Skip to main content

Quick Start

This guide will help you get started with the OPA Policies plugin for Backstage.

Pre-requisites​

Installing The OPA Policies Plugin​

Run the following command to install the OPA Backend Plugin in your Backstage project.

yarn add --cwd packages/backend @parsifal-m/plugin-opa-backend && yarn add --cwd packages/app @parsifal-m/plugin-opa-policies

Then make the following changes to the packages/backend/src/index.ts file in your Backstage project.

import { createBackend } from '@backstage/backend-defaults';

const backend = createBackend();
backend.add(import('@backstage/plugin-app-backend/alpha'));
backend.add(import('@backstage/plugin-auth-backend'));
// ..... other plugins
backend.add(import('@parsifal-m/plugin-opa-backend'));

Add The OPA Policies Plugin To Your Frontend​

You can then add it to your entity pages in packages/app/src/components/catalog/EntityPage.tsx:

import {
OpaPolicyPage,
isOpaPoliciesEnabled,
} from '@parsifal-m/plugin-opa-policies';

const websiteEntityPage = (
<EntityLayout>
<EntityLayout.Route path="/" title="Overview">
{overviewContent}
</EntityLayout.Route>
// Other routes...
<EntityLayout.Route
if={isOpaPoliciesEnabled}
path="/opa"
title="Open Policy Agent"
>
<OpaPolicyPage />
</EntityLayout.Route>
<EntityLayout.Route path="/docs" title="Docs">
{techdocsContent}
</EntityLayout.Route>
</EntityLayout>
);

Note: Using isOpaPoliciesEnabled will then only display the OPA Policy tab if the entity has the annotation set.

Configuration​

You need to add the following annotation to the entity you want to display the OPA Policy for:

apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: backstage-testing-grounds
description: An example of a Backstage application.
annotations:
# Add the OPA Policy URL here
open-policy-agent/policy: https://github.com/Parsifal-M/backstage-testing-grounds/blob/main/rbac.rego
spec:
type: website
owner: john@example.com
lifecycle: experimental

You need to provide the full URL to the OPA Policy file as above in order for the plugin to fetch and display it.

New Frontend System​

If your app uses the new Backstage frontend system, import from the ./alpha subpath instead. The plugin exports a createFrontendPlugin default that bundles both the API and the entity content tab — no EntityLayout.Route or apis.ts changes needed.

yarn add --cwd packages/app @parsifal-m/plugin-opa-policies
// App.tsx
import { createApp } from '@backstage/frontend-app-api';
import opaPoliciesPlugin from '@parsifal-m/plugin-opa-policies/alpha';

const app = createApp({
features: [
// ... other plugins
opaPoliciesPlugin,
],
});

The OPA Policy tab is added to entity pages automatically at /opa-policy. To show it only for entities that carry the annotation, add a filter in app-config.yaml:

app:
extensions:
- entity-content:opa-policies/opa-policies:
config:
filter: has-annotation:open-policy-agent/policy

The entity annotation and backend setup are the same as the legacy system — see the sections above.