diff --git a/api/deployment/v1/message.pb.go b/api/deployment/v1/message.pb.go index 90636c71c1f..34c10c21998 100644 --- a/api/deployment/v1/message.pb.go +++ b/api/deployment/v1/message.pb.go @@ -333,6 +333,8 @@ type VersionLocalState struct { LastModifierIdentity string `protobuf:"bytes,17,opt,name=last_modifier_identity,json=lastModifierIdentity,proto3" json:"last_modifier_identity,omitempty"` // 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"` + // Cached compute status, updated when WCI signals this version workflow. + ComputeStatus *v11.ComputeStatus `protobuf:"bytes,19,opt,name=compute_status,json=computeStatus,proto3" json:"compute_status,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -494,6 +496,13 @@ func (x *VersionLocalState) GetComputeConfig() *v12.ComputeConfigSummary { return nil } +func (x *VersionLocalState) GetComputeStatus() *v11.ComputeStatus { + if x != nil { + return x.ComputeStatus + } + 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"` @@ -858,6 +867,8 @@ type WorkerDeploymentVersionSummary struct { // 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"` + // Compute status for this version. Synced from the version workflow when WCI signals a status change. + ComputeStatus *v11.ComputeStatus `protobuf:"bytes,14,opt,name=compute_status,json=computeStatus,proto3" json:"compute_status,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -984,6 +995,13 @@ func (x *WorkerDeploymentVersionSummary) GetComputeConfig() *v12.ComputeConfigSu return nil } +func (x *WorkerDeploymentVersionSummary) GetComputeStatus() *v11.ComputeStatus { + if x != nil { + return x.ComputeStatus + } + return nil +} + // used as Worker Deployment Version workflow update input: type RegisterWorkerInVersionArgs struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -4088,7 +4106,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\"\xc0\r\n" + + "\x06status\x18\x06 \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\"\x92\x0e\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" + @@ -4109,7 +4127,8 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" + "\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\x12T\n" + - "\x0ecompute_config\x18\x12 \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\x1a\x8e\x01\n" + + "\x0ecompute_config\x18\x12 \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\x12P\n" + + "\x0ecompute_status\x18\x13 \x01(\v2).temporal.api.deployment.v1.ComputeStatusR\rcomputeStatus\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" + @@ -4147,7 +4166,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\"\xc2\a\n" + + "\x10revision_numbers\x18\x01 \x03(\x03R\x0frevisionNumbers\"\x94\b\n" + "\x1eWorkerDeploymentVersionSummary\x12\x18\n" + "\aversion\x18\x01 \x01(\tR\aversion\x12;\n" + "\vcreate_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\n" + @@ -4163,7 +4182,8 @@ const file_temporal_server_api_deployment_v1_message_proto_rawDesc = "" + "\x06status\x18\n" + " \x01(\x0e24.temporal.api.enums.v1.WorkerDeploymentVersionStatusR\x06status\x12*\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" + + "\x0ecompute_config\x18\r \x01(\v2-.temporal.api.compute.v1.ComputeConfigSummaryR\rcomputeConfig\x12P\n" + + "\x0ecompute_status\x18\x0e \x01(\v2).temporal.api.deployment.v1.ComputeStatusR\rcomputeStatus\"\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" + @@ -4482,16 +4502,17 @@ var file_temporal_server_api_deployment_v1_message_proto_goTypes = []any{ (*v11.VersionDrainageInfo)(nil), // 77: temporal.api.deployment.v1.VersionDrainageInfo (*v11.VersionMetadata)(nil), // 78: temporal.api.deployment.v1.VersionMetadata (*v12.ComputeConfigSummary)(nil), // 79: temporal.api.compute.v1.ComputeConfigSummary - (*v11.RoutingConfig)(nil), // 80: temporal.api.deployment.v1.RoutingConfig - (v1.VersionDrainageStatus)(0), // 81: temporal.api.enums.v1.VersionDrainageStatus - (v1.TaskQueueType)(0), // 82: temporal.api.enums.v1.TaskQueueType - (*v11.WorkerDeploymentVersionInfo_VersionTaskQueueInfo)(nil), // 83: temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo - (*v12.ComputeConfig)(nil), // 84: temporal.api.compute.v1.ComputeConfig - (*v11.WorkerDeploymentInfo_WorkerDeploymentVersionSummary)(nil), // 85: temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - (*v11.WorkerDeploymentVersion)(nil), // 86: temporal.api.deployment.v1.WorkerDeploymentVersion - (*v13.Payload)(nil), // 87: temporal.api.common.v1.Payload - (*v12.ComputeConfigScalingGroup)(nil), // 88: temporal.api.compute.v1.ComputeConfigScalingGroup - (*v12.ComputeConfigScalingGroupUpdate)(nil), // 89: temporal.api.compute.v1.ComputeConfigScalingGroupUpdate + (*v11.ComputeStatus)(nil), // 80: temporal.api.deployment.v1.ComputeStatus + (*v11.RoutingConfig)(nil), // 81: temporal.api.deployment.v1.RoutingConfig + (v1.VersionDrainageStatus)(0), // 82: temporal.api.enums.v1.VersionDrainageStatus + (v1.TaskQueueType)(0), // 83: temporal.api.enums.v1.TaskQueueType + (*v11.WorkerDeploymentVersionInfo_VersionTaskQueueInfo)(nil), // 84: temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo + (*v12.ComputeConfig)(nil), // 85: temporal.api.compute.v1.ComputeConfig + (*v11.WorkerDeploymentInfo_WorkerDeploymentVersionSummary)(nil), // 86: temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + (*v11.WorkerDeploymentVersion)(nil), // 87: temporal.api.deployment.v1.WorkerDeploymentVersion + (*v13.Payload)(nil), // 88: temporal.api.common.v1.Payload + (*v12.ComputeConfigScalingGroup)(nil), // 89: temporal.api.compute.v1.ComputeConfigScalingGroup + (*v12.ComputeConfigScalingGroupUpdate)(nil), // 90: 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 @@ -4514,92 +4535,94 @@ var file_temporal_server_api_deployment_v1_message_proto_depIdxs = []int32{ 60, // 17: temporal.server.api.deployment.v1.VersionLocalState.task_queue_families:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry 76, // 18: temporal.server.api.deployment.v1.VersionLocalState.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus 79, // 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 - 75, // 22: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.create_time:type_name -> google.protobuf.Timestamp - 80, // 23: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 63, // 24: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.versions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry - 64, // 25: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.propagating_revisions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry - 75, // 26: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.create_time:type_name -> google.protobuf.Timestamp - 81, // 27: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus - 77, // 28: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo - 75, // 29: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.routing_update_time:type_name -> google.protobuf.Timestamp - 75, // 30: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.current_since_time:type_name -> google.protobuf.Timestamp - 75, // 31: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.ramping_since_time:type_name -> google.protobuf.Timestamp - 75, // 32: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.first_activation_time:type_name -> google.protobuf.Timestamp - 75, // 33: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_current_time:type_name -> google.protobuf.Timestamp - 75, // 34: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_deactivation_time:type_name -> google.protobuf.Timestamp - 76, // 35: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus - 79, // 36: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary - 82, // 37: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 80, // 38: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 82, // 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 - 83, // 41: temporal.server.api.deployment.v1.DescribeVersionFromWorkerDeploymentActivityResult.task_queue_infos:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo - 75, // 42: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_update_time:type_name -> google.protobuf.Timestamp - 75, // 43: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.current_since_time:type_name -> google.protobuf.Timestamp - 75, // 44: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.ramping_since_time:type_name -> google.protobuf.Timestamp - 80, // 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 - 75, // 48: temporal.server.api.deployment.v1.AddVersionUpdateArgs.create_time:type_name -> google.protobuf.Timestamp - 77, // 49: temporal.server.api.deployment.v1.SyncDrainageInfoSignalArgs.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo - 81, // 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 - 79, // 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 - 65, // 55: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.sync:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData - 80, // 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 - 66, // 58: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.TaskQueueMaxVersionsEntry - 67, // 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 - 68, // 61: temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.TaskQueueMaxVersionsEntry - 69, // 62: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.upsert_entries:type_name -> temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry - 78, // 63: temporal.server.api.deployment.v1.UpdateVersionMetadataResponse.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata - 84, // 64: temporal.server.api.deployment.v1.CreateWorkerDeploymentVersionArgs.compute_config:type_name -> temporal.api.compute.v1.ComputeConfig - 70, // 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 - 75, // 70: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.create_time:type_name -> google.protobuf.Timestamp - 80, // 71: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 85, // 72: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 85, // 73: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 85, // 74: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 75, // 75: temporal.server.api.deployment.v1.WorkerDeploymentSummary.create_time:type_name -> google.protobuf.Timestamp - 80, // 76: temporal.server.api.deployment.v1.WorkerDeploymentSummary.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 85, // 77: temporal.server.api.deployment.v1.WorkerDeploymentSummary.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 85, // 78: temporal.server.api.deployment.v1.WorkerDeploymentSummary.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 85, // 79: temporal.server.api.deployment.v1.WorkerDeploymentSummary.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary - 72, // 80: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.scaling_groups:type_name -> temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry - 86, // 81: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion - 73, // 82: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry - 86, // 83: temporal.server.api.deployment.v1.DeleteWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion - 74, // 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 - 80, // 87: temporal.server.api.deployment.v1.DemoteVersionSignalArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 61, // 88: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry.value:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData - 62, // 89: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.task_queues:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry - 4, // 90: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry.value:type_name -> temporal.server.api.deployment.v1.TaskQueueVersionData - 9, // 91: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary - 8, // 92: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry.value:type_name -> temporal.server.api.deployment.v1.PropagatingRevisions - 82, // 93: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.types:type_name -> temporal.api.enums.v1.TaskQueueType - 1, // 94: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData - 87, // 95: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry.value:type_name -> temporal.api.common.v1.Payload - 71, // 96: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry.value:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes - 82, // 97: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes.types:type_name -> temporal.api.enums.v1.TaskQueueType - 88, // 98: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroup - 89, // 99: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate - 89, // 100: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate - 101, // [101:101] is the sub-list for method output_type - 101, // [101:101] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 80, // 20: temporal.server.api.deployment.v1.VersionLocalState.compute_status:type_name -> temporal.api.deployment.v1.ComputeStatus + 3, // 21: temporal.server.api.deployment.v1.WorkerDeploymentVersionWorkflowArgs.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState + 7, // 22: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowArgs.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState + 75, // 23: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.create_time:type_name -> google.protobuf.Timestamp + 81, // 24: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 63, // 25: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.versions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry + 64, // 26: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.propagating_revisions:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry + 75, // 27: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.create_time:type_name -> google.protobuf.Timestamp + 82, // 28: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus + 77, // 29: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo + 75, // 30: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.routing_update_time:type_name -> google.protobuf.Timestamp + 75, // 31: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.current_since_time:type_name -> google.protobuf.Timestamp + 75, // 32: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.ramping_since_time:type_name -> google.protobuf.Timestamp + 75, // 33: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.first_activation_time:type_name -> google.protobuf.Timestamp + 75, // 34: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_current_time:type_name -> google.protobuf.Timestamp + 75, // 35: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.last_deactivation_time:type_name -> google.protobuf.Timestamp + 76, // 36: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.status:type_name -> temporal.api.enums.v1.WorkerDeploymentVersionStatus + 79, // 37: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary + 80, // 38: temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary.compute_status:type_name -> temporal.api.deployment.v1.ComputeStatus + 83, // 39: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 81, // 40: temporal.server.api.deployment.v1.RegisterWorkerInVersionArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 83, // 41: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 0, // 42: temporal.server.api.deployment.v1.RegisterWorkerInWorkerDeploymentArgs.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 84, // 43: temporal.server.api.deployment.v1.DescribeVersionFromWorkerDeploymentActivityResult.task_queue_infos:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersionInfo.VersionTaskQueueInfo + 75, // 44: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_update_time:type_name -> google.protobuf.Timestamp + 75, // 45: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.current_since_time:type_name -> google.protobuf.Timestamp + 75, // 46: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.ramping_since_time:type_name -> google.protobuf.Timestamp + 81, // 47: temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 3, // 48: temporal.server.api.deployment.v1.SyncVersionStateResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState + 9, // 49: temporal.server.api.deployment.v1.SyncVersionStateResponse.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary + 75, // 50: temporal.server.api.deployment.v1.AddVersionUpdateArgs.create_time:type_name -> google.protobuf.Timestamp + 77, // 51: temporal.server.api.deployment.v1.SyncDrainageInfoSignalArgs.drainage_info:type_name -> temporal.api.deployment.v1.VersionDrainageInfo + 82, // 52: temporal.server.api.deployment.v1.SyncDrainageStatusSignalArgs.drainage_status:type_name -> temporal.api.enums.v1.VersionDrainageStatus + 3, // 53: temporal.server.api.deployment.v1.QueryDescribeVersionResponse.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState + 7, // 54: temporal.server.api.deployment.v1.QueryDescribeWorkerDeploymentResponse.state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState + 79, // 55: temporal.server.api.deployment.v1.StartWorkerDeploymentVersionRequest.compute_config:type_name -> temporal.api.compute.v1.ComputeConfigSummary + 0, // 56: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 65, // 57: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.sync:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData + 81, // 58: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.update_routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 2, // 59: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.upsert_version_data:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionData + 66, // 60: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataResponse.TaskQueueMaxVersionsEntry + 67, // 61: temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.CheckWorkerDeploymentUserDataPropagationRequest.TaskQueueMaxVersionsEntry + 14, // 62: temporal.server.api.deployment.v1.SyncUnversionedRampActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs + 68, // 63: temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.task_queue_max_versions:type_name -> temporal.server.api.deployment.v1.SyncUnversionedRampActivityResponse.TaskQueueMaxVersionsEntry + 69, // 64: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.upsert_entries:type_name -> temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry + 78, // 65: temporal.server.api.deployment.v1.UpdateVersionMetadataResponse.metadata:type_name -> temporal.api.deployment.v1.VersionMetadata + 85, // 66: temporal.server.api.deployment.v1.CreateWorkerDeploymentVersionArgs.compute_config:type_name -> temporal.api.compute.v1.ComputeConfig + 70, // 67: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.task_queues_and_types:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry + 0, // 68: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.worker_deployment_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 14, // 69: temporal.server.api.deployment.v1.SyncVersionStateActivityArgs.update_args:type_name -> temporal.server.api.deployment.v1.SyncVersionStateUpdateArgs + 3, // 70: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.version_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState + 9, // 71: temporal.server.api.deployment.v1.SyncVersionStateActivityResult.summary:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary + 75, // 72: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.create_time:type_name -> google.protobuf.Timestamp + 81, // 73: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 86, // 74: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 86, // 75: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 86, // 76: temporal.server.api.deployment.v1.WorkerDeploymentWorkflowMemo.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 75, // 77: temporal.server.api.deployment.v1.WorkerDeploymentSummary.create_time:type_name -> google.protobuf.Timestamp + 81, // 78: temporal.server.api.deployment.v1.WorkerDeploymentSummary.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 86, // 79: temporal.server.api.deployment.v1.WorkerDeploymentSummary.latest_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 86, // 80: temporal.server.api.deployment.v1.WorkerDeploymentSummary.current_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 86, // 81: temporal.server.api.deployment.v1.WorkerDeploymentSummary.ramping_version_summary:type_name -> temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary + 72, // 82: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.scaling_groups:type_name -> temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry + 87, // 83: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion + 73, // 84: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry + 87, // 85: temporal.server.api.deployment.v1.DeleteWorkerControllerInstanceInput.version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion + 74, // 86: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.upsert_scaling_groups:type_name -> temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry + 7, // 87: temporal.server.api.deployment.v1.ForceCANDeploymentSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentLocalState + 3, // 88: temporal.server.api.deployment.v1.ForceCANVersionSignalArgs.override_state:type_name -> temporal.server.api.deployment.v1.VersionLocalState + 81, // 89: temporal.server.api.deployment.v1.DemoteVersionSignalArgs.routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 61, // 90: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamiliesEntry.value:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData + 62, // 91: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.task_queues:type_name -> temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry + 4, // 92: temporal.server.api.deployment.v1.VersionLocalState.TaskQueueFamilyData.TaskQueuesEntry.value:type_name -> temporal.server.api.deployment.v1.TaskQueueVersionData + 9, // 93: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.VersionsEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionSummary + 8, // 94: temporal.server.api.deployment.v1.WorkerDeploymentLocalState.PropagatingRevisionsEntry.value:type_name -> temporal.server.api.deployment.v1.PropagatingRevisions + 83, // 95: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.types:type_name -> temporal.api.enums.v1.TaskQueueType + 1, // 96: temporal.server.api.deployment.v1.SyncDeploymentVersionUserDataRequest.SyncUserData.data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData + 88, // 97: temporal.server.api.deployment.v1.UpdateVersionMetadataArgs.UpsertEntriesEntry.value:type_name -> temporal.api.common.v1.Payload + 71, // 98: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueuesAndTypesEntry.value:type_name -> temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes + 83, // 99: temporal.server.api.deployment.v1.CheckTaskQueuesHavePollersActivityArgs.TaskQueueTypes.types:type_name -> temporal.api.enums.v1.TaskQueueType + 89, // 100: temporal.server.api.deployment.v1.ValidateWorkerControllerInstanceSpecInput.ScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroup + 90, // 101: temporal.server.api.deployment.v1.UpdateWorkerControllerInstanceInput.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate + 90, // 102: temporal.server.api.deployment.v1.UpdateComputeConfigArgs.UpsertScalingGroupsEntry.value:type_name -> temporal.api.compute.v1.ComputeConfigScalingGroupUpdate + 103, // [103:103] is the sub-list for method output_type + 103, // [103:103] is the sub-list for method input_type + 103, // [103:103] is the sub-list for extension type_name + 103, // [103:103] is the sub-list for extension extendee + 0, // [0:103] is the sub-list for field type_name } func init() { file_temporal_server_api_deployment_v1_message_proto_init() } diff --git a/common/worker_versioning/worker_versioning.go b/common/worker_versioning/worker_versioning.go index 9be76a58421..a8dd8a81654 100644 --- a/common/worker_versioning/worker_versioning.go +++ b/common/worker_versioning/worker_versioning.go @@ -59,6 +59,11 @@ const ( WorkerDeploymentVersionWorkflowIDInitialSize = len(WorkerDeploymentVersionWorkflowIDPrefix) + len(WorkerDeploymentVersionDelimiter) // 39 WorkerDeploymentNameFieldName = "WorkerDeploymentName" WorkerDeploymentBuildIDFieldName = "BuildID" + + // SignalSyncValidationStatus is sent by the WCI workflow to the version workflow + // when ValidationStatus changes, so the deployment workflow can maintain an + // up-to-date connectivity summary in its memo. + SignalSyncValidationStatus = "sync-validation-status" ) // FormatPinnedVersionNotInTaskQueueError formats the error message when a pinned version diff --git a/go.mod b/go.mod index f7e01ee1ae4..62c92a1de7e 100644 --- a/go.mod +++ b/go.mod @@ -64,8 +64,8 @@ require ( go.opentelemetry.io/otel/sdk v1.43.0 go.opentelemetry.io/otel/sdk/metric v1.43.0 go.opentelemetry.io/otel/trace v1.43.0 - go.temporal.io/api v1.62.15-0.20260615235047-378792ab2240 - go.temporal.io/auto-scaled-workers v0.0.0-20260407181057-edd947d743d2 + go.temporal.io/api v1.62.15-0.20260622232249-060670b1b866 + go.temporal.io/auto-scaled-workers v0.0.0-20260622220320-9b1e3849116d go.temporal.io/sdk v1.41.1 go.uber.org/fx v1.24.0 go.uber.org/goleak v1.3.0 diff --git a/go.sum b/go.sum index fdb33780b70..294812aea97 100644 --- a/go.sum +++ b/go.sum @@ -471,10 +471,10 @@ go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.3.0 h1:R go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.3.0/go.mod h1:I89cynRj8y+383o7tEQVg2SVA6SRgDVIouWPUVXjx0U= go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.3.0 h1:CQvJSldHRUN6Z8jsUeYv8J0lXRvygALXIzsmAeCcZE0= go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.3.0/go.mod h1:xSQ+mEfJe/GjK1LXEyVOoSI1N9JV9ZI923X5kup43W4= -go.temporal.io/api v1.62.15-0.20260615235047-378792ab2240 h1:Up/CNfkScGxN1TdrGZ3ez+0k6MIIhuhlbBgdZnrPhm0= -go.temporal.io/api v1.62.15-0.20260615235047-378792ab2240/go.mod h1:0k75tRljEuELWGeXjEZZO7zYqBln4+1FrG6+IMOMy7Q= -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/api v1.62.15-0.20260622232249-060670b1b866 h1:VRS5gok7O0T64Irinc37h/hD/Dtzpt2bB7OolUUUTTc= +go.temporal.io/api v1.62.15-0.20260622232249-060670b1b866/go.mod h1:0k75tRljEuELWGeXjEZZO7zYqBln4+1FrG6+IMOMy7Q= +go.temporal.io/auto-scaled-workers v0.0.0-20260622220320-9b1e3849116d h1:f7+FCJHSrYWz9zvJp2OxKo8Fu/dsBUdnZZA+m5CEOS0= +go.temporal.io/auto-scaled-workers v0.0.0-20260622220320-9b1e3849116d/go.mod h1:HOnbQTZCW18EPcutFHTkZrDcGO4tUjQ8N2pjDyrGhrY= 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= diff --git a/proto/internal/temporal/server/api/deployment/v1/message.proto b/proto/internal/temporal/server/api/deployment/v1/message.proto index f0dfd8a2f5c..bfe3be0429c 100644 --- a/proto/internal/temporal/server/api/deployment/v1/message.proto +++ b/proto/internal/temporal/server/api/deployment/v1/message.proto @@ -150,6 +150,9 @@ message VersionLocalState { // Cached compute config summary, kept in sync with the WCI on each compute config update. temporal.api.compute.v1.ComputeConfigSummary compute_config = 18; + + // Cached compute status, updated when WCI signals this version workflow. + temporal.api.deployment.v1.ComputeStatus compute_status = 19; } // Data specific to a task queue, from the perspective of a worker deployment version. @@ -233,6 +236,9 @@ message WorkerDeploymentVersionSummary { // 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; + + // Compute status for this version. Synced from the version workflow when WCI signals a status change. + temporal.api.deployment.v1.ComputeStatus compute_status = 14; } // used as Worker Deployment Version workflow update input: diff --git a/service/worker/workerdeployment/client.go b/service/worker/workerdeployment/client.go index e0c76958fab..ab1a04dba85 100644 --- a/service/worker/workerdeployment/client.go +++ b/service/worker/workerdeployment/client.go @@ -630,6 +630,7 @@ func (d *ClientImpl) DescribeWorkerDeployment( if err != nil { return nil, nil, err } + return dInfo, queryResponse.GetState().GetConflictToken(), nil } @@ -1798,6 +1799,7 @@ func (d *ClientImpl) deploymentStateToDeploymentInfo(deploymentName string, stat LastDeactivationTime: v.GetLastDeactivationTime(), Status: v.GetStatus(), ComputeConfig: v.GetComputeConfig(), + ComputeStatus: v.GetComputeStatus(), }) } diff --git a/service/worker/workerdeployment/compute_util.go b/service/worker/workerdeployment/compute_util.go index 33637f93aaf..bf904969987 100644 --- a/service/worker/workerdeployment/compute_util.go +++ b/service/worker/workerdeployment/compute_util.go @@ -2,8 +2,10 @@ package workerdeployment import ( computepb "go.temporal.io/api/compute/v1" + deploymentpb "go.temporal.io/api/deployment/v1" wciiface "go.temporal.io/auto-scaled-workers/wci/workflow/iface" "go.temporal.io/sdk/workflow" + "google.golang.org/protobuf/types/known/timestamppb" ) func computeConfigScalingGroupsToWCISpec(scalingGroups map[string]*computepb.ComputeConfigScalingGroup) *wciiface.WorkerControllerInstanceSpec { @@ -103,3 +105,18 @@ func scalingGroupsToUpsertUpdates(scalingGroups map[string]*computepb.ComputeCon } return updates } + +// wciValidationStatusToComputeStatus converts a WCI ValidationStatus to the public ComputeStatus proto. +// A successful validation results in an empty error_message; a failed validation sets the error_message. +func wciValidationStatusToComputeStatus(vs *wciiface.ValidationStatus) *deploymentpb.ComputeStatus { + if vs == nil { + return nil + } + pv := &deploymentpb.ComputeStatus_ProviderValidationStatus{ + LastCheckTime: timestamppb.New(vs.LastValidationTime), + } + if vs.Status == wciiface.ValidationResultFailed { + pv.ErrorMessage = vs.ErrMessage + } + return &deploymentpb.ComputeStatus{ProviderValidation: pv} +} diff --git a/service/worker/workerdeployment/compute_util_test.go b/service/worker/workerdeployment/compute_util_test.go index ef0479a95fb..5d8560a39c9 100644 --- a/service/worker/workerdeployment/compute_util_test.go +++ b/service/worker/workerdeployment/compute_util_test.go @@ -2,8 +2,10 @@ package workerdeployment import ( "testing" + "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" computepb "go.temporal.io/api/compute/v1" enumspb "go.temporal.io/api/enums/v1" wciiface "go.temporal.io/auto-scaled-workers/wci/workflow/iface" @@ -49,3 +51,28 @@ func TestComputeConfigScalingGroupsToWCISpec_WithComputeAndScaling(t *testing.T) assert.Equal(t, wciiface.ComputeProviderType("aws-ecs"), g2.Compute.ProviderType) assert.Nil(t, g2.Scaling, "no scaler means nil scaling spec") } + +func TestWciValidationStatusToComputeStatus_Nil(t *testing.T) { + t.Parallel() + require.Nil(t, wciValidationStatusToComputeStatus(nil)) +} + +func TestWciValidationStatusToComputeStatus_Success(t *testing.T) { + t.Parallel() + ts := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) + result := wciValidationStatusToComputeStatus(wciiface.NewValidationStatusSuccess(ts)) + require.NotNil(t, result) + require.NotNil(t, result.ProviderValidation) + require.Empty(t, result.ProviderValidation.ErrorMessage) + require.Equal(t, ts, result.ProviderValidation.LastCheckTime.AsTime()) +} + +func TestWciValidationStatusToComputeStatus_Failed(t *testing.T) { + t.Parallel() + ts := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) + result := wciValidationStatusToComputeStatus(wciiface.NewValidationStatusFailed(ts, "lambda unreachable")) + require.NotNil(t, result) + require.NotNil(t, result.ProviderValidation) + require.Equal(t, "lambda unreachable", result.ProviderValidation.ErrorMessage) + require.Equal(t, ts, result.ProviderValidation.LastCheckTime.AsTime()) +} diff --git a/service/worker/workerdeployment/version_workflow.go b/service/worker/workerdeployment/version_workflow.go index 85d51821d83..16cb306a070 100644 --- a/service/worker/workerdeployment/version_workflow.go +++ b/service/worker/workerdeployment/version_workflow.go @@ -11,6 +11,7 @@ import ( deploymentpb "go.temporal.io/api/deployment/v1" enumspb "go.temporal.io/api/enums/v1" "go.temporal.io/api/serviceerror" + wciiface "go.temporal.io/auto-scaled-workers/wci/workflow/iface" sdkclient "go.temporal.io/sdk/client" sdklog "go.temporal.io/sdk/log" "go.temporal.io/sdk/temporal" @@ -227,6 +228,20 @@ func (d *VersionWorkflowRunner) listenToSignals(ctx workflow.Context) { }) } + // Version gate for sync-validation-status signal to prevent NDEs during rollback + if workflow.GetVersion(ctx, "sync-validation-status-signal", workflow.DefaultVersion, 0) >= 0 { + syncValidationStatusChannel := workflow.GetSignalChannel(ctx, worker_versioning.SignalSyncValidationStatus) + d.signalHandler.signalSelector.AddReceive(syncValidationStatusChannel, func(c workflow.ReceiveChannel, more bool) { + d.signalHandler.processingSignals++ + defer func() { d.signalHandler.processingSignals-- }() + + var vs wciiface.ValidationStatus + c.Receive(ctx, &vs) + d.VersionState.ComputeStatus = wciValidationStatusToComputeStatus(&vs) + d.syncSummary(ctx) // propagate updated ComputeStatus to deployment workflow + }) + } + // Keep waiting for signals, when it's time to CaN the main goroutine will exit. for { d.signalHandler.signalSelector.Select(ctx) @@ -1056,6 +1071,7 @@ func versionStateToSummary(s *deploymentspb.VersionLocalState) *deploymentspb.Wo LastDeactivationTime: s.LastDeactivationTime, Status: s.Status, ComputeConfig: s.ComputeConfig, + ComputeStatus: s.ComputeStatus, } } diff --git a/service/worker/workerdeployment/version_workflow_test.go b/service/worker/workerdeployment/version_workflow_test.go index fcb4f119321..19d72a16aef 100644 --- a/service/worker/workerdeployment/version_workflow_test.go +++ b/service/worker/workerdeployment/version_workflow_test.go @@ -12,6 +12,7 @@ import ( computepb "go.temporal.io/api/compute/v1" deploymentpb "go.temporal.io/api/deployment/v1" enumspb "go.temporal.io/api/enums/v1" + wciiface "go.temporal.io/auto-scaled-workers/wci/workflow/iface" "go.temporal.io/sdk/temporal" "go.temporal.io/sdk/testsuite" "go.temporal.io/sdk/workflow" @@ -2604,3 +2605,97 @@ func (s *VersionWorkflowSuite) Test_ReactivateVersion_IgnoredWhenNotDrainedOrIna s.True(s.env.IsWorkflowCompleted()) } + +// Test_SyncValidationStatus_SuccessValidation verifies that a successful WCI validation signal +// sets ComputeStatus with an empty error message and propagates it to the deployment workflow. +func (s *VersionWorkflowSuite) Test_SyncValidationStatus_SuccessValidation() { + tv := testvars.New(s.T()) + now := timestamppb.New(time.Now()) + validationTime := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) + + var a *VersionActivities + s.env.RegisterActivity(a.StartWorkerDeploymentWorkflow) + s.env.OnActivity(a.StartWorkerDeploymentWorkflow, mock.Anything, mock.Anything).Return(nil).Maybe() + s.env.OnSignalExternalWorkflow(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe() + + s.env.RegisterDelayedCallback(func() { + s.env.SignalWorkflow(worker_versioning.SignalSyncValidationStatus, wciiface.NewValidationStatusSuccess(validationTime)) + + s.env.RegisterDelayedCallback(func() { + queryResp := &deploymentspb.QueryDescribeVersionResponse{} + val, err := s.env.QueryWorkflow(QueryDescribeVersion) + s.Require().NoError(err) + s.Require().NoError(val.Get(queryResp)) + + cs := queryResp.VersionState.ComputeStatus + s.Require().NotNil(cs) + s.Require().NotNil(cs.ProviderValidation) + s.Empty(cs.ProviderValidation.ErrorMessage) + s.Equal(validationTime, cs.ProviderValidation.LastCheckTime.AsTime()) + }, 10*time.Millisecond) + }, 10*time.Millisecond) + + s.env.ExecuteWorkflow(WorkerDeploymentVersionWorkflowType, &deploymentspb.WorkerDeploymentVersionWorkflowArgs{ + NamespaceName: tv.NamespaceName().String(), + NamespaceId: tv.NamespaceID().String(), + VersionState: &deploymentspb.VersionLocalState{ + Version: &deploymentspb.WorkerDeploymentVersion{ + DeploymentName: tv.DeploymentSeries(), + BuildId: tv.BuildID(), + }, + Status: enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CURRENT, + CurrentSinceTime: now, + SyncBatchSize: int32(s.workerDeploymentClient.getSyncBatchSize()), + StartedDeploymentWorkflow: true, + }, + }) + + s.True(s.env.IsWorkflowCompleted()) +} + +// Test_SyncValidationStatus_FailedValidation verifies that a failed WCI validation signal +// sets ComputeStatus with the error message and propagates it to the deployment workflow. +func (s *VersionWorkflowSuite) Test_SyncValidationStatus_FailedValidation() { + tv := testvars.New(s.T()) + now := timestamppb.New(time.Now()) + validationTime := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) + + var a *VersionActivities + s.env.RegisterActivity(a.StartWorkerDeploymentWorkflow) + s.env.OnActivity(a.StartWorkerDeploymentWorkflow, mock.Anything, mock.Anything).Return(nil).Maybe() + s.env.OnSignalExternalWorkflow(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe() + + s.env.RegisterDelayedCallback(func() { + s.env.SignalWorkflow(worker_versioning.SignalSyncValidationStatus, wciiface.NewValidationStatusFailed(validationTime, "lambda unreachable")) + + s.env.RegisterDelayedCallback(func() { + queryResp := &deploymentspb.QueryDescribeVersionResponse{} + val, err := s.env.QueryWorkflow(QueryDescribeVersion) + s.Require().NoError(err) + s.Require().NoError(val.Get(queryResp)) + + cs := queryResp.VersionState.ComputeStatus + s.Require().NotNil(cs) + s.Require().NotNil(cs.ProviderValidation) + s.Equal("lambda unreachable", cs.ProviderValidation.ErrorMessage) + s.Equal(validationTime, cs.ProviderValidation.LastCheckTime.AsTime()) + }, 10*time.Millisecond) + }, 10*time.Millisecond) + + s.env.ExecuteWorkflow(WorkerDeploymentVersionWorkflowType, &deploymentspb.WorkerDeploymentVersionWorkflowArgs{ + NamespaceName: tv.NamespaceName().String(), + NamespaceId: tv.NamespaceID().String(), + VersionState: &deploymentspb.VersionLocalState{ + Version: &deploymentspb.WorkerDeploymentVersion{ + DeploymentName: tv.DeploymentSeries(), + BuildId: tv.BuildID(), + }, + Status: enumspb.WORKER_DEPLOYMENT_VERSION_STATUS_CURRENT, + CurrentSinceTime: now, + SyncBatchSize: int32(s.workerDeploymentClient.getSyncBatchSize()), + StartedDeploymentWorkflow: true, + }, + }) + + s.True(s.env.IsWorkflowCompleted()) +} diff --git a/service/worker/workerdeployment/workflow.go b/service/worker/workerdeployment/workflow.go index e6978accefa..17700137b09 100644 --- a/service/worker/workerdeployment/workflow.go +++ b/service/worker/workerdeployment/workflow.go @@ -1822,5 +1822,6 @@ func (d *WorkflowRunner) getWorkerDeploymentInfoVersionSummary(versionSummary *d LastCurrentTime: versionSummary.GetLastCurrentTime(), LastDeactivationTime: versionSummary.GetLastDeactivationTime(), ComputeConfig: versionSummary.GetComputeConfig(), + ComputeStatus: versionSummary.GetComputeStatus(), } }