From 086e48839293004cd61f356d6fcee2c6aa375b73 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 1 Sep 2020 07:49:45 +0200 Subject: [PATCH] allow multiple registration of the same feature (#76272) --- .../services/feature_usage_service.test.ts | 14 +++++++++++-- .../server/services/feature_usage_service.ts | 20 ++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/licensing/server/services/feature_usage_service.test.ts b/x-pack/plugins/licensing/server/services/feature_usage_service.test.ts index 39f7aa6503b3..943516dc0409 100644 --- a/x-pack/plugins/licensing/server/services/feature_usage_service.test.ts +++ b/x-pack/plugins/licensing/server/services/feature_usage_service.test.ts @@ -19,12 +19,22 @@ describe('FeatureUsageService', () => { describe('#setup', () => { describe('#register', () => { - it('throws when registering the same feature twice', () => { + it('does not throw when registering the same feature twice with the same license', () => { const setup = service.setup(); setup.register('foo', 'basic'); expect(() => { setup.register('foo', 'basic'); - }).toThrowErrorMatchingInlineSnapshot(`"Feature 'foo' has already been registered."`); + }).not.toThrow(); + }); + + it('throws when registering the same feature again with a different license', () => { + const setup = service.setup(); + setup.register('foo', 'basic'); + expect(() => { + setup.register('foo', 'enterprise'); + }).toThrowErrorMatchingInlineSnapshot( + `"Feature 'foo' has already been registered with another license type. (current: basic, new: enterprise)"` + ); }); }); }); diff --git a/x-pack/plugins/licensing/server/services/feature_usage_service.ts b/x-pack/plugins/licensing/server/services/feature_usage_service.ts index 9bfcb28f36b2..75a0c7fa7810 100644 --- a/x-pack/plugins/licensing/server/services/feature_usage_service.ts +++ b/x-pack/plugins/licensing/server/services/feature_usage_service.ts @@ -43,14 +43,20 @@ export class FeatureUsageService { public setup(): FeatureUsageServiceSetup { return { register: (featureName, licenseType) => { - if (this.lastUsages.has(featureName)) { - throw new Error(`Feature '${featureName}' has already been registered.`); + const registered = this.lastUsages.get(featureName); + if (registered) { + if (registered.licenseType !== licenseType) { + throw new Error( + `Feature '${featureName}' has already been registered with another license type. (current: ${registered.licenseType}, new: ${licenseType})` + ); + } + } else { + this.lastUsages.set(featureName, { + name: featureName, + lastUsed: null, + licenseType, + }); } - this.lastUsages.set(featureName, { - name: featureName, - lastUsed: null, - licenseType, - }); }, }; }