@knative-extensions/plugin-knative-event-mesh-backend 0.1.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 ADDED
@@ -0,0 +1,14 @@
1
+ # knative-event-mesh
2
+
3
+ Welcome to the knative-event-mesh backend plugin!
4
+
5
+ _This plugin was created through the Backstage CLI_
6
+
7
+ ## Getting started
8
+
9
+ Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn
10
+ start` in the root directory, and then navigating to [/knative-event-mesh](http://localhost:3000/knative-event-mesh).
11
+
12
+ You can also serve the plugin in isolation by running `yarn start` in the plugin directory.
13
+ This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads.
14
+ It is only meant for local development, and the setup for it can be found inside the [/dev](/dev) directory.
@@ -0,0 +1,218 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var catalogModel = require('@backstage/catalog-model');
6
+ var backendTasks = require('@backstage/backend-tasks');
7
+
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()
53
+ });
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
+ }))
128
+ });
129
+ }
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}/eventtype/${eventType.namespace}/${eventType.name}`;
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
+ // TODO: is there a value showing Kubernetes labels in Backstage?
162
+ labels: eventType.labels || {},
163
+ // TODO: is there a value showing Kubernetes annotations in Backstage?
164
+ annotations,
165
+ // we don't use tags
166
+ tags: [],
167
+ links,
168
+ title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`
169
+ },
170
+ spec: {
171
+ type: "eventType",
172
+ lifecycle: this.env,
173
+ // TODO
174
+ system: "knative-event-mesh",
175
+ // TODO
176
+ owner: "knative",
177
+ definition: eventType.schemaData || "{}"
178
+ }
179
+ // TODO: remove?
180
+ // Backstage doesn't like empty relations
181
+ // relations: relations.length > 0 ? relations : undefined,
182
+ };
183
+ }
184
+ buildBrokerEntity(broker) {
185
+ var _a;
186
+ const annotations = (_a = broker.annotations) != null ? _a : {};
187
+ annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}/broker/${broker.namespace}/${broker.name}`;
188
+ return {
189
+ apiVersion: "backstage.io/v1alpha1",
190
+ kind: "Component",
191
+ metadata: {
192
+ // TODO: names are too generic: default/default
193
+ name: broker.name,
194
+ namespace: broker.namespace,
195
+ // TODO: is there a value showing Kubernetes labels in Backstage?
196
+ labels: broker.labels || {},
197
+ // TODO: is there a value showing Kubernetes annotations in Backstage?
198
+ annotations,
199
+ // we don't use tags
200
+ tags: []
201
+ // TODO: any links?
202
+ // links: links,
203
+ },
204
+ spec: {
205
+ type: "broker",
206
+ lifecycle: this.env,
207
+ // TODO
208
+ system: "knative-event-mesh",
209
+ // TODO
210
+ owner: "knative",
211
+ providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
212
+ }
213
+ };
214
+ }
215
+ }
216
+
217
+ exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
218
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,53 @@
1
+ import { TaskScheduleDefinition, TaskRunner, PluginTaskScheduler } from '@backstage/backend-tasks';
2
+ import { ApiEntity, ComponentEntity } from '@backstage/catalog-model';
3
+ import { Config } from '@backstage/config';
4
+ import { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';
5
+ import { Logger } from 'winston';
6
+
7
+ type KnativeEventMeshProviderConfig = {
8
+ id: string;
9
+ baseUrl: string;
10
+ schedule?: TaskScheduleDefinition;
11
+ };
12
+
13
+ type EventType = {
14
+ name: string;
15
+ namespace: string;
16
+ type: string;
17
+ uid: string;
18
+ description?: string;
19
+ schemaData?: string;
20
+ schemaURL?: string;
21
+ labels?: Record<string, string>;
22
+ annotations?: Record<string, string>;
23
+ };
24
+ type Broker = {
25
+ name: string;
26
+ namespace: string;
27
+ uid: string;
28
+ labels?: Record<string, string>;
29
+ annotations?: Record<string, string>;
30
+ providedEventTypes?: string[];
31
+ };
32
+ declare class KnativeEventMeshProvider implements EntityProvider {
33
+ private readonly env;
34
+ private readonly baseUrl;
35
+ private readonly logger;
36
+ private readonly scheduleFn;
37
+ private connection?;
38
+ static fromConfig(configRoot: Config, options: {
39
+ logger: Logger;
40
+ schedule?: TaskRunner;
41
+ scheduler?: PluginTaskScheduler;
42
+ }): KnativeEventMeshProvider[];
43
+ constructor(config: KnativeEventMeshProviderConfig, logger: Logger, taskRunner: TaskRunner);
44
+ private createScheduleFn;
45
+ getProviderName(): string;
46
+ connect(connection: EntityProviderConnection): Promise<void>;
47
+ run(): Promise<void>;
48
+ private buildEntities;
49
+ buildEventTypeEntity(eventType: EventType): ApiEntity;
50
+ buildBrokerEntity(broker: Broker): ComponentEntity;
51
+ }
52
+
53
+ export { KnativeEventMeshProvider };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@knative-extensions/plugin-knative-event-mesh-backend",
3
+ "version": "0.1.0",
4
+ "main": "dist/index.cjs.js",
5
+ "types": "dist/index.d.ts",
6
+ "license": "Apache-2.0",
7
+ "private": false,
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "main": "dist/index.cjs.js",
11
+ "types": "dist/index.d.ts"
12
+ },
13
+ "backstage": {
14
+ "role": "backend-plugin"
15
+ },
16
+ "scripts": {
17
+ "start": "backstage-cli package start",
18
+ "build": "backstage-cli package build",
19
+ "lint": "backstage-cli package lint",
20
+ "test": "backstage-cli package test",
21
+ "clean": "backstage-cli package clean",
22
+ "prepack": "backstage-cli package prepack",
23
+ "postpack": "backstage-cli package postpack"
24
+ },
25
+ "dependencies": {
26
+ "@backstage/backend-common": "^0.19.9",
27
+ "@backstage/config": "^1.1.1",
28
+ "@types/express": "*",
29
+ "express": "^4.17.1",
30
+ "express-promise-router": "^4.1.0",
31
+ "winston": "^3.2.1",
32
+ "node-fetch": "^2.6.7",
33
+ "yn": "^4.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@backstage/cli": "^0.24.0",
37
+ "@types/supertest": "^2.0.12",
38
+ "supertest": "^6.2.4",
39
+ "msw": "^1.0.0"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ]
44
+ }