From 660915e983b1f2bd473cbb7bcbb70c4fa642cae5 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 28 Nov 2024 16:59:40 -0500 Subject: [PATCH 1/9] feat: add an instance metadata experimental service Signed-off-by: aramissennyeydd --- .../src/wiring/BackendInitializer.test.ts | 55 +++++++++++++++++++ .../src/wiring/BackendInitializer.ts | 48 ++++++++++++++++ .../definitions/InstanceMetadataService.ts | 30 ++++++++++ .../src/services/definitions/coreServices.ts | 11 ++++ packages/backend/src/instanceMetadata.ts | 33 +++++++++++ 5 files changed, 177 insertions(+) create mode 100644 packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts create mode 100644 packages/backend/src/instanceMetadata.ts diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 8e92fc7120..737aba4743 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -724,4 +724,59 @@ describe('BackendInitializer', () => { await init.start(); }); + + it('should properly add plugins + modules to the instance metadata service', async () => { + expect.assertions(1); + const backend = new BackendInitializer(baseFactories); + const plugin = createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + }); + const instanceMetadataPlugin = createBackendPlugin({ + pluginId: 'instance-metadata', + register(reg) { + reg.registerInit({ + deps: { + instanceMetadata: coreServices.EXPERIMENTAL_instanceMetadata, + }, + async init({ instanceMetadata }) { + expect(instanceMetadata.getInstalledFeatures()).toEqual([ + { + pluginId: 'test', + type: 'plugin', + }, + { + pluginId: 'test', + moduleId: 'test', + type: 'module', + }, + { + pluginId: 'instance-metadata', + type: 'plugin', + }, + ]); + }, + }); + }, + }); + const module = createBackendModule({ + pluginId: 'test', + moduleId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + }); + backend.add(plugin); + backend.add(module); + backend.add(instanceMetadataPlugin); + await backend.start(); + }); }); diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 3ea1200898..cfbaea462c 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -22,6 +22,7 @@ import { ServiceFactory, LifecycleService, RootLifecycleService, + createServiceFactory, } from '@backstage/backend-plugin-api'; import { ServiceOrExtensionPoint } from './types'; // Direct internal import to avoid duplication @@ -96,6 +97,49 @@ const instanceRegistry = new (class InstanceRegistry { }; })(); +type BackendFeatureMeta = + | { + type: 'plugin'; + pluginId: string; + } + | { + type: 'module'; + pluginId: string; + moduleId: string; + }; + +function createInstanceMetadataServiceFactory( + registrations: InternalBackendRegistrations[], +) { + const installedFeatures = registrations + .map(registration => { + if (registration.featureType === 'registrations') { + return registration + .getRegistrations() + .map(feature => { + if (feature.type === 'plugin') { + return { type: 'plugin', pluginId: feature.pluginId }; + } else if (feature.type === 'module') { + return { + type: 'module', + pluginId: feature.pluginId, + moduleId: feature.moduleId, + }; + } + return undefined; + }) + .filter(Boolean) as BackendFeatureMeta[]; + } + return []; + }) + .flat(); + return createServiceFactory({ + service: coreServices.EXPERIMENTAL_instanceMetadata, + deps: {}, + factory: async () => ({ getInstalledFeatures: () => installedFeatures }), + }); +} + export class BackendInitializer { #startPromise?: Promise; #stopPromise?: Promise; @@ -210,6 +254,10 @@ export class BackendInitializer { await this.#applyBackendFeatureLoaders(this.#registeredFeatureLoaders); + this.#serviceRegistry.add( + createInstanceMetadataServiceFactory(this.#registrations), + ); + // Initialize all root scoped services await this.#serviceRegistry.initializeEagerServicesWithScope('root'); diff --git a/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts new file mode 100644 index 0000000000..c9eea973bd --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type BackendFeatureMeta = + | { + type: 'plugin'; + pluginId: string; + } + | { + type: 'module'; + pluginId: string; + moduleId: string; + }; + +export interface InstanceMetadataService { + getInstalledFeatures: () => BackendFeatureMeta[]; +} diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index f87bff023c..06e8905614 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -251,4 +251,15 @@ export namespace coreServices { export const urlReader = createServiceRef< import('./UrlReaderService').UrlReaderService >({ id: 'core.urlReader' }); + + /** + * EXPERIMENTAL: Instance metadata service. + * + * @public + */ + export const EXPERIMENTAL_instanceMetadata = createServiceRef< + import('./InstanceMetadataService').InstanceMetadataService + >({ + id: 'core.instanceMetadata', + }); } diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts new file mode 100644 index 0000000000..2e6c4e2035 --- /dev/null +++ b/packages/backend/src/instanceMetadata.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +export default createBackendPlugin({ + pluginId: 'instance-metadata-logging', + register(env) { + env.registerInit({ + deps: { + instanceMetadata: coreServices.EXPERIMENTAL_instanceMetadata, + }, + async init({ instanceMetadata }) { + console.log('metadata', instanceMetadata.getInstalledFeatures()); + }, + }); + }, +}); From 12eac85f52775223fc2d9df8785f05a18dcca6a7 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 28 Nov 2024 17:04:53 -0500 Subject: [PATCH 2/9] add changeset Signed-off-by: aramissennyeydd --- .changeset/young-months-admire.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/young-months-admire.md diff --git a/.changeset/young-months-admire.md b/.changeset/young-months-admire.md new file mode 100644 index 0000000000..05c1512cc8 --- /dev/null +++ b/.changeset/young-months-admire.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +Adds a new `instanceMetadataService` to hold information about a specific backend instance. From a9273128128b1ef91c2c6962cf22f44bfc76c0fc Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 28 Nov 2024 19:55:57 -0500 Subject: [PATCH 3/9] add comments around usage Signed-off-by: aramissennyeydd --- .changeset/young-months-admire.md | 3 ++- packages/backend-app-api/src/wiring/BackendInitializer.ts | 2 ++ packages/backend/src/instanceMetadata.ts | 8 ++++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.changeset/young-months-admire.md b/.changeset/young-months-admire.md index 05c1512cc8..a2062b3f88 100644 --- a/.changeset/young-months-admire.md +++ b/.changeset/young-months-admire.md @@ -1,5 +1,6 @@ --- '@backstage/backend-app-api': minor +'@backstage/backend-plugin-api': minor --- -Adds a new `instanceMetadataService` to hold information about a specific backend instance. +**EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance. diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index cfbaea462c..ce7717c0cb 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -97,6 +97,7 @@ const instanceRegistry = new (class InstanceRegistry { }; })(); +// Duplicating from `@backstage/backend-plugin-api` to avoid a deep import. type BackendFeatureMeta = | { type: 'plugin'; @@ -126,6 +127,7 @@ function createInstanceMetadataServiceFactory( moduleId: feature.moduleId, }; } + // Ignore unknown feature types. return undefined; }) .filter(Boolean) as BackendFeatureMeta[]; diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts index 2e6c4e2035..dbf2acba54 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend/src/instanceMetadata.ts @@ -18,15 +18,19 @@ import { createBackendPlugin, } from '@backstage/backend-plugin-api'; +// Example usage of the instance metadata service to log the installed features. export default createBackendPlugin({ pluginId: 'instance-metadata-logging', register(env) { env.registerInit({ deps: { instanceMetadata: coreServices.EXPERIMENTAL_instanceMetadata, + logger: coreServices.logger, }, - async init({ instanceMetadata }) { - console.log('metadata', instanceMetadata.getInstalledFeatures()); + async init({ instanceMetadata, logger }) { + logger.info( + `Installed features on this instance: ${instanceMetadata.getInstalledFeatures()}`, + ); }, }); }, From 2f8c58b11b3deef624bf657513bde4d7fefa96d1 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 28 Nov 2024 20:46:34 -0500 Subject: [PATCH 4/9] remove experimental service from core services Signed-off-by: aramissennyeydd --- .../src/wiring/BackendInitializer.ts | 20 ++++--------- packages/backend-plugin-api/src/alpha.ts | 3 ++ .../src/services/definitions/coreServices.ts | 11 ------- .../definitions/experimentalServices.ts | 29 +++++++++++++++++++ packages/backend/src/instanceMetadata.ts | 3 +- 5 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 packages/backend-plugin-api/src/services/definitions/experimentalServices.ts diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index ce7717c0cb..ec36847855 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -35,7 +35,11 @@ import type { // eslint-disable-next-line @backstage/no-relative-monorepo-imports import type { InternalServiceFactory } from '../../../backend-plugin-api/src/services/system/types'; import { ForwardedError, ConflictError } from '@backstage/errors'; -import { featureDiscoveryServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { + experimentalServices, + featureDiscoveryServiceRef, + BackendFeatureMeta, +} from '@backstage/backend-plugin-api/alpha'; import { DependencyGraph } from '../lib/DependencyGraph'; import { ServiceRegistry } from './ServiceRegistry'; import { createInitializationLogger } from './createInitializationLogger'; @@ -97,18 +101,6 @@ const instanceRegistry = new (class InstanceRegistry { }; })(); -// Duplicating from `@backstage/backend-plugin-api` to avoid a deep import. -type BackendFeatureMeta = - | { - type: 'plugin'; - pluginId: string; - } - | { - type: 'module'; - pluginId: string; - moduleId: string; - }; - function createInstanceMetadataServiceFactory( registrations: InternalBackendRegistrations[], ) { @@ -136,7 +128,7 @@ function createInstanceMetadataServiceFactory( }) .flat(); return createServiceFactory({ - service: coreServices.EXPERIMENTAL_instanceMetadata, + service: experimentalServices.EXPERIMENTAL_instanceMetadata, deps: {}, factory: async () => ({ getInstalledFeatures: () => installedFeatures }), }); diff --git a/packages/backend-plugin-api/src/alpha.ts b/packages/backend-plugin-api/src/alpha.ts index 3f26c66fe9..8749537bd2 100644 --- a/packages/backend-plugin-api/src/alpha.ts +++ b/packages/backend-plugin-api/src/alpha.ts @@ -34,3 +34,6 @@ export const featureDiscoveryServiceRef = id: 'core.featureDiscovery', scope: 'root', }); + +export { experimentalServices } from './services/definitions/experimentalServices'; +export type { BackendFeatureMeta } from './services/definitions/InstanceMetadataService'; diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index 06e8905614..f87bff023c 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -251,15 +251,4 @@ export namespace coreServices { export const urlReader = createServiceRef< import('./UrlReaderService').UrlReaderService >({ id: 'core.urlReader' }); - - /** - * EXPERIMENTAL: Instance metadata service. - * - * @public - */ - export const EXPERIMENTAL_instanceMetadata = createServiceRef< - import('./InstanceMetadataService').InstanceMetadataService - >({ - id: 'core.instanceMetadata', - }); } diff --git a/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts b/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts new file mode 100644 index 0000000000..b1c820742d --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createServiceRef } from '../system'; + +export namespace experimentalServices { + /** + * EXPERIMENTAL: Instance metadata service. + * + * @public + */ + export const EXPERIMENTAL_instanceMetadata = createServiceRef< + import('./InstanceMetadataService').InstanceMetadataService + >({ + id: 'core.instanceMetadata', + }); +} diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts index dbf2acba54..923fc8beea 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend/src/instanceMetadata.ts @@ -17,6 +17,7 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; +import { experimentalServices } from '@backstage/backend-plugin-api/alpha'; // Example usage of the instance metadata service to log the installed features. export default createBackendPlugin({ @@ -24,7 +25,7 @@ export default createBackendPlugin({ register(env) { env.registerInit({ deps: { - instanceMetadata: coreServices.EXPERIMENTAL_instanceMetadata, + instanceMetadata: experimentalServices.EXPERIMENTAL_instanceMetadata, logger: coreServices.logger, }, async init({ instanceMetadata, logger }) { From 51ae068e104253ebc6fae789667a85ad8f5b1d0e Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 29 Nov 2024 09:15:04 -0500 Subject: [PATCH 5/9] adjust ref Signed-off-by: aramissennyeydd --- .../backend-app-api/src/wiring/BackendInitializer.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 737aba4743..61c70a3ebe 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -27,6 +27,7 @@ import { createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; +import { experimentalServices } from '@backstage/backend-plugin-api/alpha'; class MockLogger { debug() {} @@ -742,7 +743,8 @@ describe('BackendInitializer', () => { register(reg) { reg.registerInit({ deps: { - instanceMetadata: coreServices.EXPERIMENTAL_instanceMetadata, + instanceMetadata: + experimentalServices.EXPERIMENTAL_instanceMetadata, }, async init({ instanceMetadata }) { expect(instanceMetadata.getInstalledFeatures()).toEqual([ From af86ae9e570616edeacde796bdbd64c83ea92de4 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 29 Nov 2024 09:44:09 -0500 Subject: [PATCH 6/9] move to a top level service Signed-off-by: aramissennyeydd --- .../src/wiring/BackendInitializer.test.ts | 5 ++-- .../src/wiring/BackendInitializer.ts | 4 +-- .../backend-plugin-api/report-alpha.api.md | 25 ++++++++++++++++ packages/backend-plugin-api/src/alpha.ts | 17 +++++++++-- .../definitions/InstanceMetadataService.ts | 2 ++ .../definitions/experimentalServices.ts | 29 ------------------- packages/backend/src/instanceMetadata.ts | 4 +-- 7 files changed, 48 insertions(+), 38 deletions(-) delete mode 100644 packages/backend-plugin-api/src/services/definitions/experimentalServices.ts diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 61c70a3ebe..29c1041afc 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -27,7 +27,7 @@ import { createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; -import { experimentalServices } from '@backstage/backend-plugin-api/alpha'; +import { EXPERIMENTAL_instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; class MockLogger { debug() {} @@ -743,8 +743,7 @@ describe('BackendInitializer', () => { register(reg) { reg.registerInit({ deps: { - instanceMetadata: - experimentalServices.EXPERIMENTAL_instanceMetadata, + instanceMetadata: EXPERIMENTAL_instanceMetadataServiceRef, }, async init({ instanceMetadata }) { expect(instanceMetadata.getInstalledFeatures()).toEqual([ diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index ec36847855..93352479bf 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -36,7 +36,7 @@ import type { import type { InternalServiceFactory } from '../../../backend-plugin-api/src/services/system/types'; import { ForwardedError, ConflictError } from '@backstage/errors'; import { - experimentalServices, + EXPERIMENTAL_instanceMetadataServiceRef, featureDiscoveryServiceRef, BackendFeatureMeta, } from '@backstage/backend-plugin-api/alpha'; @@ -128,7 +128,7 @@ function createInstanceMetadataServiceFactory( }) .flat(); return createServiceFactory({ - service: experimentalServices.EXPERIMENTAL_instanceMetadata, + service: EXPERIMENTAL_instanceMetadataServiceRef, deps: {}, factory: async () => ({ getInstalledFeatures: () => installedFeatures }), }); diff --git a/packages/backend-plugin-api/report-alpha.api.md b/packages/backend-plugin-api/report-alpha.api.md index dea357502e..dd20930e2e 100644 --- a/packages/backend-plugin-api/report-alpha.api.md +++ b/packages/backend-plugin-api/report-alpha.api.md @@ -6,6 +6,25 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; +// @alpha (undocumented) +export type BackendFeatureMeta = + | { + type: 'plugin'; + pluginId: string; + } + | { + type: 'module'; + pluginId: string; + moduleId: string; + }; + +// @alpha +export const EXPERIMENTAL_instanceMetadataServiceRef: ServiceRef< + InstanceMetadataService, + 'plugin', + 'singleton' +>; + // @alpha (undocumented) export interface FeatureDiscoveryService { // (undocumented) @@ -21,5 +40,11 @@ export const featureDiscoveryServiceRef: ServiceRef< 'singleton' >; +// @alpha (undocumented) +export interface InstanceMetadataService { + // (undocumented) + getInstalledFeatures: () => BackendFeatureMeta[]; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-plugin-api/src/alpha.ts b/packages/backend-plugin-api/src/alpha.ts index 8749537bd2..8d9e126b16 100644 --- a/packages/backend-plugin-api/src/alpha.ts +++ b/packages/backend-plugin-api/src/alpha.ts @@ -35,5 +35,18 @@ export const featureDiscoveryServiceRef = scope: 'root', }); -export { experimentalServices } from './services/definitions/experimentalServices'; -export type { BackendFeatureMeta } from './services/definitions/InstanceMetadataService'; +/** + * EXPERIMENTAL: Instance metadata service. + * + * @alpha + */ +export const EXPERIMENTAL_instanceMetadataServiceRef = createServiceRef< + import('./services/definitions/InstanceMetadataService').InstanceMetadataService +>({ + id: 'experimental.instanceMetadata', +}); + +export type { + BackendFeatureMeta, + InstanceMetadataService, +} from './services/definitions/InstanceMetadataService'; diff --git a/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts index c9eea973bd..869d361343 100644 --- a/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +/** @alpha */ export type BackendFeatureMeta = | { type: 'plugin'; @@ -25,6 +26,7 @@ export type BackendFeatureMeta = moduleId: string; }; +/** @alpha */ export interface InstanceMetadataService { getInstalledFeatures: () => BackendFeatureMeta[]; } diff --git a/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts b/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts deleted file mode 100644 index b1c820742d..0000000000 --- a/packages/backend-plugin-api/src/services/definitions/experimentalServices.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { createServiceRef } from '../system'; - -export namespace experimentalServices { - /** - * EXPERIMENTAL: Instance metadata service. - * - * @public - */ - export const EXPERIMENTAL_instanceMetadata = createServiceRef< - import('./InstanceMetadataService').InstanceMetadataService - >({ - id: 'core.instanceMetadata', - }); -} diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts index 923fc8beea..a27922f71f 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend/src/instanceMetadata.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -import { experimentalServices } from '@backstage/backend-plugin-api/alpha'; +import { EXPERIMENTAL_instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; // Example usage of the instance metadata service to log the installed features. export default createBackendPlugin({ @@ -25,7 +25,7 @@ export default createBackendPlugin({ register(env) { env.registerInit({ deps: { - instanceMetadata: experimentalServices.EXPERIMENTAL_instanceMetadata, + instanceMetadata: EXPERIMENTAL_instanceMetadataServiceRef, logger: coreServices.logger, }, async init({ instanceMetadata, logger }) { From c1a3bdbe1276f7a0a88861f41eff00662b2d9bc5 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 2 Dec 2024 07:56:50 -0500 Subject: [PATCH 7/9] remove experimental prefix and add instance metadata example plugin by default Signed-off-by: aramissennyeydd --- .../backend-app-api/src/wiring/BackendInitializer.test.ts | 4 ++-- packages/backend-app-api/src/wiring/BackendInitializer.ts | 4 ++-- packages/backend-plugin-api/src/alpha.ts | 4 ++-- packages/backend/src/index.ts | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 29c1041afc..f6d65e883e 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -27,7 +27,7 @@ import { createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; -import { EXPERIMENTAL_instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; class MockLogger { debug() {} @@ -743,7 +743,7 @@ describe('BackendInitializer', () => { register(reg) { reg.registerInit({ deps: { - instanceMetadata: EXPERIMENTAL_instanceMetadataServiceRef, + instanceMetadata: instanceMetadataServiceRef, }, async init({ instanceMetadata }) { expect(instanceMetadata.getInstalledFeatures()).toEqual([ diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 93352479bf..3e7b46fc9e 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -36,7 +36,7 @@ import type { import type { InternalServiceFactory } from '../../../backend-plugin-api/src/services/system/types'; import { ForwardedError, ConflictError } from '@backstage/errors'; import { - EXPERIMENTAL_instanceMetadataServiceRef, + instanceMetadataServiceRef, featureDiscoveryServiceRef, BackendFeatureMeta, } from '@backstage/backend-plugin-api/alpha'; @@ -128,7 +128,7 @@ function createInstanceMetadataServiceFactory( }) .flat(); return createServiceFactory({ - service: EXPERIMENTAL_instanceMetadataServiceRef, + service: instanceMetadataServiceRef, deps: {}, factory: async () => ({ getInstalledFeatures: () => installedFeatures }), }); diff --git a/packages/backend-plugin-api/src/alpha.ts b/packages/backend-plugin-api/src/alpha.ts index 8d9e126b16..1a39fe6c23 100644 --- a/packages/backend-plugin-api/src/alpha.ts +++ b/packages/backend-plugin-api/src/alpha.ts @@ -40,10 +40,10 @@ export const featureDiscoveryServiceRef = * * @alpha */ -export const EXPERIMENTAL_instanceMetadataServiceRef = createServiceRef< +export const instanceMetadataServiceRef = createServiceRef< import('./services/definitions/InstanceMetadataService').InstanceMetadataService >({ - id: 'experimental.instanceMetadata', + id: 'core.instanceMetadata', }); export type { diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index d8a4bcb98f..8ae9864a4a 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -59,5 +59,6 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); +backend.add(import('./instanceMetadata')); backend.start(); From c0e7198fdb4d34c83cdbbbbb78535e8addad33ac Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 2 Dec 2024 08:17:31 -0500 Subject: [PATCH 8/9] fix api report Signed-off-by: aramissennyeydd --- packages/backend-plugin-api/report-alpha.api.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/backend-plugin-api/report-alpha.api.md b/packages/backend-plugin-api/report-alpha.api.md index dd20930e2e..8509d1196d 100644 --- a/packages/backend-plugin-api/report-alpha.api.md +++ b/packages/backend-plugin-api/report-alpha.api.md @@ -18,13 +18,6 @@ export type BackendFeatureMeta = moduleId: string; }; -// @alpha -export const EXPERIMENTAL_instanceMetadataServiceRef: ServiceRef< - InstanceMetadataService, - 'plugin', - 'singleton' ->; - // @alpha (undocumented) export interface FeatureDiscoveryService { // (undocumented) @@ -46,5 +39,12 @@ export interface InstanceMetadataService { getInstalledFeatures: () => BackendFeatureMeta[]; } +// @alpha +export const instanceMetadataServiceRef: ServiceRef< + InstanceMetadataService, + 'plugin', + 'singleton' +>; + // (No @packageDocumentation comment for this package) ``` From 0f396fa1c0cd6f0a37f4941c63da04729af73dcb Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 2 Dec 2024 09:36:34 -0500 Subject: [PATCH 9/9] fix import Signed-off-by: aramissennyeydd --- packages/backend/src/instanceMetadata.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts index a27922f71f..dd499aa40a 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend/src/instanceMetadata.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -import { EXPERIMENTAL_instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; // Example usage of the instance metadata service to log the installed features. export default createBackendPlugin({ @@ -25,7 +25,7 @@ export default createBackendPlugin({ register(env) { env.registerInit({ deps: { - instanceMetadata: EXPERIMENTAL_instanceMetadataServiceRef, + instanceMetadata: instanceMetadataServiceRef, logger: coreServices.logger, }, async init({ instanceMetadata, logger }) {