Skip to content

Commit

Permalink
feat: add dynamic-plugins-info backend plugin (janus-idp#638)
Browse files Browse the repository at this point in the history
* feat: add the `dynamic-plugins-info` backend plugin

* chore(deps): update yarn.lock

* chore: fix tsc error

* chore(dynamic-plugins-info-backend): update endpoint name

* chore: attempt to disable sonarcloud scan for mock data

* chore: remove unnecessary dependencies

* Update plugins/dynamic-plugins-info-backend/README.md

Co-authored-by: Tomas Kral <tomas.kral@gmail.com>

* docs(dynamic-plugin-info-backend): update endpoint documentation

* chore: update yarn.lock

---------

Co-authored-by: Tomas Kral <tkral@redhat.com>
Co-authored-by: Tomas Kral <tomas.kral@gmail.com>
  • Loading branch information
3 people committed Nov 3, 2023
1 parent 8811125 commit facc61b
Show file tree
Hide file tree
Showing 15 changed files with 439 additions and 28 deletions.
8 changes: 8 additions & 0 deletions .changeset/purple-cougars-fry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@internal/plugin-dynamic-plugins-info-backend': patch
'backend': patch
---

Adds a 'dynamic-plugins-info' backend plugin

This plugin depends on the `backend-plugin-manager` and lists all the dynamic plugins installed in the dynamic plugins root folder.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
**/node_modules
plugins
!plugins/scalprum-backend
!plugins/dynamic-plugins-info-backend
*.local.yaml
coverage
dist-types
Expand Down
4 changes: 2 additions & 2 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ COPY $EXTERNAL_SOURCE_NESTED/package.json $EXTERNAL_SOURCE_NESTED/yarn.lock ./
COPY $EXTERNAL_SOURCE_NESTED/packages/app/package.json ./packages/app/package.json
COPY $EXTERNAL_SOURCE_NESTED/packages/backend/package.json ./packages/backend/package.json
COPY $EXTERNAL_SOURCE_NESTED/plugins/scalprum-backend/package.json ./plugins/scalprum-backend/package.json
COPY $EXTERNAL_SOURCE_NESTED/plugins/dynamic-plugins-info-backend/package.json ./plugins/dynamic-plugins-info-backend/package.json

RUN $YARN install --frozen-lockfile --network-timeout 600000

Expand Down Expand Up @@ -77,10 +78,9 @@ COPY --from=build $CONTAINER_SOURCE/yarn.lock \
$CONTAINER_SOURCE/packages/backend/dist/skeleton.tar.gz \
$CONTAINER_SOURCE/packages/backend/dist/bundle.tar.gz \
./

ENV TARBALL_PATH=.
RUN tar xzf $TARBALL_PATH/skeleton.tar.gz; tar xzf $TARBALL_PATH/bundle.tar.gz; \
rm -f $TARBALL_PATH/skeleton.tar.gz $TARBALL_PATH/bundle.tar.gz
rm -f $TARBALL_PATH/skeleton.tar.gz $TARBALL_PATH/bundle.tar.gz

# Copy app-config files needed in runtime
# Upstream only
Expand Down
45 changes: 23 additions & 22 deletions docker/brew.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ COPY $EXTERNAL_SOURCE_NESTED/package.json $EXTERNAL_SOURCE_NESTED/yarn.lock ./
COPY $EXTERNAL_SOURCE_NESTED/packages/app/package.json ./packages/app/package.json
COPY $EXTERNAL_SOURCE_NESTED/packages/backend/package.json ./packages/backend/package.json
COPY $EXTERNAL_SOURCE_NESTED/plugins/scalprum-backend/package.json ./plugins/scalprum-backend/package.json
COPY $EXTERNAL_SOURCE_NESTED/plugins/dynamic-plugins-info-backend/package.json ./plugins/dynamic-plugins-info-backend/package.json

# Downstream only - debugging
# COPY $REMOTE_SOURCES/ ./
Expand All @@ -64,9 +65,9 @@ COPY $EXTERNAL_SOURCE_NESTED/plugins/scalprum-backend/package.json ./plugins/sca
# Downstream only - Cachito configuration
# see https://docs.engineering.redhat.com/pages/viewpage.action?pageId=228017926#UpstreamSources(Cachito,ContainerFirst)-CachitoIntegrationfornpm
COPY $REMOTE_SOURCES/upstream1/cachito.env \
$REMOTE_SOURCES/upstream1/app/registry-ca.pem \
$REMOTE_SOURCES/upstream1/app/distgit/containers/rhdh-hub/.npmrc \
./
$REMOTE_SOURCES/upstream1/app/registry-ca.pem \
$REMOTE_SOURCES/upstream1/app/distgit/containers/rhdh-hub/.npmrc \
./
# registry=https://cachito-nexus.engineering.redhat.com/repository/cachito-yarn-914335/
# email=noreply@domain.local
# always-auth=true
Expand Down Expand Up @@ -150,7 +151,7 @@ RUN find dynamic-plugins -type f -not -name 'dist' -delete

ENV TARBALL_PATH=./packages/backend/dist
RUN tar xzf $TARBALL_PATH/skeleton.tar.gz; tar xzf $TARBALL_PATH/bundle.tar.gz; \
rm -f $TARBALL_PATH/skeleton.tar.gz $TARBALL_PATH/bundle.tar.gz
rm -f $TARBALL_PATH/skeleton.tar.gz $TARBALL_PATH/bundle.tar.gz

# Copy app-config files needed in runtime
# Upstream only
Expand All @@ -177,24 +178,24 @@ WORKDIR $CONTAINER_SOURCE/
# Downstream only - install techdocs dependencies using cachito sources
COPY $REMOTE_SOURCES/upstream2 ./upstream2/
RUN microdnf update -y && \
microdnf install -y python3.11 python3.11-pip python3.11-devel make cmake cpp gcc gcc-c++; \
ln -s /usr/bin/pip3.11 /usr/bin/pip3; \
ln -s /usr/bin/pip3.11 /usr/bin/pip; \
# ls -la $CONTAINER_SOURCE/ $CONTAINER_SOURCE/upstream2/ $CONTAINER_SOURCE/upstream2/app/distgit/containers/rhdh-hub/docker/ || true; \
cat $CONTAINER_SOURCE/upstream2/cachito.env && \
# cachito.env contains path to cert:
# export PIP_CERT=/remote-source/upstream2/app/package-index-ca.pem
source $CONTAINER_SOURCE/upstream2/cachito.env && \
# fix ownership for pip install folder
mkdir -p /opt/app-root/src/.cache/pip && chown -R root:root /opt/app-root && \
# ls -ld /opt/ /opt/app-root /opt/app-root/src/ /opt/app-root/src/.cache /opt/app-root/src/.cache/pip || true; \
pushd $CONTAINER_SOURCE/upstream2/app/distgit/containers/rhdh-hub/docker/ >/dev/null && \
set -xe; \
python3.11 -V; pip3.11 -V; \
pip3.11 install --user --no-cache-dir --upgrade pip setuptools pyyaml; \
pip3.11 install --user --no-cache-dir -r requirements.txt -r requirements-build.txt; \
popd >/dev/null; \
microdnf clean all; rm -fr $CONTAINER_SOURCE/upstream2
microdnf install -y python3.11 python3.11-pip python3.11-devel make cmake cpp gcc gcc-c++; \
ln -s /usr/bin/pip3.11 /usr/bin/pip3; \
ln -s /usr/bin/pip3.11 /usr/bin/pip; \
# ls -la $CONTAINER_SOURCE/ $CONTAINER_SOURCE/upstream2/ $CONTAINER_SOURCE/upstream2/app/distgit/containers/rhdh-hub/docker/ || true; \
cat $CONTAINER_SOURCE/upstream2/cachito.env && \
# cachito.env contains path to cert:
# export PIP_CERT=/remote-source/upstream2/app/package-index-ca.pem
source $CONTAINER_SOURCE/upstream2/cachito.env && \
# fix ownership for pip install folder
mkdir -p /opt/app-root/src/.cache/pip && chown -R root:root /opt/app-root && \
# ls -ld /opt/ /opt/app-root /opt/app-root/src/ /opt/app-root/src/.cache /opt/app-root/src/.cache/pip || true; \
pushd $CONTAINER_SOURCE/upstream2/app/distgit/containers/rhdh-hub/docker/ >/dev/null && \
set -xe; \
python3.11 -V; pip3.11 -V; \
pip3.11 install --user --no-cache-dir --upgrade pip setuptools pyyaml; \
pip3.11 install --user --no-cache-dir -r requirements.txt -r requirements-build.txt; \
popd >/dev/null; \
microdnf clean all; rm -fr $CONTAINER_SOURCE/upstream2

# Downstream only - copy from build, not cleanup stage
COPY --from=build --chown=1001:1001 $CONTAINER_SOURCE/ ./
Expand Down
2 changes: 2 additions & 0 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"@backstage/plugin-auth-node": "0.4.0",
"@backstage/plugin-catalog-backend": "1.14.0",
"@backstage/plugin-catalog-backend-module-openapi": "0.1.23",
"@internal/plugin-dynamic-plugins-info-backend": "0.1.0",
"@backstage/plugin-events-backend": "0.2.15",
"@backstage/plugin-events-node": "0.2.15",
"@backstage/plugin-permission-backend": "0.5.29",
Expand All @@ -44,6 +45,7 @@
"better-sqlite3": "9.0.0",
"express": "4.18.2",
"express-prom-bundle": "6.6.0",
"express-promise-router": "4.1.1",
"isolated-vm": "4.6.0",
"pg": "8.11.3",
"prom-client": "15.0.0",
Expand Down
19 changes: 16 additions & 3 deletions packages/backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
import { DefaultEventBroker } from '@backstage/plugin-events-backend';
import { ServerPermissionClient } from '@backstage/plugin-permission-node';
import { createRouter as scalprumRouter } from '@internal/plugin-scalprum-backend';
import { createRouter as dynamicPluginsInfoRouter } from '@internal/plugin-dynamic-plugins-info-backend';
import { RequestHandler, Router } from 'express';
import { metricsHandler } from './metrics';
import app from './plugins/app';
Expand Down Expand Up @@ -184,13 +185,25 @@ async function main() {
const apiRouter = Router();

// Scalprum frontend plugins provider
const scalprumEmv = useHotMemoize(module, () => createEnv('scalprum'));
const scalprumEnv = useHotMemoize(module, () => createEnv('scalprum'));
apiRouter.use(
'/scalprum',
await scalprumRouter({
logger: scalprumEmv.logger,
logger: scalprumEnv.logger,
pluginManager,
discovery: scalprumEnv.discovery,
}),
);

// Dynamic plugins info provider
const dynamicPluginsInfoEnv = useHotMemoize(module, () =>
createEnv('dynamic-plugins-info'),
);
apiRouter.use(
'/dynamic-plugins-info',
await dynamicPluginsInfoRouter({
logger: dynamicPluginsInfoEnv.logger,
pluginManager,
discovery: scalprumEmv.discovery,
}),
);

Expand Down
1 change: 1 addition & 0 deletions plugins/dynamic-plugins-info-backend/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
12 changes: 12 additions & 0 deletions plugins/dynamic-plugins-info-backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# dynamic-plugins-info

Welcome to the dynamic-plugins-info backend plugin!

This plugin depends on the `backend-plugin-manager` and lists all the dynamic plugins installed in the dynamic plugins root folder.

## Getting started

This plugin has been added to the backend app in this repository, meaning you'll be able to access it by running `yarn
start-backend` in the root directory, and then navigating to [/api/dynamic-plugins-info](http://localhost:7007/api/dynamic-plugins-info).

To view the list of installed dynamic plugins, navigate to `http://localhost:7007/api/dynamic-plugins-info/loaded-plugins`
163 changes: 163 additions & 0 deletions plugins/dynamic-plugins-info-backend/__fixtures__/data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
// BEGIN-NOSCAN
export const plugins = [
{
name: 'backstage-plugin-aap-backend-wrapped-dynamic',
version: '1.2.2-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'backstage-plugin-argo-cd-backend-wrapped-dynamic',
version: '2.11.3-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
router: {
pluginID: 'argocd',
},
},
},
{
name: 'backstage-plugin-gitlab-backend-wrapped-dynamic',
version: '6.2.0-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
router: {
pluginID: 'gitlab',
},
},
},
{
name: 'backstage-plugin-keycloak-backend-wrapped-dynamic',
version: '1.5.5-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'backstage-plugin-ocm-backend-wrapped-dynamic',
version: '3.2.2-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
router: {
pluginID: 'ocm',
},
},
},
{
name: 'plugin-azure-devops-backend-wrapped-dynamic',
version: '0.4.2-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
router: {
pluginID: 'azure-devops',
},
},
},
{
name: 'plugin-catalog-backend-module-github-wrapped-dynamic',
version: '0.4.3-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'plugin-catalog-backend-module-gitlab-wrapped-dynamic',
version: '0.3.2-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'plugin-jenkins-backend-wrapped-dynamic',
version: '0.2.8-dynamic.0',
platform: 'node',
role: 'backend-plugin',
installer: {
kind: 'legacy',
router: {
pluginID: 'jenkins',
},
},
},
{
name: 'plugin-kubernetes-backend-wrapped-dynamic',
version: '0.12.2-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
router: {
pluginID: 'kubernetes',
},
},
},
{
name: 'plugin-scaffolder-backend-module-gitlab-wrapped-dynamic',
version: '0.2.8-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'plugin-sonarqube-backend-wrapped-dynamic',
version: '0.2.7-dynamic.0',
platform: 'node',
role: 'backend-plugin',
installer: {
kind: 'legacy',
router: {
pluginID: 'sonarqube',
},
},
},
{
name: 'plugin-techdocs-backend-wrapped-dynamic',
version: '1.7.2-dynamic.0',
platform: 'node',
role: 'backend-plugin',
installer: {
kind: 'legacy',
router: {
pluginID: 'techdocs',
},
},
},
{
name: 'scaffolder-backend-argocd-wrapped-dynamic',
version: '1.1.17-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
{
name: 'scaffolder-backend-module-utils-wrapped-dynamic',
version: '1.10.4-dynamic.0',
platform: 'node',
role: 'backend-plugin-module',
installer: {
kind: 'legacy',
},
},
];
// END-NOSCAN
Loading

0 comments on commit facc61b

Please sign in to comment.