@knative-extensions/plugin-knative-event-mesh-backend 0.0.0-nightly → 0.0.0-snapshot.2148f52
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 +94 -9
- package/dist/index.cjs.js +120 -34
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +15 -3
- package/package.json +6 -6
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -1,14 +1,99 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Knative Event Mesh plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The Event Mesh plugin is a Backstage plugin that allows you to view and manage Knative Eventing resources.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The Backstage plugin talks to a special backend that runs in the Kubernetes cluster and communicates with the Kubernetes
|
|
6
|
+
API server.
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## Installation
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
start` in the root directory, and then navigating to [/knative-event-mesh](http://localhost:3000/knative-event-mesh).
|
|
10
|
+
Install the backend and the relevant configuration in the Kubernetes cluster
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
```bash
|
|
13
|
+
kubectl apply -f https://github.com/knative-extensions/backstage-plugins/releases/download/v0.1.0/eventmesh.yaml
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
In your Backstage directory, run the following command to install the plugin:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
yarn workspace backend add @knative-extensions/plugin-knative-event-mesh-backend
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
> **NOTE**: The backend needs to be accessible from the Backstage instance. If you are running the backend without
|
|
25
|
+
> exposing it, you can use `kubectl port-forward` to forward the port of the backend service to your local machine.
|
|
26
|
+
> ```bash
|
|
27
|
+
> kubectl port-forward -n knative-eventing svc/eventmesh-backend 8080:8080
|
|
28
|
+
> ```
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
The plugin needs to be configured to talk to the backend. It can be configured in the `app-config.yaml` file of the
|
|
32
|
+
Backstage instance and allows configuration of one or multiple providers.
|
|
33
|
+
|
|
34
|
+
Use a `knativeEventMesh` marker to start configuring the `app-config.yaml` file of Backstage:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
catalog:
|
|
38
|
+
providers:
|
|
39
|
+
knativeEventMesh:
|
|
40
|
+
dev:
|
|
41
|
+
baseUrl: 'http://localhost:8080' # URL of the backend installed in the cluster
|
|
42
|
+
schedule: # optional; same options as in TaskScheduleDefinition
|
|
43
|
+
# supports cron, ISO duration, "human duration" as used in code
|
|
44
|
+
frequency: { minutes: 1 }
|
|
45
|
+
# supports ISO duration, "human duration" as used in code
|
|
46
|
+
timeout: { minutes: 1 }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Configure the scheduler for the entity provider. Add the following code to `packages/backend/src/plugins/catalog.ts`
|
|
50
|
+
file:
|
|
51
|
+
|
|
52
|
+
In file `packages/backend/src/plugins/catalog.ts`:
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import {KnativeEventMeshProvider} from '@knative-extensions/plugin-knative-event-mesh-backend';
|
|
56
|
+
|
|
57
|
+
export default async function createPlugin(
|
|
58
|
+
env:PluginEnvironment,
|
|
59
|
+
):Promise<Router> {
|
|
60
|
+
const builder = await CatalogBuilder.create(env);
|
|
61
|
+
|
|
62
|
+
/* ... other processors and/or providers ... */
|
|
63
|
+
|
|
64
|
+
// ADD THIS
|
|
65
|
+
builder.addEntityProvider(
|
|
66
|
+
KnativeEventMeshProvider.fromConfig(env.config, {
|
|
67
|
+
logger: env.logger,
|
|
68
|
+
scheduler: env.scheduler,
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
/* ... other processors and/or providers ... */
|
|
73
|
+
|
|
74
|
+
const {processingEngine, router} = await builder.build();
|
|
75
|
+
await processingEngine.start();
|
|
76
|
+
return router;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> **NOTE**: If you have made any changes to the schedule in the `app-config.yaml` file, then restart to apply the
|
|
81
|
+
> changes.
|
|
82
|
+
|
|
83
|
+
## Troubleshooting
|
|
84
|
+
|
|
85
|
+
When you start your Backstage application, you can see some log lines as follows:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
[1] 2024-01-04T09:38:08.707Z knative-event-mesh-backend info Found 1 knative event mesh provider configs with ids: dev type=plugin
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Usage
|
|
92
|
+
|
|
93
|
+
The plugin will register a few entities in the Backstage catalog.
|
|
94
|
+
|
|
95
|
+
Screenshots:
|
|
96
|
+
|
|
97
|
+
- 
|
|
98
|
+
|
|
99
|
+
- 
|
package/dist/index.cjs.js
CHANGED
|
@@ -26,10 +26,15 @@ function readKnativeEventMeshProviderConfig(id, config) {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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);
|
|
33
38
|
return value;
|
|
34
39
|
};
|
|
35
40
|
async function getEventMesh(baseUrl) {
|
|
@@ -41,11 +46,11 @@ async function getEventMesh(baseUrl) {
|
|
|
41
46
|
}
|
|
42
47
|
class KnativeEventMeshProvider {
|
|
43
48
|
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
|
+
__publicField$1(this, "env");
|
|
50
|
+
__publicField$1(this, "baseUrl");
|
|
51
|
+
__publicField$1(this, "logger");
|
|
52
|
+
__publicField$1(this, "scheduleFn");
|
|
53
|
+
__publicField$1(this, "connection");
|
|
49
54
|
this.env = config.id;
|
|
50
55
|
this.baseUrl = config.baseUrl;
|
|
51
56
|
this.logger = logger.child({
|
|
@@ -106,7 +111,7 @@ class KnativeEventMeshProvider {
|
|
|
106
111
|
};
|
|
107
112
|
}
|
|
108
113
|
getProviderName() {
|
|
109
|
-
return `knative-event-mesh-${this.env}`;
|
|
114
|
+
return `knative-event-mesh-provider-${this.env}`;
|
|
110
115
|
}
|
|
111
116
|
async connect(connection) {
|
|
112
117
|
this.connection = connection;
|
|
@@ -140,9 +145,9 @@ class KnativeEventMeshProvider {
|
|
|
140
145
|
return entities;
|
|
141
146
|
}
|
|
142
147
|
buildEventTypeEntity(eventType) {
|
|
143
|
-
var _a;
|
|
148
|
+
var _a, _b;
|
|
144
149
|
const annotations = (_a = eventType.annotations) != null ? _a : {};
|
|
145
|
-
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}
|
|
150
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
146
151
|
const links = [];
|
|
147
152
|
if (eventType.schemaURL) {
|
|
148
153
|
links.push({
|
|
@@ -158,61 +163,142 @@ class KnativeEventMeshProvider {
|
|
|
158
163
|
name: eventType.name,
|
|
159
164
|
namespace: eventType.namespace,
|
|
160
165
|
description: eventType.description,
|
|
161
|
-
// TODO: is there a value showing Kubernetes labels in Backstage?
|
|
162
166
|
labels: eventType.labels || {},
|
|
163
|
-
// TODO: is there a value showing Kubernetes annotations in Backstage?
|
|
164
167
|
annotations,
|
|
165
168
|
// we don't use tags
|
|
166
169
|
tags: [],
|
|
167
170
|
links,
|
|
168
|
-
title: `${eventType.type} - (${eventType.namespace}/${eventType.name})
|
|
171
|
+
title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`,
|
|
172
|
+
// custom field, stored
|
|
173
|
+
// see https://backstage.io/docs/features/software-catalog/extending-the-model#adding-new-fields-to-the-metadata-object
|
|
174
|
+
// can't make it type safe as the Metadata type is not exported
|
|
175
|
+
consumedBy: (_b = eventType.consumedBy) != null ? _b : []
|
|
169
176
|
},
|
|
170
177
|
spec: {
|
|
171
|
-
type:
|
|
178
|
+
type: TypeKnativeEvent,
|
|
172
179
|
lifecycle: this.env,
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
// TODO
|
|
176
|
-
owner: "knative",
|
|
180
|
+
system: SystemKnative,
|
|
181
|
+
owner: OwnerKnative,
|
|
177
182
|
definition: eventType.schemaData || "{}"
|
|
178
183
|
}
|
|
179
|
-
// TODO: remove?
|
|
180
|
-
// Backstage doesn't like empty relations
|
|
181
|
-
// relations: relations.length > 0 ? relations : undefined,
|
|
182
184
|
};
|
|
183
185
|
}
|
|
184
186
|
buildBrokerEntity(broker) {
|
|
185
187
|
var _a;
|
|
186
188
|
const annotations = (_a = broker.annotations) != null ? _a : {};
|
|
187
|
-
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}
|
|
189
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
188
190
|
return {
|
|
189
191
|
apiVersion: "backstage.io/v1alpha1",
|
|
190
192
|
kind: "Component",
|
|
191
193
|
metadata: {
|
|
192
|
-
// TODO: names are too generic: default/default
|
|
193
194
|
name: broker.name,
|
|
194
195
|
namespace: broker.namespace,
|
|
195
|
-
// TODO: is there a value showing Kubernetes labels in Backstage?
|
|
196
196
|
labels: broker.labels || {},
|
|
197
|
-
// TODO: is there a value showing Kubernetes annotations in Backstage?
|
|
198
197
|
annotations,
|
|
199
198
|
// we don't use tags
|
|
200
199
|
tags: []
|
|
201
|
-
// TODO: any links?
|
|
202
|
-
// links: links,
|
|
203
200
|
},
|
|
204
201
|
spec: {
|
|
205
|
-
type:
|
|
202
|
+
type: TypeKnativeBroker,
|
|
206
203
|
lifecycle: this.env,
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
// TODO
|
|
210
|
-
owner: "knative",
|
|
204
|
+
system: SystemKnative,
|
|
205
|
+
owner: OwnerKnative,
|
|
211
206
|
providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
|
|
212
207
|
}
|
|
213
208
|
};
|
|
214
209
|
}
|
|
215
210
|
}
|
|
216
211
|
|
|
212
|
+
var __defProp = Object.defineProperty;
|
|
213
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
214
|
+
var __publicField = (obj, key, value) => {
|
|
215
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
216
|
+
return value;
|
|
217
|
+
};
|
|
218
|
+
class KnativeEventMeshProcessor {
|
|
219
|
+
constructor(catalogApi, logger) {
|
|
220
|
+
__publicField(this, "catalogApi");
|
|
221
|
+
__publicField(this, "logger");
|
|
222
|
+
this.catalogApi = catalogApi;
|
|
223
|
+
this.logger = logger.child({
|
|
224
|
+
target: this.getProcessorName()
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
getProcessorName() {
|
|
228
|
+
return "knative-event-mesh-processor";
|
|
229
|
+
}
|
|
230
|
+
async preProcessEntity(entity, _location, emit, _originLocation, _cache) {
|
|
231
|
+
var _a;
|
|
232
|
+
if (entity.kind === "API" && ((_a = entity.spec) == null ? void 0 : _a.type) === TypeKnativeEvent) {
|
|
233
|
+
this.logger.debug(`Processing KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
234
|
+
if (!entity.metadata.consumedBy) {
|
|
235
|
+
this.logger.debug(`No consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
236
|
+
return entity;
|
|
237
|
+
}
|
|
238
|
+
const consumers = entity.metadata.consumedBy;
|
|
239
|
+
this.logger.debug(`Consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}: ${consumers.join(", ")}`);
|
|
240
|
+
for (const consumedBy of consumers) {
|
|
241
|
+
this.logger.debug(`Building relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
242
|
+
const consumerComponents = await this.findComponentsByBackstageId(entity.metadata.namespace, consumedBy);
|
|
243
|
+
this.logger.debug(`Found ${consumerComponents.length} components for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
244
|
+
for (const component of consumerComponents) {
|
|
245
|
+
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}`);
|
|
246
|
+
const apiToComponentRelation = {
|
|
247
|
+
type: "relation",
|
|
248
|
+
relation: {
|
|
249
|
+
type: "apiConsumedBy",
|
|
250
|
+
source: {
|
|
251
|
+
kind: "API",
|
|
252
|
+
namespace: entity.metadata.namespace,
|
|
253
|
+
name: entity.metadata.name
|
|
254
|
+
},
|
|
255
|
+
target: {
|
|
256
|
+
kind: "Component",
|
|
257
|
+
namespace: component.metadata.namespace,
|
|
258
|
+
name: component.metadata.name
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
emit(apiToComponentRelation);
|
|
263
|
+
const componentToApiRelation = {
|
|
264
|
+
type: "relation",
|
|
265
|
+
relation: {
|
|
266
|
+
type: "consumesApi",
|
|
267
|
+
source: {
|
|
268
|
+
kind: "Component",
|
|
269
|
+
namespace: component.metadata.namespace,
|
|
270
|
+
name: component.metadata.name
|
|
271
|
+
},
|
|
272
|
+
target: {
|
|
273
|
+
kind: "API",
|
|
274
|
+
namespace: entity.metadata.namespace,
|
|
275
|
+
name: entity.metadata.name
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
emit(componentToApiRelation);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return entity;
|
|
284
|
+
}
|
|
285
|
+
async findComponentsByBackstageId(namespace, componentId) {
|
|
286
|
+
try {
|
|
287
|
+
let response = await this.catalogApi.queryEntities({
|
|
288
|
+
filter: {
|
|
289
|
+
kind: "component",
|
|
290
|
+
"metadata.namespace": namespace,
|
|
291
|
+
"metadata.annotations.backstage.io/kubernetes-id": componentId
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
return response.items;
|
|
295
|
+
} catch (e) {
|
|
296
|
+
this.logger.error(`Failed to find components by backstage id ${namespace}/${componentId}: ${e}`);
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
exports.KnativeEventMeshProcessor = KnativeEventMeshProcessor;
|
|
217
303
|
exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
|
|
218
304
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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 // TODO: no route exists yet\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}/eventtype/${eventType.namespace}/${eventType.name}`;\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 // TODO: remove?\n // let relations:EntityRelation[] = [];\n // if (eventType.provider) {\n // relations = [...relations, {\n // // type: RELATION_API_PROVIDED_BY,\n // type: 'apiProvidedBy',\n // // TODO: ref should point to the Backstage Broker provider\n // // targetRef: `${this.getProviderName()}:${eventType.provider.kind}:${eventType.provider.namespace}/${eventType.provider.name}`,\n // targetRef: `component:default/example-website`,\n // }];\n // console.log(relations);\n //\n // // TODO:\n // // partOf: https://backstage.io/docs/features/software-catalog/well-known-relations/#partof-and-haspart\n // // - system?\n //\n // // TODO:\n // // apiConsumedBy: https://backstage.io/docs/features/software-catalog/well-known-relations/#consumesapi-and-apiconsumedby\n // // - triggers?\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 // TODO: is there a value showing Kubernetes labels in Backstage?\n labels: eventType.labels || {} as Record<string, string>,\n // TODO: is there a value showing Kubernetes annotations in Backstage?\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 // TODO\n system: 'knative-event-mesh',\n // TODO\n owner: 'knative',\n definition: eventType.schemaData || \"{}\",\n },\n // TODO: remove?\n // Backstage doesn't like empty relations\n // relations: relations.length > 0 ? relations : undefined,\n };\n }\n\n buildBrokerEntity(broker:Broker):ComponentEntity {\n const annotations = broker.annotations ?? {} as Record<string, string>;\n // TODO: no route exists yet\n annotations[ANNOTATION_ORIGIN_LOCATION] = annotations[ANNOTATION_LOCATION] = `url:${this.baseUrl}/broker/${broker.namespace}/${broker.name}`;\n\n return {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Component',\n metadata: {\n // TODO: names are too generic: default/default\n name: broker.name,\n namespace: broker.namespace,\n // TODO: is there a value showing Kubernetes labels in Backstage?\n labels: broker.labels || {} as Record<string, string>,\n // TODO: is there a value showing Kubernetes annotations in Backstage?\n annotations: annotations,\n // we don't use tags\n tags: [],\n // TODO: any links?\n // links: links,\n },\n spec: {\n type: 'broker',\n lifecycle: this.env,\n // TODO\n system: 'knative-event-mesh',\n // TODO\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/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\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 {TaskScheduleDefinition} from '@backstage/backend-tasks';\n\nexport type KnativeEventMeshProviderConfig = {\n id:string;\n baseUrl:string;\n schedule?:TaskScheduleDefinition;\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):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-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\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 // 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 {CatalogClient} 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:CatalogClient;\n private readonly logger:Logger;\n\n constructor(catalogApi:CatalogClient, logger:Logger) {\n this.catalogApi = catalogApi;\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\n try {\n let response = await this.catalogApi.queryEntities({\n filter: {\n kind: 'component',\n 'metadata.namespace': namespace,\n 'metadata.annotations.backstage.io/kubernetes-id': componentId,\n },\n });\n\n return response.items as ComponentEntity[];\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.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
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 { CatalogClient } from '@backstage/catalog-client';
|
|
7
|
+
import { LocationSpec } from '@backstage/plugin-catalog-common';
|
|
6
8
|
|
|
7
9
|
type KnativeEventMeshProviderConfig = {
|
|
8
10
|
id: string;
|
|
@@ -20,6 +22,7 @@ type EventType = {
|
|
|
20
22
|
schemaURL?: string;
|
|
21
23
|
labels?: Record<string, string>;
|
|
22
24
|
annotations?: Record<string, string>;
|
|
25
|
+
consumedBy?: string[];
|
|
23
26
|
};
|
|
24
27
|
type Broker = {
|
|
25
28
|
name: string;
|
|
@@ -50,4 +53,13 @@ declare class KnativeEventMeshProvider implements EntityProvider {
|
|
|
50
53
|
buildBrokerEntity(broker: Broker): ComponentEntity;
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
declare class KnativeEventMeshProcessor implements CatalogProcessor {
|
|
57
|
+
private readonly catalogApi;
|
|
58
|
+
private readonly logger;
|
|
59
|
+
constructor(catalogApi: CatalogClient, logger: Logger);
|
|
60
|
+
getProcessorName(): string;
|
|
61
|
+
preProcessEntity(entity: Entity, _location: LocationSpec, emit: CatalogProcessorEmit, _originLocation: LocationSpec, _cache: CatalogProcessorCache): Promise<Entity>;
|
|
62
|
+
private findComponentsByBackstageId;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { KnativeEventMeshProcessor, KnativeEventMeshProvider };
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knative-extensions/plugin-knative-event-mesh-backend",
|
|
3
|
-
"version": "0.0.0-
|
|
4
|
-
"main": "
|
|
5
|
-
"types": "
|
|
3
|
+
"version": "0.0.0-snapshot.2148f52",
|
|
4
|
+
"main": "src/index.ts",
|
|
5
|
+
"types": "src/index.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"private": false,
|
|
8
8
|
"publishConfig": {
|
|
@@ -28,15 +28,15 @@
|
|
|
28
28
|
"@types/express": "*",
|
|
29
29
|
"express": "^4.17.1",
|
|
30
30
|
"express-promise-router": "^4.1.0",
|
|
31
|
-
"winston": "^3.2.1",
|
|
32
31
|
"node-fetch": "^2.6.7",
|
|
32
|
+
"winston": "^3.2.1",
|
|
33
33
|
"yn": "^4.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@backstage/cli": "^0.24.0",
|
|
37
37
|
"@types/supertest": "^2.0.12",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
38
|
+
"msw": "^1.0.0",
|
|
39
|
+
"supertest": "^6.2.4"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
42
|
"dist"
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './providers';
|