Skip to content

Commit b3604f9

Browse files
committed
Add versioning override
1 parent 4f62b9a commit b3604f9

File tree

15 files changed

+175
-6
lines changed

15 files changed

+175
-6
lines changed

temporalio/lib/temporalio.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require 'temporalio/version'
4+
require 'temporalio/versioning_override'
45

56
# Temporal Ruby SDK. See the README at https://github.com/temporalio/sdk-ruby.
67
module Temporalio

temporalio/lib/temporalio/client.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
require 'temporalio/retry_policy'
2323
require 'temporalio/runtime'
2424
require 'temporalio/search_attributes'
25+
require 'temporalio/versioning_override'
2526
require 'temporalio/workflow/definition'
2627

2728
module Temporalio
@@ -239,6 +240,7 @@ def start_workflow(
239240
search_attributes: nil,
240241
start_delay: nil,
241242
request_eager_start: false,
243+
versioning_override: nil,
242244
rpc_options: nil
243245
)
244246
@impl.start_workflow(Interceptor::StartWorkflowInput.new(
@@ -260,6 +262,7 @@ def start_workflow(
260262
start_delay:,
261263
request_eager_start:,
262264
headers: {},
265+
versioning_override:,
263266
rpc_options:
264267
))
265268
end
@@ -316,9 +319,11 @@ def execute_workflow(
316319
search_attributes: nil,
317320
start_delay: nil,
318321
request_eager_start: false,
322+
versioning_override: nil,
323+
follow_runs: true,
319324
rpc_options: nil
320325
)
321-
start_workflow(
326+
handle = start_workflow(
322327
workflow,
323328
*args,
324329
id:,
@@ -336,8 +341,10 @@ def execute_workflow(
336341
search_attributes:,
337342
start_delay:,
338343
request_eager_start:,
344+
versioning_override:,
339345
rpc_options:
340-
).result
346+
)
347+
follow_runs ? handle.result : handle
341348
end
342349

343350
# Get a workflow handle to an existing workflow by its ID.

temporalio/lib/temporalio/client/interceptor.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def intercept_client(next_interceptor)
3737
:start_delay,
3838
:request_eager_start,
3939
:headers,
40+
:versioning_override,
4041
:rpc_options
4142
)
4243

temporalio/lib/temporalio/internal/client/implementation.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ def start_workflow(input)
6969
user_metadata: ProtoUtils.to_user_metadata(
7070
input.static_summary, input.static_details, @client.data_converter
7171
),
72-
header: ProtoUtils.headers_to_proto(input.headers, @client.data_converter)
72+
header: ProtoUtils.headers_to_proto(input.headers, @client.data_converter),
73+
versioning_override: input.versioning_override&._to_proto
7374
)
7475

7576
# Send request

temporalio/lib/temporalio/internal/worker/workflow_instance.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def self.new_completion_with_failure(run_id:, error:, failure_converter:, payloa
5757
:pending_external_signals, :pending_external_cancels, :in_progress_handlers, :payload_converter,
5858
:failure_converter, :cancellation, :continue_as_new_suggested, :current_deployment_version,
5959
:current_history_length, :current_history_size, :replaying, :random,
60-
:signal_handlers, :query_handlers, :update_handlers, :context_frozen, :assert_valid_local_history
60+
:signal_handlers, :query_handlers, :update_handlers, :context_frozen, :assert_valid_local_activity
6161
attr_accessor :io_enabled, :current_details
6262

6363
def initialize(details)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# frozen_string_literal: true
2+
3+
require 'temporalio/worker_deployment_version'
4+
5+
module Temporalio
6+
# Base class for version overrides that can be provided in start workflow options.
7+
# Used to control the versioning behavior of workflows started with this override.
8+
#
9+
# Use factory methods {.auto_upgrade} or {.pinned} to create instances.
10+
#
11+
# WARNING: Experimental API.
12+
class VersioningOverride
13+
# Creates an auto-upgrade versioning override
14+
# The workflow will auto-upgrade to the current deployment version on the next workflow task.
15+
#
16+
# @return [AutoUpgradeVersioningOverride] An auto-upgrade versioning override
17+
def self.auto_upgrade
18+
AutoUpgradeVersioningOverride.new
19+
end
20+
21+
# Creates a pinned versioning override
22+
# The workflow will be pinned to a specific deployment version.
23+
#
24+
# @param version [WorkerDeploymentVersion] The worker deployment version to pin the workflow to
25+
# @return [PinnedVersioningOverride] A pinned versioning override
26+
def self.pinned(version)
27+
PinnedVersioningOverride.new(version)
28+
end
29+
30+
# @!visibility private
31+
def _to_proto
32+
raise NotImplementedError, 'Subclasses must implement this method'
33+
end
34+
end
35+
36+
# Represents a versioning override to pin a workflow to a specific version
37+
class PinnedVersioningOverride < VersioningOverride
38+
# The worker deployment version to pin to
39+
# @return [WorkerDeploymentVersion]
40+
attr_reader :version
41+
42+
# Create a new pinned versioning override
43+
#
44+
# @param version [WorkerDeploymentVersion] The worker deployment version to pin to
45+
def initialize(version)
46+
@version = version
47+
super()
48+
end
49+
50+
# TODO: Remove deprecated field setting once removed from server
51+
52+
# @!visibility private
53+
def _to_proto
54+
Temporalio::Api::Workflow::V1::VersioningOverride.new(
55+
behavior: Temporalio::Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_PINNED,
56+
pinned_version: @version.to_canonical_string,
57+
pinned: Temporalio::Api::Workflow::V1::VersioningOverride::PinnedOverride.new(
58+
version: @version._to_proto
59+
)
60+
)
61+
end
62+
end
63+
64+
# Represents a versioning override to auto-upgrade a workflow
65+
class AutoUpgradeVersioningOverride < VersioningOverride
66+
# @!visibility private
67+
def _to_proto
68+
Temporalio::Api::Workflow::V1::VersioningOverride.new(
69+
behavior: Temporalio::Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_AUTO_UPGRADE,
70+
auto_upgrade: true
71+
)
72+
end
73+
end
74+
end

temporalio/lib/temporalio/worker/workflow_replayer.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,10 @@ def initialize(
217217
graceful_shutdown_period: 0.0,
218218
nondeterminism_as_workflow_fail:,
219219
nondeterminism_as_workflow_fail_for_types:,
220-
deployment_options: nil
220+
deployment_options: DeploymentOptions.new(
221+
version: WorkerDeploymentVersion.new(deployment_name: '',
222+
build_id: Worker.default_build_id)
223+
)._to_bridge_options
221224
)
222225
)
223226

temporalio/lib/temporalio/worker_deployment_version.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,13 @@ def _to_bridge_options
5555
build_id: build_id
5656
)
5757
end
58+
59+
# @!visibility private
60+
def _to_proto
61+
Api::Deployment::V1::WorkerDeploymentVersion.new(
62+
deployment_name: deployment_name,
63+
build_id: build_id
64+
)
65+
end
5866
end
5967
end

temporalio/lib/temporalio/workflow/definition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ def _with_validator_to_invoke(validator_to_invoke)
643643
:versioning_behavior
644644
)
645645
# @!attribute failure_exception_types
646-
# Dynamic equivalent of {Definition.Info.workflow_failure_exception_types}.
646+
# Dynamic equivalent of {Definition.workflow_failure_exception_type}.
647647
# Will override any types set there if set, including if set to an empty array.
648648
# @return [Array<Class<Exception>>, nil] The failure exception types
649649
#

temporalio/sig/temporalio/client.rbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ module Temporalio
7575
?search_attributes: SearchAttributes?,
7676
?start_delay: duration?,
7777
?request_eager_start: bool,
78+
?versioning_override: VersioningOverride?,
7879
?rpc_options: RPCOptions?
7980
) -> WorkflowHandle
8081

@@ -96,6 +97,8 @@ module Temporalio
9697
?search_attributes: SearchAttributes?,
9798
?start_delay: duration?,
9899
?request_eager_start: bool,
100+
?versioning_override: VersioningOverride?,
101+
?follow_runs: bool,
99102
?rpc_options: RPCOptions?
100103
) -> Object?
101104

0 commit comments

Comments
 (0)