diff --git a/.changeset/curly-steaks-mate.md b/.changeset/curly-steaks-mate.md new file mode 100644 index 0000000000..93e53c4959 --- /dev/null +++ b/.changeset/curly-steaks-mate.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-app-api': patch +'@backstage/backend-common': patch +--- + +Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index e99135b3ec..90b76ffb64 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import type { AppConfig } from '@backstage/config'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CacheClient } from '@backstage/backend-common'; import { Config } from '@backstage/config'; @@ -178,6 +179,7 @@ export const lifecycleServiceFactory: () => ServiceFactory< export function loadBackendConfig(options: { remote?: LoadConfigOptionsRemote; argv: string[]; + additionalConfigs?: AppConfig[]; }): Promise<{ config: Config; }>; diff --git a/packages/backend-app-api/src/config/config.ts b/packages/backend-app-api/src/config/config.ts index d3349b41ef..7367767870 100644 --- a/packages/backend-app-api/src/config/config.ts +++ b/packages/backend-app-api/src/config/config.ts @@ -24,7 +24,8 @@ import { ConfigTarget, LoadConfigOptionsRemote, } from '@backstage/config-loader'; -import { Config, ConfigReader } from '@backstage/config'; +import { ConfigReader } from '@backstage/config'; +import type { Config, AppConfig } from '@backstage/config'; import { getPackages } from '@manypkg/get-packages'; import { ObservableConfigProxy } from './ObservableConfigProxy'; import { isValidUrl } from '../lib/urls'; @@ -70,6 +71,7 @@ export async function createConfigSecretEnumerator(options: { export async function loadBackendConfig(options: { remote?: LoadConfigOptionsRemote; argv: string[]; + additionalConfigs?: AppConfig[]; }): Promise<{ config: Config }> { const args = parseArgs(options.argv); @@ -92,8 +94,11 @@ export async function loadBackendConfig(options: { console.info( `Reloaded config from ${newConfigs.map(c => c.context).join(', ')}`, ); - - config.setConfig(ConfigReader.fromConfigs(newConfigs)); + const configsToMerge = [...newConfigs]; + if (options.additionalConfigs) { + configsToMerge.push(...options.additionalConfigs); + } + config.setConfig(ConfigReader.fromConfigs(configsToMerge)); }, stopSignal: new Promise(resolve => { if (currentCancelFunc) { @@ -109,12 +114,15 @@ export async function loadBackendConfig(options: { }), }, }); - console.info( `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`, ); - config.setConfig(ConfigReader.fromConfigs(appConfigs)); + const finalAppConfigs = [...appConfigs]; + if (options.additionalConfigs) { + finalAppConfigs.push(...options.additionalConfigs); + } + config.setConfig(ConfigReader.fromConfigs(finalAppConfigs)); return { config }; } diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index f1d8a74dbe..99f4bfea71 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -6,6 +6,7 @@ /// /// +import { AppConfig } from '@backstage/config'; import { AwsCredentialsManager } from '@backstage/integration-aws-node'; import { AwsS3Integration } from '@backstage/integration'; import { AzureIntegration } from '@backstage/integration'; @@ -533,6 +534,7 @@ export const legacyPlugin: ( export function loadBackendConfig(options: { logger: LoggerService; remote?: LoadConfigOptionsRemote; + additionalConfig?: AppConfig; argv: string[]; }): Promise; diff --git a/packages/backend-common/src/config.ts b/packages/backend-common/src/config.ts index dd96a6b46a..cc824c47fd 100644 --- a/packages/backend-common/src/config.ts +++ b/packages/backend-common/src/config.ts @@ -19,7 +19,7 @@ import { loadBackendConfig as newLoadBackendConfig, } from '@backstage/backend-app-api'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; +import { AppConfig, Config } from '@backstage/config'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { setRootLoggerRedactionList } from './logging/createRootLogger'; @@ -34,6 +34,7 @@ export async function loadBackendConfig(options: { logger: LoggerService; // process.argv or any other overrides remote?: LoadConfigOptionsRemote; + additionalConfig?: AppConfig; argv: string[]; }): Promise { const secretEnumerator = await createConfigSecretEnumerator({