Skip to content

Commit

Permalink
refactor(core): Ensure only leader handles licensing in multi-main sc…
Browse files Browse the repository at this point in the history
  • Loading branch information
ivov authored Nov 2, 2023
1 parent 7dac9ab commit 1c77d65
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
11 changes: 11 additions & 0 deletions packages/cli/src/License.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,17 @@ export class License {

async onFeatureChange(_features: TFeatures): Promise<void> {
if (config.getEnv('executions.mode') === 'queue') {
if (config.getEnv('leaderSelection.enabled')) {
const { MultiMainInstancePublisher } = await import(
'@/services/orchestration/main/MultiMainInstance.publisher.ee'
);

if (Container.get(MultiMainInstancePublisher).isFollower) {
this.logger.debug('Instance is follower, skipping sending of reloadLicense command...');
return;
}
}

if (!this.redisPublisher) {
this.logger.debug('Initializing Redis publisher for License Service');
this.redisPublisher = await Container.get(RedisService).getPubSubPublisher();
Expand Down
11 changes: 11 additions & 0 deletions packages/cli/src/commands/BaseCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,17 @@ export abstract class BaseCommand extends Command {
}

async initLicense(): Promise<void> {
if (config.getEnv('executions.mode') === 'queue' && config.getEnv('leaderSelection.enabled')) {
const { MultiMainInstancePublisher } = await import(
'@/services/orchestration/main/MultiMainInstance.publisher.ee'
);

if (Container.get(MultiMainInstancePublisher).isFollower) {
this.logger.debug('Instance is follower, skipping license initialization...');
return;
}
}

const license = Container.get(License);
await license.init(this.instanceType ?? 'main');

Expand Down
53 changes: 53 additions & 0 deletions packages/cli/test/integration/commands/start.cmd.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import * as Config from '@oclif/config';

import { mockInstance } from '../shared/utils';

import { Start } from '@/commands/start';
import { BaseCommand } from '@/commands/BaseCommand';
import config from '@/config';
import { License } from '@/License';

import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee';
import { MultiMainInstancePublisher } from '@/services/orchestration/main/MultiMainInstance.publisher.ee';
import { ActiveWorkflowRunner } from '@/ActiveWorkflowRunner';
import { WorkflowHistoryManager } from '@/workflows/workflowHistory/workflowHistoryManager.ee';
import { RedisService } from '@/services/redis.service';
import { RedisServicePubSubPublisher } from '@/services/redis/RedisServicePubSubPublisher';
import { RedisServicePubSubSubscriber } from '@/services/redis/RedisServicePubSubSubscriber';
import { OrchestrationHandlerMainService } from '@/services/orchestration/main/orchestration.handler.main.service';

const oclifConfig: Config.IConfig = new Config.Config({ root: __dirname });

beforeAll(() => {
mockInstance(ExternalSecretsManager);
mockInstance(ActiveWorkflowRunner);
mockInstance(WorkflowHistoryManager);
mockInstance(RedisService);
mockInstance(RedisServicePubSubPublisher);
mockInstance(RedisServicePubSubSubscriber);
mockInstance(MultiMainInstancePublisher);
mockInstance(OrchestrationHandlerMainService);
});

afterEach(() => {
config.load(config.default);
jest.restoreAllMocks();
});

test('should not init license if instance is follower in multi-main scenario', async () => {
config.set('executions.mode', 'queue');
config.set('leaderSelection.enabled', true);

jest.spyOn(MultiMainInstancePublisher.prototype, 'isFollower', 'get').mockReturnValue(true);
jest.spyOn(BaseCommand.prototype, 'init').mockImplementation(async () => {});

const licenseMock = mockInstance(License, {
isMultipleMainInstancesLicensed: jest.fn().mockReturnValue(true),
});

const startCmd = new Start([], oclifConfig);

await startCmd.init();

expect(licenseMock.init).not.toHaveBeenCalled();
});

0 comments on commit 1c77d65

Please sign in to comment.