@@ -12,6 +12,7 @@ import * as activities from './activities';
12
12
import { toCanonicalString , WorkerDeploymentVersion } from '@temporalio/common' ;
13
13
import { makeTestFunction } from './helpers-integration' ;
14
14
import { unblockSignal , versionQuery } from './workflows/' ;
15
+ import { temporal } from '@temporalio/proto' ;
15
16
16
17
const test = makeTestFunction ( { workflowsPath : __filename } ) ;
17
18
@@ -40,6 +41,7 @@ test('Worker deployment based versioning', async (t) => {
40
41
workerDeploymentOptions : {
41
42
useWorkerVersioning : true ,
42
43
version : w1DeploymentVersion ,
44
+ defaultVersioningBehavior : 'pinned' ,
43
45
} ,
44
46
} ) ;
45
47
const worker1Promise = worker1 . run ( ) ;
@@ -54,6 +56,7 @@ test('Worker deployment based versioning', async (t) => {
54
56
workerDeploymentOptions : {
55
57
useWorkerVersioning : true ,
56
58
version : w2DeploymentVersion ,
59
+ defaultVersioningBehavior : 'pinned' ,
57
60
} ,
58
61
} ) ;
59
62
const worker2Promise = worker2 . run ( ) ;
@@ -68,6 +71,7 @@ test('Worker deployment based versioning', async (t) => {
68
71
workerDeploymentOptions : {
69
72
useWorkerVersioning : true ,
70
73
version : w3DeploymentVersion ,
74
+ defaultVersioningBehavior : 'pinned' ,
71
75
} ,
72
76
} ) ;
73
77
const worker3Promise = worker3 . run ( ) ;
@@ -154,6 +158,7 @@ test('Worker deployment based versioning with ramping', async (t) => {
154
158
workerDeploymentOptions : {
155
159
useWorkerVersioning : true ,
156
160
version : v1 ,
161
+ defaultVersioningBehavior : 'pinned' ,
157
162
} ,
158
163
} ) ;
159
164
const worker1Promise = worker1 . run ( ) ;
@@ -168,6 +173,7 @@ test('Worker deployment based versioning with ramping', async (t) => {
168
173
workerDeploymentOptions : {
169
174
useWorkerVersioning : true ,
170
175
version : v2 ,
176
+ defaultVersioningBehavior : 'pinned' ,
171
177
} ,
172
178
} ) ;
173
179
const worker2Promise = worker2 . run ( ) ;
@@ -237,6 +243,116 @@ test('Worker deployment based versioning with ramping', async (t) => {
237
243
t . pass ( ) ;
238
244
} ) ;
239
245
246
+ test ( 'Worker deployment with dynamic workflow on run' , async ( t ) => {
247
+ if ( t . context . env . supportsTimeSkipping ) {
248
+ t . pass ( "Test Server doesn't support worker deployments" ) ;
249
+ return ;
250
+ }
251
+
252
+ const taskQueue = 'worker-deployment-dynamic-' + randomUUID ( ) ;
253
+ const deploymentName = 'deployment-dynamic-' + randomUUID ( ) ;
254
+ const client = t . context . env . client ;
255
+
256
+ const version = {
257
+ buildId : '1.0' ,
258
+ deploymentName : deploymentName ,
259
+ } ;
260
+
261
+ const worker = await Worker . create ( {
262
+ workflowsPath : require . resolve ( './deployment-versioning-v1' ) ,
263
+ activities,
264
+ taskQueue,
265
+ workerDeploymentOptions : {
266
+ useWorkerVersioning : true ,
267
+ version : version ,
268
+ defaultVersioningBehavior : 'auto-upgrade' ,
269
+ } ,
270
+ } ) ;
271
+
272
+ const workerPromise = worker . run ( ) ;
273
+ workerPromise . catch ( ( err ) => {
274
+ t . fail ( 'Worker run error: ' + JSON . stringify ( err ) ) ;
275
+ } ) ;
276
+
277
+ const describeResp = await waitUntilWorkerDeploymentVisible ( client , version ) ;
278
+ await setCurrentDeploymentVersion ( client , describeResp . conflictToken , version ) ;
279
+
280
+ const wf = await client . workflow . start ( 'cooldynamicworkflow' , {
281
+ taskQueue,
282
+ workflowId : 'dynamic-workflow-versioning-' + randomUUID ( ) ,
283
+ } ) ;
284
+
285
+ const result = await wf . result ( ) ;
286
+ assert . equal ( result , 'dynamic' ) ;
287
+
288
+ // Check history for versioning behavior
289
+ const history = await wf . fetchHistory ( ) ;
290
+
291
+ const hasPinnedVersioningBehavior = history . events ! . some (
292
+ ( event ) =>
293
+ event . workflowTaskCompletedEventAttributes &&
294
+ event . workflowTaskCompletedEventAttributes . versioningBehavior ===
295
+ temporal . api . enums . v1 . VersioningBehavior . VERSIONING_BEHAVIOR_PINNED
296
+ ) ;
297
+ assert . ok ( hasPinnedVersioningBehavior , 'Expected workflow to use pinned versioning behavior' ) ;
298
+
299
+ worker . shutdown ( ) ;
300
+ await workerPromise ;
301
+ t . pass ( ) ;
302
+ } ) ;
303
+
304
+ test ( 'Workflows can use default versioning behavior' , async ( t ) => {
305
+ const taskQueue = 'task-queue-default-versioning-' + randomUUID ( ) ;
306
+ const deploymentName = 'deployment-default-versioning-' + randomUUID ( ) ;
307
+ const client = t . context . env . client ;
308
+
309
+ const workerV1 = {
310
+ buildId : '1.0' ,
311
+ deploymentName : deploymentName ,
312
+ } ;
313
+
314
+ const worker = await Worker . create ( {
315
+ workflowsPath : require . resolve ( './deployment-versioning-no-annotations' ) ,
316
+ activities,
317
+ taskQueue,
318
+ workerDeploymentOptions : {
319
+ useWorkerVersioning : true ,
320
+ version : workerV1 ,
321
+ defaultVersioningBehavior : 'pinned' ,
322
+ } ,
323
+ } ) ;
324
+
325
+ const workerPromise = worker . run ( ) ;
326
+ workerPromise . catch ( ( err ) => {
327
+ t . fail ( 'Worker run error: ' + JSON . stringify ( err ) ) ;
328
+ } ) ;
329
+
330
+ const describeResp = await waitUntilWorkerDeploymentVisible ( client , workerV1 ) ;
331
+ await setCurrentDeploymentVersion ( client , describeResp . conflictToken , workerV1 ) ;
332
+
333
+ const wf = await client . workflow . start ( 'noVersioningAnnotationWorkflow' , {
334
+ taskQueue,
335
+ workflowId : 'default-versioning-behavior-' + randomUUID ( ) ,
336
+ } ) ;
337
+
338
+ await wf . result ( ) ;
339
+
340
+ // Check history for versioning behavior
341
+ const history = await wf . fetchHistory ( ) ;
342
+
343
+ const hasPinnedVersioningBehavior = history . events ! . some (
344
+ ( event ) =>
345
+ event . workflowTaskCompletedEventAttributes &&
346
+ event . workflowTaskCompletedEventAttributes . versioningBehavior ===
347
+ temporal . api . enums . v1 . VersioningBehavior . VERSIONING_BEHAVIOR_PINNED
348
+ ) ;
349
+ assert . ok ( hasPinnedVersioningBehavior , 'Expected workflow to use pinned versioning behavior' ) ;
350
+
351
+ worker . shutdown ( ) ;
352
+ await workerPromise ;
353
+ t . pass ( ) ;
354
+ } ) ;
355
+
240
356
async function setRampingVersion (
241
357
client : Client ,
242
358
conflictToken : Uint8Array ,
0 commit comments