Skip to content

Commit 48bbb74

Browse files
committed
Versioning override updates
1 parent d6074f0 commit 48bbb74

File tree

4 files changed

+87
-6
lines changed

4 files changed

+87
-6
lines changed

packages/client/src/workflow-client.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,7 @@ export class WorkflowClient extends BaseClient {
12271227
cronSchedule: options.cronSchedule,
12281228
header: { fields: headers },
12291229
priority: options.priority ? compilePriority(options.priority) : undefined,
1230+
versioningOverride: options.versioningOverride ? options.versioningOverride : undefined,
12301231
};
12311232
try {
12321233
return (await this.workflowService.signalWithStartWorkflowExecution(req)).runId;
@@ -1296,6 +1297,7 @@ export class WorkflowClient extends BaseClient {
12961297
cronSchedule: opts.cronSchedule,
12971298
header: { fields: headers },
12981299
priority: opts.priority ? compilePriority(opts.priority) : undefined,
1300+
versioningOverride: opts.versioningOverride ? opts.versioningOverride : undefined,
12991301
};
13001302
}
13011303

packages/client/src/workflow-options.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,23 @@ function versioningOverrideToProto(
130130
vo: VersioningOverride | undefined
131131
): temporal.api.workflow.v1.IVersioningOverride | undefined {
132132
if (!vo) return undefined;
133+
133134
// TODO: Remove deprecated field assignments when versioning is non-experimental
134135
if (vo === 'AUTO_UPGRADE') {
135136
return {
137+
autoUpgrade: true,
138+
// @ts-ignore - using deprecated field
136139
behavior: temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_AUTO_UPGRADE,
137140
};
138141
}
142+
139143
return {
144+
pinned: {
145+
version: vo.pinnedTo,
146+
},
147+
// @ts-ignore - using deprecated fields
140148
behavior: temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED,
141-
pinnedVersion: toCanonicalString(vo.version),
149+
// @ts-ignore - using deprecated field
150+
pinnedVersion: toCanonicalString(vo.pinnedTo),
142151
};
143152
}

packages/common/src/worker-deployments.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,20 @@ export const [encodeVersioningBehavior, decodeVersioningBehavior] = makeProtoEnu
5151

5252
/**
5353
* Represents versioning overrides. For example, when starting workflows.
54-
*
55-
* If set to 'AUTO_UPGRADE', the Workflow will run as if it is using {@link VersioningBehavior.AUTO_UPGRADE}.
56-
* Otherwise, you select a pinned behavior, and a specific version to pin to. Currently only one
57-
* such behavior exists, but more will be added in the future.
5854
*/
59-
export type VersioningOverride = { pinned_behavior: 'PINNED'; version: WorkerDeploymentVersion } | 'AUTO_UPGRADE';
55+
export type VersioningOverride = PinnedVersioningOverride | 'AUTO_UPGRADE';
56+
57+
/**
58+
* Workflow will be pinned to a specific deployment version.
59+
*/
60+
export interface PinnedVersioningOverride {
61+
/**
62+
* The worker deployment version to pin the workflow to.
63+
*/
64+
pinnedTo: WorkerDeploymentVersion;
65+
}
66+
67+
/**
68+
* The workflow will auto-upgrade to the current deployment version on the next workflow task.
69+
*/
70+
export type AutoUpgradeVersioningOverride = 'AUTO_UPGRADE';

packages/test/src/test-worker-deployment-versioning.ts

+59
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,65 @@ test('Workflows can use default versioning behavior', async (t) => {
361361
t.pass();
362362
});
363363

364+
test('Workflow versioningOverride overrides default versioning behavior', async (t) => {
365+
const taskQueue = 'task-queue-versioning-override-' + randomUUID();
366+
const { client, nativeConnection } = t.context.env;
367+
368+
const workerV1 = {
369+
buildId: '1.0',
370+
deploymentName: 'deployment-versioning-override-' + randomUUID(),
371+
};
372+
373+
const worker1 = await Worker.create({
374+
workflowsPath: require.resolve('./deployment-versioning-v1'),
375+
taskQueue,
376+
workerDeploymentOptions: {
377+
useWorkerVersioning: true,
378+
version: workerV1,
379+
defaultVersioningBehavior: 'AUTO_UPGRADE',
380+
},
381+
connection: nativeConnection,
382+
});
383+
const worker1Promise = worker1.run();
384+
worker1Promise.catch((err) => {
385+
t.fail('Worker 1.0 run error: ' + err);
386+
});
387+
388+
// Wait for workers to be visible and set current version to v1
389+
const describeResp = await waitUntilWorkerDeploymentVisible(client, workerV1);
390+
await setCurrentDeploymentVersion(client, describeResp.conflictToken, workerV1);
391+
392+
// Start workflow with PINNED to v1 versioningOverride - should use v1 despite AUTO_UPGRADE default
393+
const wfPinned = await client.workflow.start('deploymentVersioning', {
394+
taskQueue,
395+
workflowId: 'versioning-override-pinned-v1-' + randomUUID(),
396+
versioningOverride: {
397+
pinnedTo: workerV1,
398+
},
399+
});
400+
const statePinned = await wfPinned.query(versionQuery);
401+
assert.equal(statePinned, 'v1');
402+
403+
await wfPinned.signal(unblockSignal);
404+
405+
// Get results and check versioning behavior
406+
const historyPinned = await wfPinned.fetchHistory();
407+
const hasPinnedVersioningBehavior = historyPinned.events!.some(
408+
(event) =>
409+
event.workflowExecutionStartedEventAttributes?.versioningOverride?.behavior ===
410+
temporal.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED ||
411+
event.workflowExecutionStartedEventAttributes?.versioningOverride?.pinned != null
412+
);
413+
assert.ok(hasPinnedVersioningBehavior, 'Expected workflow to use pinned versioning behavior');
414+
415+
const resPinned = await wfPinned.result();
416+
assert.equal(resPinned, 'version-v1');
417+
418+
worker1.shutdown();
419+
await worker1Promise;
420+
t.pass();
421+
});
422+
364423
async function setRampingVersion(
365424
client: Client,
366425
conflictToken: Uint8Array,

0 commit comments

Comments
 (0)