@knative-extensions/plugin-knative-event-mesh-backend 0.1.2 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,18 +5,35 @@ The Event Mesh plugin is a Backstage plugin that allows you to view and manage K
5
5
  The Backstage plugin talks to a special backend that runs in the Kubernetes cluster and communicates with the Kubernetes
6
6
  API server.
7
7
 
8
+ A demo setup for this plugin is available at https://github.com/aliok/knative-backstage-demo.
9
+
10
+ ## Dynamic vs static plugin
11
+
12
+ This plugin has 2 distributions: static and dynamic.
13
+
14
+ The static distribution is a regular Backstage plugin that requires
15
+ the source code of Backstage to be changed.
16
+
17
+ The dynamic distribution is a plugin that can be installed without changing
18
+ the source code of Backstage. If you would like to use the dynamic plugin, please see the instructions in the
19
+ [Dynamic Plugin README file](./dist-dynamic/README.md).
20
+
21
+ Rest of this documentation is for the static plugin.
22
+
8
23
  ## Installation
9
24
 
10
25
  Install the backend and the relevant configuration in the Kubernetes cluster
11
26
 
12
27
  ```bash
13
- kubectl apply -f https://github.com/knative-extensions/backstage-plugins/releases/download/v0.1.0/eventmesh.yaml
28
+ VERSION="latest" # or a specific version like 0.1.2
29
+ kubectl apply -f https://github.com/knative-extensions/backstage-plugins/releases/${VERSION}/download/eventmesh.yaml
14
30
  ```
15
31
 
16
32
  In your Backstage directory, run the following command to install the plugin:
17
33
 
18
34
  ```bash
19
- yarn workspace backend add @knative-extensions/plugin-knative-event-mesh-backend
35
+ VERSION="latest" # or a specific version like 0.1.2
36
+ yarn workspace backend add @knative-extensions/plugin-knative-event-mesh-backend@${VERSION}
20
37
  ```
21
38
 
22
39
  ## Configuration
@@ -38,7 +55,8 @@ catalog:
38
55
  providers:
39
56
  knativeEventMesh:
40
57
  dev:
41
- baseUrl: 'http://localhost:8080' # URL of the backend installed in the cluster
58
+ token: '${KNATIVE_EVENT_MESH_TOKEN}' # SA token to authenticate to the backend
59
+ baseUrl: '${KNATIVE_EVENT_MESH_BACKEND}' # URL of the backend installed in the cluster
42
60
  schedule: # optional; same options as in TaskScheduleDefinition
43
61
  # supports cron, ISO duration, "human duration" as used in code
44
62
  frequency: { minutes: 1 }
@@ -46,13 +64,132 @@ catalog:
46
64
  timeout: { minutes: 1 }
47
65
  ```
48
66
 
49
- Configure the scheduler for the entity provider. Add the following code to `packages/backend/src/plugins/catalog.ts`
50
- file:
67
+ You can either manually change the placeholders in the `app-config.yaml` file or use environment variables to set the
68
+ values. The environment variables can be set as following before starting the Backstage instance:
69
+
70
+ ```bash
71
+ export KNATIVE_EVENT_MESH_TOKEN=your-token
72
+ export KNATIVE_EVENT_MESH_BACKEND=http://localhost:8080
73
+ ```
74
+
75
+ The value of `KNATIVE_EVENT_MESH_BACKEND` should be the URL of the backend service. If you are running the backend
76
+ service in the same cluster as the Backstage instance, you can use the service name as the URL. Or, if you are running
77
+ the backend without exposing it, you can use `kubectl port-forward` as mentioned above.
78
+
79
+ The value of `KNATIVE_EVENT_MESH_TOKEN` should be a service account token that has the necessary permissions to list
80
+ the Knative Eventing resources in the cluster. The backend will use this token to authenticate to the Kubernetes API
81
+ server. This is required for security reasons as otherwise (if the backend is running with a SA token directly) the
82
+ backend would have full access to the cluster will be returning all resources to anyone who can access the backend.
83
+
84
+ The token will require the following permissions to work properly:
85
+
86
+ - `get`, `list` and `watch` permissions for `eventing.knative.dev/brokers`, `eventing.knative.dev/eventtypes` and
87
+ `eventing.knative.dev/triggers` resources
88
+ - `get` permission for all resources to fetch subscribers for triggers
89
+
90
+ You can create a ClusterRole with the necessary permissions and bind it to the service account token.
91
+
92
+ An example configuration is as follows:
93
+
94
+ ```yaml
95
+ apiVersion: v1
96
+ kind: ServiceAccount
97
+ metadata:
98
+ name: my-eventmesh-backend-service-account
99
+ namespace: default
100
+ ---
101
+ apiVersion: rbac.authorization.k8s.io/v1
102
+ kind: ClusterRole
103
+ metadata:
104
+ name: my-eventmesh-backend-cluster-role
105
+ rules:
106
+ # permissions for eventtypes, brokers and triggers
107
+ - apiGroups:
108
+ - "eventing.knative.dev"
109
+ resources:
110
+ - brokers
111
+ - eventtypes
112
+ - triggers
113
+ verbs:
114
+ - get
115
+ - list
116
+ - watch
117
+ # permissions to get subscribers for triggers
118
+ # as subscribers can be any resource, we need to give access to all resources
119
+ # we fetch subscribers one by one, we only need `get` verb
120
+ - apiGroups:
121
+ - "*"
122
+ resources:
123
+ - "*"
124
+ verbs:
125
+ - get
126
+ ---
127
+ apiVersion: rbac.authorization.k8s.io/v1
128
+ kind: ClusterRoleBinding
129
+ metadata:
130
+ name: my-eventmesh-backend-cluster-role-binding
131
+ subjects:
132
+ - kind: ServiceAccount
133
+ name: my-eventmesh-backend-service-account
134
+ namespace: default
135
+ roleRef:
136
+ kind: ClusterRole
137
+ name: my-eventmesh-backend-cluster-role
138
+ apiGroup: rbac.authorization.k8s.io
139
+ ---
140
+ apiVersion: v1
141
+ kind: Secret
142
+ metadata:
143
+ name: my-eventmesh-backend-secret
144
+ namespace: default
145
+ annotations:
146
+ kubernetes.io/service-account.name: my-eventmesh-backend-service-account
147
+ type: kubernetes.io/service-account-token
148
+ ```
149
+
150
+ To get the token, you can run the following command:
151
+
152
+ ```bash
153
+ kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode
154
+ ```
155
+
156
+ Run a quick check to see if the token works:
157
+
158
+ ```bash
159
+ export KUBE_API_SERVER_URL=$(kubectl config view --minify --output jsonpath="{.clusters[*].cluster.server}") # e.g. "https://192.168.2.151:16443"
160
+ export KUBE_SA_TOKEN=$(kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode)
161
+ curl -k -H "Authorization: Bearer $KUBE_SA_TOKEN" -X GET "${KUBE_API_SERVER_URL}/apis/eventing.knative.dev/v1/namespaces/default/brokers" | json_pp
162
+ # Should see the brokers, or nothing if there are no brokers
163
+ # But, should not see an error
164
+ ```
165
+
166
+ Run a second quick check to see if the token works with the backend
167
+
168
+ ```bash
169
+ export KNATIVE_EVENT_MESH_BACKEND=http://localhost:8080 # or the URL of the backend
170
+ export KUBE_SA_TOKEN=$(kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode)
171
+ curl -k -H "Authorization: Bearer $KUBE_SA_TOKEN" -X GET "${KNATIVE_EVENT_MESH_BACKEND}" | json_pp
172
+ # Should see the response from the backend such as
173
+ # {
174
+ # "brokers" : [...],
175
+ # "eventTypes" : [...]
176
+ #}
177
+ ```
178
+
179
+ If these quick checks work, you can use the token in the `app-config.yaml` file as the value
180
+ of `KNATIVE_EVENT_MESH_TOKEN`.
181
+
182
+ ### Legacy Backend Installation
51
183
 
52
- In file `packages/backend/src/plugins/catalog.ts`:
184
+ Configure the scheduler for the entity provider and enable the processor. Add the following code
185
+ to `packages/backend/src/plugins/catalog.ts` file:
53
186
 
54
187
  ```ts
55
- import {KnativeEventMeshProvider} from '@knative-extensions/plugin-knative-event-mesh-backend';
188
+ import {CatalogClient} from "@backstage/catalog-client";
189
+ import {
190
+ KnativeEventMeshProcessor,
191
+ KnativeEventMeshProvider
192
+ } from '@knative-extensions/plugin-knative-event-mesh-backend';
56
193
 
57
194
  export default async function createPlugin(
58
195
  env:PluginEnvironment,
@@ -61,13 +198,18 @@ export default async function createPlugin(
61
198
 
62
199
  /* ... other processors and/or providers ... */
63
200
 
64
- // ADD THIS
201
+ // ADD THESE
65
202
  builder.addEntityProvider(
66
203
  KnativeEventMeshProvider.fromConfig(env.config, {
67
204
  logger: env.logger,
68
205
  scheduler: env.scheduler,
69
206
  }),
70
207
  );
208
+ const catalogApi = new CatalogClient({
209
+ discoveryApi: env.discovery,
210
+ });
211
+ const knativeEventMeshProcessor = new KnativeEventMeshProcessor(catalogApi, env.logger);
212
+ builder.addProcessor(knativeEventMeshProcessor);
71
213
 
72
214
  /* ... other processors and/or providers ... */
73
215
 
@@ -77,6 +219,21 @@ export default async function createPlugin(
77
219
  }
78
220
  ```
79
221
 
222
+ ### New Backend Installation
223
+
224
+ To install on the new backend system, add the following into the `packages/backend/index.ts` file:
225
+
226
+ ```ts title=packages/backend/index.ts
227
+ import { createBackend } from '@backstage/backend-defaults';
228
+
229
+ const backend = createBackend();
230
+
231
+ // Other plugins/modules
232
+
233
+ backend.add(import('@knative-extensions/plugin-knative-event-mesh-backend/alpha'));
234
+
235
+ ```
236
+
80
237
  > **NOTE**: If you have made any changes to the schedule in the `app-config.yaml` file, then restart to apply the
81
238
  > changes.
82
239
 
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@knative-extensions/plugin-knative-event-mesh-backend",
3
+ "version": "1.15.0",
4
+ "main": "../dist/alpha.cjs.js",
5
+ "types": "../dist/alpha.d.ts"
6
+ }
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var backendCommon = require('@backstage/backend-common');
6
+ var backendPluginApi = require('@backstage/backend-plugin-api');
7
+ var alpha = require('@backstage/plugin-catalog-node/alpha');
8
+ var knativeEventMeshProcessor = require('./cjs/knativeEventMeshProcessor-fc47dadc.cjs.js');
9
+ require('@backstage/catalog-model');
10
+ require('@backstage/backend-tasks');
11
+
12
+ const catalogModuleKnativeEventMesh = backendPluginApi.createBackendModule({
13
+ moduleId: "knative-event-mesh-module",
14
+ pluginId: "catalog",
15
+ register(env) {
16
+ env.registerInit({
17
+ deps: {
18
+ catalogApi: alpha.catalogServiceRef,
19
+ catalog: alpha.catalogProcessingExtensionPoint,
20
+ config: backendPluginApi.coreServices.rootConfig,
21
+ logger: backendPluginApi.coreServices.logger,
22
+ scheduler: backendPluginApi.coreServices.scheduler
23
+ },
24
+ async init({ catalogApi, catalog, config, logger, scheduler }) {
25
+ const knativeEventMeshProviders = knativeEventMeshProcessor.KnativeEventMeshProvider.fromConfig(config, {
26
+ logger: backendCommon.loggerToWinstonLogger(logger),
27
+ scheduler
28
+ });
29
+ catalog.addEntityProvider(knativeEventMeshProviders);
30
+ const knativeEventMeshProcessor$1 = new knativeEventMeshProcessor.KnativeEventMeshProcessor(catalogApi, backendCommon.loggerToWinstonLogger(logger));
31
+ catalog.addProcessor(knativeEventMeshProcessor$1);
32
+ }
33
+ });
34
+ }
35
+ });
36
+
37
+ exports["default"] = catalogModuleKnativeEventMesh;
38
+ //# sourceMappingURL=alpha.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alpha.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {loggerToWinstonLogger} from '@backstage/backend-common';\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { \n catalogServiceRef,\n catalogProcessingExtensionPoint\n} from '@backstage/plugin-catalog-node/alpha';\n\nimport { \n KnativeEventMeshProcessor, \n KnativeEventMeshProvider\n} from './providers';\n\nexport const catalogModuleKnativeEventMesh = createBackendModule({\n moduleId: 'knative-event-mesh-module',\n pluginId: 'catalog',\n register(env) {\n env.registerInit({\n deps: {\n catalogApi: catalogServiceRef,\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ catalogApi, catalog, config, logger, scheduler }) {\n const knativeEventMeshProviders = KnativeEventMeshProvider.fromConfig(config, {\n logger: loggerToWinstonLogger(logger),\n scheduler: scheduler,\n });\n catalog.addEntityProvider(knativeEventMeshProviders);\n\n const knativeEventMeshProcessor = new KnativeEventMeshProcessor(catalogApi, loggerToWinstonLogger(logger));\n catalog.addProcessor(knativeEventMeshProcessor);\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogServiceRef","catalogProcessingExtensionPoint","coreServices","KnativeEventMeshProvider","loggerToWinstonLogger","knativeEventMeshProcessor","KnativeEventMeshProcessor"],"mappings":";;;;;;;;;;;AAeO,MAAM,gCAAgCA,oCAAoB,CAAA;AAAA,EAC7D,QAAU,EAAA,2BAAA;AAAA,EACV,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACV,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACb,IAAM,EAAA;AAAA,QACF,UAAY,EAAAC,uBAAA;AAAA,QACZ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,OAC5B;AAAA,MACA,MAAM,KAAK,EAAE,UAAA,EAAY,SAAS,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AAC3D,QAAM,MAAA,yBAAA,GAA4BC,kDAAyB,CAAA,UAAA,CAAW,MAAQ,EAAA;AAAA,UAC1E,MAAA,EAAQC,oCAAsB,MAAM,CAAA;AAAA,UACpC,SAAA;AAAA,SACH,CAAA,CAAA;AACD,QAAA,OAAA,CAAQ,kBAAkB,yBAAyB,CAAA,CAAA;AAEnD,QAAA,MAAMC,8BAA4B,IAAIC,mDAAA,CAA0B,UAAY,EAAAF,mCAAA,CAAsB,MAAM,CAAC,CAAA,CAAA;AACzG,QAAA,OAAA,CAAQ,aAAaC,2BAAyB,CAAA,CAAA;AAAA,OAClD;AAAA,KACH,CAAA,CAAA;AAAA,GACL;AACJ,CAAC;;;;"}
@@ -0,0 +1,5 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+
3
+ declare const catalogModuleKnativeEventMesh: () => _backstage_backend_plugin_api.BackendFeature;
4
+
5
+ export { catalogModuleKnativeEventMesh as default };
@@ -0,0 +1,324 @@
1
+ 'use strict';
2
+
3
+ var catalogModel = require('@backstage/catalog-model');
4
+ var backendTasks = require('@backstage/backend-tasks');
5
+
6
+ function readKnativeEventMeshProviderConfigs(config) {
7
+ const providerConfigs = config.getOptionalConfig(
8
+ "catalog.providers.knativeEventMesh"
9
+ );
10
+ if (!providerConfigs) {
11
+ return [];
12
+ }
13
+ return providerConfigs.keys().map(
14
+ (id) => readKnativeEventMeshProviderConfig(id, providerConfigs.getConfig(id))
15
+ );
16
+ }
17
+ function readKnativeEventMeshProviderConfig(id, config) {
18
+ const baseUrl = config.getString("baseUrl");
19
+ const token = config.getString("token");
20
+ const schedule = config.has("schedule") ? backendTasks.readTaskScheduleDefinitionFromConfig(config.getConfig("schedule")) : void 0;
21
+ return {
22
+ id,
23
+ baseUrl,
24
+ schedule,
25
+ token
26
+ };
27
+ }
28
+
29
+ const TypeKnativeEvent = "eventType";
30
+ const TypeKnativeBroker = "broker";
31
+ const SystemKnative = "knative-event-mesh";
32
+ const OwnerKnative = "knative";
33
+
34
+ var __defProp$1 = Object.defineProperty;
35
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
36
+ var __publicField$1 = (obj, key, value) => {
37
+ __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
38
+ return value;
39
+ };
40
+ async function getEventMesh(baseUrl, token) {
41
+ const response = await fetch(`${baseUrl}`, {
42
+ headers: {
43
+ "Authorization": `Bearer ${token}`
44
+ }
45
+ });
46
+ if (!response.ok) {
47
+ throw new Error(response.statusText);
48
+ }
49
+ return await response.json();
50
+ }
51
+ class KnativeEventMeshProvider {
52
+ constructor(config, logger, taskRunner) {
53
+ __publicField$1(this, "env");
54
+ __publicField$1(this, "baseUrl");
55
+ __publicField$1(this, "logger");
56
+ __publicField$1(this, "token");
57
+ __publicField$1(this, "scheduleFn");
58
+ __publicField$1(this, "connection");
59
+ this.env = config.id;
60
+ this.baseUrl = config.baseUrl;
61
+ this.token = config.token;
62
+ this.logger = logger.child({
63
+ target: this.getProviderName()
64
+ });
65
+ this.scheduleFn = this.createScheduleFn(taskRunner);
66
+ }
67
+ static fromConfig(configRoot, options) {
68
+ const providerConfigs = readKnativeEventMeshProviderConfigs(configRoot);
69
+ if (configRoot.getConfig("token") === void 0) {
70
+ throw new Error("Service account token must be provided.");
71
+ }
72
+ if (!options.schedule && !options.scheduler) {
73
+ throw new Error("Either schedule or scheduler must be provided.");
74
+ }
75
+ const logger = options.logger.child({ plugin: "knative-event-mesh-backend" });
76
+ logger.info(`Found ${providerConfigs.length} knative event mesh provider configs with ids: ${providerConfigs.map((providerConfig) => providerConfig.id).join(", ")}`);
77
+ return providerConfigs.map((providerConfig) => {
78
+ if (!options.schedule && !providerConfig.schedule) {
79
+ throw new Error(`No schedule provided neither via code nor config for KnativeEventMesh entity provider:${providerConfig.id}.`);
80
+ }
81
+ let taskRunner;
82
+ if (options.scheduler && providerConfig.schedule) {
83
+ taskRunner = options.scheduler.createScheduledTaskRunner(providerConfig.schedule);
84
+ } else if (options.schedule) {
85
+ taskRunner = options.schedule;
86
+ } else {
87
+ throw new Error("Neither schedule nor scheduler is provided.");
88
+ }
89
+ return new KnativeEventMeshProvider(
90
+ providerConfig,
91
+ options.logger,
92
+ taskRunner
93
+ );
94
+ });
95
+ }
96
+ createScheduleFn(taskRunner) {
97
+ return async () => {
98
+ const taskId = `${this.getProviderName()}:run`;
99
+ return taskRunner.run({
100
+ id: taskId,
101
+ fn: async () => {
102
+ var _a;
103
+ try {
104
+ await this.run();
105
+ } catch (error) {
106
+ this.logger.error(
107
+ `Error while fetching Knative Event Mesh from ${this.baseUrl}`,
108
+ {
109
+ // Default Error properties:
110
+ name: error.name,
111
+ message: error.message,
112
+ stack: error.stack,
113
+ // Additional status code if available:
114
+ status: (_a = error.response) == null ? void 0 : _a.status
115
+ }
116
+ );
117
+ }
118
+ }
119
+ });
120
+ };
121
+ }
122
+ getProviderName() {
123
+ return `knative-event-mesh-provider-${this.env}`;
124
+ }
125
+ async connect(connection) {
126
+ this.connection = connection;
127
+ await this.scheduleFn();
128
+ }
129
+ async run() {
130
+ if (!this.connection) {
131
+ throw new Error("Not initialized");
132
+ }
133
+ const url = this.baseUrl;
134
+ const token = this.token;
135
+ const eventMesh = await getEventMesh(url, token);
136
+ const entities = this.buildEntities(eventMesh);
137
+ await this.connection.applyMutation({
138
+ type: "full",
139
+ entities: entities.map((entity) => ({
140
+ entity,
141
+ locationKey: this.getProviderName()
142
+ }))
143
+ });
144
+ }
145
+ buildEntities(eventMesh) {
146
+ const entities = [];
147
+ for (const eventType of eventMesh.eventTypes) {
148
+ const entity = this.buildEventTypeEntity(eventType);
149
+ entities.push(entity);
150
+ }
151
+ for (const broker of eventMesh.brokers) {
152
+ const entity = this.buildBrokerEntity(broker);
153
+ entities.push(entity);
154
+ }
155
+ return entities;
156
+ }
157
+ buildEventTypeEntity(eventType) {
158
+ var _a, _b;
159
+ const annotations = (_a = eventType.annotations) != null ? _a : {};
160
+ annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
161
+ const links = [];
162
+ if (eventType.schemaURL) {
163
+ links.push({
164
+ title: "View external schema",
165
+ icon: "scaffolder",
166
+ url: eventType.schemaURL
167
+ });
168
+ }
169
+ return {
170
+ apiVersion: "backstage.io/v1alpha1",
171
+ kind: "API",
172
+ metadata: {
173
+ name: eventType.name,
174
+ namespace: eventType.namespace,
175
+ description: eventType.description,
176
+ labels: eventType.labels || {},
177
+ annotations,
178
+ // we don't use tags
179
+ tags: [],
180
+ links,
181
+ title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`,
182
+ // custom field, stored
183
+ // see https://backstage.io/docs/features/software-catalog/extending-the-model#adding-new-fields-to-the-metadata-object
184
+ // can't make it type safe as the Metadata type is not exported
185
+ consumedBy: (_b = eventType.consumedBy) != null ? _b : []
186
+ },
187
+ spec: {
188
+ type: TypeKnativeEvent,
189
+ lifecycle: this.env,
190
+ system: SystemKnative,
191
+ owner: OwnerKnative,
192
+ definition: eventType.schemaData || "{}"
193
+ }
194
+ };
195
+ }
196
+ buildBrokerEntity(broker) {
197
+ var _a;
198
+ const annotations = (_a = broker.annotations) != null ? _a : {};
199
+ annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
200
+ return {
201
+ apiVersion: "backstage.io/v1alpha1",
202
+ kind: "Component",
203
+ metadata: {
204
+ name: broker.name,
205
+ namespace: broker.namespace,
206
+ labels: broker.labels || {},
207
+ annotations,
208
+ // we don't use tags
209
+ tags: []
210
+ },
211
+ spec: {
212
+ type: TypeKnativeBroker,
213
+ lifecycle: this.env,
214
+ system: SystemKnative,
215
+ owner: OwnerKnative,
216
+ providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
217
+ }
218
+ };
219
+ }
220
+ }
221
+
222
+ var __defProp = Object.defineProperty;
223
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
224
+ var __publicField = (obj, key, value) => {
225
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
226
+ return value;
227
+ };
228
+ class KnativeEventMeshProcessor {
229
+ constructor(catalogApi, logger, queryEntityPageLimit) {
230
+ __publicField(this, "catalogApi");
231
+ __publicField(this, "logger");
232
+ __publicField(this, "queryEntityPageLimit");
233
+ this.catalogApi = catalogApi;
234
+ this.queryEntityPageLimit = queryEntityPageLimit != null ? queryEntityPageLimit : 1e4;
235
+ this.logger = logger.child({
236
+ target: this.getProcessorName()
237
+ });
238
+ }
239
+ getProcessorName() {
240
+ return "knative-event-mesh-processor";
241
+ }
242
+ async preProcessEntity(entity, _location, emit, _originLocation, _cache) {
243
+ var _a;
244
+ if (entity.kind === "API" && ((_a = entity.spec) == null ? void 0 : _a.type) === TypeKnativeEvent) {
245
+ this.logger.debug(`Processing KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
246
+ if (!entity.metadata.consumedBy) {
247
+ this.logger.debug(`No consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
248
+ return entity;
249
+ }
250
+ const consumers = entity.metadata.consumedBy;
251
+ this.logger.debug(`Consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}: ${consumers.join(", ")}`);
252
+ for (const consumedBy of consumers) {
253
+ this.logger.debug(`Building relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
254
+ const consumerComponents = await this.findComponentsByBackstageId(entity.metadata.namespace, consumedBy);
255
+ this.logger.debug(`Found ${consumerComponents.length} components for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
256
+ for (const component of consumerComponents) {
257
+ this.logger.debug(`Emitting relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} for consumer ${consumedBy} via component ${component.metadata.namespace}/${component.metadata.name}`);
258
+ const apiToComponentRelation = {
259
+ type: "relation",
260
+ relation: {
261
+ type: "apiConsumedBy",
262
+ source: {
263
+ kind: "API",
264
+ namespace: entity.metadata.namespace,
265
+ name: entity.metadata.name
266
+ },
267
+ target: {
268
+ kind: "Component",
269
+ namespace: component.metadata.namespace,
270
+ name: component.metadata.name
271
+ }
272
+ }
273
+ };
274
+ emit(apiToComponentRelation);
275
+ const componentToApiRelation = {
276
+ type: "relation",
277
+ relation: {
278
+ type: "consumesApi",
279
+ source: {
280
+ kind: "Component",
281
+ namespace: component.metadata.namespace,
282
+ name: component.metadata.name
283
+ },
284
+ target: {
285
+ kind: "API",
286
+ namespace: entity.metadata.namespace,
287
+ name: entity.metadata.name
288
+ }
289
+ }
290
+ };
291
+ emit(componentToApiRelation);
292
+ }
293
+ }
294
+ }
295
+ return entity;
296
+ }
297
+ async findComponentsByBackstageId(namespace, componentId) {
298
+ let catalogApiCursor;
299
+ let entities = [];
300
+ try {
301
+ do {
302
+ const response = await this.catalogApi.queryEntities({
303
+ filter: {
304
+ kind: "component",
305
+ "metadata.namespace": namespace,
306
+ "metadata.annotations.backstage.io/kubernetes-id": componentId
307
+ },
308
+ cursor: catalogApiCursor,
309
+ limit: this.queryEntityPageLimit
310
+ });
311
+ catalogApiCursor = response.pageInfo.nextCursor;
312
+ entities = entities.concat(response.items);
313
+ } while (catalogApiCursor);
314
+ return entities;
315
+ } catch (e) {
316
+ this.logger.error(`Failed to find components by backstage id ${namespace}/${componentId}: ${e}`);
317
+ return [];
318
+ }
319
+ }
320
+ }
321
+
322
+ exports.KnativeEventMeshProcessor = KnativeEventMeshProcessor;
323
+ exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
324
+ //# sourceMappingURL=knativeEventMeshProcessor-fc47dadc.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knativeEventMeshProcessor-fc47dadc.cjs.js","sources":["../../src/providers/config.ts","../../src/providers/types.ts","../../src/providers/knativeEventMeshProvider.ts","../../src/providers/knativeEventMeshProcessor.ts"],"sourcesContent":["import {readTaskScheduleDefinitionFromConfig} from '@backstage/backend-tasks';\nimport {Config} from '@backstage/config';\n\nimport {KnativeEventMeshProviderConfig} from './types';\n\nexport function readKnativeEventMeshProviderConfigs(config:Config):KnativeEventMeshProviderConfig[] {\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.knativeEventMesh',\n );\n if (!providerConfigs) {\n return [];\n }\n return providerConfigs\n .keys()\n .map(id =>\n readKnativeEventMeshProviderConfig(id, providerConfigs.getConfig(id)),\n );\n}\n\nfunction readKnativeEventMeshProviderConfig(id:string, config:Config):KnativeEventMeshProviderConfig {\n const baseUrl = config.getString('baseUrl');\n const token = config.getString('token');\n\n const schedule = config.has('schedule')\n ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule'))\n : undefined;\n\n return {\n id,\n baseUrl,\n schedule,\n token,\n };\n}\n","import {TaskScheduleDefinition} from '@backstage/backend-tasks';\n\nexport type KnativeEventMeshProviderConfig = {\n id:string;\n baseUrl:string;\n schedule?:TaskScheduleDefinition;\n token?:string;\n};\n\nexport const TypeKnativeEvent = 'eventType';\nexport const TypeKnativeBroker = 'broker';\nexport const SystemKnative = 'knative-event-mesh';\nexport const OwnerKnative = 'knative';\n","import {PluginTaskScheduler, TaskRunner} from '@backstage/backend-tasks';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ApiEntity,\n ComponentEntity,\n Entity,\n EntityLink,\n} from '@backstage/catalog-model';\n\nimport {Config} from '@backstage/config';\n\nimport {EntityProvider, EntityProviderConnection,} from '@backstage/plugin-catalog-node';\n\nimport {Logger} from 'winston';\nimport {readKnativeEventMeshProviderConfigs} from \"./config\";\nimport {\n KnativeEventMeshProviderConfig,\n OwnerKnative,\n SystemKnative,\n TypeKnativeBroker,\n TypeKnativeEvent\n} from \"./types\";\n\nexport type EventType = {\n name:string;\n namespace:string;\n type:string;\n uid:string;\n description?:string;\n schemaData?:string;\n schemaURL?:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n consumedBy?:string[];\n};\n\nexport type Broker = {\n name:string;\n namespace:string;\n uid:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n providedEventTypes?:string[];\n};\n\ntype EventMesh = {\n eventTypes:EventType[];\n brokers:Broker[];\n};\n\nexport async function getEventMesh(baseUrl: string, token: string | undefined):Promise<EventMesh> {\n const response = await fetch(`${baseUrl}`, {\n headers: {\n 'Authorization': `Bearer ${token}`\n }\n });\n\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return await response.json() as Promise<EventMesh>;\n}\n\nexport class KnativeEventMeshProvider implements EntityProvider {\n private readonly env:string;\n private readonly baseUrl:string;\n private readonly logger:Logger;\n private readonly token:string | undefined;\n private readonly scheduleFn:() => Promise<void>;\n private connection?:EntityProviderConnection;\n\n static fromConfig(\n configRoot:Config,\n options:{\n logger:Logger;\n schedule?:TaskRunner;\n scheduler?:PluginTaskScheduler;\n },\n ):KnativeEventMeshProvider[] {\n const providerConfigs = readKnativeEventMeshProviderConfigs(configRoot);\n\n if (configRoot.getConfig('token') === undefined) {\n throw new Error('Service account token must be provided.');\n }\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n const logger = options.logger.child({plugin: 'knative-event-mesh-backend'});\n logger.info(`Found ${providerConfigs.length} knative event mesh provider configs with ids: ${providerConfigs.map(providerConfig => providerConfig.id).join(', ')}`);\n\n return providerConfigs.map(providerConfig => {\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(`No schedule provided neither via code nor config for KnativeEventMesh entity provider:${providerConfig.id}.`);\n }\n\n let taskRunner;\n\n if (options.scheduler && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(providerConfig.schedule);\n } else if (options.schedule) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n // Handle the case where both options.schedule and options.scheduler are missing\n throw new Error('Neither schedule nor scheduler is provided.');\n }\n\n return new KnativeEventMeshProvider(\n providerConfig,\n options.logger,\n taskRunner,\n );\n });\n }\n\n constructor(config:KnativeEventMeshProviderConfig, logger:Logger, taskRunner:TaskRunner) {\n this.env = config.id;\n this.baseUrl = config.baseUrl;\n this.token = config.token;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n private createScheduleFn(taskRunner:TaskRunner):() => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:run`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n try {\n await this.run();\n } catch (error:any) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n `Error while fetching Knative Event Mesh from ${this.baseUrl}`,\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: error.response?.status,\n },\n );\n }\n },\n });\n };\n }\n\n getProviderName():string {\n return `knative-event-mesh-provider-${this.env}`;\n }\n\n async connect(connection:EntityProviderConnection):Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async run():Promise<void> {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n const url = this.baseUrl;\n const token = this.token;\n\n const eventMesh = await getEventMesh(url, token);\n\n const entities = this.buildEntities(eventMesh);\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n private buildEntities(eventMesh:EventMesh) {\n const entities:Entity[] = [];\n\n for (const eventType of eventMesh.eventTypes) {\n const entity = this.buildEventTypeEntity(eventType);\n entities.push(entity);\n }\n\n for (const broker of eventMesh.brokers) {\n const entity = this.buildBrokerEntity(broker);\n entities.push(entity);\n }\n return entities;\n }\n\n buildEventTypeEntity(eventType:EventType):ApiEntity {\n const annotations = eventType.annotations ?? {} as Record<string, string>;\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}`;\n\n const links:EntityLink[] = [];\n if (eventType.schemaURL) {\n links.push({\n title: \"View external schema\",\n icon: \"scaffolder\",\n url: eventType.schemaURL\n });\n }\n\n return {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n name: eventType.name,\n namespace: eventType.namespace,\n description: eventType.description,\n labels: eventType.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n links: links,\n title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`,\n // custom field, stored\n // see https://backstage.io/docs/features/software-catalog/extending-the-model#adding-new-fields-to-the-metadata-object\n // can't make it type safe as the Metadata type is not exported\n consumedBy: eventType.consumedBy ?? [],\n },\n spec: {\n type: TypeKnativeEvent,\n lifecycle: this.env,\n system: SystemKnative,\n owner: OwnerKnative,\n definition: eventType.schemaData || \"{}\",\n },\n };\n }\n\n buildBrokerEntity(broker:Broker):ComponentEntity {\n const annotations = broker.annotations ?? {} as Record<string, string>;\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}`;\n\n return {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Component',\n metadata: {\n name: broker.name,\n namespace: broker.namespace,\n labels: broker.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n },\n spec: {\n type: TypeKnativeBroker,\n lifecycle: this.env,\n system: SystemKnative,\n owner: OwnerKnative,\n providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType:string) => `api:${eventType}`),\n }\n }\n }\n}\n","import {CatalogApi} from '@backstage/catalog-client';\nimport {ComponentEntity, Entity} from '@backstage/catalog-model';\nimport {LocationSpec} from '@backstage/plugin-catalog-common';\nimport {\n CatalogProcessor,\n CatalogProcessorCache,\n CatalogProcessorEmit,\n CatalogProcessorRelationResult,\n} from '@backstage/plugin-catalog-node';\nimport {Logger} from \"winston\";\nimport {TypeKnativeEvent} from \"./types\";\n\n\nexport class KnativeEventMeshProcessor implements CatalogProcessor {\n private readonly catalogApi: CatalogApi;\n private readonly logger:Logger;\n private readonly queryEntityPageLimit:number;\n\n constructor(catalogApi:CatalogApi, logger:Logger, queryEntityPageLimit?:number) {\n this.catalogApi = catalogApi;\n this.queryEntityPageLimit = queryEntityPageLimit ?? 10000;\n\n this.logger = logger.child({\n target: this.getProcessorName(),\n });\n }\n\n getProcessorName():string {\n return \"knative-event-mesh-processor\";\n }\n\n async preProcessEntity(entity:Entity, _location:LocationSpec, emit:CatalogProcessorEmit, _originLocation:LocationSpec, _cache:CatalogProcessorCache):Promise<Entity> {\n if (entity.kind === 'API' && entity.spec?.type === TypeKnativeEvent) {\n this.logger.debug(`Processing KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);\n\n // if there's no relation to build, return entity as is\n if (!entity.metadata.consumedBy) {\n this.logger.debug(`No consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);\n return entity;\n }\n\n const consumers = entity.metadata.consumedBy as string[];\n this.logger.debug(`Consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}: ${consumers.join(', ')}`);\n\n // build relations\n for (const consumedBy of consumers) {\n this.logger.debug(`Building relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);\n\n // query the catalog for the component with the id\n const consumerComponents = await this.findComponentsByBackstageId(entity.metadata.namespace as string, consumedBy);\n this.logger.debug(`Found ${consumerComponents.length} components for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);\n\n for (const component of consumerComponents) {\n this.logger.debug(`Emitting relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} for consumer ${consumedBy} via component ${component.metadata.namespace}/${component.metadata.name}`);\n\n // emit a relation from the API to the component\n const apiToComponentRelation:CatalogProcessorRelationResult = {\n type: 'relation',\n relation: {\n type: 'apiConsumedBy',\n source: {\n kind: 'API',\n namespace: entity.metadata.namespace as string,\n name: entity.metadata.name,\n },\n target: {\n kind: 'Component',\n namespace: component.metadata.namespace as string,\n name: component.metadata.name,\n },\n },\n };\n emit(apiToComponentRelation);\n\n // emit a relation from the component to the API\n const componentToApiRelation:CatalogProcessorRelationResult = {\n type: 'relation',\n relation: {\n type: 'consumesApi',\n source: {\n kind: 'Component',\n namespace: component.metadata.namespace as string,\n name: component.metadata.name,\n },\n target: {\n kind: 'API',\n namespace: entity.metadata.namespace as string,\n name: entity.metadata.name,\n },\n },\n };\n emit(componentToApiRelation);\n }\n }\n }\n return entity;\n }\n\n private async findComponentsByBackstageId(namespace:string, componentId:string) {\n // fetch the component by the id\n // example: http://localhost:7007/api/catalog/entities/by-query\n // ?filter=kind=component,metadata.namespace=default,metadata.annotations.backstage.io/kubernetes-id=fraud-detector\n let catalogApiCursor: string | undefined;\n let entities: Entity[] = [];\n\n try {\n do {\n const response = await this.catalogApi.queryEntities({\n filter: {\n kind: 'component',\n 'metadata.namespace': namespace,\n 'metadata.annotations.backstage.io/kubernetes-id': componentId,\n },\n cursor: catalogApiCursor,\n limit: this.queryEntityPageLimit\n });\n catalogApiCursor = response.pageInfo.nextCursor;\n entities = entities.concat(response.items);\n } while (catalogApiCursor)\n\n return entities;\n } catch (e) {\n this.logger.error(`Failed to find components by backstage id ${namespace}/${componentId}: ${e}`);\n return [] as ComponentEntity[];\n }\n }\n}\n"],"names":["readTaskScheduleDefinitionFromConfig","__publicField","ANNOTATION_ORIGIN_LOCATION","ANNOTATION_LOCATION"],"mappings":"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"}
package/dist/index.cjs.js CHANGED
@@ -2,203 +2,28 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var catalogModel = require('@backstage/catalog-model');
6
- var backendTasks = require('@backstage/backend-tasks');
5
+ var knativeEventMeshProcessor = require('./cjs/knativeEventMeshProcessor-fc47dadc.cjs.js');
6
+ var catalogClient = require('@backstage/catalog-client');
7
+ require('@backstage/catalog-model');
8
+ require('@backstage/backend-tasks');
7
9
 
8
- function readKnativeEventMeshProviderConfigs(config) {
9
- const providerConfigs = config.getOptionalConfig(
10
- "catalog.providers.knativeEventMesh"
11
- );
12
- if (!providerConfigs) {
13
- return [];
14
- }
15
- return providerConfigs.keys().map(
16
- (id) => readKnativeEventMeshProviderConfig(id, providerConfigs.getConfig(id))
17
- );
18
- }
19
- function readKnativeEventMeshProviderConfig(id, config) {
20
- const baseUrl = config.getString("baseUrl");
21
- const schedule = config.has("schedule") ? backendTasks.readTaskScheduleDefinitionFromConfig(config.getConfig("schedule")) : void 0;
22
- return {
23
- id,
24
- baseUrl,
25
- schedule
26
- };
27
- }
28
-
29
- var __defProp = Object.defineProperty;
30
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
31
- var __publicField = (obj, key, value) => {
32
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
33
- return value;
34
- };
35
- async function getEventMesh(baseUrl) {
36
- const response = await fetch(`${baseUrl}`);
37
- if (!response.ok) {
38
- throw new Error(response.statusText);
39
- }
40
- return await response.json();
41
- }
42
- class KnativeEventMeshProvider {
43
- constructor(config, logger, taskRunner) {
44
- __publicField(this, "env");
45
- __publicField(this, "baseUrl");
46
- __publicField(this, "logger");
47
- __publicField(this, "scheduleFn");
48
- __publicField(this, "connection");
49
- this.env = config.id;
50
- this.baseUrl = config.baseUrl;
51
- this.logger = logger.child({
52
- target: this.getProviderName()
10
+ const dynamicPluginInstaller = {
11
+ kind: "legacy",
12
+ async catalog(builder, env) {
13
+ const knativeEventMeshProviders = knativeEventMeshProcessor.KnativeEventMeshProvider.fromConfig(env.config, {
14
+ logger: env.logger,
15
+ scheduler: env.scheduler
53
16
  });
54
- this.scheduleFn = this.createScheduleFn(taskRunner);
55
- }
56
- static fromConfig(configRoot, options) {
57
- const providerConfigs = readKnativeEventMeshProviderConfigs(configRoot);
58
- if (!options.schedule && !options.scheduler) {
59
- throw new Error("Either schedule or scheduler must be provided.");
60
- }
61
- const logger = options.logger.child({ plugin: "knative-event-mesh-backend" });
62
- logger.info(`Found ${providerConfigs.length} knative event mesh provider configs with ids: ${providerConfigs.map((providerConfig) => providerConfig.id).join(", ")}`);
63
- return providerConfigs.map((providerConfig) => {
64
- if (!options.schedule && !providerConfig.schedule) {
65
- throw new Error(`No schedule provided neither via code nor config for KnativeEventMesh entity provider:${providerConfig.id}.`);
66
- }
67
- let taskRunner;
68
- if (options.scheduler && providerConfig.schedule) {
69
- taskRunner = options.scheduler.createScheduledTaskRunner(providerConfig.schedule);
70
- } else if (options.schedule) {
71
- taskRunner = options.schedule;
72
- } else {
73
- throw new Error("Neither schedule nor scheduler is provided.");
74
- }
75
- return new KnativeEventMeshProvider(
76
- providerConfig,
77
- options.logger,
78
- taskRunner
79
- );
80
- });
81
- }
82
- createScheduleFn(taskRunner) {
83
- return async () => {
84
- const taskId = `${this.getProviderName()}:run`;
85
- return taskRunner.run({
86
- id: taskId,
87
- fn: async () => {
88
- var _a;
89
- try {
90
- await this.run();
91
- } catch (error) {
92
- this.logger.error(
93
- `Error while fetching Knative Event Mesh from ${this.baseUrl}`,
94
- {
95
- // Default Error properties:
96
- name: error.name,
97
- message: error.message,
98
- stack: error.stack,
99
- // Additional status code if available:
100
- status: (_a = error.response) == null ? void 0 : _a.status
101
- }
102
- );
103
- }
104
- }
105
- });
106
- };
107
- }
108
- getProviderName() {
109
- return `knative-event-mesh-${this.env}`;
110
- }
111
- async connect(connection) {
112
- this.connection = connection;
113
- await this.scheduleFn();
114
- }
115
- async run() {
116
- if (!this.connection) {
117
- throw new Error("Not initialized");
118
- }
119
- const url = this.baseUrl;
120
- const eventMesh = await getEventMesh(url);
121
- const entities = this.buildEntities(eventMesh);
122
- await this.connection.applyMutation({
123
- type: "full",
124
- entities: entities.map((entity) => ({
125
- entity,
126
- locationKey: this.getProviderName()
127
- }))
17
+ builder.addEntityProvider(knativeEventMeshProviders);
18
+ const catalogApi = new catalogClient.CatalogClient({
19
+ discoveryApi: env.discovery
128
20
  });
21
+ const knativeEventMeshProcessor$1 = new knativeEventMeshProcessor.KnativeEventMeshProcessor(catalogApi, env.logger);
22
+ builder.addProcessor(knativeEventMeshProcessor$1);
129
23
  }
130
- buildEntities(eventMesh) {
131
- const entities = [];
132
- for (const eventType of eventMesh.eventTypes) {
133
- const entity = this.buildEventTypeEntity(eventType);
134
- entities.push(entity);
135
- }
136
- for (const broker of eventMesh.brokers) {
137
- const entity = this.buildBrokerEntity(broker);
138
- entities.push(entity);
139
- }
140
- return entities;
141
- }
142
- buildEventTypeEntity(eventType) {
143
- var _a;
144
- const annotations = (_a = eventType.annotations) != null ? _a : {};
145
- annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
146
- const links = [];
147
- if (eventType.schemaURL) {
148
- links.push({
149
- title: "View external schema",
150
- icon: "scaffolder",
151
- url: eventType.schemaURL
152
- });
153
- }
154
- return {
155
- apiVersion: "backstage.io/v1alpha1",
156
- kind: "API",
157
- metadata: {
158
- name: eventType.name,
159
- namespace: eventType.namespace,
160
- description: eventType.description,
161
- labels: eventType.labels || {},
162
- annotations,
163
- // we don't use tags
164
- tags: [],
165
- links,
166
- title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`
167
- },
168
- spec: {
169
- type: "eventType",
170
- lifecycle: this.env,
171
- system: "knative-event-mesh",
172
- owner: "knative",
173
- definition: eventType.schemaData || "{}"
174
- }
175
- };
176
- }
177
- buildBrokerEntity(broker) {
178
- var _a;
179
- const annotations = (_a = broker.annotations) != null ? _a : {};
180
- annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
181
- return {
182
- apiVersion: "backstage.io/v1alpha1",
183
- kind: "Component",
184
- metadata: {
185
- name: broker.name,
186
- namespace: broker.namespace,
187
- labels: broker.labels || {},
188
- annotations,
189
- // we don't use tags
190
- tags: []
191
- },
192
- spec: {
193
- type: "broker",
194
- lifecycle: this.env,
195
- system: "knative-event-mesh",
196
- owner: "knative",
197
- providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
198
- }
199
- };
200
- }
201
- }
24
+ };
202
25
 
203
- exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
26
+ exports.KnativeEventMeshProcessor = knativeEventMeshProcessor.KnativeEventMeshProcessor;
27
+ exports.KnativeEventMeshProvider = knativeEventMeshProcessor.KnativeEventMeshProvider;
28
+ exports.dynamicPluginInstaller = dynamicPluginInstaller;
204
29
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/providers/config.ts","../src/providers/knativeEventMeshProvider.ts"],"sourcesContent":["import {readTaskScheduleDefinitionFromConfig} from '@backstage/backend-tasks';\nimport {Config} from '@backstage/config';\n\nimport {KnativeEventMeshProviderConfig} from './types';\n\nexport function readKnativeEventMeshProviderConfigs(config:Config):KnativeEventMeshProviderConfig[] {\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.knativeEventMesh',\n );\n if (!providerConfigs) {\n return [];\n }\n return providerConfigs\n .keys()\n .map(id =>\n readKnativeEventMeshProviderConfig(id, providerConfigs.getConfig(id)),\n );\n}\n\nfunction readKnativeEventMeshProviderConfig(id:string, config:Config):KnativeEventMeshProviderConfig {\n const baseUrl = config.getString('baseUrl');\n\n const schedule = config.has('schedule')\n ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule'))\n : undefined;\n\n return {\n id,\n baseUrl,\n schedule,\n };\n}\n","import {PluginTaskScheduler, TaskRunner} from '@backstage/backend-tasks';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ApiEntity,\n ComponentEntity,\n Entity,\n EntityLink,\n} from '@backstage/catalog-model';\n\nimport {Config} from '@backstage/config';\n\nimport {EntityProvider, EntityProviderConnection,} from '@backstage/plugin-catalog-node';\n\nimport {Logger} from 'winston';\nimport {readKnativeEventMeshProviderConfigs} from \"./config\";\nimport {KnativeEventMeshProviderConfig} from \"./types\";\n\nexport type EventType = {\n name:string;\n namespace:string;\n type:string;\n uid:string;\n description?:string;\n schemaData?:string;\n schemaURL?:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n};\n\nexport type Broker = {\n name:string;\n namespace:string;\n uid:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n providedEventTypes?:string[];\n};\n\ntype EventMesh = {\n eventTypes:EventType[];\n brokers:Broker[];\n};\n\nexport async function getEventMesh(baseUrl:string):Promise<EventMesh> {\n const response = await fetch(`${baseUrl}`);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return await response.json() as Promise<EventMesh>;\n}\n\nexport class KnativeEventMeshProvider implements EntityProvider {\n private readonly env:string;\n private readonly baseUrl:string;\n private readonly logger:Logger;\n private readonly scheduleFn:() => Promise<void>;\n private connection?:EntityProviderConnection;\n\n static fromConfig(\n configRoot:Config,\n options:{\n logger:Logger;\n schedule?:TaskRunner;\n scheduler?:PluginTaskScheduler;\n },\n ):KnativeEventMeshProvider[] {\n const providerConfigs = readKnativeEventMeshProviderConfigs(configRoot);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n const logger = options.logger.child({plugin: 'knative-event-mesh-backend'});\n logger.info(`Found ${providerConfigs.length} knative event mesh provider configs with ids: ${providerConfigs.map(providerConfig => providerConfig.id).join(', ')}`);\n\n return providerConfigs.map(providerConfig => {\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(`No schedule provided neither via code nor config for KnativeEventMesh entity provider:${providerConfig.id}.`);\n }\n\n let taskRunner;\n\n if (options.scheduler && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(providerConfig.schedule);\n } else if (options.schedule) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n // Handle the case where both options.schedule and options.scheduler are missing\n throw new Error('Neither schedule nor scheduler is provided.');\n }\n\n return new KnativeEventMeshProvider(\n providerConfig,\n options.logger,\n taskRunner,\n );\n });\n }\n\n constructor(config:KnativeEventMeshProviderConfig, logger:Logger, taskRunner:TaskRunner) {\n this.env = config.id;\n this.baseUrl = config.baseUrl;\n\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n private createScheduleFn(taskRunner:TaskRunner):() => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:run`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n try {\n await this.run();\n } catch (error:any) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n `Error while fetching Knative Event Mesh from ${this.baseUrl}`,\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: error.response?.status,\n },\n );\n }\n },\n });\n };\n }\n\n getProviderName():string {\n return `knative-event-mesh-${this.env}`;\n }\n\n async connect(connection:EntityProviderConnection):Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async run():Promise<void> {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n const url = this.baseUrl;\n\n const eventMesh = await getEventMesh(url);\n\n const entities = this.buildEntities(eventMesh);\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n private buildEntities(eventMesh:EventMesh) {\n const entities:Entity[] = [];\n\n for (const eventType of eventMesh.eventTypes) {\n const entity = this.buildEventTypeEntity(eventType);\n entities.push(entity);\n }\n\n for (const broker of eventMesh.brokers) {\n const entity = this.buildBrokerEntity(broker);\n entities.push(entity);\n }\n return entities;\n }\n\n buildEventTypeEntity(eventType:EventType):ApiEntity {\n const annotations = eventType.annotations ?? {} as Record<string, string>;\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}`;\n\n const links:EntityLink[] = [];\n if (eventType.schemaURL) {\n links.push({\n title: \"View external schema\",\n icon: \"scaffolder\",\n url: eventType.schemaURL\n });\n }\n\n return {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n name: eventType.name,\n namespace: eventType.namespace,\n description: eventType.description,\n labels: eventType.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n links: links,\n title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`\n },\n spec: {\n type: 'eventType',\n lifecycle: this.env,\n system: 'knative-event-mesh',\n owner: 'knative',\n definition: eventType.schemaData || \"{}\",\n },\n };\n }\n\n buildBrokerEntity(broker:Broker):ComponentEntity {\n const annotations = broker.annotations ?? {} as Record<string, string>;\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}`;\n\n return {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Component',\n metadata: {\n name: broker.name,\n namespace: broker.namespace,\n labels: broker.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n },\n spec: {\n type: 'broker',\n lifecycle: this.env,\n system: 'knative-event-mesh',\n owner: 'knative',\n providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType:string) => `api:${eventType}`),\n }\n }\n }\n}\n"],"names":["readTaskScheduleDefinitionFromConfig","ANNOTATION_ORIGIN_LOCATION","ANNOTATION_LOCATION"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/dynamic/index.ts"],"sourcesContent":["import {BackendDynamicPluginInstaller} from '@backstage/backend-dynamic-feature-service';\nimport {CatalogClient} from \"@backstage/catalog-client\";\n\nimport {KnativeEventMeshProcessor, KnativeEventMeshProvider} from '../providers';\n\n// This is mainly to provide dynamic plugin support for backstage's legacy backend. During the plugin loading phase, it'll use this dynamicPluginInstaller.\n// https://github.com/backstage/backstage/blob/master/packages/backend-dynamic-feature-service/src/manager/types.ts\n// It's deprecated since the legacy backend is now deprecated, but it's probably still nice to have in case someone wants to install on the legacy backend for some reason.\nexport const dynamicPluginInstaller:BackendDynamicPluginInstaller = {\n kind: 'legacy',\n async catalog(builder:any, env:any) {\n const knativeEventMeshProviders = KnativeEventMeshProvider.fromConfig(env.config, {\n logger: env.logger,\n scheduler: env.scheduler,\n });\n builder.addEntityProvider(knativeEventMeshProviders);\n\n const catalogApi = new CatalogClient({\n discoveryApi: env.discovery,\n });\n\n const knativeEventMeshProcessor = new KnativeEventMeshProcessor(catalogApi, env.logger);\n builder.addProcessor(knativeEventMeshProcessor);\n },\n};\n"],"names":["KnativeEventMeshProvider","CatalogClient","knativeEventMeshProcessor","KnativeEventMeshProcessor"],"mappings":";;;;;;;;;AAQO,MAAM,sBAAuD,GAAA;AAAA,EAChE,IAAM,EAAA,QAAA;AAAA,EACN,MAAM,OAAQ,CAAA,OAAA,EAAa,GAAS,EAAA;AAChC,IAAA,MAAM,yBAA4B,GAAAA,kDAAA,CAAyB,UAAW,CAAA,GAAA,CAAI,MAAQ,EAAA;AAAA,MAC9E,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,WAAW,GAAI,CAAA,SAAA;AAAA,KAClB,CAAA,CAAA;AACD,IAAA,OAAA,CAAQ,kBAAkB,yBAAyB,CAAA,CAAA;AAEnD,IAAM,MAAA,UAAA,GAAa,IAAIC,2BAAc,CAAA;AAAA,MACjC,cAAc,GAAI,CAAA,SAAA;AAAA,KACrB,CAAA,CAAA;AAED,IAAA,MAAMC,2BAA4B,GAAA,IAAIC,mDAA0B,CAAA,UAAA,EAAY,IAAI,MAAM,CAAA,CAAA;AACtF,IAAA,OAAA,CAAQ,aAAaD,2BAAyB,CAAA,CAAA;AAAA,GAClD;AACJ;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,17 @@
1
1
  import { TaskScheduleDefinition, TaskRunner, PluginTaskScheduler } from '@backstage/backend-tasks';
2
- import { ApiEntity, ComponentEntity } from '@backstage/catalog-model';
2
+ import { ApiEntity, ComponentEntity, Entity } from '@backstage/catalog-model';
3
3
  import { Config } from '@backstage/config';
4
- import { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';
4
+ import { EntityProvider, EntityProviderConnection, CatalogProcessor, CatalogProcessorEmit, CatalogProcessorCache } from '@backstage/plugin-catalog-node';
5
5
  import { Logger } from 'winston';
6
+ import { CatalogApi } from '@backstage/catalog-client';
7
+ import { LocationSpec } from '@backstage/plugin-catalog-common';
8
+ import { BackendDynamicPluginInstaller } from '@backstage/backend-dynamic-feature-service';
6
9
 
7
10
  type KnativeEventMeshProviderConfig = {
8
11
  id: string;
9
12
  baseUrl: string;
10
13
  schedule?: TaskScheduleDefinition;
14
+ token?: string;
11
15
  };
12
16
 
13
17
  type EventType = {
@@ -20,6 +24,7 @@ type EventType = {
20
24
  schemaURL?: string;
21
25
  labels?: Record<string, string>;
22
26
  annotations?: Record<string, string>;
27
+ consumedBy?: string[];
23
28
  };
24
29
  type Broker = {
25
30
  name: string;
@@ -33,6 +38,7 @@ declare class KnativeEventMeshProvider implements EntityProvider {
33
38
  private readonly env;
34
39
  private readonly baseUrl;
35
40
  private readonly logger;
41
+ private readonly token;
36
42
  private readonly scheduleFn;
37
43
  private connection?;
38
44
  static fromConfig(configRoot: Config, options: {
@@ -50,4 +56,16 @@ declare class KnativeEventMeshProvider implements EntityProvider {
50
56
  buildBrokerEntity(broker: Broker): ComponentEntity;
51
57
  }
52
58
 
53
- export { KnativeEventMeshProvider };
59
+ declare class KnativeEventMeshProcessor implements CatalogProcessor {
60
+ private readonly catalogApi;
61
+ private readonly logger;
62
+ private readonly queryEntityPageLimit;
63
+ constructor(catalogApi: CatalogApi, logger: Logger, queryEntityPageLimit?: number);
64
+ getProcessorName(): string;
65
+ preProcessEntity(entity: Entity, _location: LocationSpec, emit: CatalogProcessorEmit, _originLocation: LocationSpec, _cache: CatalogProcessorCache): Promise<Entity>;
66
+ private findComponentsByBackstageId;
67
+ }
68
+
69
+ declare const dynamicPluginInstaller: BackendDynamicPluginInstaller;
70
+
71
+ export { KnativeEventMeshProcessor, KnativeEventMeshProvider, dynamicPluginInstaller };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@knative-extensions/plugin-knative-event-mesh-backend",
3
- "version": "0.1.2",
4
- "main": "src/index.ts",
5
- "types": "src/index.ts",
3
+ "version": "1.15.0",
4
+ "main": "dist/index.cjs.js",
5
+ "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
7
7
  "private": false,
8
8
  "publishConfig": {
@@ -13,6 +13,19 @@
13
13
  "backstage": {
14
14
  "role": "backend-plugin"
15
15
  },
16
+ "exports": {
17
+ ".": {
18
+ "require": "./dist/index.cjs.js",
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.cjs.js"
21
+ },
22
+ "./alpha": {
23
+ "require": "./dist/alpha.cjs.js",
24
+ "types": "./dist/alpha.d.ts",
25
+ "default": "./dist/alpha.cjs.js"
26
+ },
27
+ "./package.json": "./package.json"
28
+ },
16
29
  "scripts": {
17
30
  "start": "backstage-cli package start",
18
31
  "build": "backstage-cli package build",
@@ -20,11 +33,19 @@
20
33
  "test": "backstage-cli package test",
21
34
  "clean": "backstage-cli package clean",
22
35
  "prepack": "backstage-cli package prepack",
23
- "postpack": "backstage-cli package postpack"
36
+ "postpack": "backstage-cli package postpack",
37
+ "export-dynamic": "npx janus-cli package export-dynamic-plugin --embed-as-dependencies && cp README-dynamic.md dist-dynamic/README.md"
24
38
  },
25
39
  "dependencies": {
26
40
  "@backstage/backend-common": "^0.19.9",
41
+ "@backstage/backend-dynamic-feature-service": "^0.2.9",
42
+ "@backstage/backend-plugin-api": "^0.6.18",
43
+ "@backstage/backend-tasks": "^0.5.21",
44
+ "@backstage/catalog-client": "^1.4.6",
45
+ "@backstage/catalog-model": "^1.4.5",
27
46
  "@backstage/config": "^1.1.1",
47
+ "@backstage/plugin-catalog-common": "^1.0.22",
48
+ "@backstage/plugin-catalog-node": "^1.11.0",
28
49
  "@types/express": "*",
29
50
  "express": "^4.17.1",
30
51
  "express-promise-router": "^4.1.0",
@@ -34,11 +55,13 @@
34
55
  },
35
56
  "devDependencies": {
36
57
  "@backstage/cli": "^0.24.0",
58
+ "@janus-idp/cli": "^1.8.7",
37
59
  "@types/supertest": "^2.0.12",
38
60
  "msw": "^1.0.0",
39
61
  "supertest": "^6.2.4"
40
62
  },
41
63
  "files": [
42
- "dist"
64
+ "dist",
65
+ "alpha"
43
66
  ]
44
67
  }
package/src/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './providers';