Skip to content

Commit 7b268e3

Browse files
committed
Add versioning override
1 parent 4f62b9a commit 7b268e3

File tree

13 files changed

+173
-4
lines changed

13 files changed

+173
-4
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
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/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

temporalio/sig/temporalio/client/interceptor.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Temporalio
2222
attr_reader start_delay: duration?
2323
attr_reader request_eager_start: bool
2424
attr_reader headers: Hash[String, Object?]
25+
attr_reader versioning_override: VersioningOverride?
2526
attr_reader rpc_options: RPCOptions?
2627

2728
def initialize: (
@@ -43,6 +44,7 @@ module Temporalio
4344
start_delay: duration?,
4445
request_eager_start: bool,
4546
headers: Hash[String, Object?],
47+
versioning_override: VersioningOverride?,
4648
rpc_options: RPCOptions?
4749
) -> void
4850
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Temporalio
2+
class VersioningOverride
3+
def self.auto_upgrade: -> AutoUpgradeVersioningOverride
4+
def self.pinned: (WorkerDeploymentVersion version) -> PinnedVersioningOverride
5+
6+
def _to_proto: -> untyped
7+
end
8+
9+
class PinnedVersioningOverride < VersioningOverride
10+
attr_reader version: WorkerDeploymentVersion
11+
12+
def initialize: (WorkerDeploymentVersion version) -> void
13+
def _to_proto: -> untyped
14+
end
15+
16+
class AutoUpgradeVersioningOverride < VersioningOverride
17+
def initialize: -> void
18+
def _to_proto: -> untyped
19+
end
20+
end

0 commit comments

Comments
 (0)