@knative-extensions/plugin-knative-event-mesh-backend 0.0.0-snapshot.fa86c6e → 0.0.0-snapshot.faa3ef4
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 +9 -97
- package/alpha/package.json +6 -0
- package/dist/alpha.cjs.js +38 -0
- package/dist/alpha.cjs.js.map +1 -0
- package/dist/alpha.d.ts +5 -0
- package/dist/cjs/knativeEventMeshProcessor-1f8d1a5f.cjs.js +381 -0
- package/dist/cjs/knativeEventMeshProcessor-1f8d1a5f.cjs.js.map +1 -0
- package/dist/index.cjs.js +18 -303
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +64 -3
- package/package.json +26 -3
package/README.md
CHANGED
|
@@ -2,107 +2,19 @@
|
|
|
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
|
-
The Backstage plugin talks to a special backend that runs in the Kubernetes cluster and communicates with the Kubernetes
|
|
6
|
-
API server.
|
|
7
|
-
|
|
8
5
|
A demo setup for this plugin is available at https://github.com/aliok/knative-backstage-demo.
|
|
9
6
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
Install the backend and the relevant configuration in the Kubernetes cluster
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
kubectl apply -f https://github.com/knative-extensions/backstage-plugins/releases/download/v0.1.0/eventmesh.yaml
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
In your Backstage directory, run the following command to install the plugin:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
yarn workspace backend add @knative-extensions/plugin-knative-event-mesh-backend
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Configuration
|
|
25
|
-
|
|
26
|
-
> **NOTE**: The backend needs to be accessible from the Backstage instance. If you are running the backend without
|
|
27
|
-
> exposing it, you can use `kubectl port-forward` to forward the port of the backend service to your local machine.
|
|
28
|
-
> ```bash
|
|
29
|
-
> kubectl port-forward -n knative-eventing svc/eventmesh-backend 8080:8080
|
|
30
|
-
> ```
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
The plugin needs to be configured to talk to the backend. It can be configured in the `app-config.yaml` file of the
|
|
34
|
-
Backstage instance and allows configuration of one or multiple providers.
|
|
35
|
-
|
|
36
|
-
Use a `knativeEventMesh` marker to start configuring the `app-config.yaml` file of Backstage:
|
|
37
|
-
|
|
38
|
-
```yaml
|
|
39
|
-
catalog:
|
|
40
|
-
providers:
|
|
41
|
-
knativeEventMesh:
|
|
42
|
-
dev:
|
|
43
|
-
baseUrl: 'http://localhost:8080' # URL of the backend installed in the cluster
|
|
44
|
-
schedule: # optional; same options as in TaskScheduleDefinition
|
|
45
|
-
# supports cron, ISO duration, "human duration" as used in code
|
|
46
|
-
frequency: { minutes: 1 }
|
|
47
|
-
# supports ISO duration, "human duration" as used in code
|
|
48
|
-
timeout: { minutes: 1 }
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Configure the scheduler for the entity provider and enable the processor. Add the following code
|
|
52
|
-
to `packages/backend/src/plugins/catalog.ts` file:
|
|
53
|
-
|
|
54
|
-
```ts
|
|
55
|
-
import {CatalogClient} from "@backstage/catalog-client";
|
|
56
|
-
import {
|
|
57
|
-
KnativeEventMeshProcessor,
|
|
58
|
-
KnativeEventMeshProvider
|
|
59
|
-
} from '@knative-extensions/plugin-knative-event-mesh-backend';
|
|
60
|
-
|
|
61
|
-
export default async function createPlugin(
|
|
62
|
-
env:PluginEnvironment,
|
|
63
|
-
):Promise<Router> {
|
|
64
|
-
const builder = await CatalogBuilder.create(env);
|
|
65
|
-
|
|
66
|
-
/* ... other processors and/or providers ... */
|
|
67
|
-
|
|
68
|
-
// ADD THESE
|
|
69
|
-
builder.addEntityProvider(
|
|
70
|
-
KnativeEventMeshProvider.fromConfig(env.config, {
|
|
71
|
-
logger: env.logger,
|
|
72
|
-
scheduler: env.scheduler,
|
|
73
|
-
}),
|
|
74
|
-
);
|
|
75
|
-
const catalogApi = new CatalogClient({
|
|
76
|
-
discoveryApi: env.discovery,
|
|
77
|
-
});
|
|
78
|
-
const knativeEventMeshProcessor = new KnativeEventMeshProcessor(catalogApi, env.logger);
|
|
79
|
-
builder.addProcessor(knativeEventMeshProcessor);
|
|
80
|
-
|
|
81
|
-
/* ... other processors and/or providers ... */
|
|
82
|
-
|
|
83
|
-
const {processingEngine, router} = await builder.build();
|
|
84
|
-
await processingEngine.start();
|
|
85
|
-
return router;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
> **NOTE**: If you have made any changes to the schedule in the `app-config.yaml` file, then restart to apply the
|
|
90
|
-
> changes.
|
|
91
|
-
|
|
92
|
-
## Troubleshooting
|
|
93
|
-
|
|
94
|
-
When you start your Backstage application, you can see some log lines as follows:
|
|
95
|
-
|
|
96
|
-
```text
|
|
97
|
-
[1] 2024-01-04T09:38:08.707Z knative-event-mesh-backend info Found 1 knative event mesh provider configs with ids: dev type=plugin
|
|
98
|
-
```
|
|
7
|
+
## Dynamic vs static plugin
|
|
99
8
|
|
|
100
|
-
|
|
9
|
+
This plugin has 2 distributions: static and dynamic.
|
|
101
10
|
|
|
102
|
-
The
|
|
11
|
+
The static distribution is a regular Backstage plugin that requires the source code of Backstage to be changed.
|
|
103
12
|
|
|
104
|
-
|
|
13
|
+
The dynamic distribution is a plugin that can be installed without changing the source code of Backstage.
|
|
105
14
|
|
|
106
|
-
|
|
15
|
+
If you would like to use the dynamic plugin, please see the instructions in the
|
|
16
|
+
[Dynamic Plugin README file](https://github.com/knative-extensions/backstage-plugins/blob/main/backstage/plugins/knative-event-mesh-backend/README-dynamic.md).
|
|
107
17
|
|
|
108
|
-
|
|
18
|
+
If you would like to use the static distribution, please see the documentation on Knative website for
|
|
19
|
+
[installing](https://knative.dev/docs/install/installing-backstage-plugins/)
|
|
20
|
+
and [using](https://knative.dev/docs/eventing/event-registry/eventmesh-backstage-plugin/) the plugin.
|
|
@@ -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-1f8d1a5f.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;;;;"}
|
package/dist/alpha.d.ts
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
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(url, token) {
|
|
41
|
+
const response = await fetch(`${url}`, {
|
|
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 baseUrl = this.baseUrl.replace(/\/$/, "");
|
|
134
|
+
const token = this.token;
|
|
135
|
+
const url = `${baseUrl}/v1/getEventMesh`;
|
|
136
|
+
const eventMesh = await getEventMesh(url, token);
|
|
137
|
+
const entities = this.buildEntities(eventMesh);
|
|
138
|
+
await this.connection.applyMutation({
|
|
139
|
+
type: "full",
|
|
140
|
+
entities: entities.map((entity) => ({
|
|
141
|
+
entity,
|
|
142
|
+
locationKey: this.getProviderName()
|
|
143
|
+
}))
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
buildEntities(eventMesh) {
|
|
147
|
+
const entities = [];
|
|
148
|
+
for (const eventType of eventMesh.eventTypes) {
|
|
149
|
+
const entity = this.buildEventTypeEntity(eventType);
|
|
150
|
+
entities.push(entity);
|
|
151
|
+
}
|
|
152
|
+
for (const broker of eventMesh.brokers) {
|
|
153
|
+
const entity = this.buildBrokerEntity(broker);
|
|
154
|
+
entities.push(entity);
|
|
155
|
+
}
|
|
156
|
+
for (const subscribable of eventMesh.subscribables) {
|
|
157
|
+
const entity = this.buildSubscribableEntity(subscribable);
|
|
158
|
+
entities.push(entity);
|
|
159
|
+
}
|
|
160
|
+
for (const source of eventMesh.sources) {
|
|
161
|
+
const entity = this.buildSourceEntity(source);
|
|
162
|
+
entities.push(entity);
|
|
163
|
+
}
|
|
164
|
+
return entities;
|
|
165
|
+
}
|
|
166
|
+
buildEventTypeEntity(eventType) {
|
|
167
|
+
var _a, _b;
|
|
168
|
+
const annotations = (_a = eventType.annotations) != null ? _a : {};
|
|
169
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
170
|
+
const links = [];
|
|
171
|
+
if (eventType.schemaURL) {
|
|
172
|
+
links.push({
|
|
173
|
+
title: "View external schema",
|
|
174
|
+
icon: "scaffolder",
|
|
175
|
+
url: eventType.schemaURL
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
apiVersion: "backstage.io/v1alpha1",
|
|
180
|
+
kind: "API",
|
|
181
|
+
metadata: {
|
|
182
|
+
name: eventType.name,
|
|
183
|
+
namespace: eventType.namespace,
|
|
184
|
+
description: eventType.description,
|
|
185
|
+
labels: eventType.labels || {},
|
|
186
|
+
annotations,
|
|
187
|
+
// we don't use tags
|
|
188
|
+
tags: [],
|
|
189
|
+
links,
|
|
190
|
+
title: `${eventType.type} - (${eventType.namespace}/${eventType.name})`,
|
|
191
|
+
// custom field, stored
|
|
192
|
+
// see https://backstage.io/docs/features/software-catalog/extending-the-model#adding-new-fields-to-the-metadata-object
|
|
193
|
+
// can't make it type safe as the Metadata type is not exported
|
|
194
|
+
consumedBy: (_b = eventType.consumedBy) != null ? _b : []
|
|
195
|
+
},
|
|
196
|
+
spec: {
|
|
197
|
+
type: TypeKnativeEvent,
|
|
198
|
+
lifecycle: this.env,
|
|
199
|
+
system: SystemKnative,
|
|
200
|
+
owner: OwnerKnative,
|
|
201
|
+
definition: eventType.schemaData || "{}"
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
buildBrokerEntity(broker) {
|
|
206
|
+
var _a;
|
|
207
|
+
const annotations = (_a = broker.annotations) != null ? _a : {};
|
|
208
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
209
|
+
return {
|
|
210
|
+
apiVersion: "backstage.io/v1alpha1",
|
|
211
|
+
kind: "Component",
|
|
212
|
+
metadata: {
|
|
213
|
+
name: broker.name,
|
|
214
|
+
namespace: broker.namespace,
|
|
215
|
+
labels: broker.labels || {},
|
|
216
|
+
annotations,
|
|
217
|
+
// we don't use tags
|
|
218
|
+
tags: []
|
|
219
|
+
},
|
|
220
|
+
spec: {
|
|
221
|
+
type: TypeKnativeBroker,
|
|
222
|
+
lifecycle: this.env,
|
|
223
|
+
system: SystemKnative,
|
|
224
|
+
owner: OwnerKnative,
|
|
225
|
+
providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
buildSubscribableEntity(subscribable) {
|
|
230
|
+
var _a;
|
|
231
|
+
const annotations = (_a = subscribable.annotations) != null ? _a : {};
|
|
232
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
233
|
+
return {
|
|
234
|
+
apiVersion: "backstage.io/v1alpha1",
|
|
235
|
+
kind: "Component",
|
|
236
|
+
metadata: {
|
|
237
|
+
name: subscribable.name,
|
|
238
|
+
namespace: subscribable.namespace,
|
|
239
|
+
labels: subscribable.labels || {},
|
|
240
|
+
annotations,
|
|
241
|
+
// we don't use tags
|
|
242
|
+
tags: []
|
|
243
|
+
},
|
|
244
|
+
spec: {
|
|
245
|
+
type: `${subscribable.group}:${subscribable.kind}`,
|
|
246
|
+
lifecycle: this.env,
|
|
247
|
+
system: SystemKnative,
|
|
248
|
+
owner: OwnerKnative,
|
|
249
|
+
providesApis: !subscribable.providedEventTypes ? [] : subscribable.providedEventTypes.map((eventType) => `api:${eventType}`)
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
buildSourceEntity(source) {
|
|
254
|
+
var _a;
|
|
255
|
+
const annotations = (_a = source.annotations) != null ? _a : {};
|
|
256
|
+
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
257
|
+
return {
|
|
258
|
+
apiVersion: "backstage.io/v1alpha1",
|
|
259
|
+
kind: "Component",
|
|
260
|
+
metadata: {
|
|
261
|
+
name: source.name,
|
|
262
|
+
namespace: source.namespace,
|
|
263
|
+
labels: source.labels || {},
|
|
264
|
+
annotations,
|
|
265
|
+
// we don't use tags
|
|
266
|
+
tags: []
|
|
267
|
+
},
|
|
268
|
+
spec: {
|
|
269
|
+
type: `${source.group}:${source.kind}`,
|
|
270
|
+
lifecycle: this.env,
|
|
271
|
+
system: SystemKnative,
|
|
272
|
+
owner: OwnerKnative,
|
|
273
|
+
providesApis: !source.providedEventTypes ? [] : source.providedEventTypes.map((eventType) => `api:${eventType}`)
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
var __defProp = Object.defineProperty;
|
|
280
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
281
|
+
var __publicField = (obj, key, value) => {
|
|
282
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
283
|
+
return value;
|
|
284
|
+
};
|
|
285
|
+
class KnativeEventMeshProcessor {
|
|
286
|
+
constructor(catalogApi, logger, queryEntityPageLimit) {
|
|
287
|
+
__publicField(this, "catalogApi");
|
|
288
|
+
__publicField(this, "logger");
|
|
289
|
+
__publicField(this, "queryEntityPageLimit");
|
|
290
|
+
this.catalogApi = catalogApi;
|
|
291
|
+
this.queryEntityPageLimit = queryEntityPageLimit != null ? queryEntityPageLimit : 1e4;
|
|
292
|
+
this.logger = logger.child({
|
|
293
|
+
target: this.getProcessorName()
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
getProcessorName() {
|
|
297
|
+
return "knative-event-mesh-processor";
|
|
298
|
+
}
|
|
299
|
+
async preProcessEntity(entity, _location, emit, _originLocation, _cache) {
|
|
300
|
+
var _a;
|
|
301
|
+
if (entity.kind === "API" && ((_a = entity.spec) == null ? void 0 : _a.type) === TypeKnativeEvent) {
|
|
302
|
+
this.logger.debug(`Processing KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
303
|
+
if (!entity.metadata.consumedBy) {
|
|
304
|
+
this.logger.debug(`No consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
305
|
+
return entity;
|
|
306
|
+
}
|
|
307
|
+
const consumers = entity.metadata.consumedBy;
|
|
308
|
+
this.logger.debug(`Consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}: ${consumers.join(", ")}`);
|
|
309
|
+
for (const consumedBy of consumers) {
|
|
310
|
+
this.logger.debug(`Building relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
311
|
+
const consumerComponents = await this.findComponentsByBackstageId(entity.metadata.namespace, consumedBy);
|
|
312
|
+
this.logger.debug(`Found ${consumerComponents.length} components for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
313
|
+
for (const component of consumerComponents) {
|
|
314
|
+
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}`);
|
|
315
|
+
const apiToComponentRelation = {
|
|
316
|
+
type: "relation",
|
|
317
|
+
relation: {
|
|
318
|
+
type: "apiConsumedBy",
|
|
319
|
+
source: {
|
|
320
|
+
kind: "API",
|
|
321
|
+
namespace: entity.metadata.namespace,
|
|
322
|
+
name: entity.metadata.name
|
|
323
|
+
},
|
|
324
|
+
target: {
|
|
325
|
+
kind: "Component",
|
|
326
|
+
namespace: component.metadata.namespace,
|
|
327
|
+
name: component.metadata.name
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
emit(apiToComponentRelation);
|
|
332
|
+
const componentToApiRelation = {
|
|
333
|
+
type: "relation",
|
|
334
|
+
relation: {
|
|
335
|
+
type: "consumesApi",
|
|
336
|
+
source: {
|
|
337
|
+
kind: "Component",
|
|
338
|
+
namespace: component.metadata.namespace,
|
|
339
|
+
name: component.metadata.name
|
|
340
|
+
},
|
|
341
|
+
target: {
|
|
342
|
+
kind: "API",
|
|
343
|
+
namespace: entity.metadata.namespace,
|
|
344
|
+
name: entity.metadata.name
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
emit(componentToApiRelation);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return entity;
|
|
353
|
+
}
|
|
354
|
+
async findComponentsByBackstageId(namespace, componentId) {
|
|
355
|
+
let catalogApiCursor;
|
|
356
|
+
let entities = [];
|
|
357
|
+
try {
|
|
358
|
+
do {
|
|
359
|
+
const response = await this.catalogApi.queryEntities({
|
|
360
|
+
filter: {
|
|
361
|
+
kind: "component",
|
|
362
|
+
"metadata.namespace": namespace,
|
|
363
|
+
"metadata.annotations.backstage.io/kubernetes-id": componentId
|
|
364
|
+
},
|
|
365
|
+
cursor: catalogApiCursor,
|
|
366
|
+
limit: this.queryEntityPageLimit
|
|
367
|
+
});
|
|
368
|
+
catalogApiCursor = response.pageInfo.nextCursor;
|
|
369
|
+
entities = entities.concat(response.items);
|
|
370
|
+
} while (catalogApiCursor);
|
|
371
|
+
return entities;
|
|
372
|
+
} catch (e) {
|
|
373
|
+
this.logger.error(`Failed to find components by backstage id ${namespace}/${componentId}: ${e}`);
|
|
374
|
+
return [];
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
exports.KnativeEventMeshProcessor = KnativeEventMeshProcessor;
|
|
380
|
+
exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
|
|
381
|
+
//# sourceMappingURL=knativeEventMeshProcessor-1f8d1a5f.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knativeEventMeshProcessor-1f8d1a5f.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\nexport type Subscribable = {\n name:string;\n namespace:string;\n uid:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n group:string;\n kind:string;\n providedEventTypes?:string[];\n};\n\nexport type Source = {\n name:string;\n namespace:string;\n uid:string;\n labels?:Record<string, string>;\n annotations?:Record<string, string>;\n group:string;\n kind:string;\n providedEventTypes?:string[];\n};\n\ntype EventMesh = {\n eventTypes:EventType[];\n brokers:Broker[];\n subscribables:Subscribable[];\n sources:Source[];\n};\n\nexport async function getEventMesh(url:string, token:string | undefined):Promise<EventMesh> {\n const response = await fetch(`${url}`, {\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 // remove the trailing slash if it exists\n const baseUrl = this.baseUrl.replace(/\\/$/, '');\n const token = this.token;\n\n const url = `${baseUrl}/v1/getEventMesh`;\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\n for (const subscribable of eventMesh.subscribables) {\n const entity = this.buildSubscribableEntity(subscribable);\n entities.push(entity);\n }\n\n for (const source of eventMesh.sources) {\n const entity = this.buildSourceEntity(source);\n entities.push(entity);\n }\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 buildSubscribableEntity(subscribable:Subscribable) {\n const annotations = subscribable.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: subscribable.name,\n namespace: subscribable.namespace,\n labels: subscribable.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n },\n spec: {\n type: `${subscribable.group}:${subscribable.kind}`,\n lifecycle: this.env,\n system: SystemKnative,\n owner: OwnerKnative,\n providesApis: !subscribable.providedEventTypes ? [] : subscribable.providedEventTypes.map((eventType:string) => `api:${eventType}`),\n }\n }\n }\n\n buildSourceEntity(source:Source) {\n const annotations = source.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: source.name,\n namespace: source.namespace,\n labels: source.labels || {} as Record<string, string>,\n annotations: annotations,\n // we don't use tags\n tags: [],\n },\n spec: {\n type: `${source.group}:${source.kind}`,\n lifecycle: this.env,\n system: SystemKnative,\n owner: OwnerKnative,\n providesApis: !source.providedEventTypes ? [] : source.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,313 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var knativeEventMeshProcessor = require('./cjs/knativeEventMeshProcessor-1f8d1a5f.cjs.js');
|
|
6
|
+
var catalogClient = require('@backstage/catalog-client');
|
|
7
|
+
require('@backstage/catalog-model');
|
|
8
|
+
require('@backstage/backend-tasks');
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
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) {
|
|
41
|
-
const response = await fetch(`${baseUrl}`);
|
|
42
|
-
if (!response.ok) {
|
|
43
|
-
throw new Error(response.statusText);
|
|
44
|
-
}
|
|
45
|
-
return await response.json();
|
|
46
|
-
}
|
|
47
|
-
class KnativeEventMeshProvider {
|
|
48
|
-
constructor(config, logger, taskRunner) {
|
|
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");
|
|
54
|
-
this.env = config.id;
|
|
55
|
-
this.baseUrl = config.baseUrl;
|
|
56
|
-
this.logger = logger.child({
|
|
57
|
-
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
|
|
58
16
|
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const providerConfigs = readKnativeEventMeshProviderConfigs(configRoot);
|
|
63
|
-
if (!options.schedule && !options.scheduler) {
|
|
64
|
-
throw new Error("Either schedule or scheduler must be provided.");
|
|
65
|
-
}
|
|
66
|
-
const logger = options.logger.child({ plugin: "knative-event-mesh-backend" });
|
|
67
|
-
logger.info(`Found ${providerConfigs.length} knative event mesh provider configs with ids: ${providerConfigs.map((providerConfig) => providerConfig.id).join(", ")}`);
|
|
68
|
-
return providerConfigs.map((providerConfig) => {
|
|
69
|
-
if (!options.schedule && !providerConfig.schedule) {
|
|
70
|
-
throw new Error(`No schedule provided neither via code nor config for KnativeEventMesh entity provider:${providerConfig.id}.`);
|
|
71
|
-
}
|
|
72
|
-
let taskRunner;
|
|
73
|
-
if (options.scheduler && providerConfig.schedule) {
|
|
74
|
-
taskRunner = options.scheduler.createScheduledTaskRunner(providerConfig.schedule);
|
|
75
|
-
} else if (options.schedule) {
|
|
76
|
-
taskRunner = options.schedule;
|
|
77
|
-
} else {
|
|
78
|
-
throw new Error("Neither schedule nor scheduler is provided.");
|
|
79
|
-
}
|
|
80
|
-
return new KnativeEventMeshProvider(
|
|
81
|
-
providerConfig,
|
|
82
|
-
options.logger,
|
|
83
|
-
taskRunner
|
|
84
|
-
);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
createScheduleFn(taskRunner) {
|
|
88
|
-
return async () => {
|
|
89
|
-
const taskId = `${this.getProviderName()}:run`;
|
|
90
|
-
return taskRunner.run({
|
|
91
|
-
id: taskId,
|
|
92
|
-
fn: async () => {
|
|
93
|
-
var _a;
|
|
94
|
-
try {
|
|
95
|
-
await this.run();
|
|
96
|
-
} catch (error) {
|
|
97
|
-
this.logger.error(
|
|
98
|
-
`Error while fetching Knative Event Mesh from ${this.baseUrl}`,
|
|
99
|
-
{
|
|
100
|
-
// Default Error properties:
|
|
101
|
-
name: error.name,
|
|
102
|
-
message: error.message,
|
|
103
|
-
stack: error.stack,
|
|
104
|
-
// Additional status code if available:
|
|
105
|
-
status: (_a = error.response) == null ? void 0 : _a.status
|
|
106
|
-
}
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
getProviderName() {
|
|
114
|
-
return `knative-event-mesh-provider-${this.env}`;
|
|
115
|
-
}
|
|
116
|
-
async connect(connection) {
|
|
117
|
-
this.connection = connection;
|
|
118
|
-
await this.scheduleFn();
|
|
119
|
-
}
|
|
120
|
-
async run() {
|
|
121
|
-
if (!this.connection) {
|
|
122
|
-
throw new Error("Not initialized");
|
|
123
|
-
}
|
|
124
|
-
const url = this.baseUrl;
|
|
125
|
-
const eventMesh = await getEventMesh(url);
|
|
126
|
-
const entities = this.buildEntities(eventMesh);
|
|
127
|
-
await this.connection.applyMutation({
|
|
128
|
-
type: "full",
|
|
129
|
-
entities: entities.map((entity) => ({
|
|
130
|
-
entity,
|
|
131
|
-
locationKey: this.getProviderName()
|
|
132
|
-
}))
|
|
17
|
+
builder.addEntityProvider(knativeEventMeshProviders);
|
|
18
|
+
const catalogApi = new catalogClient.CatalogClient({
|
|
19
|
+
discoveryApi: env.discovery
|
|
133
20
|
});
|
|
21
|
+
const knativeEventMeshProcessor$1 = new knativeEventMeshProcessor.KnativeEventMeshProcessor(catalogApi, env.logger);
|
|
22
|
+
builder.addProcessor(knativeEventMeshProcessor$1);
|
|
134
23
|
}
|
|
135
|
-
buildEntities(eventMesh) {
|
|
136
|
-
const entities = [];
|
|
137
|
-
for (const eventType of eventMesh.eventTypes) {
|
|
138
|
-
const entity = this.buildEventTypeEntity(eventType);
|
|
139
|
-
entities.push(entity);
|
|
140
|
-
}
|
|
141
|
-
for (const broker of eventMesh.brokers) {
|
|
142
|
-
const entity = this.buildBrokerEntity(broker);
|
|
143
|
-
entities.push(entity);
|
|
144
|
-
}
|
|
145
|
-
return entities;
|
|
146
|
-
}
|
|
147
|
-
buildEventTypeEntity(eventType) {
|
|
148
|
-
var _a, _b;
|
|
149
|
-
const annotations = (_a = eventType.annotations) != null ? _a : {};
|
|
150
|
-
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
151
|
-
const links = [];
|
|
152
|
-
if (eventType.schemaURL) {
|
|
153
|
-
links.push({
|
|
154
|
-
title: "View external schema",
|
|
155
|
-
icon: "scaffolder",
|
|
156
|
-
url: eventType.schemaURL
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
apiVersion: "backstage.io/v1alpha1",
|
|
161
|
-
kind: "API",
|
|
162
|
-
metadata: {
|
|
163
|
-
name: eventType.name,
|
|
164
|
-
namespace: eventType.namespace,
|
|
165
|
-
description: eventType.description,
|
|
166
|
-
labels: eventType.labels || {},
|
|
167
|
-
annotations,
|
|
168
|
-
// we don't use tags
|
|
169
|
-
tags: [],
|
|
170
|
-
links,
|
|
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 : []
|
|
176
|
-
},
|
|
177
|
-
spec: {
|
|
178
|
-
type: TypeKnativeEvent,
|
|
179
|
-
lifecycle: this.env,
|
|
180
|
-
system: SystemKnative,
|
|
181
|
-
owner: OwnerKnative,
|
|
182
|
-
definition: eventType.schemaData || "{}"
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
buildBrokerEntity(broker) {
|
|
187
|
-
var _a;
|
|
188
|
-
const annotations = (_a = broker.annotations) != null ? _a : {};
|
|
189
|
-
annotations[catalogModel.ANNOTATION_ORIGIN_LOCATION] = annotations[catalogModel.ANNOTATION_LOCATION] = `url:${this.baseUrl}`;
|
|
190
|
-
return {
|
|
191
|
-
apiVersion: "backstage.io/v1alpha1",
|
|
192
|
-
kind: "Component",
|
|
193
|
-
metadata: {
|
|
194
|
-
name: broker.name,
|
|
195
|
-
namespace: broker.namespace,
|
|
196
|
-
labels: broker.labels || {},
|
|
197
|
-
annotations,
|
|
198
|
-
// we don't use tags
|
|
199
|
-
tags: []
|
|
200
|
-
},
|
|
201
|
-
spec: {
|
|
202
|
-
type: TypeKnativeBroker,
|
|
203
|
-
lifecycle: this.env,
|
|
204
|
-
system: SystemKnative,
|
|
205
|
-
owner: OwnerKnative,
|
|
206
|
-
providesApis: !broker.providedEventTypes ? [] : broker.providedEventTypes.map((eventType) => `api:${eventType}`)
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
}
|
|
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
24
|
};
|
|
218
|
-
class KnativeEventMeshProcessor {
|
|
219
|
-
constructor(catalogApi, logger, queryEntityPageLimit) {
|
|
220
|
-
__publicField(this, "catalogApi");
|
|
221
|
-
__publicField(this, "logger");
|
|
222
|
-
__publicField(this, "queryEntityPageLimit");
|
|
223
|
-
this.catalogApi = catalogApi;
|
|
224
|
-
this.queryEntityPageLimit = queryEntityPageLimit != null ? queryEntityPageLimit : 1e4;
|
|
225
|
-
this.logger = logger.child({
|
|
226
|
-
target: this.getProcessorName()
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
getProcessorName() {
|
|
230
|
-
return "knative-event-mesh-processor";
|
|
231
|
-
}
|
|
232
|
-
async preProcessEntity(entity, _location, emit, _originLocation, _cache) {
|
|
233
|
-
var _a;
|
|
234
|
-
if (entity.kind === "API" && ((_a = entity.spec) == null ? void 0 : _a.type) === TypeKnativeEvent) {
|
|
235
|
-
this.logger.debug(`Processing KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
236
|
-
if (!entity.metadata.consumedBy) {
|
|
237
|
-
this.logger.debug(`No consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}`);
|
|
238
|
-
return entity;
|
|
239
|
-
}
|
|
240
|
-
const consumers = entity.metadata.consumedBy;
|
|
241
|
-
this.logger.debug(`Consumers defined for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name}: ${consumers.join(", ")}`);
|
|
242
|
-
for (const consumedBy of consumers) {
|
|
243
|
-
this.logger.debug(`Building relations for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
244
|
-
const consumerComponents = await this.findComponentsByBackstageId(entity.metadata.namespace, consumedBy);
|
|
245
|
-
this.logger.debug(`Found ${consumerComponents.length} components for KnativeEventType entity ${entity.metadata.namespace}/${entity.metadata.name} to consumer ${consumedBy}`);
|
|
246
|
-
for (const component of consumerComponents) {
|
|
247
|
-
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}`);
|
|
248
|
-
const apiToComponentRelation = {
|
|
249
|
-
type: "relation",
|
|
250
|
-
relation: {
|
|
251
|
-
type: "apiConsumedBy",
|
|
252
|
-
source: {
|
|
253
|
-
kind: "API",
|
|
254
|
-
namespace: entity.metadata.namespace,
|
|
255
|
-
name: entity.metadata.name
|
|
256
|
-
},
|
|
257
|
-
target: {
|
|
258
|
-
kind: "Component",
|
|
259
|
-
namespace: component.metadata.namespace,
|
|
260
|
-
name: component.metadata.name
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
emit(apiToComponentRelation);
|
|
265
|
-
const componentToApiRelation = {
|
|
266
|
-
type: "relation",
|
|
267
|
-
relation: {
|
|
268
|
-
type: "consumesApi",
|
|
269
|
-
source: {
|
|
270
|
-
kind: "Component",
|
|
271
|
-
namespace: component.metadata.namespace,
|
|
272
|
-
name: component.metadata.name
|
|
273
|
-
},
|
|
274
|
-
target: {
|
|
275
|
-
kind: "API",
|
|
276
|
-
namespace: entity.metadata.namespace,
|
|
277
|
-
name: entity.metadata.name
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
emit(componentToApiRelation);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return entity;
|
|
286
|
-
}
|
|
287
|
-
async findComponentsByBackstageId(namespace, componentId) {
|
|
288
|
-
let catalogApiCursor;
|
|
289
|
-
let entities = [];
|
|
290
|
-
try {
|
|
291
|
-
do {
|
|
292
|
-
let response = await this.catalogApi.queryEntities({
|
|
293
|
-
filter: {
|
|
294
|
-
kind: "component",
|
|
295
|
-
"metadata.namespace": namespace,
|
|
296
|
-
"metadata.annotations.backstage.io/kubernetes-id": componentId
|
|
297
|
-
},
|
|
298
|
-
cursor: catalogApiCursor,
|
|
299
|
-
limit: this.queryEntityPageLimit
|
|
300
|
-
});
|
|
301
|
-
catalogApiCursor = response.pageInfo.nextCursor;
|
|
302
|
-
entities = entities.concat(response.items);
|
|
303
|
-
} while (catalogApiCursor);
|
|
304
|
-
return entities;
|
|
305
|
-
} catch (e) {
|
|
306
|
-
this.logger.error(`Failed to find components by backstage id ${namespace}/${componentId}: ${e}`);
|
|
307
|
-
return [];
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
25
|
|
|
312
|
-
exports.KnativeEventMeshProcessor = KnativeEventMeshProcessor;
|
|
313
|
-
exports.KnativeEventMeshProvider = KnativeEventMeshProvider;
|
|
26
|
+
exports.KnativeEventMeshProcessor = knativeEventMeshProcessor.KnativeEventMeshProcessor;
|
|
27
|
+
exports.KnativeEventMeshProvider = knativeEventMeshProcessor.KnativeEventMeshProvider;
|
|
28
|
+
exports.dynamicPluginInstaller = dynamicPluginInstaller;
|
|
314
29
|
//# 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/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 private readonly queryEntityPageLimit:number;\n\n constructor(catalogApi:CatalogClient, 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 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 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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"}
|
|
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
|
@@ -3,13 +3,15 @@ import { ApiEntity, ComponentEntity, Entity } from '@backstage/catalog-model';
|
|
|
3
3
|
import { Config } from '@backstage/config';
|
|
4
4
|
import { EntityProvider, EntityProviderConnection, CatalogProcessor, CatalogProcessorEmit, CatalogProcessorCache } from '@backstage/plugin-catalog-node';
|
|
5
5
|
import { Logger } from 'winston';
|
|
6
|
-
import {
|
|
6
|
+
import { CatalogApi } from '@backstage/catalog-client';
|
|
7
7
|
import { LocationSpec } from '@backstage/plugin-catalog-common';
|
|
8
|
+
import { BackendDynamicPluginInstaller } from '@backstage/backend-dynamic-feature-service';
|
|
8
9
|
|
|
9
10
|
type KnativeEventMeshProviderConfig = {
|
|
10
11
|
id: string;
|
|
11
12
|
baseUrl: string;
|
|
12
13
|
schedule?: TaskScheduleDefinition;
|
|
14
|
+
token?: string;
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
type EventType = {
|
|
@@ -32,10 +34,31 @@ type Broker = {
|
|
|
32
34
|
annotations?: Record<string, string>;
|
|
33
35
|
providedEventTypes?: string[];
|
|
34
36
|
};
|
|
37
|
+
type Subscribable = {
|
|
38
|
+
name: string;
|
|
39
|
+
namespace: string;
|
|
40
|
+
uid: string;
|
|
41
|
+
labels?: Record<string, string>;
|
|
42
|
+
annotations?: Record<string, string>;
|
|
43
|
+
group: string;
|
|
44
|
+
kind: string;
|
|
45
|
+
providedEventTypes?: string[];
|
|
46
|
+
};
|
|
47
|
+
type Source = {
|
|
48
|
+
name: string;
|
|
49
|
+
namespace: string;
|
|
50
|
+
uid: string;
|
|
51
|
+
labels?: Record<string, string>;
|
|
52
|
+
annotations?: Record<string, string>;
|
|
53
|
+
group: string;
|
|
54
|
+
kind: string;
|
|
55
|
+
providedEventTypes?: string[];
|
|
56
|
+
};
|
|
35
57
|
declare class KnativeEventMeshProvider implements EntityProvider {
|
|
36
58
|
private readonly env;
|
|
37
59
|
private readonly baseUrl;
|
|
38
60
|
private readonly logger;
|
|
61
|
+
private readonly token;
|
|
39
62
|
private readonly scheduleFn;
|
|
40
63
|
private connection?;
|
|
41
64
|
static fromConfig(configRoot: Config, options: {
|
|
@@ -51,16 +74,54 @@ declare class KnativeEventMeshProvider implements EntityProvider {
|
|
|
51
74
|
private buildEntities;
|
|
52
75
|
buildEventTypeEntity(eventType: EventType): ApiEntity;
|
|
53
76
|
buildBrokerEntity(broker: Broker): ComponentEntity;
|
|
77
|
+
buildSubscribableEntity(subscribable: Subscribable): {
|
|
78
|
+
apiVersion: string;
|
|
79
|
+
kind: string;
|
|
80
|
+
metadata: {
|
|
81
|
+
name: string;
|
|
82
|
+
namespace: string;
|
|
83
|
+
labels: Record<string, string>;
|
|
84
|
+
annotations: Record<string, string>;
|
|
85
|
+
tags: never[];
|
|
86
|
+
};
|
|
87
|
+
spec: {
|
|
88
|
+
type: string;
|
|
89
|
+
lifecycle: string;
|
|
90
|
+
system: string;
|
|
91
|
+
owner: string;
|
|
92
|
+
providesApis: string[];
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
buildSourceEntity(source: Source): {
|
|
96
|
+
apiVersion: string;
|
|
97
|
+
kind: string;
|
|
98
|
+
metadata: {
|
|
99
|
+
name: string;
|
|
100
|
+
namespace: string;
|
|
101
|
+
labels: Record<string, string>;
|
|
102
|
+
annotations: Record<string, string>;
|
|
103
|
+
tags: never[];
|
|
104
|
+
};
|
|
105
|
+
spec: {
|
|
106
|
+
type: string;
|
|
107
|
+
lifecycle: string;
|
|
108
|
+
system: string;
|
|
109
|
+
owner: string;
|
|
110
|
+
providesApis: string[];
|
|
111
|
+
};
|
|
112
|
+
};
|
|
54
113
|
}
|
|
55
114
|
|
|
56
115
|
declare class KnativeEventMeshProcessor implements CatalogProcessor {
|
|
57
116
|
private readonly catalogApi;
|
|
58
117
|
private readonly logger;
|
|
59
118
|
private readonly queryEntityPageLimit;
|
|
60
|
-
constructor(catalogApi:
|
|
119
|
+
constructor(catalogApi: CatalogApi, logger: Logger, queryEntityPageLimit?: number);
|
|
61
120
|
getProcessorName(): string;
|
|
62
121
|
preProcessEntity(entity: Entity, _location: LocationSpec, emit: CatalogProcessorEmit, _originLocation: LocationSpec, _cache: CatalogProcessorCache): Promise<Entity>;
|
|
63
122
|
private findComponentsByBackstageId;
|
|
64
123
|
}
|
|
65
124
|
|
|
66
|
-
|
|
125
|
+
declare const dynamicPluginInstaller: BackendDynamicPluginInstaller;
|
|
126
|
+
|
|
127
|
+
export { KnativeEventMeshProcessor, KnativeEventMeshProvider, dynamicPluginInstaller };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knative-extensions/plugin-knative-event-mesh-backend",
|
|
3
|
-
"version": "0.0.0-snapshot.
|
|
3
|
+
"version": "0.0.0-snapshot.faa3ef4",
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -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
|
}
|