Skip to content

Commit c65665f

Browse files
feat: allow use any dynamic label with prefix ghr-
1 parent 3c4a197 commit c65665f

File tree

19 files changed

+111
-70
lines changed

19 files changed

+111
-70
lines changed

lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ describe('scaleUp with GHES', () => {
575575
describe('Dynamic EC2 Configuration', () => {
576576
beforeEach(() => {
577577
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
578-
process.env.ENABLE_DYNAMIC_EC2_CONFIG = 'true';
578+
process.env.ENABLE_DYNAMIC_LABELS = 'true';
579579
process.env.ENABLE_EPHEMERAL_RUNNERS = 'true';
580580
process.env.ENABLE_JOB_QUEUED_CHECK = 'false';
581581
process.env.RUNNER_LABELS = 'base-label';
@@ -670,8 +670,8 @@ describe('scaleUp with GHES', () => {
670670
);
671671
});
672672

673-
it('does not process EC2 labels when ENABLE_DYNAMIC_EC2_CONFIG is disabled', async () => {
674-
process.env.ENABLE_DYNAMIC_EC2_CONFIG = 'false';
673+
it('does not process EC2 labels when ENABLE_DYNAMIC_LABELS is disabled', async () => {
674+
process.env.ENABLE_DYNAMIC_LABELS = 'false';
675675

676676
const testDataWithEc2Labels = [
677677
{
@@ -2219,7 +2219,6 @@ describe('scaleUp with Github Data Residency', () => {
22192219
});
22202220
});
22212221

2222-
<<<<<<< HEAD
22232222
describe('Retry mechanism tests', () => {
22242223
beforeEach(() => {
22252224
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
@@ -2361,7 +2360,30 @@ describe('Retry mechanism tests', () => {
23612360
id: msg.id,
23622361
messageId: msg.messageId,
23632362
}),
2364-
=======
2363+
);
2364+
});
2365+
});
2366+
2367+
it('calls publishRetryMessage after runner creation', async () => {
2368+
const messages = createTestMessages(1);
2369+
mockCreateRunner.mockResolvedValue(['i-12345']); // Create the requested runner
2370+
2371+
const callOrder: string[] = [];
2372+
mockPublishRetryMessage.mockImplementation(() => {
2373+
callOrder.push('publishRetryMessage');
2374+
return Promise.resolve();
2375+
});
2376+
mockCreateRunner.mockImplementation(async () => {
2377+
callOrder.push('createRunner');
2378+
return ['i-12345'];
2379+
});
2380+
2381+
await scaleUpModule.scaleUp(messages);
2382+
2383+
expect(callOrder).toEqual(['createRunner', 'publishRetryMessage']);
2384+
});
2385+
});
2386+
23652387
describe('parseEc2OverrideConfig', () => {
23662388
describe('Basic Fleet Overrides', () => {
23672389
it('should parse instance-type label', () => {
@@ -2858,30 +2880,10 @@ describe('parseEc2OverrideConfig', () => {
28582880
);
28592881
expect(result?.InstanceRequirements?.BaselinePerformanceFactors?.Cpu?.References?.[1]?.InstanceFamily).toBe(
28602882
'amd',
2861-
>>>>>>> 44df86d7 (test: fix test cases)
28622883
);
28632884
});
28642885
});
28652886

2866-
<<<<<<< HEAD
2867-
it('calls publishRetryMessage after runner creation', async () => {
2868-
const messages = createTestMessages(1);
2869-
mockCreateRunner.mockResolvedValue(['i-12345']); // Create the requested runner
2870-
2871-
const callOrder: string[] = [];
2872-
mockPublishRetryMessage.mockImplementation(() => {
2873-
callOrder.push('publishRetryMessage');
2874-
return Promise.resolve();
2875-
});
2876-
mockCreateRunner.mockImplementation(async () => {
2877-
callOrder.push('createRunner');
2878-
return ['i-12345'];
2879-
});
2880-
2881-
await scaleUpModule.scaleUp(messages);
2882-
2883-
expect(callOrder).toEqual(['createRunner', 'publishRetryMessage']);
2884-
=======
28852887
describe('Edge Cases', () => {
28862888
it('should return undefined when empty array is provided', () => {
28872889
const result = scaleUpModule.parseEc2OverrideConfig([]);
@@ -3078,7 +3080,6 @@ describe('parseEc2OverrideConfig', () => {
30783080
expect(result?.InstanceRequirements?.SpotMaxPricePercentageOverLowestPrice).toBe(100);
30793081
expect(result?.InstanceRequirements?.OnDemandMaxPricePercentageOverLowestPrice).toBe(150);
30803082
});
3081-
>>>>>>> 44df86d7 (test: fix test cases)
30823083
});
30833084
});
30843085

lambdas/functions/control-plane/src/scale-runners/scale-up.ts

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import { createGithubAppAuth, createGithubInstallationAuth, createOctokitClient
77
import { createRunner, listEC2Runners, tag, terminateRunner } from './../aws/runners';
88
import { Ec2OverrideConfig, RunnerInputParameters } from './../aws/runners.d';
99
import { metricGitHubAppRateLimit } from '../github/rate-limit';
10-
<<<<<<< HEAD
1110
import { publishRetryMessage } from './job-retry';
12-
=======
1311
import {
1412
_InstanceType,
1513
Tenancy,
@@ -40,7 +38,6 @@ import {
4038
TotalLocalStorageGBRequest,
4139
BaselineEbsBandwidthMbpsRequest,
4240
} from '@aws-sdk/client-ec2';
43-
>>>>>>> 44df86d7 (test: fix test cases)
4441

4542
const logger = createChildLogger('scale-up');
4643

@@ -334,7 +331,7 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise<stri
334331
const instanceTypes = process.env.INSTANCE_TYPES.split(',');
335332
const instanceTargetCapacityType = process.env.INSTANCE_TARGET_CAPACITY_TYPE;
336333
const ephemeralEnabled = yn(process.env.ENABLE_EPHEMERAL_RUNNERS, { default: false });
337-
const dynamicEc2ConfigEnabled = yn(process.env.ENABLE_DYNAMIC_EC2_CONFIG, { default: false });
334+
const dynamicLabelsEnabled = yn(process.env.ENABLE_DYNAMIC_LABELS, { default: false });
338335
const enableJitConfig = yn(process.env.ENABLE_JIT_CONFIG, { default: ephemeralEnabled });
339336
const disableAutoUpdate = yn(process.env.DISABLE_RUNNER_AUTOUPDATE, { default: false });
340337
const launchTemplateName = process.env.LAUNCH_TEMPLATE_NAME;
@@ -404,12 +401,12 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise<stri
404401
: `${payload.repositoryOwner}/${payload.repositoryName}`;
405402

406403
let key = runnerOwner;
407-
if (dynamicEc2ConfigEnabled && labels?.length) {
408-
const requestedDynamicEc2Config = labels.find((l) => l.startsWith('ghr-ec2-'))?.slice('ghr-ec2-'.length);
404+
if (dynamicLabelsEnabled && labels?.length) {
405+
const dynamicLabels = labels.find((l) => l.startsWith('ghr-'))?.slice('ghr-'.length);
409406

410-
if (requestedDynamicEc2Config) {
411-
const ec2Hash = ec2LabelsHash(labels);
412-
key = `${key}/${ec2Hash}`;
407+
if (dynamicLabels) {
408+
const dynamicLabelsHash = labelsHash(labels);
409+
key = `${key}/${dynamicLabelsHash}`;
413410
}
414411
}
415412

@@ -454,26 +451,28 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise<stri
454451

455452
let ec2OverrideConfig: Ec2OverrideConfig | undefined = undefined;
456453

457-
if (messages.length > 0 && dynamicEc2ConfigEnabled) {
454+
if (messages.length > 0 && dynamicLabelsEnabled) {
458455
logger.debug('Dynamic EC2 config enabled, processing labels', { labels: messages[0].labels });
459456

460457
const dynamicEC2Labels = messages[0].labels?.map((l) => l.trim()).filter((l) => l.startsWith('ghr-ec2-')) ?? [];
458+
const allDynamicLabels = messages[0].labels?.map((l) => l.trim()).filter((l) => l.startsWith('ghr-')) ?? [];
461459

462-
if (dynamicEC2Labels.length > 0) {
463-
// Append all EC2 labels to runnerLabels
464-
runnerLabels = runnerLabels ? `${runnerLabels},${dynamicEC2Labels.join(',')}` : dynamicEC2Labels.join(',');
460+
if (allDynamicLabels.length > 0) {
461+
runnerLabels = runnerLabels ? `${runnerLabels},${allDynamicLabels.join(',')}` : allDynamicLabels.join(',');
465462

466463
logger.debug('Updated runner labels', { runnerLabels });
467464

468-
// Parse EC2 override configuration from labels
469-
ec2OverrideConfig = parseEc2OverrideConfig(dynamicEC2Labels);
470-
if (ec2OverrideConfig) {
471-
logger.debug('EC2 override config parsed from labels', {
472-
ec2OverrideConfig,
473-
});
465+
if (dynamicEC2Labels.length > 0) {
466+
467+
ec2OverrideConfig = parseEc2OverrideConfig(dynamicEC2Labels);
468+
if (ec2OverrideConfig) {
469+
logger.debug('EC2 override config parsed from labels', {
470+
ec2OverrideConfig,
471+
});
472+
}
474473
}
475474
} else {
476-
logger.debug('No dynamic EC2 labels found on message');
475+
logger.debug('No dynamic labels found on message');
477476
}
478477
}
479478

@@ -1083,8 +1082,8 @@ export function parseEc2OverrideConfig(labels: string[]): Ec2OverrideConfig | un
10831082
return Object.keys(config).length > 0 ? config : undefined;
10841083
}
10851084

1086-
function ec2LabelsHash(labels: string[]): string {
1087-
const prefix = 'ghr-ec2-';
1085+
function labelsHash(labels: string[]): string {
1086+
const prefix = 'ghr-';
10881087

10891088
const input = labels
10901089
.filter((l) => l.startsWith(prefix))

lambdas/functions/webhook/src/ConfigLoader.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,11 @@ export class ConfigWebhook extends MatcherAwareConfig {
130130
repositoryAllowList: string[] = [];
131131
webhookSecret: string = '';
132132
workflowJobEventSecondaryQueue: string = '';
133+
enableDynamicLabels: boolean = false;
133134

134135
async loadConfig(): Promise<void> {
135136
this.loadEnvVar(process.env.REPOSITORY_ALLOW_LIST, 'repositoryAllowList', []);
137+
this.loadEnvVar(process.env.ENABLE_DYNAMIC_LABELS, 'enableDynamicLabels', false);
136138

137139
await Promise.all([
138140
this.loadMatcherConfig(process.env.PARAMETER_RUNNER_MATCHER_CONFIG_PATH),
@@ -162,9 +164,11 @@ export class ConfigWebhookEventBridge extends BaseConfig {
162164
export class ConfigDispatcher extends MatcherAwareConfig {
163165
repositoryAllowList: string[] = [];
164166
workflowJobEventSecondaryQueue: string = ''; // Deprecated
167+
enableDynamicLabels: boolean = false;
165168

166169
async loadConfig(): Promise<void> {
167170
this.loadEnvVar(process.env.REPOSITORY_ALLOW_LIST, 'repositoryAllowList', []);
171+
this.loadEnvVar(process.env.ENABLE_DYNAMIC_LABELS, 'enableDynamicLabels', false);
168172
await this.loadMatcherConfig(process.env.PARAMETER_RUNNER_MATCHER_CONFIG_PATH);
169173

170174
validateRunnerMatcherConfig(this);

lambdas/functions/webhook/src/modules.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ declare namespace NodeJS {
55
PARAMETER_GITHUB_APP_WEBHOOK_SECRET: string;
66
PARAMETER_RUNNER_MATCHER_CONFIG_PATH: string;
77
REPOSITORY_ALLOW_LIST: string;
8+
ENABLE_DYNAMIC_LABELS: string
89
RUNNER_LABELS: string;
910
ACCEPT_EVENTS: string;
1011
}

lambdas/functions/webhook/src/runners/dispatch.test.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,49 +183,61 @@ describe('Dispatcher', () => {
183183
it('should accept job with an exact match and identical labels.', () => {
184184
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ubuntu-latest'];
185185
const runnerLabels = [['self-hosted', 'linux', 'x64', 'ubuntu-latest']];
186-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(true);
186+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(true);
187187
});
188188

189189
it('should accept job with an exact match and identical labels, ignoring cases.', () => {
190190
const workflowLabels = ['self-Hosted', 'Linux', 'X64', 'ubuntu-Latest'];
191191
const runnerLabels = [['self-hosted', 'linux', 'x64', 'ubuntu-latest']];
192-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(true);
192+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(true);
193193
});
194194

195195
it('should accept job with an exact match and runner supports requested capabilities.', () => {
196196
const workflowLabels = ['self-hosted', 'linux', 'x64'];
197197
const runnerLabels = [['self-hosted', 'linux', 'x64', 'ubuntu-latest']];
198-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(true);
198+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(true);
199199
});
200200

201201
it('should NOT accept job with an exact match and runner not matching requested capabilities.', () => {
202202
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ubuntu-latest'];
203203
const runnerLabels = [['self-hosted', 'linux', 'x64']];
204-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(false);
204+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(false);
205205
});
206206

207207
it('should accept job with for a non exact match. Any label that matches will accept the job.', () => {
208208
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ubuntu-latest', 'gpu'];
209209
const runnerLabels = [['gpu']];
210-
expect(canRunJob(workflowLabels, runnerLabels, false)).toBe(true);
210+
expect(canRunJob(workflowLabels, runnerLabels, false, false)).toBe(true);
211211
});
212212

213213
it('should NOT accept job with for an exact match. Not all requested capabilities are supported.', () => {
214214
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ubuntu-latest', 'gpu'];
215215
const runnerLabels = [['gpu']];
216-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(false);
216+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(false);
217217
});
218218

219219
it('should not accept jobs not providing labels if exact match is.', () => {
220220
const workflowLabels: string[] = [];
221221
const runnerLabels = [['self-hosted', 'linux', 'x64']];
222-
expect(canRunJob(workflowLabels, runnerLabels, true)).toBe(false);
222+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(false);
223223
});
224224

225225
it('should accept jobs not providing labels and exact match is set to false.', () => {
226226
const workflowLabels: string[] = [];
227227
const runnerLabels = [['self-hosted', 'linux', 'x64']];
228-
expect(canRunJob(workflowLabels, runnerLabels, false)).toBe(true);
228+
expect(canRunJob(workflowLabels, runnerLabels, false, false)).toBe(true);
229+
});
230+
231+
it('should filter out ghr- and ghr-run- labels when enableDynamicLabels is true.', () => {
232+
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ghr-ec2-instance-type:t3.large', 'ghr-run-id:12345'];
233+
const runnerLabels = [['self-hosted', 'linux', 'x64']];
234+
expect(canRunJob(workflowLabels, runnerLabels, true, true)).toBe(true);
235+
});
236+
237+
it('should NOT filter out ghr- and ghr-run- labels when enableDynamicLabels is false.', () => {
238+
const workflowLabels = ['self-hosted', 'linux', 'x64', 'ghr-ec2-instance-type:t3.large'];
239+
const runnerLabels = [['self-hosted', 'linux', 'x64']];
240+
expect(canRunJob(workflowLabels, runnerLabels, true, false)).toBe(false);
229241
});
230242
});
231243
});

lambdas/functions/webhook/src/runners/dispatch.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function dispatch(
1515
): Promise<Response> {
1616
validateRepoInAllowList(event, config);
1717

18-
return await handleWorkflowJob(event, eventType, config.matcherConfig!);
18+
return await handleWorkflowJob(event, eventType, config.matcherConfig!, config.enableDynamicLabels);
1919
}
2020

2121
function validateRepoInAllowList(event: WorkflowJobEvent, config: ConfigDispatcher) {
@@ -29,6 +29,7 @@ async function handleWorkflowJob(
2929
body: WorkflowJobEvent,
3030
githubEvent: string,
3131
matcherConfig: Array<RunnerMatcherConfig>,
32+
enableDynamicLabels: boolean,
3233
): Promise<Response> {
3334
if (body.action !== 'queued') {
3435
return {
@@ -47,7 +48,7 @@ async function handleWorkflowJob(
4748
return a.matcherConfig.exactMatch === b.matcherConfig.exactMatch ? 0 : a.matcherConfig.exactMatch ? -1 : 1;
4849
});
4950
for (const queue of matcherConfig) {
50-
if (canRunJob(body.workflow_job.labels, queue.matcherConfig.labelMatchers, queue.matcherConfig.exactMatch)) {
51+
if (canRunJob(body.workflow_job.labels, queue.matcherConfig.labelMatchers, queue.matcherConfig.exactMatch, enableDynamicLabels)) {
5152
await sendActionRequest({
5253
id: body.workflow_job.id,
5354
repositoryName: body.repository.name,
@@ -81,9 +82,12 @@ export function canRunJob(
8182
workflowJobLabels: string[],
8283
runnerLabelsMatchers: string[][],
8384
workflowLabelCheckAll: boolean,
85+
enableDynamicLabels: boolean,
8486
): boolean {
85-
// Filter out ghr-ec2- labels as they are handled by the dynamic EC2 instance type feature
86-
const filteredLabels = workflowJobLabels.filter((label) => !label.startsWith('ghr-ec2-'));
87+
// Filter out ghr- and ghr-run- labels only if dynamic labels config is enabled
88+
const filteredLabels = enableDynamicLabels
89+
? workflowJobLabels.filter((label) => !label.startsWith('ghr-'))
90+
: workflowJobLabels;
8791

8892
runnerLabelsMatchers = runnerLabelsMatchers.map((runnerLabel) => {
8993
return runnerLabel.map((label) => label.toLowerCase());

main.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ module "webhook" {
137137
logging_retention_in_days = var.logging_retention_in_days
138138
logging_kms_key_id = var.logging_kms_key_id
139139
log_class = var.log_class
140+
enable_dynamic_labels = var.enable_dynamic_labels
140141

141142
role_path = var.role_path
142143
role_permissions_boundary = var.role_permissions_boundary
@@ -185,7 +186,7 @@ module "runners" {
185186
github_app_parameters = local.github_app_parameters
186187
enable_organization_runners = var.enable_organization_runners
187188
enable_ephemeral_runners = var.enable_ephemeral_runners
188-
enable_dynamic_ec2_config = var.enable_dynamic_ec2_config
189+
enable_dynamic_labels = var.enable_dynamic_labels
189190
enable_job_queued_check = var.enable_job_queued_check
190191
enable_jit_config = var.enable_jit_config
191192
enable_on_demand_failover_for_errors = var.enable_runner_on_demand_failover_for_errors

modules/multi-runner/runners.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ module "runners" {
3535
scale_errors = each.value.runner_config.scale_errors
3636
enable_organization_runners = each.value.runner_config.enable_organization_runners
3737
enable_ephemeral_runners = each.value.runner_config.enable_ephemeral_runners
38-
enable_dynamic_ec2_config = each.value.runner_config.enable_dynamic_ec2_config
38+
enable_dynamic_labels = each.value.runner_config.enable_dynamic_labels
3939
enable_jit_config = each.value.runner_config.enable_jit_config
4040
enable_job_queued_check = each.value.runner_config.enable_job_queued_check
4141
disable_runner_autoupdate = each.value.runner_config.disable_runner_autoupdate

modules/multi-runner/variables.tf

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ variable "multi_runner_config" {
7777
disable_runner_autoupdate = optional(bool, false)
7878
ebs_optimized = optional(bool, false)
7979
enable_ephemeral_runners = optional(bool, false)
80-
enable_dynamic_ec2_config = optional(bool, false)
8180
enable_job_queued_check = optional(bool, null)
8281
enable_on_demand_failover_for_errors = optional(list(string), [])
8382
scale_errors = optional(list(string), [
@@ -208,7 +207,7 @@ variable "multi_runner_config" {
208207
disable_runner_autoupdate: "Disable the auto update of the github runner agent. Be aware there is a grace period of 30 days, see also the [GitHub article](https://github.blog/changelog/2022-02-01-github-actions-self-hosted-runners-can-now-disable-automatic-updates/)"
209208
ebs_optimized: "The EC2 EBS optimized configuration."
210209
enable_ephemeral_runners: "Enable ephemeral runners, runners will only be used once."
211-
enable_dynamic_ec2_config: "Enable dynamic EC2 configs based on workflow job labels. When enabled, jobs can request specific configs via the 'gh-ec2-<config type key>:<config type value>' label (e.g., 'gh-ec2-instance-type:t3.large')."
210+
enable_dynamic_labels: "Enable dynamic labels with 'ghr-' prefix. When enabled, jobs can use 'ghr-ec2-<config>:<value>' labels to dynamically configure EC2 instances (e.g., 'ghr-ec2-instance-type:t3.large') and 'ghr-run-<label>' to add unique labels dynamically to runners."
212211
enable_job_queued_check: "(Optional) Only scale if the job event received by the scale up lambda is is in the state queued. By default enabled for non ephemeral runners and disabled for ephemeral. Set this variable to overwrite the default behavior."
213212
enable_on_demand_failover_for_errors: "Enable on-demand failover. For example to fall back to on demand when no spot capacity is available the variable can be set to `InsufficientInstanceCapacity`. When not defined the default behavior is to retry later."
214213
scale_errors: "List of aws error codes that should trigger retry during scale up. This list will replace the default errors defined in the variable `defaultScaleErrors` in https://github.com/github-aws-runners/terraform-aws-github-runner/blob/main/lambdas/functions/control-plane/src/aws/runners.ts"
@@ -772,3 +771,9 @@ variable "parameter_store_tags" {
772771
type = map(string)
773772
default = {}
774773
}
774+
775+
variable "enable_dynamic_labels" {
776+
description = "Enable dynamic labels with 'ghr-' prefix. When enabled, jobs can use 'ghr-ec2-<config>:<value>' labels to dynamically configure EC2 instances (e.g., 'ghr-ec2-instance-type:t3.large') and 'ghr-run-<label>' to add unique labels dynamically to runners."
777+
type = bool
778+
default = false
779+
}

modules/multi-runner/webhook.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,7 @@ module "webhook" {
3939
lambda_security_group_ids = var.lambda_security_group_ids
4040
aws_partition = var.aws_partition
4141

42+
enable_dynamic_labels = var.enable_dynamic_labels
43+
4244
log_level = var.log_level
4345
}

0 commit comments

Comments
 (0)