diff --git a/.changeset/dull-hotels-dream.md b/.changeset/dull-hotels-dream.md new file mode 100644 index 000000000..24d801655 --- /dev/null +++ b/.changeset/dull-hotels-dream.md @@ -0,0 +1,5 @@ +--- +'backend': patch +--- + +Correctly use the dynamic plugins configuration schemas in the Showcase application diff --git a/dynamic-plugins/wrappers/backstage-plugin-azure-devops-backend-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-azure-devops-backend-dynamic/package.json index 032fde789..77536b5aa 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-azure-devops-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-azure-devops-backend-dynamic/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-azure-devops/package.json b/dynamic-plugins/wrappers/backstage-plugin-azure-devops/package.json index 83c142640..e174068e7 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-azure-devops/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-azure-devops/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-dynamic/package.json index 83b113251..2898ae321 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-dynamic/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-org-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-org-dynamic/package.json index b15947052..aa044d003 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-org-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-github-org-dynamic/package.json @@ -31,7 +31,7 @@ "@backstage/plugin-catalog-backend-module-github": "0.4.4" }, "devDependencies": { - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-gitlab-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-gitlab-dynamic/package.json index ea6f1523b..f5b1d00bd 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-gitlab-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-catalog-backend-module-gitlab-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-dynatrace/package.json b/dynamic-plugins/wrappers/backstage-plugin-dynatrace/package.json index 3e2a580e6..9d8e85ff1 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-dynatrace/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-dynatrace/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-github-actions/package.json b/dynamic-plugins/wrappers/backstage-plugin-github-actions/package.json index 161d83752..97980f0b2 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-github-actions/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-github-actions/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-github-issues/package.json b/dynamic-plugins/wrappers/backstage-plugin-github-issues/package.json index b7edb1aee..cb61ee9a7 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-github-issues/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-github-issues/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-jenkins-backend-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-jenkins-backend-dynamic/package.json index 0c55c961c..6a562b145 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-jenkins-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-jenkins-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-jenkins/package.json b/dynamic-plugins/wrappers/backstage-plugin-jenkins/package.json index ef060ec0a..f39d93c6f 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-jenkins/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-jenkins/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-kubernetes-backend-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-kubernetes-backend-dynamic/package.json index 22d16dbcf..43b843986 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-kubernetes-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-kubernetes-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-kubernetes/package.json b/dynamic-plugins/wrappers/backstage-plugin-kubernetes/package.json index 6af29f151..f1ac81310 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-kubernetes/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-kubernetes/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-lighthouse/package.json b/dynamic-plugins/wrappers/backstage-plugin-lighthouse/package.json index 180e52884..7413c1ecb 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-lighthouse/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-lighthouse/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-pagerduty/package.json b/dynamic-plugins/wrappers/backstage-plugin-pagerduty/package.json index e0e7d32a4..23c063d08 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-pagerduty/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-pagerduty/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-scaffolder-backend-module-gitlab-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-scaffolder-backend-module-gitlab-dynamic/package.json index 5a9769b56..364cbc2a9 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-scaffolder-backend-module-gitlab-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-scaffolder-backend-module-gitlab-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-sonarqube-backend-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-sonarqube-backend-dynamic/package.json index 2b3fa2224..2a54ce760 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-sonarqube-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-sonarqube-backend-dynamic/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-sonarqube/package.json b/dynamic-plugins/wrappers/backstage-plugin-sonarqube/package.json index 90c15fca2..b3e1b75a0 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-sonarqube/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-sonarqube/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/backstage-plugin-techdocs-backend-dynamic/package.json b/dynamic-plugins/wrappers/backstage-plugin-techdocs-backend-dynamic/package.json index 72b56c31f..1357fe758 100644 --- a/dynamic-plugins/wrappers/backstage-plugin-techdocs-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/backstage-plugin-techdocs-backend-dynamic/package.json @@ -36,7 +36,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic/package.json b/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic/package.json index 138266013..4d228ba6e 100644 --- a/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab/package.json b/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab/package.json index a145c8698..a2bf83d89 100644 --- a/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab/package.json +++ b/dynamic-plugins/wrappers/immobiliarelabs-backstage-plugin-gitlab/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-aap-backend-dynamic/package.json b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-aap-backend-dynamic/package.json index e617de539..cdd296f7b 100644 --- a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-aap-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-aap-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-keycloak-backend-dynamic/package.json b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-keycloak-backend-dynamic/package.json index 1fdccf669..935716922 100644 --- a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-keycloak-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-keycloak-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-ocm-backend-dynamic/package.json b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-ocm-backend-dynamic/package.json index 47ef564aa..3bf8c8d4a 100644 --- a/dynamic-plugins/wrappers/janus-idp-backstage-plugin-ocm-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/janus-idp-backstage-plugin-ocm-backend-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd-backend-dynamic/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd-backend-dynamic/package.json index f13f57800..039f90b55 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd-backend-dynamic/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd-backend-dynamic/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd/package.json index d10f1887a..95561cbeb 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-argo-cd/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-datadog/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-datadog/package.json index 07db25b08..44261c5eb 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-datadog/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-datadog/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-insights/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-insights/package.json index bbbf4dad0..79713d057 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-insights/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-insights/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-pull-requests/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-pull-requests/package.json index cb3f24017..a581bef13 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-pull-requests/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-github-pull-requests/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-jira/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-jira/package.json index 996b6b6e5..d18c6cb7e 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-jira/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-jira/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-security-insights/package.json b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-security-insights/package.json index 3e3c8cf0e..5a2bcc139 100644 --- a/dynamic-plugins/wrappers/roadiehq-backstage-plugin-security-insights/package.json +++ b/dynamic-plugins/wrappers/roadiehq-backstage-plugin-security-insights/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-argocd-dynamic/package.json b/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-argocd-dynamic/package.json index dcd2e9bcf..185e89ae0 100644 --- a/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-argocd-dynamic/package.json +++ b/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-argocd-dynamic/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-module-utils-dynamic/package.json b/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-module-utils-dynamic/package.json index 660a195ea..8931d2c59 100644 --- a/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-module-utils-dynamic/package.json +++ b/dynamic-plugins/wrappers/roadiehq-scaffolder-backend-module-utils-dynamic/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@backstage/cli": "0.23.1", - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, "files": [ "dist", diff --git a/packages/app/package.json b/packages/app/package.json index 9999a0f08..53053493f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -59,7 +59,7 @@ }, "devDependencies": { "@backstage/test-utils": "1.4.4", - "@janus-idp/cli": "1.3.3", + "@janus-idp/cli": "1.4.0", "@scalprum/react-test-utils": "0.0.5", "@testing-library/dom": "8.20.1", "@testing-library/jest-dom": "5.17.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 387175112..f46d47db6 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -17,6 +17,9 @@ }, "dependencies": { "@backstage/backend-common": "0.19.8", + "@backstage/backend-app-api": "0.5.7", + "@backstage/backend-plugin-api": "0.6.6", + "@backstage/config-loader": "1.5.2", "@backstage/backend-plugin-manager": "npm:@janus-idp/backend-plugin-manager@0.0.2-janus.5", "@backstage/backend-tasks": "0.5.11", "@backstage/catalog-client": "1.4.5", @@ -48,10 +51,12 @@ "express-promise-router": "4.1.1", "isolated-vm": "4.6.0", "pg": "8.11.3", + "lodash": "4.17.21", "prom-client": "15.0.0", "winston": "3.11.0", "fs-extra": "10.1.0", - "express-rate-limit": "7.1.3" + "express-rate-limit": "7.1.3", + "@manypkg/get-packages": "1.1.3" }, "devDependencies": { "@backstage/cli": "0.23.1", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 6a1a885df..80ed2123b 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -8,10 +8,14 @@ import { createServiceBuilder, createStatusCheckRouter, getRootLogger, - loadBackendConfig, notFoundHandler, useHotMemoize, + createRootLogger, } from '@backstage/backend-common'; +import { + loadBackendConfig, + createConfigSecretEnumerator, +} from '@backstage/backend-app-api'; import { BackendPluginProvider, LegacyPluginEnvironment as PluginEnvironment, @@ -19,6 +23,7 @@ import { } from '@backstage/backend-plugin-manager'; import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; +import * as winston from 'winston'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; import { DefaultEventBroker } from '@backstage/plugin-events-backend'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; @@ -34,6 +39,10 @@ import permission from './plugins/permission'; import proxy from './plugins/proxy'; import scaffolder from './plugins/scaffolder'; import search from './plugins/search'; +import { + createDynamicPluginsConfigSecretEnumerator, + gatherDynamicPluginsSchemas, +} from './schemas'; // TODO(davidfestal): The following import is a temporary workaround for a bug // in the upstream @backstage/backend-plugin-manager package. @@ -41,6 +50,7 @@ import search from './plugins/search'; // It should be removed as soon as the upstream package is fixed and released. // see https://github.com/janus-idp/backstage-showcase/pull/600 import { CommonJSModuleLoader } from './loader/CommonJSModuleLoader'; +import { WinstonLogger } from '@backstage/backend-app-api'; function makeCreateEnv(config: Config, pluginProvider: BackendPluginProvider) { const root = getRootLogger(); @@ -166,18 +176,60 @@ async function addRouter(args: AddRouter | AddRouterOptional): Promise { } } +const redacter = WinstonLogger.redacter(); + async function main() { - const logger = getRootLogger(); - const config = await loadBackendConfig({ + const logger = createRootLogger({ + format: winston.format.combine( + redacter.format, // We use our own redacter here, in order to add additional secrets for dynamic plugins. + process.env.NODE_ENV === 'production' + ? winston.format.json() + : WinstonLogger.colorFormat(), + ), + }); + + const { config } = await loadBackendConfig({ argv: process.argv, - logger, }); + const pluginManager = await PluginManager.fromConfig( config, logger, undefined, new CommonJSModuleLoader(logger), ); + + const dynamicPluginsSchemas = await gatherDynamicPluginsSchemas( + pluginManager, + logger, + ); + + const secretEnumerator = { + staticApplication: await createConfigSecretEnumerator({ logger }), + dynamicPlugins: await createDynamicPluginsConfigSecretEnumerator( + dynamicPluginsSchemas, + logger, + ), + }; + + const addSecretsInRedacter = () => { + redacter.add([ + ...secretEnumerator.staticApplication(config), + ...secretEnumerator.dynamicPlugins(config), + ]); + }; + addSecretsInRedacter(); + config.subscribe?.(() => { + addSecretsInRedacter(); + }); + + const secrets = [...secretEnumerator.dynamicPlugins(config)]; + if (secrets.length > 0) { + getRootLogger().info( + `The following secret related to dynamic plugin should be redacted: ${secrets[0]}`, + ); + } + const createEnv = makeCreateEnv(config, pluginManager); const appEnv = useHotMemoize(module, () => createEnv('app')); @@ -298,7 +350,7 @@ async function main() { name: 'app', service, root: '', - router: await app(appEnv), + router: await app(appEnv, dynamicPluginsSchemas), }); await service.start().catch(err => { console.log(err); diff --git a/packages/backend/src/plugins/app.ts b/packages/backend/src/plugins/app.ts index 254c8c80a..ce19ca02e 100644 --- a/packages/backend/src/plugins/app.ts +++ b/packages/backend/src/plugins/app.ts @@ -5,15 +5,21 @@ import { resolvePackagePath } from '@backstage/backend-common'; import { resolve as resolvePath } from 'path'; import fs from 'fs-extra'; import rateLimit from 'express-rate-limit'; +import { completeFrontendSchemas } from '../schemas'; export default async function createPlugin( env: PluginEnvironment, + dynamicPluginsSchemas: { value: any; path: string }[], ): Promise { const appPackageName = 'app'; const appDistDir = resolvePackagePath(appPackageName, 'dist'); const staticDir = resolvePath(appDistDir, 'static'); + if (await fs.pathExists(appDistDir)) { + await completeFrontendSchemas(dynamicPluginsSchemas, appDistDir); + } + let injectedJSFile: string | undefined = undefined; if (await fs.pathExists(staticDir)) { diff --git a/packages/backend/src/schemas.ts b/packages/backend/src/schemas.ts new file mode 100644 index 000000000..fc045ff94 --- /dev/null +++ b/packages/backend/src/schemas.ts @@ -0,0 +1,149 @@ +import { PluginManager } from '@backstage/backend-plugin-manager'; +import { Logger } from 'winston'; +import fs from 'fs-extra'; +import * as path from 'path'; +import * as url from 'url'; +import { isEmpty } from 'lodash'; +import type { Config } from '@backstage/config'; +import { loadConfigSchema } from '@backstage/config-loader'; + +export async function gatherDynamicPluginsSchemas( + pluginManager: PluginManager, + logger: Logger, +): Promise<{ value: any; path: string }[]> { + const allSchemas: { value: any; path: string }[] = []; + + for (const plugin of pluginManager.plugins) { + const pluginPackage = pluginManager.availablePackages.find( + pkg => + pkg.manifest.name === plugin.name && + pkg.manifest.version === plugin.version, + ); + + if (!pluginPackage) { + throw new Error(`Could not find package for plugin ${plugin.name}`); + } + + const distDir = plugin.platform === 'node' ? 'dist' : 'dist-scalprum'; + const schemaLocation: string = path.resolve( + url.fileURLToPath(pluginPackage.location), + distDir, + 'configSchema.json', + ); + if (!(await fs.pathExists(schemaLocation))) { + continue; + } + + const serialized = await fs.readJson(schemaLocation); + if (!serialized) { + continue; + } + + if (isEmpty(serialized)) { + continue; + } + + if (!serialized?.$schema || serialized?.type !== 'object') { + logger.error( + `Serialized configuration schema is invalid for plugin ${plugin.name}`, + ); + continue; + } + + allSchemas.push({ + path: schemaLocation, + value: serialized, + }); + } + + return allSchemas; +} + +export async function createDynamicPluginsConfigSecretEnumerator( + schemas: { value: any; path: string }[], + logger: Logger, +): Promise<(config: Config) => Iterable> { + const schema = await loadConfigSchema({ + serialized: { + backstageConfigSchemaVersion: 1, + schemas: schemas, + }, + }); + + return (config: Config) => { + if (schemas.length === 0) { + return []; + } + + const [secretsData] = schema + .process( + [{ data: config.getOptional() ?? {}, context: 'schema-enumerator' }], + { + visibility: ['secret'], + ignoreSchemaErrors: true, + }, + ) + .map(({ data }) => data); + const secrets = new Set(); + JSON.parse( + JSON.stringify(secretsData), + (_, v) => typeof v === 'string' && secrets.add(v), + ); + + logger.info( + `Found ${secrets.size} additional dynamic plugins secrets in config that will be redacted`, + ); + + return secrets; + }; +} + +export async function completeFrontendSchemas( + schemas: { value: any; path: string }[], + appDistDir: string, +): Promise { + // Find the frontend schema, and if not already saved, save it to '.config-schema.original.json' + const frontendBuiltSchemaPath = path.resolve( + appDistDir, + '.config-schema.json', + ); + let originalfrontendBuiltSchemaPath = path.resolve( + appDistDir, + '.config-schema.original.json', + ); + + if (!(await fs.pathExists(originalfrontendBuiltSchemaPath))) { + if (await fs.pathExists(frontendBuiltSchemaPath)) { + await fs.copyFile( + frontendBuiltSchemaPath, + originalfrontendBuiltSchemaPath, + ); + } + originalfrontendBuiltSchemaPath = frontendBuiltSchemaPath; + } + + // Read the frontend schemas from the original frontend schema file + const frontendSchemas: { value: any; path: string }[] = []; + if (await fs.pathExists(originalfrontendBuiltSchemaPath)) { + const frontendSerialized = await fs.readJson(frontendBuiltSchemaPath); + + if (frontendSerialized?.backstageConfigSchemaVersion !== 1) { + throw new Error( + `Serialized configuration schema for the frontend is invalid or has an invalid version number`, + ); + } + frontendSchemas.push( + ...(frontendSerialized.schemas as { value: any; path: string }[]), + ); + } + + // overwite the frontend schema file with one completed with the dynamic plugins schemas. + await fs.writeJSON( + frontendBuiltSchemaPath, + { + backstageConfigSchemaVersion: 1, + schemas: [...frontendSchemas, ...schemas], + }, + { spaces: 2 }, + ); +} diff --git a/showcase-docs/dynamic-plugins.md b/showcase-docs/dynamic-plugins.md index 4105116f6..c669ae5aa 100644 --- a/showcase-docs/dynamic-plugins.md +++ b/showcase-docs/dynamic-plugins.md @@ -185,7 +185,7 @@ These recommended changes to the `package.json` are summarized below: }, ... "devDependencies": { - "@janus-idp/cli": "1.3.3" + "@janus-idp/cli": "1.4.0" }, ... "files": [ diff --git a/yarn.lock b/yarn.lock index 940835649..7348c97db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1986,7 +1986,7 @@ "@material-ui/core" "^4.12.2" "@material-ui/icons" "^4.9.1" -"@backstage/backend-app-api@^0.5.5", "@backstage/backend-app-api@^0.5.6": +"@backstage/backend-app-api@0.5.7", "@backstage/backend-app-api@^0.5.5", "@backstage/backend-app-api@^0.5.6": version "0.5.7" resolved "https://registry.yarnpkg.com/@backstage/backend-app-api/-/backend-app-api-0.5.7.tgz#ebc52710ea0b125734abc3a4f3832280501ff44e" integrity sha512-dnuYyqHfQTNAo+mq0mmsRDRu0AA48ExSs0alPAt2EnP/m3rfJakxOYMneb9Cr+aWralIdb7KE0N6oPDBaFe3Xg== @@ -2417,7 +2417,7 @@ yn "^4.0.0" zod "^3.21.4" -"@backstage/config-loader@^1.5.0", "@backstage/config-loader@^1.5.1": +"@backstage/config-loader@1.5.2", "@backstage/config-loader@^1.5.0", "@backstage/config-loader@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@backstage/config-loader/-/config-loader-1.5.2.tgz#2cd808c941553bbb957c443fba7441075184d132" integrity sha512-yoN6UdzGeSU73A43FQMT2Rz2cJTnIy02bGvAnAFYvBXJHvn3WXlHAXxjeOvcm6KJfZImziVUO6Sujv1YM8WpKw== @@ -5493,10 +5493,10 @@ dependencies: "@backstage/plugin-permission-common" "^0.7.9" -"@janus-idp/cli@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@janus-idp/cli/-/cli-1.3.3.tgz#6269f389ba9780f3f2e4cffb407b52b059d9b527" - integrity sha512-m7lbKpDY6rwE4u/9Iy0yw55L2VZXsYdxj4buJxybzdM+mYNQC5mcAvQJt8lIFkdBApX1LIcTTblMI0U9WWoOiw== +"@janus-idp/cli@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@janus-idp/cli/-/cli-1.4.0.tgz#b28801b68abce0e4c12249de3dd5d0267bd704bc" + integrity sha512-xa+IVdvw3zquhlRylnMEPse3zfSyvk9QzGZc42dcALvHmOrpiuRYFhYkT+tQFbBlMU+oASzvLpvu1KR8eFo/1w== dependencies: "@backstage/cli-common" "^0.1.13" "@backstage/cli-node" "^0.1.5" @@ -5550,6 +5550,7 @@ semver "^7.5.4" style-loader "^3.3.1" swc-loader "^0.2.3" + typescript-json-schema "^0.62.0" webpack "^5.89.0" webpack-dev-server "^4.15.1" yml-loader "^2.1.0" @@ -5985,7 +5986,7 @@ find-up "^4.1.0" fs-extra "^8.1.0" -"@manypkg/get-packages@^1.1.3": +"@manypkg/get-packages@1.1.3", "@manypkg/get-packages@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== @@ -24894,6 +24895,20 @@ typescript-json-schema@^0.61.0: typescript "~5.1.0" yargs "^17.1.1" +typescript-json-schema@^0.62.0: + version "0.62.0" + resolved "https://registry.yarnpkg.com/typescript-json-schema/-/typescript-json-schema-0.62.0.tgz#774b06b0c9d86d7f3580ea9136363a6eafae1470" + integrity sha512-qRO6pCgyjKJ230QYdOxDRpdQrBeeino4v5p2rYmSD72Jf4rD3O+cJcROv46sQukm46CLWoeusqvBgKpynEv25g== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/node" "^16.9.2" + glob "^7.1.7" + path-equal "^1.2.5" + safe-stable-stringify "^2.2.0" + ts-node "^10.9.1" + typescript "~5.1.0" + yargs "^17.1.1" + typescript@5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"