From 26666e163654eb12c6c16d66e048a29d88c459bf Mon Sep 17 00:00:00 2001 From: edersonbrilhante Date: Wed, 5 Aug 2026 20:21:49 +0200 Subject: [PATCH] refactor(runner-providers): resolve labels for runners --- .../src/scale-runners/scale-up-contract.test.ts | 2 +- .../src/scale-runners/scale-up.test.ts | 8 ++++---- .../control-plane/src/scale-runners/scale-up.ts | 16 ++++++++-------- .../control-plane/src/scale-runners/types.ts | 2 +- .../test/runner-provider-contracts/scale-up.ts | 4 ++-- .../aws/ec2/src/control-plane/scale-up.test.ts | 12 +++++++----- .../aws/ec2/src/control-plane/scale-up.ts | 6 +++--- lambdas/libs/runner-providers/core/index.ts | 4 ++-- lambdas/libs/runner-providers/registry.test.ts | 2 +- .../templates/provider/control-plane.ts | 4 ++-- .../templates/provider/provider.test.ts | 2 +- 11 files changed, 32 insertions(+), 30 deletions(-) diff --git a/lambdas/functions/control-plane/src/scale-runners/scale-up-contract.test.ts b/lambdas/functions/control-plane/src/scale-runners/scale-up-contract.test.ts index fd29e89a3e..257f9907ca 100644 --- a/lambdas/functions/control-plane/src/scale-runners/scale-up-contract.test.ts +++ b/lambdas/functions/control-plane/src/scale-runners/scale-up-contract.test.ts @@ -46,7 +46,7 @@ const cleanEnv = process.env; const lanes = providerTypes.map((type) => ({ provider: { type, - prepareGroup: vi.fn(), + resolveLabelsForRunners: vi.fn(), getCurrentRunners: vi.fn(), createRunners: vi.fn(), } satisfies ScaleUpRunnerProvider, diff --git a/lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts b/lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts index 93a08f3aeb..6b6d0b5b76 100644 --- a/lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts +++ b/lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts @@ -59,11 +59,11 @@ const mockPublishRetryMessage = vi.mocked(publishRetryMessage); const testProviderState = { provider: 'test' }; const mockRunnerProvider: ScaleUpRunnerProvider = { type: 'ec2', - prepareGroup: vi.fn(), + resolveLabelsForRunners: vi.fn(), getCurrentRunners: vi.fn(), createRunners: vi.fn(), }; -const mockPrepareGroup = vi.mocked(mockRunnerProvider.prepareGroup); +const mockResolveLabelsForRunners = vi.mocked(mockRunnerProvider.resolveLabelsForRunners); const mockGetCurrentRunners = vi.mocked(mockRunnerProvider.getCurrentRunners); const mockCreateRunners = vi.mocked(mockRunnerProvider.createRunners); const mockedResolveCapability = vi.spyOn(controlPlaneProviderRegistry, 'capability'); @@ -190,7 +190,7 @@ beforeEach(() => { defaultOctokitMockImpl(); mockedResolveCapability.mockReturnValue(() => mockRunnerProvider); - mockPrepareGroup.mockImplementation(async (labels) => ({ + mockResolveLabelsForRunners.mockImplementation(async (labels) => ({ runnerLabels: labels.filter((label) => label.startsWith('ghr-')), state: testProviderState, })); @@ -673,7 +673,7 @@ describe('scaleUp with GHES', () => { expectedRunnerParams = { ...EXPECTED_RUNNER_PARAMS }; mockSSMClient.reset(); - mockPrepareGroup.mockImplementation(async (labels) => ({ + mockResolveLabelsForRunners.mockImplementation(async (labels) => ({ runnerLabels: labels.filter((label) => label.startsWith('ghr-')), state: testProviderState, })); diff --git a/lambdas/functions/control-plane/src/scale-runners/scale-up.ts b/lambdas/functions/control-plane/src/scale-runners/scale-up.ts index f42caea451..4f06d5a1ff 100644 --- a/lambdas/functions/control-plane/src/scale-runners/scale-up.ts +++ b/lambdas/functions/control-plane/src/scale-runners/scale-up.ts @@ -193,14 +193,14 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise 0 ? (messages[0].labels ?? []) : []; - const preparedRunnerGroup = await runnerProvider.prepareGroup(messageLabels); - const dynamicLabels = preparedRunnerGroup.runnerLabels; + const runnerLabelResolution = await runnerProvider.resolveLabelsForRunners(messageLabels); + const resolvedRunnerLabels = runnerLabelResolution.runnerLabels; - if (dynamicLabels.length > 0) { - logger.debug('Dynamic labels present on message', { labels: dynamicLabels }); + if (resolvedRunnerLabels.length > 0) { + logger.debug('Dynamic labels present on message', { labels: resolvedRunnerLabels }); groupRunnerLabels = groupRunnerLabels - ? `${groupRunnerLabels},${dynamicLabels.join(',')}` - : dynamicLabels.join(','); + ? `${groupRunnerLabels},${resolvedRunnerLabels.join(',')}` + : resolvedRunnerLabels.join(','); logger.debug('Updated runner labels', { runnerLabels: groupRunnerLabels }); } @@ -251,7 +251,7 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise({ process.env.RUNNER_PROVIDER_TYPE = provider.type; resolveCapability.mockReturnValue(() => provider); - vi.mocked(provider.prepareGroup).mockResolvedValue({ runnerLabels: [], state }); + vi.mocked(provider.resolveLabelsForRunners).mockResolvedValue({ runnerLabels: [], state }); vi.mocked(provider.getCurrentRunners).mockResolvedValue(0); vi.mocked(provider.createRunners).mockResolvedValue(createResult); }); @@ -54,7 +54,7 @@ export function defineScaleUpContractTests({ await scaleUp(payloads); expect(resolveCapability).toHaveBeenCalledWith(provider.type, 'scaleUp'); - expect(provider.prepareGroup).toHaveBeenCalledWith(['lane-label']); + expect(provider.resolveLabelsForRunners).toHaveBeenCalledWith(['lane-label']); expect(provider.getCurrentRunners).toHaveBeenCalledWith(state, { runnerOwner: payloads[0].repositoryOwner, runnerType: 'Org', diff --git a/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.test.ts b/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.test.ts index 70924427f4..0c6bac69f4 100644 --- a/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.test.ts +++ b/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.test.ts @@ -86,10 +86,10 @@ function expectedRunnerParams( } async function createProviderRunners(options: CreateProviderRunnersOptions = {}) { - const prepared = await provider.prepareGroup(options.labels ?? []); + const runnerLabelResolution = await provider.resolveLabelsForRunners(options.labels ?? []); const baseRunnerLabels = options.baseRunnerLabels ?? 'label1,label2'; const githubRunnerConfig = runnerConfig({ - runnerLabels: [baseRunnerLabels, ...prepared.runnerLabels].filter(Boolean).join(','), + runnerLabels: [baseRunnerLabels, ...runnerLabelResolution.runnerLabels].filter(Boolean).join(','), ...options.githubRunnerConfig, }); @@ -97,14 +97,16 @@ async function createProviderRunners(options: CreateProviderRunnersOptions = {}) githubRunnerConfig, numberOfRunners: 1, githubInstallationClient: githubClient, - state: prepared.state, + state: runnerLabelResolution.state, }); } async function expectCurrentRunners(runnerType: RunnerType, owner: string) { - const prepared = await provider.prepareGroup([]); + const runnerLabelResolution = await provider.resolveLabelsForRunners([]); - await expect(provider.getCurrentRunners(prepared.state, { runnerType, runnerOwner: owner })).resolves.toBe(1); + await expect( + provider.getCurrentRunners(runnerLabelResolution.state, { runnerType, runnerOwner: owner }), + ).resolves.toBe(1); expect(mockListRunners).toHaveBeenCalledWith({ environment: 'unit-test-environment', runnerType, diff --git a/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.ts b/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.ts index 0de80a6274..d5886a57ce 100644 --- a/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.ts +++ b/lambdas/libs/runner-providers/aws/ec2/src/control-plane/scale-up.ts @@ -4,7 +4,7 @@ import type { CreateScaleUpRunnersInput, CreateStartRunnerConfig, CurrentRunnersInput, - PreparedScaleUpRunnerGroup, + RunnerLabelResolution, ScaleUpRunnerProvider, } from '../../../../core'; import yn from 'yn'; @@ -32,7 +32,7 @@ function loadEc2ScaleUpProviderConfig(): CreateEC2RunnerConfig { }; } -async function prepareEc2ScaleUpGroup(messageLabels: string[]): Promise> { +async function resolveEc2LabelsForRunners(messageLabels: string[]): Promise> { const trimmedLabels = messageLabels.map((label) => label.trim()); const dynamicEC2Labels = trimmedLabels.filter((label) => label.startsWith('ghr-ec2-')); const nonEc2DynamicLabels = trimmedLabels.filter( @@ -85,7 +85,7 @@ export function createEc2ScaleUpProvider( createStartRunnerConfig: CreateStartRunnerConfig, ): Omit, 'type'> { return { - prepareGroup: prepareEc2ScaleUpGroup, + resolveLabelsForRunners: resolveEc2LabelsForRunners, getCurrentRunners: getCurrentEc2Runners, createRunners: (input) => createEc2ScaleUpRunners(input, createStartRunnerConfig), }; diff --git a/lambdas/libs/runner-providers/core/index.ts b/lambdas/libs/runner-providers/core/index.ts index 4a4bedf372..02e97c694b 100644 --- a/lambdas/libs/runner-providers/core/index.ts +++ b/lambdas/libs/runner-providers/core/index.ts @@ -53,7 +53,7 @@ export interface CreateScaleUpRunnersInput { state: TState; } -export interface PreparedScaleUpRunnerGroup { +export interface RunnerLabelResolution { runnerLabels: string[]; state: TState; } @@ -65,7 +65,7 @@ export interface CreateRunnerResult { } export interface ScaleUpRunnerProvider extends RunnerProvider { - prepareGroup(messageLabels: string[]): Promise>; + resolveLabelsForRunners(messageLabels: string[]): Promise>; getCurrentRunners(state: TState, input: CurrentRunnersInput): Promise; createRunners(input: CreateScaleUpRunnersInput): Promise; } diff --git a/lambdas/libs/runner-providers/registry.test.ts b/lambdas/libs/runner-providers/registry.test.ts index 28a35a75f5..129986119c 100644 --- a/lambdas/libs/runner-providers/registry.test.ts +++ b/lambdas/libs/runner-providers/registry.test.ts @@ -22,7 +22,7 @@ it('exposes every configured provider through both capability registries', () => createRunners: expect.any(Function), }); expect(controlPlaneRegistry.capability(type, 'scaleUp')()).toEqual({ - prepareGroup: expect.any(Function), + resolveLabelsForRunners: expect.any(Function), getCurrentRunners: expect.any(Function), createRunners: expect.any(Function), }); diff --git a/lambdas/libs/runner-providers/templates/provider/control-plane.ts b/lambdas/libs/runner-providers/templates/provider/control-plane.ts index 61f6d5f482..b58e02e9f5 100644 --- a/lambdas/libs/runner-providers/templates/provider/control-plane.ts +++ b/lambdas/libs/runner-providers/templates/provider/control-plane.ts @@ -35,9 +35,9 @@ export function createTemplateScaleUpProvider( createStartRunnerConfig: CreateStartRunnerConfig, ): Omit { return { - prepareGroup: async (messageLabels) => { + resolveLabelsForRunners: async (messageLabels) => { void messageLabels; - return notImplemented('scaleUp.prepareGroup'); + return notImplemented('scaleUp.resolveLabelsForRunners'); }, getCurrentRunners: async (state, input) => { const templateState = state as TemplateScaleUpState; diff --git a/lambdas/libs/runner-providers/templates/provider/provider.test.ts b/lambdas/libs/runner-providers/templates/provider/provider.test.ts index 2d05fb3478..d449de3947 100644 --- a/lambdas/libs/runner-providers/templates/provider/provider.test.ts +++ b/lambdas/libs/runner-providers/templates/provider/provider.test.ts @@ -17,7 +17,7 @@ it('exposes every runner provider capability from its lane entry point', () => { createRunners: expect.any(Function), }); expect(scaleUp).toEqual({ - prepareGroup: expect.any(Function), + resolveLabelsForRunners: expect.any(Function), getCurrentRunners: expect.any(Function), createRunners: expect.any(Function), });