diff --git a/packages/api/internal/db/layer_sizes.go b/packages/api/internal/db/layer_sizes.go new file mode 100644 index 0000000000..ecafdff4d9 --- /dev/null +++ b/packages/api/internal/db/layer_sizes.go @@ -0,0 +1,32 @@ +package db + +import ( + "github.com/google/uuid" + + "github.com/e2b-dev/infra/packages/db/queries" + "github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator" +) + +// LayerSizesParams maps the orchestrator's synchronously-available logical layer +// sizes into params for SetEnvBuildLayerSizes. A zero value maps to NULL (e.g. +// the memfile logical size is 0 for filesystem-only snapshots). +func LayerSizesParams(buildID uuid.UUID, ls *orchestrator.LayerSizes) queries.SetEnvBuildLayerSizesParams { + p := queries.SetEnvBuildLayerSizesParams{BuildID: buildID} + if ls == nil { + return p + } + + p.MemfileLogicalSizeBytes = sizePtr(ls.GetMemfileLogicalSize()) + + return p +} + +func sizePtr(v uint64) *int64 { + if v == 0 { + return nil + } + + i := int64(v) + + return &i +} diff --git a/packages/api/internal/orchestrator/pause_instance.go b/packages/api/internal/orchestrator/pause_instance.go index a1b10065f2..03a416179a 100644 --- a/packages/api/internal/orchestrator/pause_instance.go +++ b/packages/api/internal/orchestrator/pause_instance.go @@ -12,6 +12,7 @@ import ( "go.uber.org/zap" "google.golang.org/grpc/codes" + apidb "github.com/e2b-dev/infra/packages/api/internal/db" "github.com/e2b-dev/infra/packages/api/internal/orchestrator/nodemanager" "github.com/e2b-dev/infra/packages/api/internal/sandbox" "github.com/e2b-dev/infra/packages/db/pkg/types" @@ -55,7 +56,7 @@ func (o *Orchestrator) pauseSandbox(ctx context.Context, node *nodemanager.Node, zap.String("source_build_id", sbx.BuildID.String()), ) - err = snapshotInstance(ctx, node, sbx, result.TemplateID, result.BuildID.String(), filesystemOnly) + pauseResp, err := snapshotInstance(ctx, node, sbx, result.TemplateID, result.BuildID.String(), filesystemOnly) if errors.Is(err, PauseQueueExhaustedError{}) { telemetry.ReportCriticalError(ctx, "pause queue exhausted", err) @@ -81,17 +82,23 @@ func (o *Orchestrator) pauseSandbox(ctx context.Context, node *nodemanager.Node, return fmt.Errorf("error pausing sandbox: %w", err) } + // Best-effort: the pause already succeeded, so don't fail it over layer-size + // bookkeeping. + if err := o.sqlcDB.SetEnvBuildLayerSizes(ctx, apidb.LayerSizesParams(result.BuildID, pauseResp.GetLayerSizes())); err != nil { + logger.L().Warn(ctx, "failed to persist build layer sizes", logger.WithBuildID(result.BuildID.String()), zap.Error(err)) + } + o.snapshotCache.Invalidate(context.WithoutCancel(ctx), sbx.SandboxID) return nil } -func snapshotInstance(ctx context.Context, node *nodemanager.Node, sbx sandbox.Sandbox, templateID, buildID string, filesystemOnly bool) error { +func snapshotInstance(ctx context.Context, node *nodemanager.Node, sbx sandbox.Sandbox, templateID, buildID string, filesystemOnly bool) (*orchestrator.SandboxPauseResponse, error) { childCtx, childSpan := tracer.Start(ctx, "snapshot-instance") defer childSpan.End() client, childCtx := node.GetSandboxDeleteCtx(childCtx, sbx.SandboxID, sbx.ExecutionID) - _, err := client.Sandbox.Pause( + resp, err := client.Sandbox.Pause( childCtx, &orchestrator.SandboxPauseRequest{ SandboxId: sbx.SandboxID, TemplateId: templateID, @@ -103,19 +110,19 @@ func snapshotInstance(ctx context.Context, node *nodemanager.Node, sbx sandbox.S if err == nil { telemetry.ReportEvent(ctx, "Paused sandbox") - return nil + return resp, nil } st, ok := status.FromError(err) if !ok { - return err + return nil, err } if st.Code() == codes.ResourceExhausted { - return PauseQueueExhaustedError{} + return nil, PauseQueueExhaustedError{} } - return fmt.Errorf("failed to pause sandbox '%s': %w", sbx.SandboxID, err) + return nil, fmt.Errorf("failed to pause sandbox '%s': %w", sbx.SandboxID, err) } func (o *Orchestrator) WaitForStateChange(ctx context.Context, teamID uuid.UUID, sandboxID string) error { diff --git a/packages/api/internal/orchestrator/snapshot_template.go b/packages/api/internal/orchestrator/snapshot_template.go index fab4f45d0d..d9e5b3b724 100644 --- a/packages/api/internal/orchestrator/snapshot_template.go +++ b/packages/api/internal/orchestrator/snapshot_template.go @@ -7,13 +7,16 @@ import ( "time" "github.com/google/uuid" + "go.uber.org/zap" + apidb "github.com/e2b-dev/infra/packages/api/internal/db" "github.com/e2b-dev/infra/packages/api/internal/sandbox" "github.com/e2b-dev/infra/packages/db/pkg/types" "github.com/e2b-dev/infra/packages/db/queries" "github.com/e2b-dev/infra/packages/shared/pkg/consts" "github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator" "github.com/e2b-dev/infra/packages/shared/pkg/id" + "github.com/e2b-dev/infra/packages/shared/pkg/logger" "github.com/e2b-dev/infra/packages/shared/pkg/storage/storageopts" "github.com/e2b-dev/infra/packages/shared/pkg/telemetry" ) @@ -88,7 +91,7 @@ func (o *Orchestrator) CreateSnapshotTemplate(ctx context.Context, teamID uuid.U // kills the sandbox itself; RemoveSandbox is still needed to clean up // API-side state (store, routing, analytics). client, childCtx := node.GetClient(ctx) - _, err = client.Sandbox.Checkpoint(childCtx, &orchestrator.SandboxCheckpointRequest{ + checkpointResp, err := client.Sandbox.Checkpoint(childCtx, &orchestrator.SandboxCheckpointRequest{ SandboxId: sbx.SandboxID, BuildId: upsertResult.BuildID.String(), Metadata: map[string]string{storageopts.ObjectMetadataTemplateID: snapshotTemplateEnvID}, @@ -119,6 +122,12 @@ func (o *Orchestrator) CreateSnapshotTemplate(ctx context.Context, teamID uuid.U return SnapshotTemplateResult{}, fmt.Errorf("error updating build status: %w", err) } + // Best-effort: the checkpoint already succeeded, so don't fail it over + // layer-size bookkeeping. + if err := o.sqlcDB.SetEnvBuildLayerSizes(ctx, apidb.LayerSizesParams(upsertResult.BuildID, checkpointResp.GetLayerSizes())); err != nil { + logger.L().Warn(ctx, "failed to persist build layer sizes", logger.WithBuildID(upsertResult.BuildID.String()), zap.Error(err)) + } + o.snapshotCache.Invalidate(context.WithoutCancel(ctx), sandboxID) telemetry.ReportEvent(ctx, "Snapshot template completed") diff --git a/packages/api/internal/template-manager/template_manager_test.go b/packages/api/internal/template-manager/template_manager_test.go index 335c1b23b3..93c094bd40 100644 --- a/packages/api/internal/template-manager/template_manager_test.go +++ b/packages/api/internal/template-manager/template_manager_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/uuid" "github.com/e2b-dev/infra/packages/db/pkg/types" + "github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator" templatemanagergrpc "github.com/e2b-dev/infra/packages/shared/pkg/grpc/template-manager" "github.com/e2b-dev/infra/packages/shared/pkg/logger" ) @@ -26,7 +27,7 @@ func (f fakeTemplateManagerClient) SetStatus(context.Context, uuid.UUID, types.B return f.setStatusError } -func (f fakeTemplateManagerClient) SetFinished(context.Context, uuid.UUID, int64, string, string, string) error { +func (f fakeTemplateManagerClient) SetFinished(context.Context, uuid.UUID, int64, string, string, string, *orchestrator.LayerSizes) error { return f.setFinishedError } diff --git a/packages/api/internal/template-manager/template_status.go b/packages/api/internal/template-manager/template_status.go index 95ac2f384c..0b7a4a3584 100644 --- a/packages/api/internal/template-manager/template_status.go +++ b/packages/api/internal/template-manager/template_status.go @@ -10,8 +10,10 @@ import ( "github.com/google/uuid" "go.uber.org/zap" + apidb "github.com/e2b-dev/infra/packages/api/internal/db" "github.com/e2b-dev/infra/packages/db/pkg/types" "github.com/e2b-dev/infra/packages/db/queries" + "github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator" templatemanagergrpc "github.com/e2b-dev/infra/packages/shared/pkg/grpc/template-manager" "github.com/e2b-dev/infra/packages/shared/pkg/logger" ) @@ -84,7 +86,7 @@ func (tm *TemplateManager) BuildStatusSync(ctx context.Context, buildID uuid.UUI type templateManagerClient interface { SetStatus(ctx context.Context, buildID uuid.UUID, statusGroup types.BuildStatusGroup, reason *templatemanagergrpc.TemplateBuildStatusReason) error - SetFinished(ctx context.Context, buildID uuid.UUID, rootfsSize int64, envdVersion, kernelVersion, firecrackerVersion string) error + SetFinished(ctx context.Context, buildID uuid.UUID, rootfsSize int64, envdVersion, kernelVersion, firecrackerVersion string, layerSizes *orchestrator.LayerSizes) error GetStatus(ctx context.Context, buildId uuid.UUID, templateID string, clusterID uuid.UUID, nodeID string) (*templatemanagergrpc.TemplateBuildStatusResponse, error) } @@ -207,6 +209,7 @@ func (c *PollBuildStatus) dispatchBasedOnStatus(ctx context.Context, status *tem meta.GetEnvdVersionKey(), meta.GetKernelVersion(), meta.GetFirecrackerVersion(), + meta.GetLayerSizes(), ) if err != nil { return false, fmt.Errorf("error when finishing build: %w", err) @@ -307,7 +310,7 @@ func (tm *TemplateManager) SetStatus(ctx context.Context, buildID uuid.UUID, sta return err } -func (tm *TemplateManager) SetFinished(ctx context.Context, buildID uuid.UUID, rootfsSize int64, envdVersion, kernelVersion, firecrackerVersion string) error { +func (tm *TemplateManager) SetFinished(ctx context.Context, buildID uuid.UUID, rootfsSize int64, envdVersion, kernelVersion, firecrackerVersion string, layerSizes *orchestrator.LayerSizes) error { // first do database update to prevent race condition while calling status // TODO(ENG-3469): Switch to types.BuildStatusReady once all consumers are migrated. err := tm.sqlcDB.FinishTemplateBuild(ctx, queries.FinishTemplateBuildParams{ @@ -318,6 +321,9 @@ func (tm *TemplateManager) SetFinished(ctx context.Context, buildID uuid.UUID, r FirecrackerVersion: firecrackerVersion, BuildID: buildID, }) + if err == nil { + err = tm.sqlcDB.SetEnvBuildLayerSizes(ctx, apidb.LayerSizesParams(buildID, layerSizes)) + } tm.buildCache.Invalidate(ctx, buildID) diff --git a/packages/db/migrations/20260627130000_add_layer_size_columns.sql b/packages/db/migrations/20260627130000_add_layer_size_columns.sql new file mode 100644 index 0000000000..ada7f61406 --- /dev/null +++ b/packages/db/migrations/20260627130000_add_layer_size_columns.sql @@ -0,0 +1,11 @@ +-- +goose Up +-- Memfile logical (virtual device) size captured synchronously at snapshot time. +-- The rootfs logical size is already stored as total_disk_size_mb. Mapped and +-- diff sizes (for both rootfs and memfile) are kept in the data objects' custom +-- metadata instead, so each size category lives entirely in one place. +ALTER TABLE public.env_builds + ADD COLUMN IF NOT EXISTS memfile_logical_size_bytes bigint; + +-- +goose Down +ALTER TABLE public.env_builds + DROP COLUMN IF EXISTS memfile_logical_size_bytes; diff --git a/packages/db/pkg/testutils/queries/models.go b/packages/db/pkg/testutils/queries/models.go index 803fb55f9a..f0b6e0c168 100644 --- a/packages/db/pkg/testutils/queries/models.go +++ b/packages/db/pkg/testutils/queries/models.go @@ -103,32 +103,33 @@ type EnvAlias struct { } type EnvBuild struct { - ID uuid.UUID - CreatedAt time.Time - UpdatedAt time.Time - FinishedAt *time.Time - Status string - Dockerfile pgtype.Text - StartCmd pgtype.Text - Vcpu int64 - RamMb int64 - FreeDiskSizeMb int64 - TotalDiskSizeMb pgtype.Int8 - KernelVersion string - FirecrackerVersion string - EnvID pgtype.Text - EnvdVersion pgtype.Text - ReadyCmd pgtype.Text - ClusterNodeID pgtype.Text - Reason []byte - Version pgtype.Text - CpuArchitecture pgtype.Text - CpuFamily pgtype.Text - CpuModel pgtype.Text - CpuModelName pgtype.Text - CpuFlags []string - StatusGroup string - TeamID *uuid.UUID + ID uuid.UUID + CreatedAt time.Time + UpdatedAt time.Time + FinishedAt *time.Time + Status string + Dockerfile pgtype.Text + StartCmd pgtype.Text + Vcpu int64 + RamMb int64 + FreeDiskSizeMb int64 + TotalDiskSizeMb pgtype.Int8 + KernelVersion string + FirecrackerVersion string + EnvID pgtype.Text + EnvdVersion pgtype.Text + ReadyCmd pgtype.Text + ClusterNodeID pgtype.Text + Reason []byte + Version pgtype.Text + CpuArchitecture pgtype.Text + CpuFamily pgtype.Text + CpuModel pgtype.Text + CpuModelName pgtype.Text + CpuFlags []string + StatusGroup string + TeamID *uuid.UUID + MemfileLogicalSizeBytes pgtype.Int8 } type EnvBuildAssignment struct { diff --git a/packages/db/queries/builds/set_env_build_layer_sizes.sql b/packages/db/queries/builds/set_env_build_layer_sizes.sql new file mode 100644 index 0000000000..678d39388b --- /dev/null +++ b/packages/db/queries/builds/set_env_build_layer_sizes.sql @@ -0,0 +1,6 @@ +-- name: SetEnvBuildLayerSizes :exec +-- Persists the synchronously-available memfile logical size for a build. Nullable +-- so a filesystem-only snapshot (no memfile) can be written as NULL. +UPDATE "public"."env_builds" +SET memfile_logical_size_bytes = sqlc.narg(memfile_logical_size_bytes) +WHERE id = @build_id; diff --git a/packages/db/queries/get_concurrent_template_builds.sql.go b/packages/db/queries/get_concurrent_template_builds.sql.go index 08aacc613e..9c49862c25 100644 --- a/packages/db/queries/get_concurrent_template_builds.sql.go +++ b/packages/db/queries/get_concurrent_template_builds.sql.go @@ -12,7 +12,7 @@ import ( ) const getConcurrentTemplateBuilds = `-- name: GetConcurrentTemplateBuilds :many -SELECT DISTINCT eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id FROM env_build_assignments eba +SELECT DISTINCT eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, eb.memfile_logical_size_bytes FROM env_build_assignments eba JOIN env_builds eb ON eb.id = eba.build_id WHERE eba.env_id = $1 @@ -65,6 +65,7 @@ func (q *Queries) GetConcurrentTemplateBuilds(ctx context.Context, arg GetConcur &i.CpuFlags, &i.StatusGroup, &i.TeamID, + &i.MemfileLogicalSizeBytes, ); err != nil { return nil, err } diff --git a/packages/db/queries/get_inprogress_builds.sql.go b/packages/db/queries/get_inprogress_builds.sql.go index ec595b58f1..fd3713e388 100644 --- a/packages/db/queries/get_inprogress_builds.sql.go +++ b/packages/db/queries/get_inprogress_builds.sql.go @@ -55,7 +55,7 @@ func (q *Queries) GetCancellableTemplateBuildsByTeam(ctx context.Context, teamID } const getInProgressTemplateBuilds = `-- name: GetInProgressTemplateBuilds :many -SELECT DISTINCT ON (b.id) t.cluster_id AS team_cluster_id, e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id +SELECT DISTINCT ON (b.id) t.cluster_id AS team_cluster_id, e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes FROM public.env_builds b JOIN public.env_build_assignments eba ON eba.build_id = b.id JOIN public.envs e ON e.id = eba.env_id @@ -119,6 +119,7 @@ func (q *Queries) GetInProgressTemplateBuilds(ctx context.Context) ([]GetInProgr &i.EnvBuild.CpuFlags, &i.EnvBuild.StatusGroup, &i.EnvBuild.TeamID, + &i.EnvBuild.MemfileLogicalSizeBytes, ); err != nil { return nil, err } diff --git a/packages/db/queries/get_last_snapshot.sql.go b/packages/db/queries/get_last_snapshot.sql.go index 76fe6599a2..89e3827628 100644 --- a/packages/db/queries/get_last_snapshot.sql.go +++ b/packages/db/queries/get_last_snapshot.sql.go @@ -10,7 +10,7 @@ import ( ) const getLastSnapshot = `-- name: GetLastSnapshot :one -SELECT COALESCE(ea.aliases, ARRAY[]::text[])::text[] AS aliases, COALESCE(ea.names, ARRAY[]::text[])::text[] AS names, s.created_at, s.env_id, s.sandbox_id, s.id, s.metadata, s.base_env_id, s.sandbox_started_at, s.env_secure, s.origin_node_id, s.allow_internet_access, s.auto_pause, s.team_id, s.config, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id +SELECT COALESCE(ea.aliases, ARRAY[]::text[])::text[] AS aliases, COALESCE(ea.names, ARRAY[]::text[])::text[] AS names, s.created_at, s.env_id, s.sandbox_id, s.id, s.metadata, s.base_env_id, s.sandbox_started_at, s.env_secure, s.origin_node_id, s.allow_internet_access, s.auto_pause, s.team_id, s.config, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, eb.memfile_logical_size_bytes FROM "public"."snapshots" s JOIN LATERAL ( SELECT eba.build_id @@ -83,6 +83,7 @@ func (q *Queries) GetLastSnapshot(ctx context.Context, sandboxID string) (GetLas &i.EnvBuild.CpuFlags, &i.EnvBuild.StatusGroup, &i.EnvBuild.TeamID, + &i.EnvBuild.MemfileLogicalSizeBytes, ) return i, err } diff --git a/packages/db/queries/get_team_template.sql.go b/packages/db/queries/get_team_template.sql.go index d234141cec..b5e9df0941 100644 --- a/packages/db/queries/get_team_template.sql.go +++ b/packages/db/queries/get_team_template.sql.go @@ -32,7 +32,7 @@ LEFT JOIN LATERAL ( WHERE env_id = e.id ) ea ON TRUE LEFT JOIN LATERAL ( - SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id + SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes FROM public.env_build_assignments AS ba JOIN public.env_builds AS b ON b.id = ba.build_id WHERE ba.env_id = e.id AND ba.tag = 'default' @@ -40,7 +40,7 @@ LEFT JOIN LATERAL ( LIMIT 1 ) latest_build ON TRUE LEFT JOIN LATERAL ( - SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id + SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes FROM public.env_build_assignments AS ba JOIN public.env_builds AS b ON b.id = ba.build_id WHERE ba.env_id = e.id AND ba.tag = 'default' AND b.status_group = 'ready' diff --git a/packages/db/queries/get_team_templates.sql.go b/packages/db/queries/get_team_templates.sql.go index 491bc95c70..f71ed2084d 100644 --- a/packages/db/queries/get_team_templates.sql.go +++ b/packages/db/queries/get_team_templates.sql.go @@ -33,7 +33,7 @@ LEFT JOIN LATERAL ( WHERE env_id = e.id ) ea ON TRUE LEFT JOIN LATERAL ( - SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id + SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes FROM public.env_build_assignments AS ba JOIN public.env_builds AS b ON b.id = ba.build_id WHERE ba.env_id = e.id AND ba.tag = 'default' @@ -41,7 +41,7 @@ LEFT JOIN LATERAL ( LIMIT 1 ) latest_build ON TRUE LEFT JOIN LATERAL ( - SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id + SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes FROM public.env_build_assignments AS ba JOIN public.env_builds AS b ON b.id = ba.build_id WHERE ba.env_id = e.id AND ba.tag = 'default' AND b.status_group = 'ready' diff --git a/packages/db/queries/get_template_build.sql.go b/packages/db/queries/get_template_build.sql.go index a4493db19a..ebdb52d9f4 100644 --- a/packages/db/queries/get_template_build.sql.go +++ b/packages/db/queries/get_template_build.sql.go @@ -12,7 +12,7 @@ import ( ) const getTemplateBuildWithTemplate = `-- name: GetTemplateBuildWithTemplate :one -SELECT e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id +SELECT e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, eb.memfile_logical_size_bytes FROM "public"."envs" e JOIN "public"."env_build_assignments" eba ON eba.env_id = e.id JOIN "public"."env_builds" eb ON eb.id = eba.build_id @@ -71,6 +71,7 @@ func (q *Queries) GetTemplateBuildWithTemplate(ctx context.Context, arg GetTempl &i.EnvBuild.CpuFlags, &i.EnvBuild.StatusGroup, &i.EnvBuild.TeamID, + &i.EnvBuild.MemfileLogicalSizeBytes, ) return i, err } diff --git a/packages/db/queries/get_template_with_build_by_tag.sql.go b/packages/db/queries/get_template_with_build_by_tag.sql.go index 63450198a0..28608ab0f4 100644 --- a/packages/db/queries/get_template_with_build_by_tag.sql.go +++ b/packages/db/queries/get_template_with_build_by_tag.sql.go @@ -10,7 +10,7 @@ import ( ) const getTemplateWithBuildByTag = `-- name: GetTemplateWithBuildByTag :one -SELECT e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, aliases, names +SELECT e.id, e.created_at, e.updated_at, e.public, e.build_count, e.spawn_count, e.last_spawned_at, e.team_id, e.created_by, e.cluster_id, e.source, eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, eb.memfile_logical_size_bytes, aliases, names FROM public.envs AS e JOIN public.env_build_assignments AS eba ON eba.env_id = e.id AND ( @@ -91,6 +91,7 @@ func (q *Queries) GetTemplateWithBuildByTag(ctx context.Context, arg GetTemplate &i.EnvBuild.CpuFlags, &i.EnvBuild.StatusGroup, &i.EnvBuild.TeamID, + &i.EnvBuild.MemfileLogicalSizeBytes, &i.Aliases, &i.Names, ) diff --git a/packages/db/queries/get_template_with_builds.sql.go b/packages/db/queries/get_template_with_builds.sql.go index 86e23bd3b0..73617fb33a 100644 --- a/packages/db/queries/get_template_with_builds.sql.go +++ b/packages/db/queries/get_template_with_builds.sql.go @@ -11,7 +11,7 @@ import ( ) const getTemplateBuilds = `-- name: GetTemplateBuilds :many -SELECT DISTINCT eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id +SELECT DISTINCT eb.id, eb.created_at, eb.updated_at, eb.finished_at, eb.status, eb.dockerfile, eb.start_cmd, eb.vcpu, eb.ram_mb, eb.free_disk_size_mb, eb.total_disk_size_mb, eb.kernel_version, eb.firecracker_version, eb.env_id, eb.envd_version, eb.ready_cmd, eb.cluster_node_id, eb.reason, eb.version, eb.cpu_architecture, eb.cpu_family, eb.cpu_model, eb.cpu_model_name, eb.cpu_flags, eb.status_group, eb.team_id, eb.memfile_logical_size_bytes FROM public.env_build_assignments eba JOIN public.env_builds eb ON eb.id = eba.build_id WHERE eba.env_id = $1 @@ -68,6 +68,7 @@ func (q *Queries) GetTemplateBuilds(ctx context.Context, arg GetTemplateBuildsPa &i.CpuFlags, &i.StatusGroup, &i.TeamID, + &i.MemfileLogicalSizeBytes, ); err != nil { return nil, err } diff --git a/packages/db/queries/list_team_snapshot_templates.sql.go b/packages/db/queries/list_team_snapshot_templates.sql.go index 47c486ecfe..3a6dc13d56 100644 --- a/packages/db/queries/list_team_snapshot_templates.sql.go +++ b/packages/db/queries/list_team_snapshot_templates.sql.go @@ -31,7 +31,7 @@ SELECT FROM "public"."envs" e JOIN "public"."snapshot_templates" st ON st.env_id = e.id JOIN LATERAL ( - SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, ba.tag + SELECT b.id, b.created_at, b.updated_at, b.finished_at, b.status, b.dockerfile, b.start_cmd, b.vcpu, b.ram_mb, b.free_disk_size_mb, b.total_disk_size_mb, b.kernel_version, b.firecracker_version, b.env_id, b.envd_version, b.ready_cmd, b.cluster_node_id, b.reason, b.version, b.cpu_architecture, b.cpu_family, b.cpu_model, b.cpu_model_name, b.cpu_flags, b.status_group, b.team_id, b.memfile_logical_size_bytes, ba.tag FROM "public"."env_build_assignments" ba JOIN "public"."env_builds" b ON b.id = ba.build_id WHERE ba.env_id = e.id AND b.status IN ('success', 'uploaded', 'ready') diff --git a/packages/db/queries/models.go b/packages/db/queries/models.go index 242ff92cea..76195f7580 100644 --- a/packages/db/queries/models.go +++ b/packages/db/queries/models.go @@ -47,32 +47,33 @@ type EnvAlias struct { } type EnvBuild struct { - ID uuid.UUID - CreatedAt time.Time - UpdatedAt time.Time - FinishedAt *time.Time - Status types.BuildStatus - Dockerfile *string - StartCmd *string - Vcpu int64 - RamMb int64 - FreeDiskSizeMb int64 - TotalDiskSizeMb *int64 - KernelVersion string - FirecrackerVersion string - EnvID *string - EnvdVersion *string - ReadyCmd *string - ClusterNodeID *string - Reason types.BuildReason - Version *string - CpuArchitecture *string - CpuFamily *string - CpuModel *string - CpuModelName *string - CpuFlags []string - StatusGroup types.BuildStatusGroup - TeamID *uuid.UUID + ID uuid.UUID + CreatedAt time.Time + UpdatedAt time.Time + FinishedAt *time.Time + Status types.BuildStatus + Dockerfile *string + StartCmd *string + Vcpu int64 + RamMb int64 + FreeDiskSizeMb int64 + TotalDiskSizeMb *int64 + KernelVersion string + FirecrackerVersion string + EnvID *string + EnvdVersion *string + ReadyCmd *string + ClusterNodeID *string + Reason types.BuildReason + Version *string + CpuArchitecture *string + CpuFamily *string + CpuModel *string + CpuModelName *string + CpuFlags []string + StatusGroup types.BuildStatusGroup + TeamID *uuid.UUID + MemfileLogicalSizeBytes *int64 } type Snapshot struct { diff --git a/packages/db/queries/set_env_build_layer_sizes.sql.go b/packages/db/queries/set_env_build_layer_sizes.sql.go new file mode 100644 index 0000000000..a21c44223d --- /dev/null +++ b/packages/db/queries/set_env_build_layer_sizes.sql.go @@ -0,0 +1,30 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.29.0 +// source: set_env_build_layer_sizes.sql + +package queries + +import ( + "context" + + "github.com/google/uuid" +) + +const setEnvBuildLayerSizes = `-- name: SetEnvBuildLayerSizes :exec +UPDATE "public"."env_builds" +SET memfile_logical_size_bytes = $1 +WHERE id = $2 +` + +type SetEnvBuildLayerSizesParams struct { + MemfileLogicalSizeBytes *int64 + BuildID uuid.UUID +} + +// Persists the synchronously-available memfile logical size for a build. Nullable +// so a filesystem-only snapshot (no memfile) can be written as NULL. +func (q *Queries) SetEnvBuildLayerSizes(ctx context.Context, arg SetEnvBuildLayerSizesParams) error { + _, err := q.db.Exec(ctx, setEnvBuildLayerSizes, arg.MemfileLogicalSizeBytes, arg.BuildID) + return err +} diff --git a/packages/orchestrator/orchestrator.proto b/packages/orchestrator/orchestrator.proto index 941a49c28f..c216668f11 100644 --- a/packages/orchestrator/orchestrator.proto +++ b/packages/orchestrator/orchestrator.proto @@ -165,8 +165,18 @@ message SchedulingMetadata { string rootfs_base_build_id = 9; } +// LayerSizes carries the logical (virtual device) sizes available synchronously +// at snapshot time. The mapped and diff sizes (for both rootfs and memfile) are +// written to the data objects' custom metadata instead, so that each size +// category lives entirely in one place: logical here, mapped/diff in metadata. +// The rootfs logical size is already persisted as env_builds.total_disk_size_mb. +message LayerSizes { + uint64 memfile_logical_size = 1; // memfile logical (virtual device) size +} + message SandboxPauseResponse { SchedulingMetadata scheduling_metadata = 1; + LayerSizes layer_sizes = 2; } message SandboxCheckpointRequest { @@ -180,6 +190,7 @@ message SandboxCheckpointRequest { message SandboxCheckpointResponse { SchedulingMetadata scheduling_metadata = 1; + LayerSizes layer_sizes = 2; } message RunningSandbox { diff --git a/packages/orchestrator/pkg/sandbox/snapshot.go b/packages/orchestrator/pkg/sandbox/snapshot.go index 9b90397960..854b9907aa 100644 --- a/packages/orchestrator/pkg/sandbox/snapshot.go +++ b/packages/orchestrator/pkg/sandbox/snapshot.go @@ -61,3 +61,29 @@ func (s *Snapshot) Close(ctx context.Context) error { return nil } + +// SyncLayerSizes returns the logical layer sizes available synchronously at +// snapshot time (no wait on the async memfile dedup header). Mapped and diff +// sizes for both artifacts live in the data objects' metadata instead, so each +// size category stays in one place. The rootfs logical size is already carried +// separately as total_disk_size_mb. +func (s *Snapshot) SyncLayerSizes() *orchestrator.LayerSizes { + ls := &orchestrator.LayerSizes{} + + if !s.FilesystemSnapshot { + ls.MemfileLogicalSize = s.MemorySnapshot.LogicalSize() + } + + return ls +} + +// LogicalSize returns the memfile's logical (virtual device) size from its base +// header, available synchronously at Pause time. Returns 0 for a filesystem-only +// snapshot, which has no memfile. +func (m MemorySnapshot) LogicalSize() uint64 { + if m.header == nil { + return 0 + } + + return m.header.Metadata.Size +} diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go index 573989d7f0..843e9cf564 100644 --- a/packages/orchestrator/pkg/server/sandboxes.go +++ b/packages/orchestrator/pkg/server/sandboxes.go @@ -675,6 +675,7 @@ func (s *Server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest return &orchestrator.SandboxPauseResponse{ SchedulingMetadata: res.schedulingMetadata, + LayerSizes: res.layerSizes, }, nil } @@ -834,6 +835,7 @@ func (s *Server) Checkpoint(ctx context.Context, in *orchestrator.SandboxCheckpo return &orchestrator.SandboxCheckpointResponse{ SchedulingMetadata: res.schedulingMetadata, + LayerSizes: res.layerSizes, }, nil } @@ -873,6 +875,7 @@ func (s *Server) getSandboxExecutionData(sbx *sandbox.Sandbox) map[string]any { type snapshotResult struct { meta metadata.Template schedulingMetadata *orchestrator.SchedulingMetadata + layerSizes *orchestrator.LayerSizes upload *sandbox.Upload completeUpload func(ctx context.Context, uploadErr error) } @@ -937,6 +940,11 @@ func (s *Server) snapshotAndCacheSandbox( return nil, fmt.Errorf("register upload: %w", err) } + // Synchronously-available logical layer sizes (no wait on the async memfile + // dedup header). Persisted by the API; the mapped/diff sizes for both + // artifacts are written to the data objects' metadata during upload instead. + layerSizes := snapshot.SyncLayerSizes() + telemetry.ReportEvent(ctx, "added snapshot to template cache") // Capture once so Register and the symmetric Unregister inside @@ -971,6 +979,7 @@ func (s *Server) snapshotAndCacheSandbox( return &snapshotResult{ meta: meta, schedulingMetadata: snapshot.SchedulingMetadata, + layerSizes: layerSizes, upload: upload, completeUpload: completeUpload, }, nil diff --git a/packages/orchestrator/pkg/template/build/builder.go b/packages/orchestrator/pkg/template/build/builder.go index 1e2a07f473..ebfc4eaaf8 100644 --- a/packages/orchestrator/pkg/template/build/builder.go +++ b/packages/orchestrator/pkg/template/build/builder.go @@ -107,6 +107,7 @@ type Result struct { FirecrackerVersion string RootfsSizeMB int64 SchedulingMetadata *orchestratorgrpc.SchedulingMetadata + LayerSizes *orchestratorgrpc.LayerSizes } // Build builds the template, uploads it to storage and returns the result metadata. @@ -410,12 +411,13 @@ func runBuild( return nil, fmt.Errorf("error waiting for layers upload: %w", err) } - // Get the base rootfs size from the template files - // This is the size of the rootfs after provisioning and before building the layers - // (as they don't change the rootfs size) - rootfsSize, err := getRootfsSize(ctx, builder.templateStorage, storage.Paths{BuildID: lastLayerResult.Metadata.Template.BuildID}) + // Read the final layer's headers from storage to get the rootfs size and the + // synchronously-available layer sizes. The rootfs logical size is the size + // after provisioning and before building the layers (they don't change it). + paths := storage.Paths{BuildID: lastLayerResult.Metadata.Template.BuildID} + rootfsSize, layerSizes, err := getLayerSizes(ctx, builder.templateStorage, paths) if err != nil { - return nil, fmt.Errorf("error getting rootfs size: %w", err) + return nil, fmt.Errorf("error getting layer sizes: %w", err) } logger.L().Info(ctx, "rootfs size", zap.Uint64("size", rootfsSize)) @@ -425,6 +427,7 @@ func runBuild( FirecrackerVersion: bc.Config.FirecrackerVersion, RootfsSizeMB: units.BytesToMB(int64(rootfsSize)), SchedulingMetadata: templateSchedulingMetadata(ctx, builder.templateCache, lastLayerResult.Metadata.Template.BuildID), + LayerSizes: layerSizes, }, nil } @@ -465,20 +468,40 @@ func forceSteps(template config.TemplateConfig) config.TemplateConfig { return template } -func getRootfsSize( +// getLayerSizes reads the final layer's rootfs and memfile headers from storage +// and returns the rootfs logical size (persisted as total_disk_size_mb) plus the +// logical layer sizes carried over gRPC (memfile logical). The mapped/diff sizes +// for both artifacts are written to the data objects' metadata instead. +func getLayerSizes( ctx context.Context, s storage.StorageProvider, paths storage.Paths, -) (uint64, error) { - obj, err := s.OpenBlob(ctx, paths.RootfsHeader()) +) (uint64, *orchestratorgrpc.LayerSizes, error) { + rootfsHeader, err := loadBuildHeader(ctx, s, paths.RootfsHeader()) if err != nil { - return 0, fmt.Errorf("error opening rootfs header object: %w", err) + return 0, nil, fmt.Errorf("error loading rootfs header: %w", err) + } + + layerSizes := &orchestratorgrpc.LayerSizes{} + + // The memfile header is absent for filesystem-only templates; that's fine. + if memfileHeader, memErr := loadBuildHeader(ctx, s, paths.MemfileHeader()); memErr == nil { + layerSizes.MemfileLogicalSize = memfileHeader.Metadata.Size + } + + return rootfsHeader.Metadata.Size, layerSizes, nil +} + +func loadBuildHeader(ctx context.Context, s storage.StorageProvider, path string) (*header.Header, error) { + obj, err := s.OpenBlob(ctx, path) + if err != nil { + return nil, fmt.Errorf("error opening header object: %w", err) } h, err := header.Deserialize(ctx, obj) if err != nil { - return 0, fmt.Errorf("error deserializing rootfs header: %w", err) + return nil, fmt.Errorf("error deserializing header: %w", err) } - return h.Metadata.Size, nil + return h, nil } diff --git a/packages/orchestrator/pkg/template/server/create_template.go b/packages/orchestrator/pkg/template/server/create_template.go index 7aeb1aeb90..3592aea286 100644 --- a/packages/orchestrator/pkg/template/server/create_template.go +++ b/packages/orchestrator/pkg/template/server/create_template.go @@ -182,6 +182,7 @@ func (s *ServerStore) TemplateCreate(ctx context.Context, templateRequest *templ KernelVersion: res.KernelVersion, FirecrackerVersion: res.FirecrackerVersion, SchedulingMetadata: res.SchedulingMetadata, + LayerSizes: res.LayerSizes, }) telemetry.ReportEvent(ctx, "Environment built") } diff --git a/packages/orchestrator/template-manager.proto b/packages/orchestrator/template-manager.proto index 4bfbce5855..7241a17420 100644 --- a/packages/orchestrator/template-manager.proto +++ b/packages/orchestrator/template-manager.proto @@ -136,6 +136,8 @@ message TemplateBuildMetadata { // Shared with the orchestrator so the API can match the build's scheduling // metadata against create/resume responses without a separate format. SchedulingMetadata schedulingMetadata = 5; + // Synchronously-available layer sizes the API persists into env_builds. + LayerSizes layerSizes = 6; } enum TemplateBuildState { diff --git a/packages/shared/pkg/grpc/orchestrator/orchestrator.pb.go b/packages/shared/pkg/grpc/orchestrator/orchestrator.pb.go index 9ba64e3946..1fe70833dc 100644 --- a/packages/shared/pkg/grpc/orchestrator/orchestrator.pb.go +++ b/packages/shared/pkg/grpc/orchestrator/orchestrator.pb.go @@ -1179,18 +1179,71 @@ func (x *SchedulingMetadata) GetRootfsBaseBuildId() string { return "" } +// LayerSizes carries the logical (virtual device) sizes available synchronously +// at snapshot time. The mapped and diff sizes (for both rootfs and memfile) are +// written to the data objects' custom metadata instead, so that each size +// category lives entirely in one place: logical here, mapped/diff in metadata. +// The rootfs logical size is already persisted as env_builds.total_disk_size_mb. +type LayerSizes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MemfileLogicalSize uint64 `protobuf:"varint,1,opt,name=memfile_logical_size,json=memfileLogicalSize,proto3" json:"memfile_logical_size,omitempty"` // memfile logical (virtual device) size +} + +func (x *LayerSizes) Reset() { + *x = LayerSizes{} + if protoimpl.UnsafeEnabled { + mi := &file_orchestrator_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LayerSizes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LayerSizes) ProtoMessage() {} + +func (x *LayerSizes) ProtoReflect() protoreflect.Message { + mi := &file_orchestrator_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LayerSizes.ProtoReflect.Descriptor instead. +func (*LayerSizes) Descriptor() ([]byte, []int) { + return file_orchestrator_proto_rawDescGZIP(), []int{15} +} + +func (x *LayerSizes) GetMemfileLogicalSize() uint64 { + if x != nil { + return x.MemfileLogicalSize + } + return 0 +} + type SandboxPauseResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields SchedulingMetadata *SchedulingMetadata `protobuf:"bytes,1,opt,name=scheduling_metadata,json=schedulingMetadata,proto3" json:"scheduling_metadata,omitempty"` + LayerSizes *LayerSizes `protobuf:"bytes,2,opt,name=layer_sizes,json=layerSizes,proto3" json:"layer_sizes,omitempty"` } func (x *SandboxPauseResponse) Reset() { *x = SandboxPauseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[15] + mi := &file_orchestrator_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1203,7 +1256,7 @@ func (x *SandboxPauseResponse) String() string { func (*SandboxPauseResponse) ProtoMessage() {} func (x *SandboxPauseResponse) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[15] + mi := &file_orchestrator_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1216,7 +1269,7 @@ func (x *SandboxPauseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SandboxPauseResponse.ProtoReflect.Descriptor instead. func (*SandboxPauseResponse) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{15} + return file_orchestrator_proto_rawDescGZIP(), []int{16} } func (x *SandboxPauseResponse) GetSchedulingMetadata() *SchedulingMetadata { @@ -1226,6 +1279,13 @@ func (x *SandboxPauseResponse) GetSchedulingMetadata() *SchedulingMetadata { return nil } +func (x *SandboxPauseResponse) GetLayerSizes() *LayerSizes { + if x != nil { + return x.LayerSizes + } + return nil +} + type SandboxCheckpointRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1242,7 +1302,7 @@ type SandboxCheckpointRequest struct { func (x *SandboxCheckpointRequest) Reset() { *x = SandboxCheckpointRequest{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[16] + mi := &file_orchestrator_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1255,7 +1315,7 @@ func (x *SandboxCheckpointRequest) String() string { func (*SandboxCheckpointRequest) ProtoMessage() {} func (x *SandboxCheckpointRequest) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[16] + mi := &file_orchestrator_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1268,7 +1328,7 @@ func (x *SandboxCheckpointRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SandboxCheckpointRequest.ProtoReflect.Descriptor instead. func (*SandboxCheckpointRequest) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{16} + return file_orchestrator_proto_rawDescGZIP(), []int{17} } func (x *SandboxCheckpointRequest) GetSandboxId() string { @@ -1298,12 +1358,13 @@ type SandboxCheckpointResponse struct { unknownFields protoimpl.UnknownFields SchedulingMetadata *SchedulingMetadata `protobuf:"bytes,1,opt,name=scheduling_metadata,json=schedulingMetadata,proto3" json:"scheduling_metadata,omitempty"` + LayerSizes *LayerSizes `protobuf:"bytes,2,opt,name=layer_sizes,json=layerSizes,proto3" json:"layer_sizes,omitempty"` } func (x *SandboxCheckpointResponse) Reset() { *x = SandboxCheckpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[17] + mi := &file_orchestrator_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1316,7 +1377,7 @@ func (x *SandboxCheckpointResponse) String() string { func (*SandboxCheckpointResponse) ProtoMessage() {} func (x *SandboxCheckpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[17] + mi := &file_orchestrator_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1329,7 +1390,7 @@ func (x *SandboxCheckpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SandboxCheckpointResponse.ProtoReflect.Descriptor instead. func (*SandboxCheckpointResponse) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{17} + return file_orchestrator_proto_rawDescGZIP(), []int{18} } func (x *SandboxCheckpointResponse) GetSchedulingMetadata() *SchedulingMetadata { @@ -1339,6 +1400,13 @@ func (x *SandboxCheckpointResponse) GetSchedulingMetadata() *SchedulingMetadata return nil } +func (x *SandboxCheckpointResponse) GetLayerSizes() *LayerSizes { + if x != nil { + return x.LayerSizes + } + return nil +} + type RunningSandbox struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1353,7 +1421,7 @@ type RunningSandbox struct { func (x *RunningSandbox) Reset() { *x = RunningSandbox{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[18] + mi := &file_orchestrator_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1366,7 +1434,7 @@ func (x *RunningSandbox) String() string { func (*RunningSandbox) ProtoMessage() {} func (x *RunningSandbox) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[18] + mi := &file_orchestrator_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1379,7 +1447,7 @@ func (x *RunningSandbox) ProtoReflect() protoreflect.Message { // Deprecated: Use RunningSandbox.ProtoReflect.Descriptor instead. func (*RunningSandbox) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{18} + return file_orchestrator_proto_rawDescGZIP(), []int{19} } func (x *RunningSandbox) GetConfig() *SandboxConfig { @@ -1421,7 +1489,7 @@ type SandboxListResponse struct { func (x *SandboxListResponse) Reset() { *x = SandboxListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[19] + mi := &file_orchestrator_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1434,7 +1502,7 @@ func (x *SandboxListResponse) String() string { func (*SandboxListResponse) ProtoMessage() {} func (x *SandboxListResponse) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[19] + mi := &file_orchestrator_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1447,7 +1515,7 @@ func (x *SandboxListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SandboxListResponse.ProtoReflect.Descriptor instead. func (*SandboxListResponse) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{19} + return file_orchestrator_proto_rawDescGZIP(), []int{20} } func (x *SandboxListResponse) GetSandboxes() []*RunningSandbox { @@ -1469,7 +1537,7 @@ type CachedBuildInfo struct { func (x *CachedBuildInfo) Reset() { *x = CachedBuildInfo{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[20] + mi := &file_orchestrator_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1482,7 +1550,7 @@ func (x *CachedBuildInfo) String() string { func (*CachedBuildInfo) ProtoMessage() {} func (x *CachedBuildInfo) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[20] + mi := &file_orchestrator_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1495,7 +1563,7 @@ func (x *CachedBuildInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CachedBuildInfo.ProtoReflect.Descriptor instead. func (*CachedBuildInfo) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{20} + return file_orchestrator_proto_rawDescGZIP(), []int{21} } func (x *CachedBuildInfo) GetBuildId() string { @@ -1523,7 +1591,7 @@ type SandboxListCachedBuildsResponse struct { func (x *SandboxListCachedBuildsResponse) Reset() { *x = SandboxListCachedBuildsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_orchestrator_proto_msgTypes[21] + mi := &file_orchestrator_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1536,7 +1604,7 @@ func (x *SandboxListCachedBuildsResponse) String() string { func (*SandboxListCachedBuildsResponse) ProtoMessage() {} func (x *SandboxListCachedBuildsResponse) ProtoReflect() protoreflect.Message { - mi := &file_orchestrator_proto_msgTypes[21] + mi := &file_orchestrator_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1549,7 +1617,7 @@ func (x *SandboxListCachedBuildsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SandboxListCachedBuildsResponse.ProtoReflect.Descriptor instead. func (*SandboxListCachedBuildsResponse) Descriptor() ([]byte, []int) { - return file_orchestrator_proto_rawDescGZIP(), []int{21} + return file_orchestrator_proto_rawDescGZIP(), []int{22} } func (x *SandboxListCachedBuildsResponse) GetBuilds() []*CachedBuildInfo { @@ -1802,93 +1870,102 @@ var file_orchestrator_proto_rawDesc = []byte{ 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x42, 0x61, 0x73, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x49, 0x64, 0x22, 0x5c, 0x0a, 0x14, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x75, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x13, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0xd6, 0x01, 0x0a, 0x18, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x53, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x61, 0x0a, 0x19, 0x53, 0x61, 0x6e, + 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x0a, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, + 0x6d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x14, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50, 0x61, + 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x13, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x73, 0x52, 0x0a, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, + 0xd6, 0x01, 0x0a, 0x18, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x8f, 0x01, 0x0a, 0x19, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x13, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc7, 0x01, 0x0a, - 0x0e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, - 0x26, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x0b, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x0a, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x0e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x26, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x44, 0x0a, 0x13, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, + 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, + 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 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, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x44, 0x0a, 0x13, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, - 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x22, 0x71, 0x0a, 0x0f, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0f, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 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, - 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0x4b, 0x0a, 0x1f, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x32, 0xba, 0x03, 0x0a, - 0x0e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x37, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x34, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x14, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x34, 0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x2e, 0x53, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x68, 0x74, 0x74, - 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x65, 0x32, 0x62, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x6f, 0x72, - 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4b, 0x0a, + 0x1f, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x28, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x32, 0xba, 0x03, 0x0a, 0x0e, 0x53, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, + 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x34, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x14, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x15, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x34, + 0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x32, + 0x62, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x6f, 0x72, 0x63, 0x68, + 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1903,7 +1980,7 @@ func file_orchestrator_proto_rawDescGZIP() []byte { return file_orchestrator_proto_rawDescData } -var file_orchestrator_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_orchestrator_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_orchestrator_proto_goTypes = []interface{}{ (*SandboxConfig)(nil), // 0: SandboxConfig (*SandboxAutoResumeConfig)(nil), // 1: SandboxAutoResumeConfig @@ -1920,68 +1997,71 @@ var file_orchestrator_proto_goTypes = []interface{}{ (*SandboxDeleteRequest)(nil), // 12: SandboxDeleteRequest (*SandboxPauseRequest)(nil), // 13: SandboxPauseRequest (*SchedulingMetadata)(nil), // 14: SchedulingMetadata - (*SandboxPauseResponse)(nil), // 15: SandboxPauseResponse - (*SandboxCheckpointRequest)(nil), // 16: SandboxCheckpointRequest - (*SandboxCheckpointResponse)(nil), // 17: SandboxCheckpointResponse - (*RunningSandbox)(nil), // 18: RunningSandbox - (*SandboxListResponse)(nil), // 19: SandboxListResponse - (*CachedBuildInfo)(nil), // 20: CachedBuildInfo - (*SandboxListCachedBuildsResponse)(nil), // 21: SandboxListCachedBuildsResponse - nil, // 22: SandboxConfig.EnvVarsEntry - nil, // 23: SandboxConfig.MetadataEntry - nil, // 24: SandboxNetworkTransform.HeadersEntry - nil, // 25: SandboxNetworkEgressConfig.RulesEntry - nil, // 26: SandboxCheckpointRequest.MetadataEntry - (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 28: google.protobuf.Empty + (*LayerSizes)(nil), // 15: LayerSizes + (*SandboxPauseResponse)(nil), // 16: SandboxPauseResponse + (*SandboxCheckpointRequest)(nil), // 17: SandboxCheckpointRequest + (*SandboxCheckpointResponse)(nil), // 18: SandboxCheckpointResponse + (*RunningSandbox)(nil), // 19: RunningSandbox + (*SandboxListResponse)(nil), // 20: SandboxListResponse + (*CachedBuildInfo)(nil), // 21: CachedBuildInfo + (*SandboxListCachedBuildsResponse)(nil), // 22: SandboxListCachedBuildsResponse + nil, // 23: SandboxConfig.EnvVarsEntry + nil, // 24: SandboxConfig.MetadataEntry + nil, // 25: SandboxNetworkTransform.HeadersEntry + nil, // 26: SandboxNetworkEgressConfig.RulesEntry + nil, // 27: SandboxCheckpointRequest.MetadataEntry + (*timestamppb.Timestamp)(nil), // 28: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 29: google.protobuf.Empty } var file_orchestrator_proto_depIdxs = []int32{ - 22, // 0: SandboxConfig.env_vars:type_name -> SandboxConfig.EnvVarsEntry - 23, // 1: SandboxConfig.metadata:type_name -> SandboxConfig.MetadataEntry + 23, // 0: SandboxConfig.env_vars:type_name -> SandboxConfig.EnvVarsEntry + 24, // 1: SandboxConfig.metadata:type_name -> SandboxConfig.MetadataEntry 3, // 2: SandboxConfig.network:type_name -> SandboxNetworkConfig 2, // 3: SandboxConfig.volumeMounts:type_name -> SandboxVolumeMount 1, // 4: SandboxConfig.auto_resume:type_name -> SandboxAutoResumeConfig 7, // 5: SandboxNetworkConfig.egress:type_name -> SandboxNetworkEgressConfig 8, // 6: SandboxNetworkConfig.ingress:type_name -> SandboxNetworkIngressConfig - 24, // 7: SandboxNetworkTransform.headers:type_name -> SandboxNetworkTransform.HeadersEntry + 25, // 7: SandboxNetworkTransform.headers:type_name -> SandboxNetworkTransform.HeadersEntry 4, // 8: SandboxNetworkRule.transform:type_name -> SandboxNetworkTransform 5, // 9: SandboxNetworkDomainRules.rules:type_name -> SandboxNetworkRule - 25, // 10: SandboxNetworkEgressConfig.rules:type_name -> SandboxNetworkEgressConfig.RulesEntry + 26, // 10: SandboxNetworkEgressConfig.rules:type_name -> SandboxNetworkEgressConfig.RulesEntry 0, // 11: SandboxCreateRequest.sandbox:type_name -> SandboxConfig - 27, // 12: SandboxCreateRequest.start_time:type_name -> google.protobuf.Timestamp - 27, // 13: SandboxCreateRequest.end_time:type_name -> google.protobuf.Timestamp + 28, // 12: SandboxCreateRequest.start_time:type_name -> google.protobuf.Timestamp + 28, // 13: SandboxCreateRequest.end_time:type_name -> google.protobuf.Timestamp 14, // 14: SandboxCreateResponse.scheduling_metadata:type_name -> SchedulingMetadata - 27, // 15: SandboxUpdateRequest.end_time:type_name -> google.protobuf.Timestamp + 28, // 15: SandboxUpdateRequest.end_time:type_name -> google.protobuf.Timestamp 7, // 16: SandboxUpdateRequest.egress:type_name -> SandboxNetworkEgressConfig 14, // 17: SandboxPauseResponse.scheduling_metadata:type_name -> SchedulingMetadata - 26, // 18: SandboxCheckpointRequest.metadata:type_name -> SandboxCheckpointRequest.MetadataEntry - 14, // 19: SandboxCheckpointResponse.scheduling_metadata:type_name -> SchedulingMetadata - 0, // 20: RunningSandbox.config:type_name -> SandboxConfig - 27, // 21: RunningSandbox.start_time:type_name -> google.protobuf.Timestamp - 27, // 22: RunningSandbox.end_time:type_name -> google.protobuf.Timestamp - 18, // 23: SandboxListResponse.sandboxes:type_name -> RunningSandbox - 27, // 24: CachedBuildInfo.expiration_time:type_name -> google.protobuf.Timestamp - 20, // 25: SandboxListCachedBuildsResponse.builds:type_name -> CachedBuildInfo - 6, // 26: SandboxNetworkEgressConfig.RulesEntry.value:type_name -> SandboxNetworkDomainRules - 9, // 27: SandboxService.Create:input_type -> SandboxCreateRequest - 11, // 28: SandboxService.Update:input_type -> SandboxUpdateRequest - 28, // 29: SandboxService.List:input_type -> google.protobuf.Empty - 12, // 30: SandboxService.Delete:input_type -> SandboxDeleteRequest - 13, // 31: SandboxService.Pause:input_type -> SandboxPauseRequest - 16, // 32: SandboxService.Checkpoint:input_type -> SandboxCheckpointRequest - 28, // 33: SandboxService.ListCachedBuilds:input_type -> google.protobuf.Empty - 10, // 34: SandboxService.Create:output_type -> SandboxCreateResponse - 28, // 35: SandboxService.Update:output_type -> google.protobuf.Empty - 19, // 36: SandboxService.List:output_type -> SandboxListResponse - 28, // 37: SandboxService.Delete:output_type -> google.protobuf.Empty - 15, // 38: SandboxService.Pause:output_type -> SandboxPauseResponse - 17, // 39: SandboxService.Checkpoint:output_type -> SandboxCheckpointResponse - 21, // 40: SandboxService.ListCachedBuilds:output_type -> SandboxListCachedBuildsResponse - 34, // [34:41] is the sub-list for method output_type - 27, // [27:34] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 15, // 18: SandboxPauseResponse.layer_sizes:type_name -> LayerSizes + 27, // 19: SandboxCheckpointRequest.metadata:type_name -> SandboxCheckpointRequest.MetadataEntry + 14, // 20: SandboxCheckpointResponse.scheduling_metadata:type_name -> SchedulingMetadata + 15, // 21: SandboxCheckpointResponse.layer_sizes:type_name -> LayerSizes + 0, // 22: RunningSandbox.config:type_name -> SandboxConfig + 28, // 23: RunningSandbox.start_time:type_name -> google.protobuf.Timestamp + 28, // 24: RunningSandbox.end_time:type_name -> google.protobuf.Timestamp + 19, // 25: SandboxListResponse.sandboxes:type_name -> RunningSandbox + 28, // 26: CachedBuildInfo.expiration_time:type_name -> google.protobuf.Timestamp + 21, // 27: SandboxListCachedBuildsResponse.builds:type_name -> CachedBuildInfo + 6, // 28: SandboxNetworkEgressConfig.RulesEntry.value:type_name -> SandboxNetworkDomainRules + 9, // 29: SandboxService.Create:input_type -> SandboxCreateRequest + 11, // 30: SandboxService.Update:input_type -> SandboxUpdateRequest + 29, // 31: SandboxService.List:input_type -> google.protobuf.Empty + 12, // 32: SandboxService.Delete:input_type -> SandboxDeleteRequest + 13, // 33: SandboxService.Pause:input_type -> SandboxPauseRequest + 17, // 34: SandboxService.Checkpoint:input_type -> SandboxCheckpointRequest + 29, // 35: SandboxService.ListCachedBuilds:input_type -> google.protobuf.Empty + 10, // 36: SandboxService.Create:output_type -> SandboxCreateResponse + 29, // 37: SandboxService.Update:output_type -> google.protobuf.Empty + 20, // 38: SandboxService.List:output_type -> SandboxListResponse + 29, // 39: SandboxService.Delete:output_type -> google.protobuf.Empty + 16, // 40: SandboxService.Pause:output_type -> SandboxPauseResponse + 18, // 41: SandboxService.Checkpoint:output_type -> SandboxCheckpointResponse + 22, // 42: SandboxService.ListCachedBuilds:output_type -> SandboxListCachedBuildsResponse + 36, // [36:43] is the sub-list for method output_type + 29, // [29:36] is the sub-list for method input_type + 29, // [29:29] is the sub-list for extension type_name + 29, // [29:29] is the sub-list for extension extendee + 0, // [0:29] is the sub-list for field type_name } func init() { file_orchestrator_proto_init() } @@ -2171,7 +2251,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SandboxPauseResponse); i { + switch v := v.(*LayerSizes); i { case 0: return &v.state case 1: @@ -2183,7 +2263,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SandboxCheckpointRequest); i { + switch v := v.(*SandboxPauseResponse); i { case 0: return &v.state case 1: @@ -2195,7 +2275,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SandboxCheckpointResponse); i { + switch v := v.(*SandboxCheckpointRequest); i { case 0: return &v.state case 1: @@ -2207,7 +2287,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunningSandbox); i { + switch v := v.(*SandboxCheckpointResponse); i { case 0: return &v.state case 1: @@ -2219,7 +2299,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SandboxListResponse); i { + switch v := v.(*RunningSandbox); i { case 0: return &v.state case 1: @@ -2231,7 +2311,7 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CachedBuildInfo); i { + switch v := v.(*SandboxListResponse); i { case 0: return &v.state case 1: @@ -2243,6 +2323,18 @@ func file_orchestrator_proto_init() { } } file_orchestrator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CachedBuildInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_orchestrator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SandboxListCachedBuildsResponse); i { case 0: return &v.state @@ -2267,7 +2359,7 @@ func file_orchestrator_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_orchestrator_proto_rawDesc, NumEnums: 0, - NumMessages: 27, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, diff --git a/packages/shared/pkg/grpc/template-manager/template-manager.pb.go b/packages/shared/pkg/grpc/template-manager/template-manager.pb.go index 21c9b0aa14..77016805dd 100644 --- a/packages/shared/pkg/grpc/template-manager/template-manager.pb.go +++ b/packages/shared/pkg/grpc/template-manager/template-manager.pb.go @@ -1115,6 +1115,8 @@ type TemplateBuildMetadata struct { // Shared with the orchestrator so the API can match the build's scheduling // metadata against create/resume responses without a separate format. SchedulingMetadata *orchestrator.SchedulingMetadata `protobuf:"bytes,5,opt,name=schedulingMetadata,proto3" json:"schedulingMetadata,omitempty"` + // Synchronously-available layer sizes the API persists into env_builds. + LayerSizes *orchestrator.LayerSizes `protobuf:"bytes,6,opt,name=layerSizes,proto3" json:"layerSizes,omitempty"` } func (x *TemplateBuildMetadata) Reset() { @@ -1184,6 +1186,13 @@ func (x *TemplateBuildMetadata) GetSchedulingMetadata() *orchestrator.Scheduling return nil } +func (x *TemplateBuildMetadata) GetLayerSizes() *orchestrator.LayerSizes { + if x != nil { + return x.LayerSizes + } + return nil +} + type TemplateBuildLogEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1526,7 +1535,7 @@ var file_template_manager_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x44, 0x22, 0x80, 0x02, + 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x44, 0x22, 0xad, 0x02, 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, @@ -1543,79 +1552,82 @@ var file_template_manager_proto_rawDesc = []byte{ 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x83, 0x02, 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x12, 0x2b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x73, 0x52, 0x0a, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, 0x83, 0x02, + 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, + 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 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, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x05, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x3a, 0x0a, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 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, 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, 0x57, 0x0a, 0x19, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x74, + 0x65, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x22, 0x86, 0x02, 0x0a, + 0x1b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, + 0x0a, 0x6c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x2a, 0x34, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, + 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x61, 0x72, 0x6e, 0x10, 0x02, + 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x03, 0x2a, 0x2a, 0x0a, 0x0d, 0x4c, + 0x6f, 0x67, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x61, 0x63, + 0x6b, 0x77, 0x61, 0x72, 0x64, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x12, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, + 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x10, 0x02, 0x32, 0xbe, 0x02, 0x0a, 0x0f, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x13, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x1b, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, - 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, - 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, - 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 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, 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, 0x57, 0x0a, 0x19, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, - 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x73, - 0x74, 0x65, 0x70, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x22, - 0x86, 0x02, 0x0a, 0x1b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x13, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x36, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, - 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x2a, 0x34, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x61, 0x72, - 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x03, 0x2a, 0x2a, - 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0b, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, - 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x12, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x10, 0x02, 0x32, 0xbe, 0x02, 0x0a, 0x0f, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, - 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x4b, 0x0a, 0x13, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x13, 0x49, 0x6e, 0x69, 0x74, - 0x4c, 0x61, 0x79, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x1b, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x49, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x13, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x61, 0x79, + 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1b, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, 0x5a, 0x31, 0x68, 0x74, - 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x65, 0x32, 0x62, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x49, 0x6e, 0x69, 0x74, + 0x4c, 0x61, 0x79, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, 0x5a, 0x31, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x32, + 0x62, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1655,7 +1667,8 @@ var file_template_manager_proto_goTypes = []interface{}{ nil, // 19: TemplateBuildLogEntry.FieldsEntry (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp (*orchestrator.SchedulingMetadata)(nil), // 21: SchedulingMetadata - (*emptypb.Empty)(nil), // 22: google.protobuf.Empty + (*orchestrator.LayerSizes)(nil), // 22: LayerSizes + (*emptypb.Empty)(nil), // 23: google.protobuf.Empty } var file_template_manager_proto_depIdxs = []int32{ 7, // 0: FromImageRegistry.aws:type_name -> AWSRegistry @@ -1670,26 +1683,27 @@ var file_template_manager_proto_depIdxs = []int32{ 20, // 9: TemplateStatusRequest.end:type_name -> google.protobuf.Timestamp 1, // 10: TemplateStatusRequest.direction:type_name -> LogsDirection 21, // 11: TemplateBuildMetadata.schedulingMetadata:type_name -> SchedulingMetadata - 20, // 12: TemplateBuildLogEntry.timestamp:type_name -> google.protobuf.Timestamp - 0, // 13: TemplateBuildLogEntry.level:type_name -> LogLevel - 19, // 14: TemplateBuildLogEntry.fields:type_name -> TemplateBuildLogEntry.FieldsEntry - 2, // 15: TemplateBuildStatusResponse.status:type_name -> TemplateBuildState - 15, // 16: TemplateBuildStatusResponse.metadata:type_name -> TemplateBuildMetadata - 16, // 17: TemplateBuildStatusResponse.logEntries:type_name -> TemplateBuildLogEntry - 17, // 18: TemplateBuildStatusResponse.reason:type_name -> TemplateBuildStatusReason - 12, // 19: TemplateService.TemplateCreate:input_type -> TemplateCreateRequest - 13, // 20: TemplateService.TemplateBuildStatus:input_type -> TemplateStatusRequest - 14, // 21: TemplateService.TemplateBuildDelete:input_type -> TemplateBuildDeleteRequest - 3, // 22: TemplateService.InitLayerFileUpload:input_type -> InitLayerFileUploadRequest - 22, // 23: TemplateService.TemplateCreate:output_type -> google.protobuf.Empty - 18, // 24: TemplateService.TemplateBuildStatus:output_type -> TemplateBuildStatusResponse - 22, // 25: TemplateService.TemplateBuildDelete:output_type -> google.protobuf.Empty - 4, // 26: TemplateService.InitLayerFileUpload:output_type -> InitLayerFileUploadResponse - 23, // [23:27] is the sub-list for method output_type - 19, // [19:23] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 22, // 12: TemplateBuildMetadata.layerSizes:type_name -> LayerSizes + 20, // 13: TemplateBuildLogEntry.timestamp:type_name -> google.protobuf.Timestamp + 0, // 14: TemplateBuildLogEntry.level:type_name -> LogLevel + 19, // 15: TemplateBuildLogEntry.fields:type_name -> TemplateBuildLogEntry.FieldsEntry + 2, // 16: TemplateBuildStatusResponse.status:type_name -> TemplateBuildState + 15, // 17: TemplateBuildStatusResponse.metadata:type_name -> TemplateBuildMetadata + 16, // 18: TemplateBuildStatusResponse.logEntries:type_name -> TemplateBuildLogEntry + 17, // 19: TemplateBuildStatusResponse.reason:type_name -> TemplateBuildStatusReason + 12, // 20: TemplateService.TemplateCreate:input_type -> TemplateCreateRequest + 13, // 21: TemplateService.TemplateBuildStatus:input_type -> TemplateStatusRequest + 14, // 22: TemplateService.TemplateBuildDelete:input_type -> TemplateBuildDeleteRequest + 3, // 23: TemplateService.InitLayerFileUpload:input_type -> InitLayerFileUploadRequest + 23, // 24: TemplateService.TemplateCreate:output_type -> google.protobuf.Empty + 18, // 25: TemplateService.TemplateBuildStatus:output_type -> TemplateBuildStatusResponse + 23, // 26: TemplateService.TemplateBuildDelete:output_type -> google.protobuf.Empty + 4, // 27: TemplateService.InitLayerFileUpload:output_type -> InitLayerFileUploadResponse + 24, // [24:28] is the sub-list for method output_type + 20, // [20:24] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_template_manager_proto_init() }