Add compute config to WorkerDeploymentVersionSummary (#9838)

## What changed?
- Add compute config summary for latest and all other version so it is
exposed in `ListWorkerDeployments` and `DescribeWorkerDeployment` APIs.

## Why?
Mainly for UI to show compute provider types.

## How did you test it?
- [x] built
- [ ] run locally and tested manually
- [x] covered by existing tests
- [ ] added new unit test(s)
- [ ] added new functional test(s)

## Potential risks
None
This commit is contained in:
Shahab Tajik
2026-04-08 15:22:08 -07:00
committed by GitHub
parent 41aff845b9
commit 744d3f2efe
45 changed files with 393 additions and 172 deletions

View File

@@ -11,8 +11,8 @@ import (
sync "sync"
unsafe "unsafe"
v12 "go.temporal.io/api/common/v1"
v13 "go.temporal.io/api/compute/v1"
v13 "go.temporal.io/api/common/v1"
v12 "go.temporal.io/api/compute/v1"
v11 "go.temporal.io/api/deployment/v1"
v1 "go.temporal.io/api/enums/v1"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
@@ -331,8 +331,10 @@ type VersionLocalState struct {
// Covers changes through: CreateWorkerDeploymentVersion, UpdateWorkerDeploymentVersionComputeConfig,
// UpdateWorkerDeploymentVersionMetadata.
LastModifierIdentity string `protobuf:"bytes,17,opt,name=last_modifier_identity,json=lastModifierIdentity,proto3" json:"last_modifier_identity,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
// Cached compute config summary, kept in sync with the WCI on each compute config update.
ComputeConfig *v12.ComputeConfigSummary `protobuf:"bytes,18,opt,name=compute_config,json=computeConfig,proto3" json:"compute_config,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *VersionLocalState) Reset() {
@@ -485,6 +487,13 @@ func (x *VersionLocalState) GetLastModifierIdentity() string {
return ""
}
func (x *VersionLocalState) GetComputeConfig() *v12.ComputeConfigSummary {
if x != nil {
return x.ComputeConfig
}
return nil
}
// Data specific to a task queue, from the perspective of a worker deployment version.
type TaskQueueVersionData struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -846,8 +855,11 @@ type WorkerDeploymentVersionSummary struct {
// Request ID used to create this version. Used for idempotency.
// Not synced from the version workflow; only set by the deployment workflow.
CreateRequestId string `protobuf:"bytes,12,opt,name=create_request_id,json=createRequestId,proto3" json:"create_request_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
// Compute config summary for this version. Synced from the version workflow on each compute config update.
// Also set by the deployment workflow at version creation time if a compute config was provided.
ComputeConfig *v12.ComputeConfigSummary `protobuf:"bytes,13,opt,name=compute_config,json=computeConfig,proto3" json:"compute_config,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *WorkerDeploymentVersionSummary) Reset() {
@@ -965,6 +977,13 @@ func (x *WorkerDeploymentVersionSummary) GetCreateRequestId() string {
return ""
}
func (x *WorkerDeploymentVersionSummary) GetComputeConfig() *v12.ComputeConfigSummary {
if x != nil {
return x.ComputeConfig
}
return nil
}
// used as Worker Deployment Version workflow update input:
type RegisterWorkerInVersionArgs struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -1764,11 +1783,12 @@ func (x *StartWorkerDeploymentRequest) GetRequestId() string {
// used as Worker Deployment workflow activity input:
type StartWorkerDeploymentVersionRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
DeploymentName string `protobuf:"bytes,1,opt,name=deployment_name,json=deploymentName,proto3" json:"deployment_name,omitempty"`
BuildId string `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
Identity string `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"`
state protoimpl.MessageState `protogen:"open.v1"`
DeploymentName string `protobuf:"bytes,1,opt,name=deployment_name,json=deploymentName,proto3" json:"deployment_name,omitempty"`
BuildId string `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
Identity string `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"`
ComputeConfig *v12.ComputeConfigSummary `protobuf:"bytes,5,opt,name=compute_config,json=computeConfig,proto3" json:"compute_config,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -1831,6 +1851,13 @@ func (x *StartWorkerDeploymentVersionRequest) GetIdentity() string {
return ""
}
func (x *StartWorkerDeploymentVersionRequest) GetComputeConfig() *v12.ComputeConfigSummary {
if x != nil {
return x.ComputeConfig
}
return nil
}
// used as Worker Deployment Version workflow activity input:
type SyncDeploymentVersionUserDataRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -2110,7 +2137,7 @@ func (x *SyncUnversionedRampActivityResponse) GetTaskQueueMaxVersions() map[stri
// used as Worker Deployment Version workflow update input:
type UpdateVersionMetadataArgs struct {
state protoimpl.MessageState `protogen:"open.v1"`
UpsertEntries map[string]*v12.Payload `protobuf:"bytes,1,rep,name=upsert_entries,json=upsertEntries,proto3" json:"upsert_entries,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
UpsertEntries map[string]*v13.Payload `protobuf:"bytes,1,rep,name=upsert_entries,json=upsertEntries,proto3" json:"upsert_entries,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
RemoveEntries []string `protobuf:"bytes,2,rep,name=remove_entries,json=removeEntries,proto3" json:"remove_entries,omitempty"`
Identity string `protobuf:"bytes,3,opt,name=identity,proto3" json:"identity,omitempty"`
unknownFields protoimpl.UnknownFields
@@ -2147,7 +2174,7 @@ func (*UpdateVersionMetadataArgs) Descriptor() ([]byte, []int) {
return file_temporal_server_api_deployment_v1_message_proto_rawDescGZIP(), []int{30}
}
func (x *UpdateVersionMetadataArgs) GetUpsertEntries() map[string]*v12.Payload {
func (x *UpdateVersionMetadataArgs) GetUpsertEntries() map[string]*v13.Payload {
if x != nil {
return x.UpsertEntries
}
@@ -2453,7 +2480,7 @@ type CreateWorkerDeploymentVersionArgs struct {
RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
// Version string (<deployment_name>.<build_id>)
Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
ComputeConfig *v13.ComputeConfig `protobuf:"bytes,4,opt,name=compute_config,json=computeConfig,proto3" json:"compute_config,omitempty"`
ComputeConfig *v12.ComputeConfig `protobuf:"bytes,4,opt,name=compute_config,json=computeConfig,proto3" json:"compute_config,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -2509,7 +2536,7 @@ func (x *CreateWorkerDeploymentVersionArgs) GetVersion() string {
return ""
}
func (x *CreateWorkerDeploymentVersionArgs) GetComputeConfig() *v13.ComputeConfig {
func (x *CreateWorkerDeploymentVersionArgs) GetComputeConfig() *v12.ComputeConfig {
if x != nil {
return x.ComputeConfig
}
@@ -3477,7 +3504,7 @@ func (x *WorkerDeploymentSummary) GetRampingVersionSummary() *v11.WorkerDeployme
// the Worker Controller Instance client.
type ValidateWorkerControllerInstanceSpecInput struct {
state protoimpl.MessageState `protogen:"open.v1"`
ScalingGroups map[string]*v13.ComputeConfigScalingGroup `protobuf:"bytes,1,rep,name=scaling_groups,json=scalingGroups,proto3" json:"scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
ScalingGroups map[string]*v12.ComputeConfigScalingGroup `protobuf:"bytes,1,rep,name=scaling_groups,json=scalingGroups,proto3" json:"scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -3512,7 +3539,7 @@ func (*ValidateWorkerControllerInstanceSpecInput) Descriptor() ([]byte, []int) {
return file_temporal_server_api_deployment_v1_message_proto_rawDescGZIP(), []int{52}
}
func (x *ValidateWorkerControllerInstanceSpecInput) GetScalingGroups() map[string]*v13.ComputeConfigScalingGroup {
func (x *ValidateWorkerControllerInstanceSpecInput) GetScalingGroups() map[string]*v12.ComputeConfigScalingGroup {
if x != nil {
return x.ScalingGroups
}
@@ -3525,7 +3552,7 @@ type UpdateWorkerControllerInstanceInput struct {
state protoimpl.MessageState `protogen:"open.v1"`
Version *v11.WorkerDeploymentVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"`
UpsertScalingGroups map[string]*v13.ComputeConfigScalingGroupUpdate `protobuf:"bytes,3,rep,name=upsert_scaling_groups,json=upsertScalingGroups,proto3" json:"upsert_scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
UpsertScalingGroups map[string]*v12.ComputeConfigScalingGroupUpdate `protobuf:"bytes,3,rep,name=upsert_scaling_groups,json=upsertScalingGroups,proto3" json:"upsert_scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
RemoveScalingGroups []string `protobuf:"bytes,4,rep,name=remove_scaling_groups,json=removeScalingGroups,proto3" json:"remove_scaling_groups,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
@@ -3575,7 +3602,7 @@ func (x *UpdateWorkerControllerInstanceInput) GetIdentity() string {
return ""
}
func (x *UpdateWorkerControllerInstanceInput) GetUpsertScalingGroups() map[string]*v13.ComputeConfigScalingGroupUpdate {
func (x *UpdateWorkerControllerInstanceInput) GetUpsertScalingGroups() map[string]*v12.ComputeConfigScalingGroupUpdate {
if x != nil {
return x.UpsertScalingGroups
}
@@ -3649,7 +3676,7 @@ type UpdateComputeConfigArgs struct {
Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
// Scaling groups to add or update.
UpsertScalingGroups map[string]*v13.ComputeConfigScalingGroupUpdate `protobuf:"bytes,3,rep,name=upsert_scaling_groups,json=upsertScalingGroups,proto3" json:"upsert_scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
UpsertScalingGroups map[string]*v12.ComputeConfigScalingGroupUpdate `protobuf:"bytes,3,rep,name=upsert_scaling_groups,json=upsertScalingGroups,proto3" json:"upsert_scaling_groups,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
// Names of scaling groups to remove. Names that don't match an existing group are ignored.
RemoveScalingGroups []string `protobuf:"bytes,4,rep,name=remove_scaling_groups,json=removeScalingGroups,proto3" json:"remove_scaling_groups,omitempty"`
unknownFields protoimpl.UnknownFields
@@ -3700,7 +3727,7 @@ func (x *UpdateComputeConfigArgs) GetRequestId() string {
return ""
}
func (x *UpdateComputeConfigArgs) GetUpsertScalingGroups() map[string]*v13.ComputeConfigScalingGroupUpdate {
func (x *UpdateComputeConfigArgs) GetUpsertScalingGroups() map[string]*v12.ComputeConfigScalingGroupUpdate {
if x != nil {
return x.UpsertScalingGroups
}
@@ -4014,7 +4041,7 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" +
"\vupdate_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\n" +
"updateTime\x12\x18\n" +
"\adeleted\x18\x03 \x01(\bR\adeleted\x12L\n" +
"\x06status\x18\x06 \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\"\xea\f\n" +
"\x06status\x18\x06 \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\"\xc0\r\n" +
"\x11VersionLocalState\x12T\n" +
"\aversion\x18\x01 \x01(\v2:.temporal.server.api.deployment.v1.WorkerDeploymentVersionR\aversion\x12;\n" +
"\vcreate_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\n" +
@@ -4034,7 +4061,8 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" +
"\x0fsync_batch_size\x18\v \x01(\x05R\rsyncBatchSize\x12L\n" +
"\x06status\x18\x0e \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\x12'\n" +
"\x0frevision_number\x18\x0f \x01(\x03R\x0erevisionNumber\x124\n" +
"\x16last_modifier_identity\x18\x11 \x01(\tR\x14lastModifierIdentity\x1a\x8e\x01\n" +
"\x16last_modifier_identity\x18\x11 \x01(\tR\x14lastModifierIdentity\x12T\n" +
"\x0ecompute_config\x18\x12 \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\x1a\x8e\x01\n" +
"\x16TaskQueueFamiliesEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\tR\x03key\x12^\n" +
"\x05value\x18\x02 \x01(\v2H.temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyDataR\x05value:\x028\x01\x1a\x88\x02\n" +
@@ -4072,7 +4100,7 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" +
"\x03key\x18\x01 \x01(\tR\x03key\x12M\n" +
"\x05value\x18\x02 \x01(\v27.temporal.server.api.deployment.v1.PropagatingRevisionsR\x05value:\x028\x01\"A\n" +
"\x14PropagatingRevisions\x12)\n" +
"\x10revision_numbers\x18\x01 \x03(\x03R\x0frevisionNumbers\"\xec\x06\n" +
"\x10revision_numbers\x18\x01 \x03(\x03R\x0frevisionNumbers\"\xc2\a\n" +
"\x1eWorkerDeploymentVersionSummary\x12\x18\n" +
"\aversion\x18\x01 \x01(\tR\aversion\x12;\n" +
"\vcreate_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\n" +
@@ -4087,7 +4115,8 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" +
"\x16last_deactivation_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\x14lastDeactivationTime\x12L\n" +
"\x06status\x18\n" +
" \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\x12*\n" +
"\x11create_request_id\x18\f \x01(\tR\x0fcreateRequestId\"\xa7\x02\n" +
"\x11create_request_id\x18\f \x01(\tR\x0fcreateRequestId\x12T\n" +
"\x0ecompute_config\x18\r \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\"\xa7\x02\n" +
"\x1bRegisterWorkerInVersionArgs\x12&\n" +
"\x0ftask_queue_name\x18\x01 \x01(\tR\rtaskQueueName\x12L\n" +
"\x0ftask_queue_type\x18\x02 \x01(\x0e2$.temporal.api.enums.v1.TaskQueueTypeR\rtaskQueueType\x12&\n" +
@@ -4135,13 +4164,14 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" +
"\x1cStartWorkerDeploymentRequest\x12'\n" +
"\x0fdeployment_name\x18\x01 \x01(\tR\x0edeploymentName\x12\x1d\n" +
"\n" +
"request_id\x18\x02 \x01(\tR\trequestId\"\xa4\x01\n" +
"request_id\x18\x02 \x01(\tR\trequestId\"\xfa\x01\n" +
"#StartWorkerDeploymentVersionRequest\x12'\n" +
"\x0fdeployment_name\x18\x01 \x01(\tR\x0edeploymentName\x12\x19\n" +
"\bbuild_id\x18\x02 \x01(\tR\abuildId\x12\x1d\n" +
"\n" +
"request_id\x18\x03 \x01(\tR\trequestId\x12\x1a\n" +
"\bidentity\x18\x04 \x01(\tR\bidentity\"\xb4\x05\n" +
"\bidentity\x18\x04 \x01(\tR\bidentity\x12T\n" +
"\x0ecompute_config\x18\x05 \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\"\xb4\x05\n" +
"$SyncDeploymentVersionUserDataRequest\x12'\n" +
"\x0fdeployment_name\x18\x04 \x01(\tR\x0edeploymentName\x12T\n" +
"\aversion\x18\x01 \x01(\v2:.temporal.server.api.deployment.v1.WorkerDeploymentVersionR\aversion\x12h\n" +
@@ -4401,120 +4431,124 @@ var file_temporal_server_api_deployment_v1_message_proto_goTypes = []any{
(v1.WorkerDeploymentVersionStatus)(0), // 75: temporal.api.enums.v1.WorkerDeploymentVersionStatus
(*v11.VersionDrainageInfo)(nil), // 76: temporal.api.deployment.v1.VersionDrainageInfo
(*v11.VersionMetadata)(nil), // 77: temporal.api.deployment.v1.VersionMetadata
(*v11.RoutingConfig)(nil), // 78: temporal.api.deployment.v1.RoutingConfig
(v1.VersionDrainageStatus)(0), // 79: temporal.api.enums.v1.VersionDrainageStatus
(v1.TaskQueueType)(0), // 80: temporal.api.enums.v1.TaskQueueType
(*v11.WorkerDeploymentVersionInfo_VersionTaskQueueInfo)(nil), // 81: temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo
(*v13.ComputeConfig)(nil), // 82: temporal.api.compute.v1.ComputeConfig
(*v11.WorkerDeploymentInfo_WorkerDeploymentVersionSummary)(nil), // 83: temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
(*v11.WorkerDeploymentVersion)(nil), // 84: temporal.api.deployment.v1.WorkerDeploymentVersion
(*v12.Payload)(nil), // 85: temporal.api.common.v1.Payload
(*v13.ComputeConfigScalingGroup)(nil), // 86: temporal.api.compute.v1.ComputeConfigScalingGroup
(*v13.ComputeConfigScalingGroupUpdate)(nil), // 87: temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
(*v12.ComputeConfigSummary)(nil), // 78: temporal.api.compute.v1.ComputeConfigSummary
(*v11.RoutingConfig)(nil), // 79: temporal.api.deployment.v1.RoutingConfig
(v1.VersionDrainageStatus)(0), // 80: temporal.api.enums.v1.VersionDrainageStatus
(v1.TaskQueueType)(0), // 81: temporal.api.enums.v1.TaskQueueType
(*v11.WorkerDeploymentVersionInfo_VersionTaskQueueInfo)(nil), // 82: temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo
(*v12.ComputeConfig)(nil), // 83: temporal.api.compute.v1.ComputeConfig
(*v11.WorkerDeploymentInfo_WorkerDeploymentVersionSummary)(nil), // 84: temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
(*v11.WorkerDeploymentVersion)(nil), // 85: temporal.api.deployment.v1.WorkerDeploymentVersion
(*v13.Payload)(nil), // 86: temporal.api.common.v1.Payload
(*v12.ComputeConfigScalingGroup)(nil), // 87: temporal.api.compute.v1.ComputeConfigScalingGroup
(*v12.ComputeConfigScalingGroupUpdate)(nil), // 88: temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
}
var file_temporal_server_api_deployment_v1_message_proto_depIdxs = []int32{
0, // 0: temporal.server.api.deployment.v1.DeploymentVersionData.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
74, // 1: temporal.server.api.deployment.v1.DeploymentVersionData.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 2: temporal.server.api.deployment.v1.DeploymentVersionData.current_since_time:type_name -> google.protobuf.Timestamp
74, // 3: temporal.server.api.deployment.v1.DeploymentVersionData.ramping_since_time:type_name -> google.protobuf.Timestamp
75, // 4: temporal.server.api.deployment.v1.DeploymentVersionData.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
74, // 5: temporal.server.api.deployment.v1.WorkerDeploymentVersionData.update_time:type_name -> google.protobuf.Timestamp
75, // 6: temporal.server.api.deployment.v1.WorkerDeploymentVersionData.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
0, // 7: temporal.server.api.deployment.v1.VersionLocalState.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
74, // 8: temporal.server.api.deployment.v1.VersionLocalState.create_time:type_name -> google.protobuf.Timestamp
74, // 9: temporal.server.api.deployment.v1.VersionLocalState.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 10: temporal.server.api.deployment.v1.VersionLocalState.current_since_time:type_name -> google.protobuf.Timestamp
74, // 11: temporal.server.api.deployment.v1.VersionLocalState.ramping_since_time:type_name -> google.protobuf.Timestamp
74, // 12: temporal.server.api.deployment.v1.VersionLocalState.first_activation_time:type_name -> google.protobuf.Timestamp
74, // 13: temporal.server.api.deployment.v1.VersionLocalState.last_current_time:type_name -> google.protobuf.Timestamp
74, // 14: temporal.server.api.deployment.v1.VersionLocalState.last_deactivation_time:type_name -> google.protobuf.Timestamp
76, // 15: temporal.server.api.deployment.v1.VersionLocalState.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
77, // 16: temporal.server.api.deployment.v1.VersionLocalState.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata
59, // 17: temporal.server.api.deployment.v1.VersionLocalState.task_queue_families:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry
75, // 18: temporal.server.api.deployment.v1.VersionLocalState.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
3, // 19: temporal.server.api.deployment.v1.WorkerDeploymentVersionWorkflowArgs.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
7, // 20: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowArgs.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
74, // 21: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.create_time:type_name -> google.protobuf.Timestamp
78, // 22: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
62, // 23: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.versions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry
63, // 24: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.propagating_revisions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry
74, // 25: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.create_time:type_name -> google.protobuf.Timestamp
79, // 26: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus
76, // 27: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
74, // 28: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 29: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.current_since_time:type_name -> google.protobuf.Timestamp
74, // 30: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.ramping_since_time:type_name -> google.protobuf.Timestamp
74, // 31: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.first_activation_time:type_name -> google.protobuf.Timestamp
74, // 32: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_current_time:type_name -> google.protobuf.Timestamp
74, // 33: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_deactivation_time:type_name -> google.protobuf.Timestamp
75, // 34: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
80, // 35: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType
78, // 36: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
80, // 37: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType
0, // 38: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
81, // 39: temporal.server.api.deployment.v1.DescribeVersionFromWorkerDeploymentActivityResult.task_queue_infos:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo
74, // 40: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 41: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.current_since_time:type_name -> google.protobuf.Timestamp
74, // 42: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.ramping_since_time:type_name -> google.protobuf.Timestamp
78, // 43: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
3, // 44: temporal.server.api.deployment.v1.SyncVersionStateResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
9, // 45: temporal.server.api.deployment.v1.SyncVersionStateResponse.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
74, // 46: temporal.server.api.deployment.v1.AddVersionUpdateArgs.create_time:type_name -> google.protobuf.Timestamp
76, // 47: temporal.server.api.deployment.v1.SyncDrainageInfoSignalArgs.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
79, // 48: temporal.server.api.deployment.v1.SyncDrainageStatusSignalArgs.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus
3, // 49: temporal.server.api.deployment.v1.QueryDescribeVersionResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
7, // 50: temporal.server.api.deployment.v1.QueryDescribeWorkerDeploymentResponse.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
0, // 51: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
64, // 52: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.sync:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData
78, // 53: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.update_routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
2, // 54: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.upsert_version_data:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionData
65, // 55: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.TaskQueueMaxVersionsEntry
66, // 56: temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.TaskQueueMaxVersionsEntry
14, // 57: temporal.server.api.deployment.v1.SyncUnversionedRampActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs
67, // 58: temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.TaskQueueMaxVersionsEntry
68, // 59: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.upsert_entries:type_name -> temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry
77, // 60: temporal.server.api.deployment.v1.UpdateVersionMetadataResponse.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata
82, // 61: temporal.server.api.deployment.v1.CreateWorkerDeploymentVersionArgs.compute_config:type_name -> temporal.api.compute.v1.ComputeConfig
69, // 62: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.task_queues_and_types:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry
0, // 63: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.worker_deployment_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
14, // 64: temporal.server.api.deployment.v1.SyncVersionStateActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs
3, // 65: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
9, // 66: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
74, // 67: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.create_time:type_name -> google.protobuf.Timestamp
78, // 68: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
83, // 69: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
83, // 70: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
83, // 71: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
74, // 72: temporal.server.api.deployment.v1.WorkerDeploymentSummary.create_time:type_name -> google.protobuf.Timestamp
78, // 73: temporal.server.api.deployment.v1.WorkerDeploymentSummary.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
83, // 74: temporal.server.api.deployment.v1.WorkerDeploymentSummary.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
83, // 75: temporal.server.api.deployment.v1.WorkerDeploymentSummary.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
83, // 76: temporal.server.api.deployment.v1.WorkerDeploymentSummary.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
71, // 77: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.scaling_groups:type_name -> temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry
84, // 78: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
72, // 79: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry
84, // 80: temporal.server.api.deployment.v1.DeleteWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
73, // 81: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry
7, // 82: temporal.server.api.deployment.v1.ForceCANDeploymentSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
3, // 83: temporal.server.api.deployment.v1.ForceCANVersionSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
60, // 84: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry.value:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData
61, // 85: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.task_queues:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry
4, // 86: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry.value:type_name -> temporal.server.api.deployment.v1.TaskQueueVersionData
9, // 87: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
8, // 88: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry.value:type_name -> temporal.server.api.deployment.v1.PropagatingRevisions
80, // 89: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.types:type_name -> temporal.api.enums.v1.TaskQueueType
1, // 90: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData
85, // 91: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry.value:type_name -> temporal.api.common.v1.Payload
70, // 92: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry.value:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes
80, // 93: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes.types:type_name -> temporal.api.enums.v1.TaskQueueType
86, // 94: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroup
87, // 95: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
87, // 96: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
97, // [97:97] is the sub-list for method output_type
97, // [97:97] is the sub-list for method input_type
97, // [97:97] is the sub-list for extension type_name
97, // [97:97] is the sub-list for extension extendee
0, // [0:97] is the sub-list for field type_name
0, // 0: temporal.server.api.deployment.v1.DeploymentVersionData.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
74, // 1: temporal.server.api.deployment.v1.DeploymentVersionData.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 2: temporal.server.api.deployment.v1.DeploymentVersionData.current_since_time:type_name -> google.protobuf.Timestamp
74, // 3: temporal.server.api.deployment.v1.DeploymentVersionData.ramping_since_time:type_name -> google.protobuf.Timestamp
75, // 4: temporal.server.api.deployment.v1.DeploymentVersionData.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
74, // 5: temporal.server.api.deployment.v1.WorkerDeploymentVersionData.update_time:type_name -> google.protobuf.Timestamp
75, // 6: temporal.server.api.deployment.v1.WorkerDeploymentVersionData.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
0, // 7: temporal.server.api.deployment.v1.VersionLocalState.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
74, // 8: temporal.server.api.deployment.v1.VersionLocalState.create_time:type_name -> google.protobuf.Timestamp
74, // 9: temporal.server.api.deployment.v1.VersionLocalState.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 10: temporal.server.api.deployment.v1.VersionLocalState.current_since_time:type_name -> google.protobuf.Timestamp
74, // 11: temporal.server.api.deployment.v1.VersionLocalState.ramping_since_time:type_name -> google.protobuf.Timestamp
74, // 12: temporal.server.api.deployment.v1.VersionLocalState.first_activation_time:type_name -> google.protobuf.Timestamp
74, // 13: temporal.server.api.deployment.v1.VersionLocalState.last_current_time:type_name -> google.protobuf.Timestamp
74, // 14: temporal.server.api.deployment.v1.VersionLocalState.last_deactivation_time:type_name -> google.protobuf.Timestamp
76, // 15: temporal.server.api.deployment.v1.VersionLocalState.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
77, // 16: temporal.server.api.deployment.v1.VersionLocalState.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata
59, // 17: temporal.server.api.deployment.v1.VersionLocalState.task_queue_families:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry
75, // 18: temporal.server.api.deployment.v1.VersionLocalState.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
78, // 19: temporal.server.api.deployment.v1.VersionLocalState.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary
3, // 20: temporal.server.api.deployment.v1.WorkerDeploymentVersionWorkflowArgs.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
7, // 21: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowArgs.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
74, // 22: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.create_time:type_name -> google.protobuf.Timestamp
79, // 23: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
62, // 24: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.versions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry
63, // 25: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.propagating_revisions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry
74, // 26: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.create_time:type_name -> google.protobuf.Timestamp
80, // 27: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus
76, // 28: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
74, // 29: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 30: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.current_since_time:type_name -> google.protobuf.Timestamp
74, // 31: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.ramping_since_time:type_name -> google.protobuf.Timestamp
74, // 32: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.first_activation_time:type_name -> google.protobuf.Timestamp
74, // 33: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_current_time:type_name -> google.protobuf.Timestamp
74, // 34: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_deactivation_time:type_name -> google.protobuf.Timestamp
75, // 35: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus
78, // 36: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary
81, // 37: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType
79, // 38: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
81, // 39: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType
0, // 40: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
82, // 41: temporal.server.api.deployment.v1.DescribeVersionFromWorkerDeploymentActivityResult.task_queue_infos:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo
74, // 42: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_update_time:type_name -> google.protobuf.Timestamp
74, // 43: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.current_since_time:type_name -> google.protobuf.Timestamp
74, // 44: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.ramping_since_time:type_name -> google.protobuf.Timestamp
79, // 45: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
3, // 46: temporal.server.api.deployment.v1.SyncVersionStateResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
9, // 47: temporal.server.api.deployment.v1.SyncVersionStateResponse.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
74, // 48: temporal.server.api.deployment.v1.AddVersionUpdateArgs.create_time:type_name -> google.protobuf.Timestamp
76, // 49: temporal.server.api.deployment.v1.SyncDrainageInfoSignalArgs.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo
80, // 50: temporal.server.api.deployment.v1.SyncDrainageStatusSignalArgs.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus
3, // 51: temporal.server.api.deployment.v1.QueryDescribeVersionResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
7, // 52: temporal.server.api.deployment.v1.QueryDescribeWorkerDeploymentResponse.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
78, // 53: temporal.server.api.deployment.v1.StartWorkerDeploymentVersionRequest.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary
0, // 54: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
64, // 55: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.sync:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData
79, // 56: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.update_routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
2, // 57: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.upsert_version_data:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionData
65, // 58: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.TaskQueueMaxVersionsEntry
66, // 59: temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.TaskQueueMaxVersionsEntry
14, // 60: temporal.server.api.deployment.v1.SyncUnversionedRampActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs
67, // 61: temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.TaskQueueMaxVersionsEntry
68, // 62: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.upsert_entries:type_name -> temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry
77, // 63: temporal.server.api.deployment.v1.UpdateVersionMetadataResponse.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata
83, // 64: temporal.server.api.deployment.v1.CreateWorkerDeploymentVersionArgs.compute_config:type_name -> temporal.api.compute.v1.ComputeConfig
69, // 65: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.task_queues_and_types:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry
0, // 66: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.worker_deployment_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion
14, // 67: temporal.server.api.deployment.v1.SyncVersionStateActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs
3, // 68: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
9, // 69: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
74, // 70: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.create_time:type_name -> google.protobuf.Timestamp
79, // 71: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
84, // 72: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
84, // 73: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
84, // 74: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
74, // 75: temporal.server.api.deployment.v1.WorkerDeploymentSummary.create_time:type_name -> google.protobuf.Timestamp
79, // 76: temporal.server.api.deployment.v1.WorkerDeploymentSummary.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig
84, // 77: temporal.server.api.deployment.v1.WorkerDeploymentSummary.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
84, // 78: temporal.server.api.deployment.v1.WorkerDeploymentSummary.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
84, // 79: temporal.server.api.deployment.v1.WorkerDeploymentSummary.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary
71, // 80: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.scaling_groups:type_name -> temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry
85, // 81: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
72, // 82: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry
85, // 83: temporal.server.api.deployment.v1.DeleteWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
73, // 84: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry
7, // 85: temporal.server.api.deployment.v1.ForceCANDeploymentSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState
3, // 86: temporal.server.api.deployment.v1.ForceCANVersionSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState
60, // 87: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry.value:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData
61, // 88: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.task_queues:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry
4, // 89: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry.value:type_name -> temporal.server.api.deployment.v1.TaskQueueVersionData
9, // 90: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary
8, // 91: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry.value:type_name -> temporal.server.api.deployment.v1.PropagatingRevisions
81, // 92: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.types:type_name -> temporal.api.enums.v1.TaskQueueType
1, // 93: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData
86, // 94: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry.value:type_name -> temporal.api.common.v1.Payload
70, // 95: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry.value:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes
81, // 96: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes.types:type_name -> temporal.api.enums.v1.TaskQueueType
87, // 97: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroup
88, // 98: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
88, // 99: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate
100, // [100:100] is the sub-list for method output_type
100, // [100:100] is the sub-list for method input_type
100, // [100:100] is the sub-list for extension type_name
100, // [100:100] is the sub-list for extension extendee
0, // [0:100] is the sub-list for field type_name
}
func init() { file_temporal_server_api_deployment_v1_message_proto_init() }

4
go.mod
View File

@@ -18,7 +18,7 @@ require (
github.com/emirpasic/gods v1.18.1
github.com/fatih/color v1.18.0
github.com/go-faker/faker/v4 v4.6.0
github.com/go-jose/go-jose/v4 v4.1.3
github.com/go-jose/go-jose/v4 v4.1.4
github.com/go-sql-driver/mysql v1.9.0
github.com/gocql/gocql v1.7.0
github.com/golang-jwt/jwt/v4 v4.5.2
@@ -60,7 +60,7 @@ require (
go.opentelemetry.io/otel/sdk/metric v1.40.0
go.opentelemetry.io/otel/trace v1.40.0
go.temporal.io/api v1.62.8-0.20260406230818-5423d0dd678a
go.temporal.io/auto-scaled-workers v0.0.0-20260401235702-f2721a623799
go.temporal.io/auto-scaled-workers v0.0.0-20260407181057-edd947d743d2
go.temporal.io/sdk v1.41.1
go.uber.org/fx v1.24.0
go.uber.org/mock v0.6.0

8
go.sum
View File

@@ -153,8 +153,8 @@ github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj2
github.com/go-faker/faker/v4 v4.6.0 h1:6aOPzNptRiDwD14HuAnEtlTa+D1IfFuEHO8+vEFwjTs=
github.com/go-faker/faker/v4 v4.6.0/go.mod h1:ZmrHuVtTTm2Em9e0Du6CJ9CADaLEzGXW62z1YqFH0m0=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -442,8 +442,8 @@ go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOV
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
go.temporal.io/api v1.62.8-0.20260406230818-5423d0dd678a h1:2nCxSSKutK1VP2eA7/lw5/DfHk+UxNtr1GN5KsZTSNo=
go.temporal.io/api v1.62.8-0.20260406230818-5423d0dd678a/go.mod h1:iaxoP/9OXMJcQkETTECfwYq4cw/bj4nwov8b3ZLVnXM=
go.temporal.io/auto-scaled-workers v0.0.0-20260401235702-f2721a623799 h1:M+eqXvIdNCCf5wIX2no7lLuCjdhmqoIKlcPUZIo9aPg=
go.temporal.io/auto-scaled-workers v0.0.0-20260401235702-f2721a623799/go.mod h1:gni0wHhtx7BbY/Hr41ea0JENWQAlWqQbxXqXQ7p2ONo=
go.temporal.io/auto-scaled-workers v0.0.0-20260407181057-edd947d743d2 h1:1hKeH3GyR6YD6LKMHGCZ76t6h1Sgha0hXVQBxWi3dlQ=
go.temporal.io/auto-scaled-workers v0.0.0-20260407181057-edd947d743d2/go.mod h1:T8dnzVPeO+gaUTj9eDgm/lT2lZH4+JXNvrGaQGyVi50=
go.temporal.io/sdk v1.41.1 h1:yOpvsHyDD1lNuwlGBv/SUodCPhjv9nDeC9lLHW/fJUA=
go.temporal.io/sdk v1.41.1/go.mod h1:/InXQT5guZ6AizYzpmzr5avQ/GMgq1ZObcKlKE2AhTc=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=

View File

@@ -147,6 +147,9 @@ message VersionLocalState {
// Covers changes through: CreateWorkerDeploymentVersion, UpdateWorkerDeploymentVersionComputeConfig,
// UpdateWorkerDeploymentVersionMetadata.
string last_modifier_identity = 17;
// Cached compute config summary, kept in sync with the WCI on each compute config update.
temporal.api.compute.v1.ComputeConfigSummary compute_config = 18;
}
// Data specific to a task queue, from the perspective of a worker deployment version.
@@ -226,6 +229,10 @@ message WorkerDeploymentVersionSummary {
// Request ID used to create this version. Used for idempotency.
// Not synced from the version workflow; only set by the deployment workflow.
string create_request_id = 12;
// Compute config summary for this version. Synced from the version workflow on each compute config update.
// Also set by the deployment workflow at version creation time if a compute config was provided.
temporal.api.compute.v1.ComputeConfigSummary compute_config = 13;
}
// used as Worker Deployment Version workflow update input:
@@ -337,6 +344,7 @@ message StartWorkerDeploymentVersionRequest {
string build_id = 2;
string request_id = 3;
string identity = 4;
temporal.api.compute.v1.ComputeConfigSummary compute_config = 5;
}
// used as Worker Deployment Version workflow activity input:

View File

@@ -6,6 +6,7 @@ import (
"errors"
"sync"
computepb "go.temporal.io/api/compute/v1"
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
updatepb "go.temporal.io/api/update/v1"
@@ -275,19 +276,23 @@ func (a *Activities) StartWorkerDeploymentVersionWorkflow(
logger := activity.GetLogger(ctx)
logger.Info("starting worker deployment version workflow", "deploymentName", input.DeploymentName, "buildID", input.BuildId)
startIdentity := "deployment workflow " + activity.GetInfo(ctx).WorkflowExecution.ID
return a.WorkerDeploymentClient.StartWorkerDeploymentVersion(ctx, a.namespace, input.DeploymentName, input.BuildId, startIdentity, input.RequestId, input.GetIdentity())
return a.WorkerDeploymentClient.StartWorkerDeploymentVersion(ctx, a.namespace, input.DeploymentName, input.BuildId, startIdentity, input.RequestId, input.GetIdentity(), input.GetComputeConfig())
}
func (a *Activities) UpdateWorkerControllerInstanceFromDeployment(ctx context.Context, input *deploymentspb.UpdateWorkerControllerInstanceInput) error {
func (a *Activities) UpdateWorkerControllerInstanceFromDeployment(ctx context.Context, input *deploymentspb.UpdateWorkerControllerInstanceInput) (*computepb.ComputeConfigSummary, error) {
upserts := scalingGroupUpdatesToWCI(input.GetUpsertScalingGroups())
if err := a.WorkerControllerInstanceClient.UpdateWorkerControllerInstance(ctx, a.namespace, input.GetVersion(), nil, input.GetIdentity(), upserts, input.GetRemoveScalingGroups()); err != nil {
resp, err := a.WorkerControllerInstanceClient.UpdateWorkerControllerInstance(ctx, a.namespace, input.GetVersion(), nil, input.GetIdentity(), upserts, input.GetRemoveScalingGroups())
if err != nil {
var invalidArgs *serviceerror.InvalidArgument
if errors.As(err, &invalidArgs) {
return temporal.NewApplicationError(err.Error(), errInvalidComputeConfig)
return nil, temporal.NewApplicationError(err.Error(), errInvalidComputeConfig)
}
return err
return nil, err
}
return nil
if resp == nil {
return nil, nil
}
return wciSpecToComputeConfigSummary(resp.Spec), nil
}
func (a *Activities) DeleteWorkerControllerInstanceFromDeployment(ctx context.Context, input *deploymentspb.DeleteWorkerControllerInstanceInput) error {

View File

@@ -165,6 +165,7 @@ type Client interface {
ctx context.Context,
namespaceEntry *namespace.Namespace,
deploymentName, buildID, identity, requestID, modifierIdentity string,
computeConfig *computepb.ComputeConfigSummary,
) error
// Used internally by the Worker Deployment workflow in its SyncWorkerDeploymentVersion Activity
@@ -1346,6 +1347,7 @@ func (d *ClientImpl) StartWorkerDeploymentVersion(
ctx context.Context,
namespaceEntry *namespace.Namespace,
deploymentName, buildID, identity, requestID, modifierIdentity string,
computeConfig *computepb.ComputeConfigSummary,
) (retErr error) {
//revive:disable-next-line:defer
defer d.convertAndRecordError("StartWorkerDeploymentVersion", deploymentName, &retErr, namespaceEntry.Name(), identity)()
@@ -1360,7 +1362,7 @@ func (d *ClientImpl) StartWorkerDeploymentVersion(
}
workflowID := GenerateVersionWorkflowID(deploymentName, buildID)
args := d.makeVersionWorkflowArgs(deploymentName, buildID, namespaceEntry, modifierIdentity, enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CREATED)
args := d.makeVersionWorkflowArgs(deploymentName, buildID, namespaceEntry, modifierIdentity, enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CREATED, computeConfig)
input, err := sdk.PreferProtoDataConverter.ToPayloads(args)
if err != nil {
return err
@@ -1534,7 +1536,12 @@ func (d *ClientImpl) updateWithStartWorkerDeploymentVersion(
}
workflowID := GenerateVersionWorkflowID(deploymentName, buildID)
input, err := sdk.PreferProtoDataConverter.ToPayloads(d.makeVersionWorkflowArgs(deploymentName, buildID, namespaceEntry, "", enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_INACTIVE))
input, err := sdk.PreferProtoDataConverter.ToPayloads(d.makeVersionWorkflowArgs(deploymentName,
buildID,
namespaceEntry,
"",
enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_INACTIVE,
nil))
if err != nil {
return nil, err
}
@@ -1769,6 +1776,7 @@ func (d *ClientImpl) deploymentStateToDeploymentInfo(deploymentName string, stat
LastCurrentTime: v.GetLastCurrentTime(),
LastDeactivationTime: v.GetLastDeactivationTime(),
Status: v.GetStatus(),
ComputeConfig: v.GetComputeConfig(),
})
}
@@ -2017,11 +2025,12 @@ func (d *ClientImpl) makeVersionWorkflowArgs(
namespaceEntry *namespace.Namespace,
identity string,
initialStatus enumspb.WorkerDeploymentVersionStatus,
computeConfig *computepb.ComputeConfigSummary,
) *deploymentspb.WorkerDeploymentVersionWorkflowArgs {
return &deploymentspb.WorkerDeploymentVersionWorkflowArgs{
NamespaceName: namespaceEntry.Name().String(),
NamespaceId: namespaceEntry.ID().String(),
VersionState: makeNewVersionState(deploymentName, buildID, time.Now(), identity, initialStatus, d.getSyncBatchSize()),
VersionState: makeNewVersionState(deploymentName, buildID, time.Now(), identity, initialStatus, computeConfig, d.getSyncBatchSize()),
}
}

View File

@@ -76,6 +76,22 @@ func wciSpecToComputeConfig(spec *wciiface.WorkerControllerInstanceSpec) *comput
return &computepb.ComputeConfig{ScalingGroups: groups}
}
func wciSpecToComputeConfigSummary(spec *wciiface.WorkerControllerInstanceSpec) *computepb.ComputeConfigSummary {
if spec == nil || len(spec.ScalingGroupSpecs) == 0 {
return nil
}
groups := make(map[string]*computepb.ComputeConfigScalingGroupSummary, len(spec.ScalingGroupSpecs))
names := workflow.DeterministicKeys(spec.ScalingGroupSpecs)
for _, name := range names {
sg := spec.ScalingGroupSpecs[name]
groups[name] = &computepb.ComputeConfigScalingGroupSummary{
TaskQueueTypes: sg.TaskTypes,
ProviderType: string(sg.Compute.ProviderType),
}
}
return &computepb.ComputeConfigSummary{ScalingGroups: groups}
}
func scalingGroupsToUpsertUpdates(scalingGroups map[string]*computepb.ComputeConfigScalingGroup) map[string]*computepb.ComputeConfigScalingGroupUpdate {
updates := make(map[string]*computepb.ComputeConfigScalingGroupUpdate, len(scalingGroups))
names := workflow.DeterministicKeys(scalingGroups)

View File

@@ -0,0 +1,6 @@
# Expected workflow counts for replay testing
# Generated by generate_history.sh on Wed Apr 8 14:55:10 PDT 2026
EXPECTED_DEPLOYMENT_WORKFLOWS=19
EXPECTED_VERSION_WORKFLOWS=11
ACTUAL_DEPLOYMENT_WORKFLOWS=19
ACTUAL_VERSION_WORKFLOWS=11

View File

@@ -8,6 +8,7 @@ import (
"time"
commonpb "go.temporal.io/api/common/v1"
computepb "go.temporal.io/api/compute/v1"
deploymentpb "go.temporal.io/api/deployment/v1"
enumspb "go.temporal.io/api/enums/v1"
failurepb "go.temporal.io/api/failure/v1"
@@ -440,11 +441,11 @@ func buildSearchAttributes() *commonpb.SearchAttributes {
}
func makeNewVersionState(
deploymentName,
buildID string,
deploymentName, buildID string,
createTime time.Time,
identity string,
initialStatus enumspb.WorkerDeploymentVersionStatus,
computeConfig *computepb.ComputeConfigSummary,
syncBatchSize int32,
) *deploymentspb.VersionLocalState {
return &deploymentspb.VersionLocalState{
@@ -462,5 +463,6 @@ func makeNewVersionState(
Metadata: nil,
SyncBatchSize: syncBatchSize,
LastModifierIdentity: identity,
ComputeConfig: computeConfig,
}
}

View File

@@ -8,6 +8,7 @@ import (
"sync"
"time"
computepb "go.temporal.io/api/compute/v1"
deploymentpb "go.temporal.io/api/deployment/v1"
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
@@ -198,16 +199,17 @@ func (a *VersionActivities) GetVersionDrainageStatus(ctx context.Context, versio
}, nil
}
func (a *VersionActivities) UpdateWorkerControllerInstance(ctx context.Context, input *deploymentspb.UpdateWorkerControllerInstanceInput) error {
func (a *VersionActivities) UpdateWorkerControllerInstance(ctx context.Context, input *deploymentspb.UpdateWorkerControllerInstanceInput) (*computepb.ComputeConfigSummary, error) {
upserts := scalingGroupUpdatesToWCI(input.GetUpsertScalingGroups())
if err := a.WorkerControllerInstanceClient.UpdateWorkerControllerInstance(ctx, a.namespace, input.GetVersion(), nil, input.GetIdentity(), upserts, input.GetRemoveScalingGroups()); err != nil {
resp, err := a.WorkerControllerInstanceClient.UpdateWorkerControllerInstance(ctx, a.namespace, input.GetVersion(), nil, input.GetIdentity(), upserts, input.GetRemoveScalingGroups())
if err != nil {
var invalidArgs *serviceerror.InvalidArgument
if errors.As(err, &invalidArgs) {
return temporal.NewApplicationError(err.Error(), errInvalidComputeConfig)
return nil, temporal.NewApplicationError(err.Error(), errInvalidComputeConfig)
}
return err
return nil, err
}
return nil
return wciSpecToComputeConfigSummary(resp.Spec), nil
}
func (a *VersionActivities) DeleteWorkerControllerInstance(ctx context.Context, input *deploymentspb.DeleteWorkerControllerInstanceInput) error {

View File

@@ -7,6 +7,7 @@ import (
"github.com/google/uuid"
commonpb "go.temporal.io/api/common/v1"
computepb "go.temporal.io/api/compute/v1"
deploymentpb "go.temporal.io/api/deployment/v1"
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
@@ -387,12 +388,13 @@ func (d *VersionWorkflowRunner) handleUpdateVersionComputeConfig(ctx workflow.Co
BuildId: d.VersionState.Version.BuildId,
}
activityCtx := workflow.WithActivityOptions(ctx, defaultActivityOptions)
var computeConfigSummary *computepb.ComputeConfigSummary
err := workflow.ExecuteActivity(activityCtx, d.a.UpdateWorkerControllerInstance, &deploymentspb.UpdateWorkerControllerInstanceInput{
Version: apiVersion,
Identity: args.GetIdentity(),
UpsertScalingGroups: args.GetUpsertScalingGroups(),
RemoveScalingGroups: args.GetRemoveScalingGroups(),
}).Get(ctx, nil)
}).Get(ctx, &computeConfigSummary)
if err != nil {
var appErr *temporal.ApplicationError
if errors.As(err, &appErr) && appErr.Type() == errInvalidComputeConfig {
@@ -401,8 +403,10 @@ func (d *VersionWorkflowRunner) handleUpdateVersionComputeConfig(ctx workflow.Co
return nil, serviceerror.NewInternalf("update worker controller instance: %v", err)
}
d.VersionState.ComputeConfig = computeConfigSummary
d.VersionState.LastModifierIdentity = args.GetIdentity()
d.setStateChanged()
d.syncSummary(ctx)
return &deploymentspb.UpdateComputeConfigResponse{}, nil
}
@@ -727,8 +731,13 @@ func (d *VersionWorkflowRunner) handleRegisterWorker(ctx workflow.Context, args
func (d *VersionWorkflowRunner) reviveDeleted(ctx workflow.Context) {
// Resetting state to get rid of the info from the past life.
state := makeNewVersionState(d.VersionState.Version.DeploymentName, d.VersionState.Version.BuildId, workflow.Now(ctx), "",
enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_INACTIVE, d.VersionState.SyncBatchSize)
state := makeNewVersionState(d.VersionState.Version.DeploymentName,
d.VersionState.Version.BuildId,
workflow.Now(ctx),
"",
enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_INACTIVE,
nil,
d.VersionState.SyncBatchSize)
d.VersionState = state
d.deleteVersion = false
}
@@ -1002,6 +1011,7 @@ func versionStateToSummary(s *deploymentspb.VersionLocalState) *deploymentspb.Wo
LastCurrentTime: s.LastCurrentTime,
LastDeactivationTime: s.LastDeactivationTime,
Status: s.Status,
ComputeConfig: s.ComputeConfig,
}
}

View File

@@ -2271,7 +2271,10 @@ func (s *VersionWorkflowSuite) Test_UpdateComputeConfig_Success() {
s.env.OnActivity(a.StartWorkerDeploymentWorkflow, mock.Anything, mock.Anything).Return(nil).Maybe()
s.env.RegisterActivity(a.UpdateWorkerControllerInstance)
s.env.OnActivity(a.UpdateWorkerControllerInstance, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(a.UpdateWorkerControllerInstance, mock.Anything, mock.Anything).Return((*computepb.ComputeConfigSummary)(nil), nil).Once()
// Mock external signal to deployment workflow
s.env.OnSignalExternalWorkflow(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe()
s.env.RegisterDelayedCallback(func() {
args := &deploymentspb.UpdateComputeConfigArgs{
@@ -2377,6 +2380,7 @@ func (s *VersionWorkflowSuite) Test_UpdateComputeConfig_UpdateInstanceFailure_Do
s.env.RegisterActivity(a.UpdateWorkerControllerInstance)
s.env.OnActivity(a.UpdateWorkerControllerInstance, mock.Anything, mock.Anything).Return(
(*computepb.ComputeConfigSummary)(nil),
temporal.NewNonRetryableApplicationError("invalid config", errInvalidComputeConfig, nil),
).Maybe()

View File

@@ -7,6 +7,7 @@ import (
"slices"
"github.com/google/uuid"
computepb "go.temporal.io/api/compute/v1"
deploymentpb "go.temporal.io/api/deployment/v1"
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
@@ -118,7 +119,7 @@ func (d *WorkflowRunner) listenToSignals(ctx workflow.Context) {
defer func() { d.signalHandler.processingSignals-- }()
var summary *deploymentspb.WorkerDeploymentVersionSummary
c.Receive(ctx, &summary)
d.syncVersionSummaryFromVersionWorkflow(summary)
d.syncVersionSummaryFromVersionWorkflow(ctx, summary)
d.setStateChanged()
})
d.signalHandler.signalSelector.AddReceive(propagationCompleteChannel, func(c workflow.ReceiveChannel, more bool) {
@@ -138,7 +139,7 @@ func (d *WorkflowRunner) listenToSignals(ctx workflow.Context) {
// syncVersionSummary ensures the version summary in the deployment workflow stays consistent
// with the version workflow. This helps prevent discrepancies if they ever fall out of sync.
func (d *WorkflowRunner) syncVersionSummaryFromVersionWorkflow(summary *deploymentspb.WorkerDeploymentVersionSummary) {
func (d *WorkflowRunner) syncVersionSummaryFromVersionWorkflow(ctx workflow.Context, summary *deploymentspb.WorkerDeploymentVersionSummary) {
existing, ok := d.State.Versions[summary.GetVersion()]
if !ok {
d.logger.Error("received summary for a non-existing version, ignoring it", "version", summary.GetVersion())
@@ -148,6 +149,11 @@ func (d *WorkflowRunner) syncVersionSummaryFromVersionWorkflow(summary *deployme
// Preserve create_request_id since the version workflow doesn't know about it.
summary.CreateRequestId = existing.GetCreateRequestId()
d.State.Versions[summary.GetVersion()] = summary
if workflow.GetVersion(ctx, "update-memo-with-summary", workflow.DefaultVersion, 0) != workflow.DefaultVersion {
if err := d.updateMemo(ctx); err != nil {
d.logger.Error("failed to update memo", "error", err)
}
}
}
// handlePropagationComplete handles the propagation complete signal from version workflows
@@ -555,13 +561,14 @@ func (d *WorkflowRunner) handleCreateWorkerDeploymentVersion(ctx workflow.Contex
// Create or update the Worker Controller Instance for this version.
computeConfig := args.GetComputeConfig()
var computeConfigSummary *computepb.ComputeConfigSummary
if computeConfig != nil {
updateCtx := workflow.WithActivityOptions(ctx, defaultActivityOptions)
err = workflow.ExecuteActivity(updateCtx, d.a.UpdateWorkerControllerInstanceFromDeployment, &deploymentspb.UpdateWorkerControllerInstanceInput{
Version: worker_versioning.ExternalWorkerDeploymentVersionFromVersion(versionObj),
Identity: args.GetIdentity(),
UpsertScalingGroups: scalingGroupsToUpsertUpdates(computeConfig.GetScalingGroups()),
}).Get(ctx, nil)
}).Get(ctx, &computeConfigSummary)
if err != nil {
var appErr *temporal.ApplicationError
if errors.As(err, &appErr) && appErr.Type() == errInvalidComputeConfig {
@@ -578,6 +585,7 @@ func (d *WorkflowRunner) handleCreateWorkerDeploymentVersion(ctx workflow.Contex
BuildId: versionObj.BuildId,
RequestId: args.GetRequestId(),
Identity: args.GetIdentity(),
ComputeConfig: computeConfigSummary,
}).Get(ctx, nil)
if err != nil {
if computeConfig != nil {
@@ -599,6 +607,7 @@ func (d *WorkflowRunner) handleCreateWorkerDeploymentVersion(ctx workflow.Contex
CreateTime: timestamppb.New(workflow.Now(ctx)),
Status: enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CREATED,
CreateRequestId: args.GetRequestId(),
ComputeConfig: computeConfigSummary,
}
d.metrics.Counter(metrics.WorkerDeploymentVersionCreated.Name()).Inc(1)
@@ -1743,5 +1752,6 @@ func (d *WorkflowRunner) getWorkerDeploymentInfoVersionSummary(versionSummary *d
FirstActivationTime: versionSummary.GetFirstActivationTime(),
LastCurrentTime: versionSummary.GetLastCurrentTime(),
LastDeactivationTime: versionSummary.GetLastDeactivationTime(),
ComputeConfig: versionSummary.GetComputeConfig(),
}
}

View File

@@ -1434,7 +1434,7 @@ func (s *WorkerDeploymentSuite) Test_CreateWorkerDeploymentVersion_WithComputeCo
s.env.RegisterActivity(a.UpdateWorkerControllerInstanceFromDeployment)
updateCalled := false
s.env.OnActivity(a.UpdateWorkerControllerInstanceFromDeployment, mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) {
s.env.OnActivity(a.UpdateWorkerControllerInstanceFromDeployment, mock.Anything, mock.Anything).Return((*computepb.ComputeConfigSummary)(nil), nil).Run(func(args mock.Arguments) {
updateCalled = true
}).Once()
@@ -1539,6 +1539,7 @@ func (s *WorkerDeploymentSuite) Test_CreateWorkerDeploymentVersion_UpdateWorkerC
var a *Activities
s.env.RegisterActivity(a.UpdateWorkerControllerInstanceFromDeployment)
s.env.OnActivity(a.UpdateWorkerControllerInstanceFromDeployment, mock.Anything, mock.Anything).Return(
(*computepb.ComputeConfigSummary)(nil),
temporal.NewNonRetryableApplicationError("controller update failed", errInvalidComputeConfig, nil),
).Once()

View File

@@ -1326,6 +1326,63 @@ func (s *DeploymentVersionSuite) TestUpdateComputeConfig_Success() {
},
}, info.GetComputeConfig()))
}, 10*time.Second, 500*time.Millisecond)
// Verify the compute config summary is reflected in DescribeWorkerDeployment version summaries.
s.EventuallyWithT(func(t *assert.CollectT) {
a := require.New(t)
descDeployResp, err := s.FrontendClient().DescribeWorkerDeployment(ctx, &workflowservice.DescribeWorkerDeploymentRequest{
Namespace: s.Namespace().String(),
DeploymentName: tv.DeploymentSeries(),
})
a.NoError(err)
var versionSummary *deploymentpb.WorkerDeploymentInfo_WorkerDeploymentVersionSummary
for _, vs := range descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries() {
if vs.GetVersion() == tv.DeploymentVersionString() { //nolint:staticcheck // SA1019: worker versioning v0.31
versionSummary = vs
break
}
}
a.NotNil(versionSummary, "version %s not found in DescribeWorkerDeployment", tv.DeploymentVersionString())
a.True(proto.Equal(&computepb.ComputeConfigSummary{
ScalingGroups: map[string]*computepb.ComputeConfigScalingGroupSummary{
"sg1": {
ProviderType: validProvider.GetType(),
},
"sg2": {
TaskQueueTypes: []enumspb.TaskQueueType{enumspb.TASK_QUEUE_TYPE_ACTIVITY},
ProviderType: validProvider.GetType(),
},
},
}, versionSummary.GetComputeConfig()))
}, 10*time.Second, 500*time.Millisecond)
// Verify the compute config summary is reflected in ListWorkerDeployments latest version summary.
s.EventuallyWithT(func(t *assert.CollectT) {
a := require.New(t)
listResp, err := s.FrontendClient().ListWorkerDeployments(ctx, &workflowservice.ListWorkerDeploymentsRequest{
Namespace: s.Namespace().String(),
})
a.NoError(err)
var found *workflowservice.ListWorkerDeploymentsResponse_WorkerDeploymentSummary
for _, d := range listResp.GetWorkerDeployments() {
if d.GetName() == tv.DeploymentSeries() {
found = d
break
}
}
a.NotNil(found, "deployment %s not found in ListWorkerDeployments", tv.DeploymentSeries())
a.True(proto.Equal(&computepb.ComputeConfigSummary{
ScalingGroups: map[string]*computepb.ComputeConfigScalingGroupSummary{
"sg1": {
ProviderType: validProvider.GetType(),
},
"sg2": {
TaskQueueTypes: []enumspb.TaskQueueType{enumspb.TASK_QUEUE_TYPE_ACTIVITY},
ProviderType: validProvider.GetType(),
},
},
}, found.GetLatestVersionSummary().GetComputeConfig()))
}, 60*time.Second, 500*time.Millisecond)
}
func (s *DeploymentVersionSuite) TestUpdateComputeConfig_UpdateExistingGroup() {
@@ -1481,6 +1538,31 @@ func (s *DeploymentVersionSuite) TestUpdateComputeConfig_InvalidProvider() {
var invalidArg *serviceerror.InvalidArgument
s.ErrorAs(err, &invalidArg)
s.Contains(invalidArg.Message, "invalid compute provider type")
// Verify compute config summary is unchanged — the failed update should not have added sg2.
s.EventuallyWithT(func(t *assert.CollectT) {
a := require.New(t)
descDeployResp, err := s.FrontendClient().DescribeWorkerDeployment(ctx, &workflowservice.DescribeWorkerDeploymentRequest{
Namespace: s.Namespace().String(),
DeploymentName: tv.DeploymentSeries(),
})
a.NoError(err)
var versionSummary *deploymentpb.WorkerDeploymentInfo_WorkerDeploymentVersionSummary
for _, vs := range descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries() {
if vs.GetVersion() == tv.DeploymentVersionString() { //nolint:staticcheck // SA1019: worker versioning v0.31
versionSummary = vs
break
}
}
a.NotNil(versionSummary, "version %s not found in deployment summaries", tv.DeploymentVersionString())
a.True(proto.Equal(&computepb.ComputeConfigSummary{
ScalingGroups: map[string]*computepb.ComputeConfigScalingGroupSummary{
"sg1": {
ProviderType: computeprovider.TestInvokeComputeProviderValidComputeProvider().GetType(),
},
},
}, versionSummary.GetComputeConfig()))
}, 10*time.Second, 500*time.Millisecond)
}
func (s *DeploymentVersionSuite) TestUpdateComputeConfig_DeletedVersion() {
@@ -3867,7 +3949,7 @@ func (s *DeploymentVersionSuite) TestCreateWorkerDeploymentVersion_Success() {
a.Equal(identity, descResp.GetWorkerDeploymentVersionInfo().GetLastModifierIdentity())
}, 10*time.Second, 500*time.Millisecond)
// Verify the version shows up in deployment's version summaries with CREATED status
// Verify the version shows up in deployment's version summaries with CREATED status and correct compute config summary.
s.EventuallyWithT(func(t *assert.CollectT) {
a := require.New(t)
descDeployResp, err := s.FrontendClient().DescribeWorkerDeployment(ctx, &workflowservice.DescribeWorkerDeploymentRequest{
@@ -3876,8 +3958,40 @@ func (s *DeploymentVersionSuite) TestCreateWorkerDeploymentVersion_Success() {
})
a.NoError(err)
a.Len(descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries(), 1)
a.Equal(tv.DeploymentVersionStringV32(), worker_versioning.ExternalWorkerDeploymentVersionToString(descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries()[0].GetDeploymentVersion()))
a.Equal(enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CREATED, descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries()[0].GetStatus())
versionSummary := descDeployResp.GetWorkerDeploymentInfo().GetVersionSummaries()[0]
a.Equal(tv.DeploymentVersionStringV32(), worker_versioning.ExternalWorkerDeploymentVersionToString(versionSummary.GetDeploymentVersion()))
a.Equal(enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CREATED, versionSummary.GetStatus())
a.True(proto.Equal(&computepb.ComputeConfigSummary{
ScalingGroups: map[string]*computepb.ComputeConfigScalingGroupSummary{
"sg1": {
ProviderType: computeConfig.GetScalingGroups()["sg1"].GetProvider().GetType(),
},
},
}, versionSummary.GetComputeConfig()))
}, 10*time.Second, 500*time.Millisecond)
// Verify the compute config summary is reflected in ListWorkerDeployments latest version summary.
s.EventuallyWithT(func(t *assert.CollectT) {
a := require.New(t)
listResp, err := s.FrontendClient().ListWorkerDeployments(ctx, &workflowservice.ListWorkerDeploymentsRequest{
Namespace: s.Namespace().String(),
})
a.NoError(err)
var found *workflowservice.ListWorkerDeploymentsResponse_WorkerDeploymentSummary
for _, d := range listResp.GetWorkerDeployments() {
if d.GetName() == deploymentName {
found = d
break
}
}
a.NotNil(found, "deployment %s not found in ListWorkerDeployments", deploymentName)
a.True(proto.Equal(&computepb.ComputeConfigSummary{
ScalingGroups: map[string]*computepb.ComputeConfigScalingGroupSummary{
"sg1": {
ProviderType: computeConfig.GetScalingGroups()["sg1"].GetProvider().GetType(),
},
},
}, found.GetLatestVersionSummary().GetComputeConfig()))
}, 10*time.Second, 500*time.Millisecond)
}