diff --git a/gen/proto/ctrl/v1/cluster.pb.go b/gen/proto/ctrl/v1/cluster.pb.go index c1bd6254b3..dae4b1bf1b 100644 --- a/gen/proto/ctrl/v1/cluster.pb.go +++ b/gen/proto/ctrl/v1/cluster.pb.go @@ -1297,9 +1297,16 @@ type ApplyDeployment struct { Healthcheck []byte `protobuf:"bytes,17,opt,name=healthcheck,proto3,oneof" json:"healthcheck,omitempty"` // app_id identifies the app within the project. // Used for pod labels so Vector can extract it into runtime logs. - AppId string `protobuf:"bytes,18,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + AppId string `protobuf:"bytes,18,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` + // Runtime environment variable fields for user workloads. + EnvironmentSlug *string `protobuf:"bytes,21,opt,name=environment_slug,json=environmentSlug,proto3,oneof" json:"environment_slug,omitempty"` + Region *string `protobuf:"bytes,22,opt,name=region,proto3,oneof" json:"region,omitempty"` + GitCommitSha *string `protobuf:"bytes,23,opt,name=git_commit_sha,json=gitCommitSha,proto3,oneof" json:"git_commit_sha,omitempty"` + GitBranch *string `protobuf:"bytes,24,opt,name=git_branch,json=gitBranch,proto3,oneof" json:"git_branch,omitempty"` + GitRepo *string `protobuf:"bytes,25,opt,name=git_repo,json=gitRepo,proto3,oneof" json:"git_repo,omitempty"` + GitCommitMessage *string `protobuf:"bytes,26,opt,name=git_commit_message,json=gitCommitMessage,proto3,oneof" json:"git_commit_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ApplyDeployment) Reset() { @@ -1451,6 +1458,48 @@ func (x *ApplyDeployment) GetAppId() string { return "" } +func (x *ApplyDeployment) GetEnvironmentSlug() string { + if x != nil && x.EnvironmentSlug != nil { + return *x.EnvironmentSlug + } + return "" +} + +func (x *ApplyDeployment) GetRegion() string { + if x != nil && x.Region != nil { + return *x.Region + } + return "" +} + +func (x *ApplyDeployment) GetGitCommitSha() string { + if x != nil && x.GitCommitSha != nil { + return *x.GitCommitSha + } + return "" +} + +func (x *ApplyDeployment) GetGitBranch() string { + if x != nil && x.GitBranch != nil { + return *x.GitBranch + } + return "" +} + +func (x *ApplyDeployment) GetGitRepo() string { + if x != nil && x.GitRepo != nil { + return *x.GitRepo + } + return "" +} + +func (x *ApplyDeployment) GetGitCommitMessage() string { + if x != nil && x.GitCommitMessage != nil { + return *x.GitCommitMessage + } + return "" +} + // DeleteDeployment identifies a deployment to remove from the cluster. // // The deployment and all its pods will be terminated gracefully according to @@ -1860,7 +1909,7 @@ const file_ctrl_v1_cluster_proto_rawDesc = "" + "memory_mib\x18\n" + " \x01(\x03R\tmemoryMib\"+\n" + "\x0eDeleteSentinel\x12\x19\n" + - "\bk8s_name\x18\x01 \x01(\tR\ak8sName\"\xf1\x04\n" + + "\bk8s_name\x18\x01 \x01(\tR\ak8sName\"\xc6\a\n" + "\x0fApplyDeployment\x12#\n" + "\rk8s_namespace\x18\x01 \x01(\tR\fk8sNamespace\x12\x19\n" + "\bk8s_name\x18\x02 \x01(\tR\ak8sName\x12!\n" + @@ -1881,9 +1930,22 @@ const file_ctrl_v1_cluster_proto_rawDesc = "" + "\x04port\x18\x0e \x01(\x05R\x04port\x12'\n" + "\x0fshutdown_signal\x18\x0f \x01(\tR\x0eshutdownSignal\x12%\n" + "\vhealthcheck\x18\x11 \x01(\fH\x01R\vhealthcheck\x88\x01\x01\x12\x15\n" + - "\x06app_id\x18\x12 \x01(\tR\x05appIdB\v\n" + + "\x06app_id\x18\x12 \x01(\tR\x05appId\x12.\n" + + "\x10environment_slug\x18\x15 \x01(\tH\x02R\x0fenvironmentSlug\x88\x01\x01\x12\x1b\n" + + "\x06region\x18\x16 \x01(\tH\x03R\x06region\x88\x01\x01\x12)\n" + + "\x0egit_commit_sha\x18\x17 \x01(\tH\x04R\fgitCommitSha\x88\x01\x01\x12\"\n" + + "\n" + + "git_branch\x18\x18 \x01(\tH\x05R\tgitBranch\x88\x01\x01\x12\x1e\n" + + "\bgit_repo\x18\x19 \x01(\tH\x06R\agitRepo\x88\x01\x01\x121\n" + + "\x12git_commit_message\x18\x1a \x01(\tH\aR\x10gitCommitMessage\x88\x01\x01B\v\n" + "\t_build_idB\x0e\n" + - "\f_healthcheck\"R\n" + + "\f_healthcheckB\x13\n" + + "\x11_environment_slugB\t\n" + + "\a_regionB\x11\n" + + "\x0f_git_commit_shaB\r\n" + + "\v_git_branchB\v\n" + + "\t_git_repoB\x15\n" + + "\x13_git_commit_message\"R\n" + "\x10DeleteDeployment\x12#\n" + "\rk8s_namespace\x18\x01 \x01(\tR\fk8sNamespace\x12\x19\n" + "\bk8s_name\x18\x02 \x01(\tR\ak8sName\"F\n" + diff --git a/pkg/db/deployment_topology_by_id_and_region.sql_generated.go b/pkg/db/deployment_topology_by_id_and_region.sql_generated.go index e7c6825166..24e5308603 100644 --- a/pkg/db/deployment_topology_by_id_and_region.sql_generated.go +++ b/pkg/db/deployment_topology_by_id_and_region.sql_generated.go @@ -32,11 +32,18 @@ SELECT d.command, d.port, d.shutdown_signal, - d.healthcheck + d.healthcheck, + d.git_commit_sha, + d.git_branch, + d.git_commit_message, + e.slug AS environment_slug, + grc.repository_full_name AS git_repo FROM ` + "`" + `deployment_topology` + "`" + ` dt INNER JOIN ` + "`" + `deployments` + "`" + ` d ON dt.deployment_id = d.id INNER JOIN ` + "`" + `workspaces` + "`" + ` w ON d.workspace_id = w.id INNER JOIN ` + "`" + `regions` + "`" + ` r ON dt.region_id = r.id +INNER JOIN ` + "`" + `environments` + "`" + ` e ON d.environment_id = e.id +LEFT JOIN ` + "`" + `github_repo_connections` + "`" + ` grc ON d.app_id = grc.app_id WHERE r.name = ? AND dt.deployment_id = ? LIMIT 1 @@ -67,6 +74,11 @@ type FindDeploymentTopologyByIDAndRegionRow struct { Port int32 `db:"port"` ShutdownSignal DeploymentsShutdownSignal `db:"shutdown_signal"` Healthcheck dbtype.NullHealthcheck `db:"healthcheck"` + GitCommitSha sql.NullString `db:"git_commit_sha"` + GitBranch sql.NullString `db:"git_branch"` + GitCommitMessage sql.NullString `db:"git_commit_message"` + EnvironmentSlug string `db:"environment_slug"` + GitRepo sql.NullString `db:"git_repo"` } // FindDeploymentTopologyByIDAndRegion @@ -90,11 +102,18 @@ type FindDeploymentTopologyByIDAndRegionRow struct { // d.command, // d.port, // d.shutdown_signal, -// d.healthcheck +// d.healthcheck, +// d.git_commit_sha, +// d.git_branch, +// d.git_commit_message, +// e.slug AS environment_slug, +// grc.repository_full_name AS git_repo // FROM `deployment_topology` dt // INNER JOIN `deployments` d ON dt.deployment_id = d.id // INNER JOIN `workspaces` w ON d.workspace_id = w.id // INNER JOIN `regions` r ON dt.region_id = r.id +// INNER JOIN `environments` e ON d.environment_id = e.id +// LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id // WHERE r.name = ? // AND dt.deployment_id = ? // LIMIT 1 @@ -121,6 +140,11 @@ func (q *Queries) FindDeploymentTopologyByIDAndRegion(ctx context.Context, db DB &i.Port, &i.ShutdownSignal, &i.Healthcheck, + &i.GitCommitSha, + &i.GitBranch, + &i.GitCommitMessage, + &i.EnvironmentSlug, + &i.GitRepo, ) return i, err } diff --git a/pkg/db/deployment_topology_list_by_versions.sql_generated.go b/pkg/db/deployment_topology_list_by_versions.sql_generated.go index 56442a175c..005d993646 100644 --- a/pkg/db/deployment_topology_list_by_versions.sql_generated.go +++ b/pkg/db/deployment_topology_list_by_versions.sql_generated.go @@ -14,11 +14,16 @@ const listDeploymentTopologyByRegion = `-- name: ListDeploymentTopologyByRegion SELECT dt.pk, dt.workspace_id, dt.deployment_id, dt.region_id, dt.desired_replicas, dt.version, dt.desired_status, dt.created_at, dt.updated_at, d.pk, d.id, d.k8s_name, d.workspace_id, d.project_id, d.environment_id, d.app_id, d.image, d.build_id, d.git_commit_sha, d.git_branch, d.git_commit_message, d.git_commit_author_handle, d.git_commit_author_avatar_url, d.git_commit_timestamp, d.sentinel_config, d.cpu_millicores, d.memory_mib, d.desired_state, d.encrypted_environment_variables, d.command, d.port, d.shutdown_signal, d.healthcheck, d.pr_number, d.fork_repository_full_name, d.github_deployment_id, d.status, d.created_at, d.updated_at, - w.k8s_namespace + w.k8s_namespace, + e.slug AS environment_slug, + r.name AS region_name, + grc.repository_full_name AS git_repo FROM ` + "`" + `deployment_topology` + "`" + ` dt INNER JOIN ` + "`" + `deployments` + "`" + ` d ON dt.deployment_id = d.id INNER JOIN ` + "`" + `workspaces` + "`" + ` w ON d.workspace_id = w.id INNER JOIN ` + "`" + `regions` + "`" + ` r ON dt.region_id = r.id +INNER JOIN ` + "`" + `environments` + "`" + ` e ON d.environment_id = e.id +LEFT JOIN ` + "`" + `github_repo_connections` + "`" + ` grc ON d.app_id = grc.app_id WHERE r.id = ? AND dt.version > ? ORDER BY dt.version ASC LIMIT ? @@ -34,6 +39,9 @@ type ListDeploymentTopologyByRegionRow struct { DeploymentTopology DeploymentTopology `db:"deployment_topology"` Deployment Deployment `db:"deployment"` K8sNamespace sql.NullString `db:"k8s_namespace"` + EnvironmentSlug string `db:"environment_slug"` + RegionName string `db:"region_name"` + GitRepo sql.NullString `db:"git_repo"` } // ListDeploymentTopologyByRegion returns deployment topologies for a region with version > after_version. @@ -42,11 +50,16 @@ type ListDeploymentTopologyByRegionRow struct { // SELECT // dt.pk, dt.workspace_id, dt.deployment_id, dt.region_id, dt.desired_replicas, dt.version, dt.desired_status, dt.created_at, dt.updated_at, // d.pk, d.id, d.k8s_name, d.workspace_id, d.project_id, d.environment_id, d.app_id, d.image, d.build_id, d.git_commit_sha, d.git_branch, d.git_commit_message, d.git_commit_author_handle, d.git_commit_author_avatar_url, d.git_commit_timestamp, d.sentinel_config, d.cpu_millicores, d.memory_mib, d.desired_state, d.encrypted_environment_variables, d.command, d.port, d.shutdown_signal, d.healthcheck, d.pr_number, d.fork_repository_full_name, d.github_deployment_id, d.status, d.created_at, d.updated_at, -// w.k8s_namespace +// w.k8s_namespace, +// e.slug AS environment_slug, +// r.name AS region_name, +// grc.repository_full_name AS git_repo // FROM `deployment_topology` dt // INNER JOIN `deployments` d ON dt.deployment_id = d.id // INNER JOIN `workspaces` w ON d.workspace_id = w.id // INNER JOIN `regions` r ON dt.region_id = r.id +// INNER JOIN `environments` e ON d.environment_id = e.id +// LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id // WHERE r.id = ? AND dt.version > ? // ORDER BY dt.version ASC // LIMIT ? @@ -100,6 +113,9 @@ func (q *Queries) ListDeploymentTopologyByRegion(ctx context.Context, db DBTX, a &i.Deployment.CreatedAt, &i.Deployment.UpdatedAt, &i.K8sNamespace, + &i.EnvironmentSlug, + &i.RegionName, + &i.GitRepo, ); err != nil { return nil, err } diff --git a/pkg/db/querier_generated.go b/pkg/db/querier_generated.go index 4abf1d52d6..47646ca17f 100644 --- a/pkg/db/querier_generated.go +++ b/pkg/db/querier_generated.go @@ -456,11 +456,18 @@ type Querier interface { // d.command, // d.port, // d.shutdown_signal, - // d.healthcheck + // d.healthcheck, + // d.git_commit_sha, + // d.git_branch, + // d.git_commit_message, + // e.slug AS environment_slug, + // grc.repository_full_name AS git_repo // FROM `deployment_topology` dt // INNER JOIN `deployments` d ON dt.deployment_id = d.id // INNER JOIN `workspaces` w ON d.workspace_id = w.id // INNER JOIN `regions` r ON dt.region_id = r.id + // INNER JOIN `environments` e ON d.environment_id = e.id + // LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id // WHERE r.name = ? // AND dt.deployment_id = ? // LIMIT 1 @@ -2059,11 +2066,16 @@ type Querier interface { // SELECT // dt.pk, dt.workspace_id, dt.deployment_id, dt.region_id, dt.desired_replicas, dt.version, dt.desired_status, dt.created_at, dt.updated_at, // d.pk, d.id, d.k8s_name, d.workspace_id, d.project_id, d.environment_id, d.app_id, d.image, d.build_id, d.git_commit_sha, d.git_branch, d.git_commit_message, d.git_commit_author_handle, d.git_commit_author_avatar_url, d.git_commit_timestamp, d.sentinel_config, d.cpu_millicores, d.memory_mib, d.desired_state, d.encrypted_environment_variables, d.command, d.port, d.shutdown_signal, d.healthcheck, d.pr_number, d.fork_repository_full_name, d.github_deployment_id, d.status, d.created_at, d.updated_at, - // w.k8s_namespace + // w.k8s_namespace, + // e.slug AS environment_slug, + // r.name AS region_name, + // grc.repository_full_name AS git_repo // FROM `deployment_topology` dt // INNER JOIN `deployments` d ON dt.deployment_id = d.id // INNER JOIN `workspaces` w ON d.workspace_id = w.id // INNER JOIN `regions` r ON dt.region_id = r.id + // INNER JOIN `environments` e ON d.environment_id = e.id + // LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id // WHERE r.id = ? AND dt.version > ? // ORDER BY dt.version ASC // LIMIT ? diff --git a/pkg/db/queries/deployment_topology_by_id_and_region.sql b/pkg/db/queries/deployment_topology_by_id_and_region.sql index 35bb57e50f..1d1b406ab7 100644 --- a/pkg/db/queries/deployment_topology_by_id_and_region.sql +++ b/pkg/db/queries/deployment_topology_by_id_and_region.sql @@ -18,11 +18,18 @@ SELECT d.command, d.port, d.shutdown_signal, - d.healthcheck + d.healthcheck, + d.git_commit_sha, + d.git_branch, + d.git_commit_message, + e.slug AS environment_slug, + grc.repository_full_name AS git_repo FROM `deployment_topology` dt INNER JOIN `deployments` d ON dt.deployment_id = d.id INNER JOIN `workspaces` w ON d.workspace_id = w.id INNER JOIN `regions` r ON dt.region_id = r.id +INNER JOIN `environments` e ON d.environment_id = e.id +LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id WHERE r.name = sqlc.arg(region) AND dt.deployment_id = sqlc.arg(deployment_id) LIMIT 1; diff --git a/pkg/db/queries/deployment_topology_list_by_versions.sql b/pkg/db/queries/deployment_topology_list_by_versions.sql index c9a5027ee7..bdd399b175 100644 --- a/pkg/db/queries/deployment_topology_list_by_versions.sql +++ b/pkg/db/queries/deployment_topology_list_by_versions.sql @@ -4,11 +4,16 @@ SELECT sqlc.embed(dt), sqlc.embed(d), - w.k8s_namespace + w.k8s_namespace, + e.slug AS environment_slug, + r.name AS region_name, + grc.repository_full_name AS git_repo FROM `deployment_topology` dt INNER JOIN `deployments` d ON dt.deployment_id = d.id INNER JOIN `workspaces` w ON d.workspace_id = w.id INNER JOIN `regions` r ON dt.region_id = r.id +INNER JOIN `environments` e ON d.environment_id = e.id +LEFT JOIN `github_repo_connections` grc ON d.app_id = grc.app_id WHERE r.id = sqlc.arg(region_id) AND dt.version > sqlc.arg(afterVersion) ORDER BY dt.version ASC LIMIT ?; diff --git a/svc/ctrl/proto/ctrl/v1/cluster.proto b/svc/ctrl/proto/ctrl/v1/cluster.proto index a4b780e182..f342ad65a3 100644 --- a/svc/ctrl/proto/ctrl/v1/cluster.proto +++ b/svc/ctrl/proto/ctrl/v1/cluster.proto @@ -320,6 +320,14 @@ message ApplyDeployment { // app_id identifies the app within the project. // Used for pod labels so Vector can extract it into runtime logs. string app_id = 18; + + // Runtime environment variable fields for user workloads. + optional string environment_slug = 21; + optional string region = 22; + optional string git_commit_sha = 23; + optional string git_branch = 24; + optional string git_repo = 25; + optional string git_commit_message = 26; } // DeleteDeployment identifies a deployment to remove from the cluster. diff --git a/svc/ctrl/services/cluster/rpc_get_desired_deployment_state.go b/svc/ctrl/services/cluster/rpc_get_desired_deployment_state.go index 0eec1352e5..c3ddc43449 100644 --- a/svc/ctrl/services/cluster/rpc_get_desired_deployment_state.go +++ b/svc/ctrl/services/cluster/rpc_get_desired_deployment_state.go @@ -84,6 +84,21 @@ func (s *Service) GetDesiredDeploymentState(ctx context.Context, req *connect.Re Command: deployment.Command, Port: deployment.Port, ShutdownSignal: string(deployment.ShutdownSignal), + EnvironmentSlug: &deployment.EnvironmentSlug, + Region: &deployment.Region, + } + + if deployment.GitCommitSha.Valid { + apply.GitCommitSha = &deployment.GitCommitSha.String + } + if deployment.GitBranch.Valid { + apply.GitBranch = &deployment.GitBranch.String + } + if deployment.GitCommitMessage.Valid { + apply.GitCommitMessage = &deployment.GitCommitMessage.String + } + if deployment.GitRepo.Valid { + apply.GitRepo = &deployment.GitRepo.String } if deployment.Healthcheck.Valid { diff --git a/svc/ctrl/services/cluster/rpc_watch_deployments.go b/svc/ctrl/services/cluster/rpc_watch_deployments.go index 966c2feefb..4fd730e95d 100644 --- a/svc/ctrl/services/cluster/rpc_watch_deployments.go +++ b/svc/ctrl/services/cluster/rpc_watch_deployments.go @@ -155,6 +155,21 @@ func (s *Service) deploymentRowToState(row db.ListDeploymentTopologyByRegionRow) Command: row.Deployment.Command, Port: row.Deployment.Port, ShutdownSignal: string(row.Deployment.ShutdownSignal), + EnvironmentSlug: &row.EnvironmentSlug, + Region: &row.RegionName, + } + + if row.Deployment.GitCommitSha.Valid { + apply.GitCommitSha = &row.Deployment.GitCommitSha.String + } + if row.Deployment.GitBranch.Valid { + apply.GitBranch = &row.Deployment.GitBranch.String + } + if row.Deployment.GitCommitMessage.Valid { + apply.GitCommitMessage = &row.Deployment.GitCommitMessage.String + } + if row.GitRepo.Valid { + apply.GitRepo = &row.GitRepo.String } if row.Deployment.Healthcheck.Valid { diff --git a/svc/krane/internal/deployment/apply.go b/svc/krane/internal/deployment/apply.go index 9e9a7316fa..8929e60926 100644 --- a/svc/krane/internal/deployment/apply.go +++ b/svc/krane/internal/deployment/apply.go @@ -91,10 +91,16 @@ func (c *Controller) ApplyDeployment(ctx context.Context, req *ctrlv1.ApplyDeplo ImagePullPolicy: corev1.PullIfNotPresent, Env: []corev1.EnvVar{ {Name: "PORT", Value: strconv.Itoa(int(req.GetPort()))}, - {Name: "UNKEY_WORKSPACE_ID", Value: req.GetWorkspaceId()}, - {Name: "UNKEY_PROJECT_ID", Value: req.GetProjectId()}, - {Name: "UNKEY_ENVIRONMENT_ID", Value: req.GetEnvironmentId()}, {Name: "UNKEY_DEPLOYMENT_ID", Value: req.GetDeploymentId()}, + {Name: "UNKEY_ENVIRONMENT_SLUG", Value: req.GetEnvironmentSlug()}, + {Name: "UNKEY_REGION", Value: req.GetRegion()}, + {Name: "UNKEY_GIT_COMMIT_SHA", Value: req.GetGitCommitSha()}, + {Name: "UNKEY_GIT_BRANCH", Value: req.GetGitBranch()}, + {Name: "UNKEY_GIT_REPO", Value: req.GetGitRepo()}, + {Name: "UNKEY_GIT_COMMIT_MESSAGE", Value: req.GetGitCommitMessage()}, + {Name: "UNKEY_INSTANCE_ID", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.name"}, + }}, // Override kubelet-injected K8s service env vars with empty strings. // These can't be suppressed via enableServiceLinks, but setting them // explicitly prevents leaking cluster internals to customer code. diff --git a/web/apps/dashboard/gen/proto/ctrl/v1/cluster_pb.ts b/web/apps/dashboard/gen/proto/ctrl/v1/cluster_pb.ts index cc70282a35..13f4269b7d 100644 --- a/web/apps/dashboard/gen/proto/ctrl/v1/cluster_pb.ts +++ b/web/apps/dashboard/gen/proto/ctrl/v1/cluster_pb.ts @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file ctrl/v1/cluster.proto. */ export const file_ctrl_v1_cluster: GenFile = /*@__PURE__*/ - fileDesc("ChVjdHJsL3YxL2NsdXN0ZXIucHJvdG8SB2N0cmwudjEiTgohV2F0Y2hDaWxpdW1OZXR3b3JrUG9saWNpZXNSZXF1ZXN0Eg4KBnJlZ2lvbhgBIAEoCRIZChF2ZXJzaW9uX2xhc3Rfc2VlbhgCIAEoBCJ1ChhBcHBseUNpbGl1bU5ldHdvcmtQb2xpY3kSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCRIgChhjaWxpdW1fbmV0d29ya19wb2xpY3lfaWQYAyABKAkSDgoGcG9saWN5GAQgASgMIkQKGURlbGV0ZUNpbGl1bU5ldHdvcmtQb2xpY3kSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCSKeAQoYQ2lsaXVtTmV0d29ya1BvbGljeVN0YXRlEg8KB3ZlcnNpb24YAyABKAQSMgoFYXBwbHkYASABKAsyIS5jdHJsLnYxLkFwcGx5Q2lsaXVtTmV0d29ya1BvbGljeUgAEjQKBmRlbGV0ZRgCIAEoCzIiLmN0cmwudjEuRGVsZXRlQ2lsaXVtTmV0d29ya1BvbGljeUgAQgcKBXN0YXRlIk0KKUdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGVSZXF1ZXN0EiAKGGNpbGl1bV9uZXR3b3JrX3BvbGljeV9pZBgBIAEoCSI1Ch5HZXREZXNpcmVkU2VudGluZWxTdGF0ZVJlcXVlc3QSEwoLc2VudGluZWxfaWQYASABKAkiOQogR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZVJlcXVlc3QSFQoNZGVwbG95bWVudF9pZBgBIAEoCSK3BAodUmVwb3J0RGVwbG95bWVudFN0YXR1c1JlcXVlc3QSPwoGdXBkYXRlGAEgASgLMi0uY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdC5VcGRhdGVIABI/CgZkZWxldGUYAiABKAsyLS5jdHJsLnYxLlJlcG9ydERlcGxveW1lbnRTdGF0dXNSZXF1ZXN0LkRlbGV0ZUgAGu0CCgZVcGRhdGUSEAoIazhzX25hbWUYASABKAkSSQoJaW5zdGFuY2VzGAIgAygLMjYuY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdC5VcGRhdGUuSW5zdGFuY2UahQIKCEluc3RhbmNlEhAKCGs4c19uYW1lGAEgASgJEg8KB2FkZHJlc3MYAiABKAkSFgoOY3B1X21pbGxpY29yZXMYAyABKAMSEgoKbWVtb3J5X21pYhgEIAEoAxJNCgZzdGF0dXMYBSABKA4yPS5jdHJsLnYxLlJlcG9ydERlcGxveW1lbnRTdGF0dXNSZXF1ZXN0LlVwZGF0ZS5JbnN0YW5jZS5TdGF0dXMiWwoGU3RhdHVzEhYKElNUQVRVU19VTlNQRUNJRklFRBAAEhIKDlNUQVRVU19QRU5ESU5HEAESEgoOU1RBVFVTX1JVTk5JTkcQAhIRCg1TVEFUVVNfRkFJTEVEEAMaGgoGRGVsZXRlEhAKCGs4c19uYW1lGAEgASgJQggKBmNoYW5nZSIgCh5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVzcG9uc2UibAobUmVwb3J0U2VudGluZWxTdGF0dXNSZXF1ZXN0EhAKCGs4c19uYW1lGAEgASgJEhoKEmF2YWlsYWJsZV9yZXBsaWNhcxgCIAEoBRIfCgZoZWFsdGgYAyABKA4yDy5jdHJsLnYxLkhlYWx0aCIeChxSZXBvcnRTZW50aW5lbFN0YXR1c1Jlc3BvbnNlIkQKF1dhdGNoRGVwbG95bWVudHNSZXF1ZXN0Eg4KBnJlZ2lvbhgBIAEoCRIZChF2ZXJzaW9uX2xhc3Rfc2VlbhgCIAEoBCJCChVXYXRjaFNlbnRpbmVsc1JlcXVlc3QSDgoGcmVnaW9uGAEgASgJEhkKEXZlcnNpb25fbGFzdF9zZWVuGAIgASgEIn0KDVNlbnRpbmVsU3RhdGUSDwoHdmVyc2lvbhgDIAEoBBInCgVhcHBseRgBIAEoCzIWLmN0cmwudjEuQXBwbHlTZW50aW5lbEgAEikKBmRlbGV0ZRgCIAEoCzIXLmN0cmwudjEuRGVsZXRlU2VudGluZWxIAEIHCgVzdGF0ZSKDAQoPRGVwbG95bWVudFN0YXRlEg8KB3ZlcnNpb24YAyABKAQSKQoFYXBwbHkYASABKAsyGC5jdHJsLnYxLkFwcGx5RGVwbG95bWVudEgAEisKBmRlbGV0ZRgCIAEoCzIZLmN0cmwudjEuRGVsZXRlRGVwbG95bWVudEgAQgcKBXN0YXRlItUBCg1BcHBseVNlbnRpbmVsEhAKCGs4c19uYW1lGAEgASgJEhQKDHdvcmtzcGFjZV9pZBgCIAEoCRISCgpwcm9qZWN0X2lkGAMgASgJEg4KBmFwcF9pZBgEIAEoCRIWCg5lbnZpcm9ubWVudF9pZBgFIAEoCRITCgtzZW50aW5lbF9pZBgGIAEoCRINCgVpbWFnZRgHIAEoCRIQCghyZXBsaWNhcxgIIAEoBRIWCg5jcHVfbWlsbGljb3JlcxgJIAEoAxISCgptZW1vcnlfbWliGAogASgDIiIKDkRlbGV0ZVNlbnRpbmVsEhAKCGs4c19uYW1lGAEgASgJIp8DCg9BcHBseURlcGxveW1lbnQSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAyABKAkSEgoKcHJvamVjdF9pZBgEIAEoCRIWCg5lbnZpcm9ubWVudF9pZBgFIAEoCRIVCg1kZXBsb3ltZW50X2lkGAYgASgJEg0KBWltYWdlGAcgASgJEhAKCHJlcGxpY2FzGAggASgFEhYKDmNwdV9taWxsaWNvcmVzGAkgASgDEhIKCm1lbW9yeV9taWIYCiABKAMSFQoIYnVpbGRfaWQYCyABKAlIAIgBARInCh9lbmNyeXB0ZWRfZW52aXJvbm1lbnRfdmFyaWFibGVzGAwgASgMEg8KB2NvbW1hbmQYDSADKAkSDAoEcG9ydBgOIAEoBRIXCg9zaHV0ZG93bl9zaWduYWwYDyABKAkSGAoLaGVhbHRoY2hlY2sYESABKAxIAYgBARIOCgZhcHBfaWQYEiABKAlCCwoJX2J1aWxkX2lkQg4KDF9oZWFsdGhjaGVjayI7ChBEZWxldGVEZXBsb3ltZW50EhUKDWs4c19uYW1lc3BhY2UYASABKAkSEAoIazhzX25hbWUYAiABKAkiNAoQSGVhcnRiZWF0UmVxdWVzdBIOCgZyZWdpb24YASABKAkSEAoIcGxhdGZvcm0YAiABKAkiEwoRSGVhcnRiZWF0UmVzcG9uc2UqXQoGSGVhbHRoEhYKEkhFQUxUSF9VTlNQRUNJRklFRBAAEhIKDkhFQUxUSF9IRUFMVEhZEAESFAoQSEVBTFRIX1VOSEVBTFRIWRACEhEKDUhFQUxUSF9QQVVTRUQQAzLsBgoOQ2x1c3RlclNlcnZpY2USUAoQV2F0Y2hEZXBsb3ltZW50cxIgLmN0cmwudjEuV2F0Y2hEZXBsb3ltZW50c1JlcXVlc3QaGC5jdHJsLnYxLkRlcGxveW1lbnRTdGF0ZTABEkoKDldhdGNoU2VudGluZWxzEh4uY3RybC52MS5XYXRjaFNlbnRpbmVsc1JlcXVlc3QaFi5jdHJsLnYxLlNlbnRpbmVsU3RhdGUwARJaChdHZXREZXNpcmVkU2VudGluZWxTdGF0ZRInLmN0cmwudjEuR2V0RGVzaXJlZFNlbnRpbmVsU3RhdGVSZXF1ZXN0GhYuY3RybC52MS5TZW50aW5lbFN0YXRlEmMKFFJlcG9ydFNlbnRpbmVsU3RhdHVzEiQuY3RybC52MS5SZXBvcnRTZW50aW5lbFN0YXR1c1JlcXVlc3QaJS5jdHJsLnYxLlJlcG9ydFNlbnRpbmVsU3RhdHVzUmVzcG9uc2USYAoZR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZRIpLmN0cmwudjEuR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZVJlcXVlc3QaGC5jdHJsLnYxLkRlcGxveW1lbnRTdGF0ZRJpChZSZXBvcnREZXBsb3ltZW50U3RhdHVzEiYuY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdBonLmN0cmwudjEuUmVwb3J0RGVwbG95bWVudFN0YXR1c1Jlc3BvbnNlEm0KGldhdGNoQ2lsaXVtTmV0d29ya1BvbGljaWVzEiouY3RybC52MS5XYXRjaENpbGl1bU5ldHdvcmtQb2xpY2llc1JlcXVlc3QaIS5jdHJsLnYxLkNpbGl1bU5ldHdvcmtQb2xpY3lTdGF0ZTABEnsKIkdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGUSMi5jdHJsLnYxLkdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGVSZXF1ZXN0GiEuY3RybC52MS5DaWxpdW1OZXR3b3JrUG9saWN5U3RhdGUSQgoJSGVhcnRiZWF0EhkuY3RybC52MS5IZWFydGJlYXRSZXF1ZXN0GhouY3RybC52MS5IZWFydGJlYXRSZXNwb25zZUKLAQoLY29tLmN0cmwudjFCDENsdXN0ZXJQcm90b1ABWjFnaXRodWIuY29tL3Vua2V5ZWQvdW5rZXkvZ2VuL3Byb3RvL2N0cmwvdjE7Y3RybHYxogIDQ1hYqgIHQ3RybC5WMcoCB0N0cmxcVjHiAhNDdHJsXFYxXEdQQk1ldGFkYXRh6gIIQ3RybDo6VjFiBnByb3RvMw"); + fileDesc("ChVjdHJsL3YxL2NsdXN0ZXIucHJvdG8SB2N0cmwudjEiTgohV2F0Y2hDaWxpdW1OZXR3b3JrUG9saWNpZXNSZXF1ZXN0Eg4KBnJlZ2lvbhgBIAEoCRIZChF2ZXJzaW9uX2xhc3Rfc2VlbhgCIAEoBCJ1ChhBcHBseUNpbGl1bU5ldHdvcmtQb2xpY3kSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCRIgChhjaWxpdW1fbmV0d29ya19wb2xpY3lfaWQYAyABKAkSDgoGcG9saWN5GAQgASgMIkQKGURlbGV0ZUNpbGl1bU5ldHdvcmtQb2xpY3kSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCSKeAQoYQ2lsaXVtTmV0d29ya1BvbGljeVN0YXRlEg8KB3ZlcnNpb24YAyABKAQSMgoFYXBwbHkYASABKAsyIS5jdHJsLnYxLkFwcGx5Q2lsaXVtTmV0d29ya1BvbGljeUgAEjQKBmRlbGV0ZRgCIAEoCzIiLmN0cmwudjEuRGVsZXRlQ2lsaXVtTmV0d29ya1BvbGljeUgAQgcKBXN0YXRlIk0KKUdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGVSZXF1ZXN0EiAKGGNpbGl1bV9uZXR3b3JrX3BvbGljeV9pZBgBIAEoCSI1Ch5HZXREZXNpcmVkU2VudGluZWxTdGF0ZVJlcXVlc3QSEwoLc2VudGluZWxfaWQYASABKAkiOQogR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZVJlcXVlc3QSFQoNZGVwbG95bWVudF9pZBgBIAEoCSK3BAodUmVwb3J0RGVwbG95bWVudFN0YXR1c1JlcXVlc3QSPwoGdXBkYXRlGAEgASgLMi0uY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdC5VcGRhdGVIABI/CgZkZWxldGUYAiABKAsyLS5jdHJsLnYxLlJlcG9ydERlcGxveW1lbnRTdGF0dXNSZXF1ZXN0LkRlbGV0ZUgAGu0CCgZVcGRhdGUSEAoIazhzX25hbWUYASABKAkSSQoJaW5zdGFuY2VzGAIgAygLMjYuY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdC5VcGRhdGUuSW5zdGFuY2UahQIKCEluc3RhbmNlEhAKCGs4c19uYW1lGAEgASgJEg8KB2FkZHJlc3MYAiABKAkSFgoOY3B1X21pbGxpY29yZXMYAyABKAMSEgoKbWVtb3J5X21pYhgEIAEoAxJNCgZzdGF0dXMYBSABKA4yPS5jdHJsLnYxLlJlcG9ydERlcGxveW1lbnRTdGF0dXNSZXF1ZXN0LlVwZGF0ZS5JbnN0YW5jZS5TdGF0dXMiWwoGU3RhdHVzEhYKElNUQVRVU19VTlNQRUNJRklFRBAAEhIKDlNUQVRVU19QRU5ESU5HEAESEgoOU1RBVFVTX1JVTk5JTkcQAhIRCg1TVEFUVVNfRkFJTEVEEAMaGgoGRGVsZXRlEhAKCGs4c19uYW1lGAEgASgJQggKBmNoYW5nZSIgCh5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVzcG9uc2UibAobUmVwb3J0U2VudGluZWxTdGF0dXNSZXF1ZXN0EhAKCGs4c19uYW1lGAEgASgJEhoKEmF2YWlsYWJsZV9yZXBsaWNhcxgCIAEoBRIfCgZoZWFsdGgYAyABKA4yDy5jdHJsLnYxLkhlYWx0aCIeChxSZXBvcnRTZW50aW5lbFN0YXR1c1Jlc3BvbnNlIkQKF1dhdGNoRGVwbG95bWVudHNSZXF1ZXN0Eg4KBnJlZ2lvbhgBIAEoCRIZChF2ZXJzaW9uX2xhc3Rfc2VlbhgCIAEoBCJCChVXYXRjaFNlbnRpbmVsc1JlcXVlc3QSDgoGcmVnaW9uGAEgASgJEhkKEXZlcnNpb25fbGFzdF9zZWVuGAIgASgEIn0KDVNlbnRpbmVsU3RhdGUSDwoHdmVyc2lvbhgDIAEoBBInCgVhcHBseRgBIAEoCzIWLmN0cmwudjEuQXBwbHlTZW50aW5lbEgAEikKBmRlbGV0ZRgCIAEoCzIXLmN0cmwudjEuRGVsZXRlU2VudGluZWxIAEIHCgVzdGF0ZSKDAQoPRGVwbG95bWVudFN0YXRlEg8KB3ZlcnNpb24YAyABKAQSKQoFYXBwbHkYASABKAsyGC5jdHJsLnYxLkFwcGx5RGVwbG95bWVudEgAEisKBmRlbGV0ZRgCIAEoCzIZLmN0cmwudjEuRGVsZXRlRGVwbG95bWVudEgAQgcKBXN0YXRlItUBCg1BcHBseVNlbnRpbmVsEhAKCGs4c19uYW1lGAEgASgJEhQKDHdvcmtzcGFjZV9pZBgCIAEoCRISCgpwcm9qZWN0X2lkGAMgASgJEg4KBmFwcF9pZBgEIAEoCRIWCg5lbnZpcm9ubWVudF9pZBgFIAEoCRITCgtzZW50aW5lbF9pZBgGIAEoCRINCgVpbWFnZRgHIAEoCRIQCghyZXBsaWNhcxgIIAEoBRIWCg5jcHVfbWlsbGljb3JlcxgJIAEoAxISCgptZW1vcnlfbWliGAogASgDIiIKDkRlbGV0ZVNlbnRpbmVsEhAKCGs4c19uYW1lGAEgASgJIqcFCg9BcHBseURlcGxveW1lbnQSFQoNazhzX25hbWVzcGFjZRgBIAEoCRIQCghrOHNfbmFtZRgCIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAyABKAkSEgoKcHJvamVjdF9pZBgEIAEoCRIWCg5lbnZpcm9ubWVudF9pZBgFIAEoCRIVCg1kZXBsb3ltZW50X2lkGAYgASgJEg0KBWltYWdlGAcgASgJEhAKCHJlcGxpY2FzGAggASgFEhYKDmNwdV9taWxsaWNvcmVzGAkgASgDEhIKCm1lbW9yeV9taWIYCiABKAMSFQoIYnVpbGRfaWQYCyABKAlIAIgBARInCh9lbmNyeXB0ZWRfZW52aXJvbm1lbnRfdmFyaWFibGVzGAwgASgMEg8KB2NvbW1hbmQYDSADKAkSDAoEcG9ydBgOIAEoBRIXCg9zaHV0ZG93bl9zaWduYWwYDyABKAkSGAoLaGVhbHRoY2hlY2sYESABKAxIAYgBARIOCgZhcHBfaWQYEiABKAkSHQoQZW52aXJvbm1lbnRfc2x1ZxgVIAEoCUgCiAEBEhMKBnJlZ2lvbhgWIAEoCUgDiAEBEhsKDmdpdF9jb21taXRfc2hhGBcgASgJSASIAQESFwoKZ2l0X2JyYW5jaBgYIAEoCUgFiAEBEhUKCGdpdF9yZXBvGBkgASgJSAaIAQESHwoSZ2l0X2NvbW1pdF9tZXNzYWdlGBogASgJSAeIAQFCCwoJX2J1aWxkX2lkQg4KDF9oZWFsdGhjaGVja0ITChFfZW52aXJvbm1lbnRfc2x1Z0IJCgdfcmVnaW9uQhEKD19naXRfY29tbWl0X3NoYUINCgtfZ2l0X2JyYW5jaEILCglfZ2l0X3JlcG9CFQoTX2dpdF9jb21taXRfbWVzc2FnZSI7ChBEZWxldGVEZXBsb3ltZW50EhUKDWs4c19uYW1lc3BhY2UYASABKAkSEAoIazhzX25hbWUYAiABKAkiNAoQSGVhcnRiZWF0UmVxdWVzdBIOCgZyZWdpb24YASABKAkSEAoIcGxhdGZvcm0YAiABKAkiEwoRSGVhcnRiZWF0UmVzcG9uc2UqXQoGSGVhbHRoEhYKEkhFQUxUSF9VTlNQRUNJRklFRBAAEhIKDkhFQUxUSF9IRUFMVEhZEAESFAoQSEVBTFRIX1VOSEVBTFRIWRACEhEKDUhFQUxUSF9QQVVTRUQQAzLsBgoOQ2x1c3RlclNlcnZpY2USUAoQV2F0Y2hEZXBsb3ltZW50cxIgLmN0cmwudjEuV2F0Y2hEZXBsb3ltZW50c1JlcXVlc3QaGC5jdHJsLnYxLkRlcGxveW1lbnRTdGF0ZTABEkoKDldhdGNoU2VudGluZWxzEh4uY3RybC52MS5XYXRjaFNlbnRpbmVsc1JlcXVlc3QaFi5jdHJsLnYxLlNlbnRpbmVsU3RhdGUwARJaChdHZXREZXNpcmVkU2VudGluZWxTdGF0ZRInLmN0cmwudjEuR2V0RGVzaXJlZFNlbnRpbmVsU3RhdGVSZXF1ZXN0GhYuY3RybC52MS5TZW50aW5lbFN0YXRlEmMKFFJlcG9ydFNlbnRpbmVsU3RhdHVzEiQuY3RybC52MS5SZXBvcnRTZW50aW5lbFN0YXR1c1JlcXVlc3QaJS5jdHJsLnYxLlJlcG9ydFNlbnRpbmVsU3RhdHVzUmVzcG9uc2USYAoZR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZRIpLmN0cmwudjEuR2V0RGVzaXJlZERlcGxveW1lbnRTdGF0ZVJlcXVlc3QaGC5jdHJsLnYxLkRlcGxveW1lbnRTdGF0ZRJpChZSZXBvcnREZXBsb3ltZW50U3RhdHVzEiYuY3RybC52MS5SZXBvcnREZXBsb3ltZW50U3RhdHVzUmVxdWVzdBonLmN0cmwudjEuUmVwb3J0RGVwbG95bWVudFN0YXR1c1Jlc3BvbnNlEm0KGldhdGNoQ2lsaXVtTmV0d29ya1BvbGljaWVzEiouY3RybC52MS5XYXRjaENpbGl1bU5ldHdvcmtQb2xpY2llc1JlcXVlc3QaIS5jdHJsLnYxLkNpbGl1bU5ldHdvcmtQb2xpY3lTdGF0ZTABEnsKIkdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGUSMi5jdHJsLnYxLkdldERlc2lyZWRDaWxpdW1OZXR3b3JrUG9saWN5U3RhdGVSZXF1ZXN0GiEuY3RybC52MS5DaWxpdW1OZXR3b3JrUG9saWN5U3RhdGUSQgoJSGVhcnRiZWF0EhkuY3RybC52MS5IZWFydGJlYXRSZXF1ZXN0GhouY3RybC52MS5IZWFydGJlYXRSZXNwb25zZUKLAQoLY29tLmN0cmwudjFCDENsdXN0ZXJQcm90b1ABWjFnaXRodWIuY29tL3Vua2V5ZWQvdW5rZXkvZ2VuL3Byb3RvL2N0cmwvdjE7Y3RybHYxogIDQ1hYqgIHQ3RybC5WMcoCB0N0cmxcVjHiAhNDdHJsXFYxXEdQQk1ldGFkYXRh6gIIQ3RybDo6VjFiBnByb3RvMw"); /** * @generated from message ctrl.v1.WatchCiliumNetworkPoliciesRequest @@ -782,6 +782,38 @@ export type ApplyDeployment = Message<"ctrl.v1.ApplyDeployment"> & { * @generated from field: string app_id = 18; */ appId: string; + + /** + * Runtime environment variable fields for user workloads. + * + * @generated from field: optional string environment_slug = 21; + */ + environmentSlug?: string; + + /** + * @generated from field: optional string region = 22; + */ + region?: string; + + /** + * @generated from field: optional string git_commit_sha = 23; + */ + gitCommitSha?: string; + + /** + * @generated from field: optional string git_branch = 24; + */ + gitBranch?: string; + + /** + * @generated from field: optional string git_repo = 25; + */ + gitRepo?: string; + + /** + * @generated from field: optional string git_commit_message = 26; + */ + gitCommitMessage?: string; }; /**