From 375a4036645dc829d2af39b0948e3ca43174f418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 15 Jun 2022 15:44:10 +0200 Subject: [PATCH] Add more service implementations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Patrik Oldsberg Co-authored-by: blam Co-authored-by: Johan Haals Signed-off-by: Fredrik Adelöw --- packages/backend-app-api/package.json | 4 +- .../services/implementations/configService.ts | 37 +++++++++++ .../services/implementations/loggerService.ts | 63 +++++++++++++++++++ .../implementations/urlReaderService.ts | 41 ++++++++++++ .../src/wiring/BackendInitializer.ts | 3 +- .../src/wiring/BackstageBackend.ts | 3 +- .../src/wiring/CoreApiRegistry.ts | 2 +- packages/backend-app-api/src/wiring/types.ts | 9 ++- packages/backend-plugin-api/package.json | 3 +- .../definitions/cacheManagerServiceRef.ts | 22 +++++++ .../services/definitions/cacheServiceRef.ts | 22 +++++++ .../{configApiRef.ts => configServiceRef.ts} | 2 +- .../definitions/databaseServiceRef.ts | 22 +++++++ .../definitions/discoveryServiceRef.ts | 22 +++++++ ...outerApiRef.ts => httpRouterServiceRef.ts} | 2 +- .../src/services/definitions/index.ts | 15 +++-- .../{loggerApiRef.ts => loggerServiceRef.ts} | 4 +- .../definitions/tokenManagerServiceRef.ts | 22 +++++++ .../definitions/urlReaderServiceRef.ts | 22 +++++++ .../src/services/system/types.ts | 8 +++ packages/backend/src/next/index.ts | 19 ++++-- 21 files changed, 325 insertions(+), 22 deletions(-) create mode 100644 packages/backend-app-api/src/services/implementations/configService.ts create mode 100644 packages/backend-app-api/src/services/implementations/loggerService.ts create mode 100644 packages/backend-app-api/src/services/implementations/urlReaderService.ts create mode 100644 packages/backend-plugin-api/src/services/definitions/cacheManagerServiceRef.ts create mode 100644 packages/backend-plugin-api/src/services/definitions/cacheServiceRef.ts rename packages/backend-plugin-api/src/services/definitions/{configApiRef.ts => configServiceRef.ts} (92%) create mode 100644 packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts create mode 100644 packages/backend-plugin-api/src/services/definitions/discoveryServiceRef.ts rename packages/backend-plugin-api/src/services/definitions/{httpRouterApiRef.ts => httpRouterServiceRef.ts} (91%) rename packages/backend-plugin-api/src/services/definitions/{loggerApiRef.ts => loggerServiceRef.ts} (89%) create mode 100644 packages/backend-plugin-api/src/services/definitions/tokenManagerServiceRef.ts create mode 100644 packages/backend-plugin-api/src/services/definitions/urlReaderServiceRef.ts diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index ab88009d64..02c5450021 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -34,7 +34,9 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-plugin-api": "^0.0.0" + "@backstage/backend-plugin-api": "^0.0.0", + "@backstage/backend-common": "^0.14.0", + "winston": "^3.2.1" }, "devDependencies": { "@backstage/cli": "^0.17.2-next.0" diff --git a/packages/backend-app-api/src/services/implementations/configService.ts b/packages/backend-app-api/src/services/implementations/configService.ts new file mode 100644 index 0000000000..b066989069 --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/configService.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2022 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 { loadBackendConfig } from '@backstage/backend-common'; +import { + configServiceRef, + createServiceFactory, + loggerServiceRef, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from './loggerService'; + +export const configService = createServiceFactory({ + service: configServiceRef, + deps: { loggerFactory: loggerServiceRef }, + factory: async ({ loggerFactory }) => { + const logger = await loggerFactory('root'); + const config = await loadBackendConfig({ + argv: process.argv, + logger: loggerToWinstonLogger(logger), + }); + + return async () => config; + }, +}); diff --git a/packages/backend-app-api/src/services/implementations/loggerService.ts b/packages/backend-app-api/src/services/implementations/loggerService.ts new file mode 100644 index 0000000000..4b6eadfa1f --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/loggerService.ts @@ -0,0 +1,63 @@ +/* + * Copyright 2022 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 { createRootLogger } from '@backstage/backend-common'; +import { + createServiceFactory, + Logger, + loggerServiceRef, +} from '@backstage/backend-plugin-api'; +import { Logger as WinstonLogger } from 'winston'; + +class BackstageLogger implements Logger { + constructor( + private readonly options: { + winston: WinstonLogger; + }, + ) {} + + info(message: string, ...meta: any[]): void { + this.options.winston.info(message, ...meta); + } + + child(fields: { [name: string]: string }): Logger { + return new BackstageLogger({ + winston: this.options.winston.child(fields), + }); + } + + toWinston() { + return this.options.winston; + } +} + +export function loggerToWinstonLogger(logger: Logger): WinstonLogger { + return (logger as BackstageLogger).toWinston(); +} + +export const loggerFactory = createServiceFactory({ + service: loggerServiceRef, + deps: {}, + factory: async () => { + const root = new BackstageLogger({ + winston: createRootLogger(), + }); + + return async (pluginId: string) => { + return root.child({ pluginId }); + }; + }, +}); diff --git a/packages/backend-app-api/src/services/implementations/urlReaderService.ts b/packages/backend-app-api/src/services/implementations/urlReaderService.ts new file mode 100644 index 0000000000..afbc80d9ac --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/urlReaderService.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2022 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 { UrlReaders } from '@backstage/backend-common'; +import { + configServiceRef, + createServiceFactory, + loggerServiceRef, + urlReaderServiceRef, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from './loggerService'; + +export const urlReaderFactory = createServiceFactory({ + service: urlReaderServiceRef, + deps: { + loggerFactory: loggerServiceRef, + configFactory: configServiceRef, + }, + factory: async ({ loggerFactory, configFactory }) => { + return async (pluginId: string) => { + const logger = await loggerFactory(pluginId); + return UrlReaders.default({ + logger: loggerToWinstonLogger(logger), + config: await configFactory(pluginId), + }); + }; + }, +}); diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 8c2f2714c4..a613e88bb1 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -15,7 +15,7 @@ */ import { BackendRegistrable, ServiceRef } from '@backstage/backend-plugin-api'; -import { BackendRegisterInit, ApiHolder } from './types'; +import { ApiHolder, BackendRegisterInit } from './types'; export class BackendInitializer { #started = false; @@ -133,7 +133,6 @@ export class BackendInitializer { for (const registerInit of registerInitsToOrder) { const unInitializedDependents = Array.from( registerInit.provides, - // eslint-disable-next-line no-loop-func ).filter(r => registerInitsToOrder.some( init => init !== registerInit && init.consumes.has(r), diff --git a/packages/backend-app-api/src/wiring/BackstageBackend.ts b/packages/backend-app-api/src/wiring/BackstageBackend.ts index ae27c4ee05..69df1fdf82 100644 --- a/packages/backend-app-api/src/wiring/BackstageBackend.ts +++ b/packages/backend-app-api/src/wiring/BackstageBackend.ts @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { - BackendRegistrable, AnyServiceFactory, + BackendRegistrable, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; import { CoreApiRegistry } from './CoreApiRegistry'; diff --git a/packages/backend-app-api/src/wiring/CoreApiRegistry.ts b/packages/backend-app-api/src/wiring/CoreApiRegistry.ts index a144fc448d..4b1e0f5ce0 100644 --- a/packages/backend-app-api/src/wiring/CoreApiRegistry.ts +++ b/packages/backend-app-api/src/wiring/CoreApiRegistry.ts @@ -15,8 +15,8 @@ */ import { AnyServiceFactory, - ServiceRef, FactoryFunc, + ServiceRef, } from '@backstage/backend-plugin-api'; export class CoreApiRegistry { diff --git a/packages/backend-app-api/src/wiring/types.ts b/packages/backend-app-api/src/wiring/types.ts index 44640cbc07..5c2e7a9e96 100644 --- a/packages/backend-app-api/src/wiring/types.ts +++ b/packages/backend-app-api/src/wiring/types.ts @@ -15,11 +15,12 @@ */ import { - BackendRegistrable, AnyServiceFactory, - ServiceRef, + BackendRegistrable, FactoryFunc, + ServiceRef, } from '@backstage/backend-plugin-api'; +import { loggerFactory } from '../services/implementations/loggerService'; import { BackstageBackend } from './BackstageBackend'; export interface Backend { @@ -44,5 +45,7 @@ export type ApiHolder = { }; export function createBackend(options?: CreateBackendOptions): Backend { - return new BackstageBackend(options?.apis ?? []); + // TODO: merge with provided APIs + const defaultApis = [loggerFactory]; + return new BackstageBackend([...defaultApis, ...(options?.apis ?? [])]); } diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index ccda227018..6d75af03a7 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -34,7 +34,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/config": "^1.0.1" + "@backstage/config": "^1.0.1", + "@backstage/backend-common": "^0.14.0" }, "devDependencies": { "@backstage/cli": "^0.17.2-next.0" diff --git a/packages/backend-plugin-api/src/services/definitions/cacheManagerServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/cacheManagerServiceRef.ts new file mode 100644 index 0000000000..9dab256704 --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/cacheManagerServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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/types'; +import { CacheManager } from '@backstage/backend-common'; + +export const cacheManagerServiceRef = createServiceRef({ + id: 'core.cacheManager', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/cacheServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/cacheServiceRef.ts new file mode 100644 index 0000000000..439a2b645d --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/cacheServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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/types'; +import { PluginCacheManager } from '@backstage/backend-common'; + +export const cacheServiceRef = createServiceRef({ + id: 'core.cache', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/configApiRef.ts b/packages/backend-plugin-api/src/services/definitions/configServiceRef.ts similarity index 92% rename from packages/backend-plugin-api/src/services/definitions/configApiRef.ts rename to packages/backend-plugin-api/src/services/definitions/configServiceRef.ts index cca1445079..9a4199967d 100644 --- a/packages/backend-plugin-api/src/services/definitions/configApiRef.ts +++ b/packages/backend-plugin-api/src/services/definitions/configServiceRef.ts @@ -17,6 +17,6 @@ import { Config } from '@backstage/config'; import { createServiceRef } from '../system/types'; -export const configApiRef = createServiceRef({ +export const configServiceRef = createServiceRef({ id: 'core.config', }); diff --git a/packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts new file mode 100644 index 0000000000..62f7f8a157 --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/databaseServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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 { PluginDatabaseManager } from '@backstage/backend-common'; +import { createServiceRef } from '../system/types'; + +export const databaseServiceRef = createServiceRef({ + id: 'core.database', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/discoveryServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/discoveryServiceRef.ts new file mode 100644 index 0000000000..3dfd5fa62b --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/discoveryServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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/types'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; + +export const discoveryServiceRef = createServiceRef({ + id: 'core.discovery', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/httpRouterApiRef.ts b/packages/backend-plugin-api/src/services/definitions/httpRouterServiceRef.ts similarity index 91% rename from packages/backend-plugin-api/src/services/definitions/httpRouterApiRef.ts rename to packages/backend-plugin-api/src/services/definitions/httpRouterServiceRef.ts index d54ebd36bf..9cf1089119 100644 --- a/packages/backend-plugin-api/src/services/definitions/httpRouterApiRef.ts +++ b/packages/backend-plugin-api/src/services/definitions/httpRouterServiceRef.ts @@ -20,6 +20,6 @@ export interface HttpRouterApi { get(path: string): void; } -export const httpRouterApiRef = createServiceRef({ +export const httpRouterServiceRef = createServiceRef({ id: 'core.httpRouter', }); diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index b11b2f8c4e..8b78d2d0ee 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -26,8 +26,13 @@ // scheduler: PluginTaskScheduler; // }; -export { configApiRef } from './configApiRef'; -export { httpRouterApiRef } from './httpRouterApiRef'; -export type { HttpRouterApi } from './httpRouterApiRef'; -export { loggerApiRef } from './loggerApiRef'; -export type { Logger } from './loggerApiRef'; +export { configServiceRef } from './configServiceRef'; +export { httpRouterServiceRef } from './httpRouterServiceRef'; +export type { HttpRouterApi } from './httpRouterServiceRef'; +export { loggerServiceRef } from './loggerServiceRef'; +export type { Logger } from './loggerServiceRef'; +export { urlReaderServiceRef } from './urlReaderServiceRef'; +export { cacheServiceRef } from './cacheServiceRef'; +export { databaseServiceRef } from './databaseServiceRef'; +export { discoveryServiceRef } from './discoveryServiceRef'; +export { tokenManagerServiceRef } from './tokenManagerServiceRef'; diff --git a/packages/backend-plugin-api/src/services/definitions/loggerApiRef.ts b/packages/backend-plugin-api/src/services/definitions/loggerServiceRef.ts similarity index 89% rename from packages/backend-plugin-api/src/services/definitions/loggerApiRef.ts rename to packages/backend-plugin-api/src/services/definitions/loggerServiceRef.ts index 348ffc9cf4..564ce15ded 100644 --- a/packages/backend-plugin-api/src/services/definitions/loggerApiRef.ts +++ b/packages/backend-plugin-api/src/services/definitions/loggerServiceRef.ts @@ -17,10 +17,10 @@ import { createServiceRef } from '../system/types'; export interface Logger { - log(message: string): void; + info(message: string): void; child(fields: { [name: string]: string }): Logger; } -export const loggerApiRef = createServiceRef({ +export const loggerServiceRef = createServiceRef({ id: 'core.logger', }); diff --git a/packages/backend-plugin-api/src/services/definitions/tokenManagerServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/tokenManagerServiceRef.ts new file mode 100644 index 0000000000..c62d4bb634 --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/tokenManagerServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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/types'; +import { TokenManager } from '@backstage/backend-common'; + +export const tokenManagerServiceRef = createServiceRef({ + id: 'core.tokenManager', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/urlReaderServiceRef.ts b/packages/backend-plugin-api/src/services/definitions/urlReaderServiceRef.ts new file mode 100644 index 0000000000..25a9666882 --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/urlReaderServiceRef.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 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/types'; +import { UrlReader } from '@backstage/backend-common'; + +export const urlReaderServiceRef = createServiceRef({ + id: 'core.urlReader', +}); diff --git a/packages/backend-plugin-api/src/services/system/types.ts b/packages/backend-plugin-api/src/services/system/types.ts index 86ad8d42f0..2f59e65320 100644 --- a/packages/backend-plugin-api/src/services/system/types.ts +++ b/packages/backend-plugin-api/src/services/system/types.ts @@ -68,3 +68,11 @@ export function createServiceRef(options: { id: string }): ServiceRef { $$ref: 'service', // TODO: declare }; } + +export function createServiceFactory< + Api, + Impl extends Api, + Deps extends { [name in string]: unknown }, +>(factory: ServiceFactory): ServiceFactory { + return factory; +} diff --git a/packages/backend/src/next/index.ts b/packages/backend/src/next/index.ts index 221332f6ba..45cf414e01 100644 --- a/packages/backend/src/next/index.ts +++ b/packages/backend/src/next/index.ts @@ -19,6 +19,7 @@ import { createBackendModule, createBackendPlugin, createServiceRef, + loggerServiceRef, } from '@backstage/backend-plugin-api'; // import { catalogPlugin } from '@backstage/plugin-catalog-backend'; // import { scaffolderPlugin } from '@backstage/plugin-scaffolder-backend'; @@ -60,12 +61,12 @@ export const catalogPlugin = createBackendPlugin({ env.registerInit({ deps: { - // logger: loggerApiRef, + logger: loggerServiceRef, }, - async init() { + async init({ logger }) { + // const builder = await CatalogBuilder.create(env); + logger.log('boppp'); console.log('I HAZ', processingExtensions.processors[0].process()); - console.log('I AM le CATALOG!'); - // logger.log('HELLO!'); }, }); }, @@ -94,6 +95,16 @@ const backend = createBackend({ apis: [], }); +// logger: Logger; +// cache: PluginCacheManager; +// database: PluginDatabaseManager; +// config: Config; +// reader: UrlReader; +// discovery: PluginEndpointDiscovery; +// tokenManager: TokenManager; +// permissions: PermissionEvaluator | PermissionAuthorizer; +// scheduler: PluginTaskScheduler; + // backend.add(scaffolderPlugin()); backend.add(catalogPlugin({})); backend.add(scaffolderCatalogExtension({}));