@pagerduty/backstage-plugin-entity-processor 0.3.0-next.7 → 0.3.0-next.70
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/dist/index.cjs.js +460 -46
- package/dist/index.cjs.js.map +1 -1
- package/package.json +3 -2
package/dist/index.cjs.js
CHANGED
|
@@ -24,6 +24,95 @@ class PagerDutyClient {
|
|
|
24
24
|
this.discovery = discovery;
|
|
25
25
|
this.logger = logger;
|
|
26
26
|
}
|
|
27
|
+
async addServiceRelationToService(serviceId, relations) {
|
|
28
|
+
let response;
|
|
29
|
+
if (this.baseUrl === "") {
|
|
30
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
31
|
+
}
|
|
32
|
+
const options = {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
36
|
+
Accept: "application/json, text/plain, */*"
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(relations)
|
|
39
|
+
};
|
|
40
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
41
|
+
"pagerduty"
|
|
42
|
+
)}/dependencies/service/${serviceId}`;
|
|
43
|
+
try {
|
|
44
|
+
response = await fetch__default["default"](url, options);
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
throw new Error(await response.text());
|
|
47
|
+
}
|
|
48
|
+
this.logger.info(`Added dependencies to database.`);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
this.logger.error(`Failed to add dependencies: ${error}`);
|
|
51
|
+
throw new Error(`Failed to add dependencies: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async removeServiceRelationFromService(serviceId, relations) {
|
|
55
|
+
let response;
|
|
56
|
+
if (this.baseUrl === "") {
|
|
57
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
58
|
+
}
|
|
59
|
+
const options = {
|
|
60
|
+
method: "DELETE",
|
|
61
|
+
headers: {
|
|
62
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
63
|
+
Accept: "application/json, text/plain, */*"
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify(relations)
|
|
66
|
+
};
|
|
67
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
68
|
+
"pagerduty"
|
|
69
|
+
)}/dependencies/service/${serviceId}`;
|
|
70
|
+
try {
|
|
71
|
+
response = await fetch__default["default"](url, options);
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
throw new Error(await response.text());
|
|
74
|
+
}
|
|
75
|
+
this.logger.info(`Removed dependencies from database.`);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
this.logger.error(`Failed to remove dependencies: ${error}`);
|
|
78
|
+
throw new Error(`Failed to remove dependencies: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getAllServiceMappings() {
|
|
82
|
+
let response;
|
|
83
|
+
const mappings = {};
|
|
84
|
+
if (this.baseUrl === "") {
|
|
85
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
86
|
+
}
|
|
87
|
+
const options = {
|
|
88
|
+
method: "GET",
|
|
89
|
+
headers: {
|
|
90
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
91
|
+
Accept: "application/json, text/plain, */*"
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
95
|
+
"pagerduty"
|
|
96
|
+
)}/mapping/entity`;
|
|
97
|
+
try {
|
|
98
|
+
response = await fetch__default["default"](url, options);
|
|
99
|
+
const foundMappings = await response.json();
|
|
100
|
+
switch (response.status) {
|
|
101
|
+
case 400:
|
|
102
|
+
throw new Error(await response.text());
|
|
103
|
+
case 404:
|
|
104
|
+
return mappings;
|
|
105
|
+
default:
|
|
106
|
+
foundMappings.mappings.forEach((mapping) => {
|
|
107
|
+
mappings[mapping.serviceId] = mapping.entityRef;
|
|
108
|
+
});
|
|
109
|
+
return mappings;
|
|
110
|
+
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.logger.error(`Failed to retrieve mappings: ${error}`);
|
|
113
|
+
throw new Error(`Failed to retrieve mappings: ${error}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
27
116
|
async findServiceMapping({ type, namespace, name }) {
|
|
28
117
|
let response;
|
|
29
118
|
if (this.baseUrl === "") {
|
|
@@ -46,7 +135,7 @@ class PagerDutyClient {
|
|
|
46
135
|
case 400:
|
|
47
136
|
throw new Error(await response.text());
|
|
48
137
|
case 404:
|
|
49
|
-
return
|
|
138
|
+
return void 0;
|
|
50
139
|
default:
|
|
51
140
|
this.logger.debug(`Found mapping for ${type}:${namespace}/${name}: ${JSON.stringify(foundMapping.mapping)}`);
|
|
52
141
|
return {
|
|
@@ -61,6 +150,71 @@ class PagerDutyClient {
|
|
|
61
150
|
throw new Error(`Failed to retrieve mapping for ${type}:${namespace}/${name}: ${error}`);
|
|
62
151
|
}
|
|
63
152
|
}
|
|
153
|
+
async findServiceMappingById(serviceId) {
|
|
154
|
+
let response;
|
|
155
|
+
if (this.baseUrl === "") {
|
|
156
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
157
|
+
}
|
|
158
|
+
const options = {
|
|
159
|
+
method: "GET",
|
|
160
|
+
headers: {
|
|
161
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
162
|
+
Accept: "application/json, text/plain, */*"
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
166
|
+
"pagerduty"
|
|
167
|
+
)}/mapping/entity/service/${serviceId}`;
|
|
168
|
+
try {
|
|
169
|
+
response = await fetch__default["default"](url, options);
|
|
170
|
+
const foundMapping = await response.json();
|
|
171
|
+
switch (response.status) {
|
|
172
|
+
case 400:
|
|
173
|
+
throw new Error(await response.text());
|
|
174
|
+
case 404:
|
|
175
|
+
return void 0;
|
|
176
|
+
default:
|
|
177
|
+
this.logger.debug(`Found mapping for serviceId ${serviceId}: ${JSON.stringify(foundMapping.mapping)}`);
|
|
178
|
+
return {
|
|
179
|
+
serviceId: foundMapping.mapping.serviceId,
|
|
180
|
+
integrationKey: foundMapping.mapping.integrationKey,
|
|
181
|
+
entityRef: foundMapping.mapping.entityRef,
|
|
182
|
+
account: foundMapping.mapping.account
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
} catch (error) {
|
|
186
|
+
this.logger.error(`Failed to retrieve mapping for serviceId ${serviceId}: ${error}`);
|
|
187
|
+
throw new Error(`Failed to retrieve mapping for serviceId ${serviceId}: ${error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async insertServiceMapping(mapping) {
|
|
191
|
+
let response;
|
|
192
|
+
if (this.baseUrl === "") {
|
|
193
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
194
|
+
}
|
|
195
|
+
this.logger.info(`Adding mapping for ${mapping.entityRef} to database with payload: ${JSON.stringify(mapping)}`);
|
|
196
|
+
const options = {
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers: {
|
|
199
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
200
|
+
Accept: "application/json, text/plain, */*"
|
|
201
|
+
},
|
|
202
|
+
body: JSON.stringify(mapping)
|
|
203
|
+
};
|
|
204
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
205
|
+
"pagerduty"
|
|
206
|
+
)}/mapping/entity`;
|
|
207
|
+
try {
|
|
208
|
+
response = await fetch__default["default"](url, options);
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
throw new Error(await response.text());
|
|
211
|
+
}
|
|
212
|
+
this.logger.info(`Mapping for ${mapping.entityRef} added to database.`);
|
|
213
|
+
} catch (error) {
|
|
214
|
+
this.logger.error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);
|
|
215
|
+
throw new Error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
64
218
|
async getServiceDependencies(serviceId, account) {
|
|
65
219
|
let response;
|
|
66
220
|
if (this.baseUrl === "") {
|
|
@@ -88,7 +242,7 @@ class PagerDutyClient {
|
|
|
88
242
|
case 404:
|
|
89
243
|
return [];
|
|
90
244
|
default:
|
|
91
|
-
this.logger.info(`Found
|
|
245
|
+
this.logger.info(`Found dependencies for ${serviceId}: ${JSON.stringify(foundDependencies.relationships)}`);
|
|
92
246
|
return foundDependencies.relationships;
|
|
93
247
|
}
|
|
94
248
|
} catch (error) {
|
|
@@ -130,6 +284,118 @@ class PagerDutyClient {
|
|
|
130
284
|
throw new Error(`Failed to retrieve a PagerDuty service id for ${entityRef}: ${error}`);
|
|
131
285
|
}
|
|
132
286
|
}
|
|
287
|
+
async getServiceIdFromIntegrationKey(integrationKey, account) {
|
|
288
|
+
let response;
|
|
289
|
+
if (this.baseUrl === "") {
|
|
290
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
291
|
+
}
|
|
292
|
+
const options = {
|
|
293
|
+
method: "GET",
|
|
294
|
+
headers: {
|
|
295
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
296
|
+
Accept: "application/json, text/plain, */*"
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
let url = `${await this.discovery.getBaseUrl(
|
|
300
|
+
"pagerduty"
|
|
301
|
+
)}/services?integration_key=${integrationKey}`;
|
|
302
|
+
if (account) {
|
|
303
|
+
url = url.concat(`&account=${account}`);
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
response = await fetch__default["default"](url, options);
|
|
307
|
+
const foundService = await response.json();
|
|
308
|
+
switch (response.status) {
|
|
309
|
+
case 400:
|
|
310
|
+
throw new Error(await response.text());
|
|
311
|
+
case 404:
|
|
312
|
+
return "";
|
|
313
|
+
default:
|
|
314
|
+
this.logger.info(`Found service id ${foundService.service.id} from integration key ${integrationKey}`);
|
|
315
|
+
return foundService.service.id;
|
|
316
|
+
}
|
|
317
|
+
} catch (error) {
|
|
318
|
+
this.logger.error(`Failed to retrieve a PagerDuty service id for integration key ${integrationKey}: ${error}`);
|
|
319
|
+
throw new Error(`Failed to retrieve a PagerDuty service id for integration key ${integrationKey}: ${error}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async getIntegrationKeyFromServiceId(serviceId, account) {
|
|
323
|
+
var _a;
|
|
324
|
+
let response;
|
|
325
|
+
if (this.baseUrl === "") {
|
|
326
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
327
|
+
}
|
|
328
|
+
const options = {
|
|
329
|
+
method: "GET",
|
|
330
|
+
headers: {
|
|
331
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
332
|
+
Accept: "application/json, text/plain, */*"
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
let url = `${await this.discovery.getBaseUrl(
|
|
336
|
+
"pagerduty"
|
|
337
|
+
)}/services/${serviceId}`;
|
|
338
|
+
if (account) {
|
|
339
|
+
url = url.concat(`?account=${account}`);
|
|
340
|
+
}
|
|
341
|
+
try {
|
|
342
|
+
response = await fetch__default["default"](url, options);
|
|
343
|
+
const foundService = await response.json();
|
|
344
|
+
const backstageIntegration = (_a = foundService.service.integrations) == null ? void 0 : _a.find((integration) => {
|
|
345
|
+
var _a2;
|
|
346
|
+
return ((_a2 = integration.vendor) == null ? void 0 : _a2.id) === "PRO19CT";
|
|
347
|
+
});
|
|
348
|
+
switch (response.status) {
|
|
349
|
+
case 400:
|
|
350
|
+
throw new Error(await response.text());
|
|
351
|
+
case 404:
|
|
352
|
+
return "";
|
|
353
|
+
default:
|
|
354
|
+
if (!backstageIntegration) {
|
|
355
|
+
this.logger.info(`No Backstage integration found in service ${foundService.service.id}`);
|
|
356
|
+
return void 0;
|
|
357
|
+
}
|
|
358
|
+
this.logger.info(`Found Backstage integration in service ${foundService.service.id}`);
|
|
359
|
+
return backstageIntegration.integration_key;
|
|
360
|
+
}
|
|
361
|
+
} catch (error) {
|
|
362
|
+
this.logger.error(`No Backstage integration found for service id ${serviceId}: ${error}`);
|
|
363
|
+
throw new Error(`No Backstage integration found for service id ${serviceId}: ${error}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
async getServiceDependencyStrategySetting() {
|
|
367
|
+
const SERVICE_DEPENDENCY_SYNC_STRATEGY = "settings::service-dependency-sync-strategy";
|
|
368
|
+
let response;
|
|
369
|
+
if (this.baseUrl === "") {
|
|
370
|
+
this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
|
|
371
|
+
}
|
|
372
|
+
const options = {
|
|
373
|
+
method: "GET",
|
|
374
|
+
headers: {
|
|
375
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
376
|
+
Accept: "application/json, text/plain, */*"
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const url = `${await this.discovery.getBaseUrl(
|
|
380
|
+
"pagerduty"
|
|
381
|
+
)}/settings/${SERVICE_DEPENDENCY_SYNC_STRATEGY}`;
|
|
382
|
+
try {
|
|
383
|
+
response = await fetch__default["default"](url, options);
|
|
384
|
+
const setting = await response.json();
|
|
385
|
+
switch (response.status) {
|
|
386
|
+
case 400:
|
|
387
|
+
throw new Error(await response.text());
|
|
388
|
+
case 404:
|
|
389
|
+
return "disabled";
|
|
390
|
+
default:
|
|
391
|
+
this.logger.info(`Found setting for ${SERVICE_DEPENDENCY_SYNC_STRATEGY}: ${setting.value}`);
|
|
392
|
+
return setting.value;
|
|
393
|
+
}
|
|
394
|
+
} catch (error) {
|
|
395
|
+
this.logger.error(`Error getting value for setting: ${error}`);
|
|
396
|
+
throw new Error(`Error getting value for setting: ${error}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
133
399
|
}
|
|
134
400
|
|
|
135
401
|
var __defProp = Object.defineProperty;
|
|
@@ -153,8 +419,8 @@ class PagerDutyEntityProcessor {
|
|
|
153
419
|
getProcessorName() {
|
|
154
420
|
return "PagerDutyEntityProcessor";
|
|
155
421
|
}
|
|
156
|
-
async postProcessEntity(entity) {
|
|
157
|
-
var _a, _b, _c;
|
|
422
|
+
async postProcessEntity(entity, _location, emit) {
|
|
423
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
158
424
|
if (this.shouldProcessEntity(entity)) {
|
|
159
425
|
try {
|
|
160
426
|
const mapping = await client.findServiceMapping({
|
|
@@ -162,63 +428,211 @@ class PagerDutyEntityProcessor {
|
|
|
162
428
|
namespace: entity.metadata.namespace.toLowerCase(),
|
|
163
429
|
name: entity.metadata.name.toLowerCase()
|
|
164
430
|
});
|
|
165
|
-
if (mapping
|
|
166
|
-
|
|
167
|
-
entity
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
delete entity.metadata.annotations["pagerduty.com/integration-key"];
|
|
175
|
-
}
|
|
176
|
-
if (mapping.account && mapping.account !== "") {
|
|
177
|
-
entity.metadata.annotations["pagerduty.com/account"] = mapping.account;
|
|
178
|
-
} else {
|
|
179
|
-
delete entity.metadata.annotations["pagerduty.com/account"];
|
|
180
|
-
}
|
|
431
|
+
if (mapping) {
|
|
432
|
+
updateAnnotations(
|
|
433
|
+
entity,
|
|
434
|
+
{
|
|
435
|
+
serviceId: mapping.serviceId,
|
|
436
|
+
integrationKey: mapping.integrationKey,
|
|
437
|
+
account: mapping.account
|
|
438
|
+
}
|
|
439
|
+
);
|
|
181
440
|
this.logger.debug(`Added annotations to entity ${entity.metadata.name} with service id: ${mapping.serviceId}, integration key: ${mapping.integrationKey} and account: ${mapping.account}`);
|
|
182
441
|
} else {
|
|
183
|
-
this.logger.debug(`No mapping found for entity: ${entity.metadata.name}
|
|
442
|
+
this.logger.debug(`No mapping found for entity: ${entity.metadata.name}. Adding annotations to the database.`);
|
|
443
|
+
let serviceId2 = (_a = entity.metadata.annotations) == null ? void 0 : _a["pagerduty.com/service-id"];
|
|
444
|
+
let integrationKey = (_b = entity.metadata.annotations) == null ? void 0 : _b["pagerduty.com/integration-key"];
|
|
445
|
+
const account = (_c = entity.metadata.annotations) == null ? void 0 : _c["pagerduty.com/account"];
|
|
446
|
+
const entityRef = `${entity.kind.toLowerCase()}:${(_d = entity.metadata.namespace) == null ? void 0 : _d.toLowerCase()}/${entity.metadata.name.toLowerCase()}`;
|
|
447
|
+
if (serviceId2) {
|
|
448
|
+
const serviceMappingOverrideFound = await client.findServiceMappingById(serviceId2);
|
|
449
|
+
if (!serviceMappingOverrideFound) {
|
|
450
|
+
if (!integrationKey) {
|
|
451
|
+
const foundIntegrationKey = await client.getIntegrationKeyFromServiceId(serviceId2, account);
|
|
452
|
+
if (foundIntegrationKey) {
|
|
453
|
+
integrationKey = foundIntegrationKey;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
this.logger.debug(`Inserting mapping for entity: ${entityRef} with service id: ${serviceId2}, integration key: ${integrationKey} and account: ${account}`);
|
|
457
|
+
await client.insertServiceMapping({
|
|
458
|
+
entityRef,
|
|
459
|
+
serviceId: serviceId2,
|
|
460
|
+
integrationKey,
|
|
461
|
+
account
|
|
462
|
+
});
|
|
463
|
+
updateAnnotations(
|
|
464
|
+
entity,
|
|
465
|
+
{
|
|
466
|
+
serviceId: serviceId2,
|
|
467
|
+
integrationKey,
|
|
468
|
+
account
|
|
469
|
+
}
|
|
470
|
+
);
|
|
471
|
+
} else {
|
|
472
|
+
this.logger.debug(`Service mapping override found for service id: ${serviceId2}.`);
|
|
473
|
+
updateAnnotations(entity, {});
|
|
474
|
+
}
|
|
475
|
+
} else if (integrationKey) {
|
|
476
|
+
serviceId2 = await client.getServiceIdFromIntegrationKey(integrationKey, account);
|
|
477
|
+
const serviceMappingOverrideFound = await client.findServiceMappingById(serviceId2);
|
|
478
|
+
if (!serviceMappingOverrideFound) {
|
|
479
|
+
this.logger.debug(`Inserting mapping for entity: ${entityRef} with new service id: ${serviceId2}, integration key: ${integrationKey} and account: ${account}`);
|
|
480
|
+
await client.insertServiceMapping({
|
|
481
|
+
entityRef,
|
|
482
|
+
serviceId: serviceId2,
|
|
483
|
+
integrationKey,
|
|
484
|
+
account
|
|
485
|
+
});
|
|
486
|
+
updateAnnotations(
|
|
487
|
+
entity,
|
|
488
|
+
{
|
|
489
|
+
serviceId: serviceId2,
|
|
490
|
+
integrationKey,
|
|
491
|
+
account
|
|
492
|
+
}
|
|
493
|
+
);
|
|
494
|
+
} else {
|
|
495
|
+
this.logger.debug(`Service mapping override found for service id: ${serviceId2}. Skipping adding to the database.`);
|
|
496
|
+
updateAnnotations(entity, {});
|
|
497
|
+
}
|
|
498
|
+
}
|
|
184
499
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
500
|
+
const serviceId = (_e = entity.metadata.annotations) == null ? void 0 : _e["pagerduty.com/service-id"];
|
|
501
|
+
if (serviceId) {
|
|
502
|
+
const strategySetting = await client.getServiceDependencyStrategySetting();
|
|
503
|
+
if (strategySetting && strategySetting !== "disabled") {
|
|
504
|
+
let dependencyAnnotations = [];
|
|
505
|
+
if ((_f = entity.spec) == null ? void 0 : _f.dependsOn) {
|
|
506
|
+
dependencyAnnotations = JSON.parse(JSON.stringify((_g = entity.spec) == null ? void 0 : _g.dependsOn));
|
|
507
|
+
}
|
|
508
|
+
this.logger.info(`Existing dependencies on entity ${entity.metadata.name}: ${JSON.stringify(dependencyAnnotations)}`);
|
|
509
|
+
const newDependencyList = [];
|
|
510
|
+
const mappings = await client.getAllServiceMappings();
|
|
511
|
+
const entityDependencies = await buildExistingDependencies(dependencyAnnotations);
|
|
512
|
+
this.logger.info(`Dependencies from Annotations in ${serviceId}: ${JSON.stringify(entityDependencies)}`);
|
|
513
|
+
const account = (_h = entity.metadata.annotations) == null ? void 0 : _h["pagerduty.com/account"];
|
|
192
514
|
const dependencies = await client.getServiceDependencies(serviceId, account);
|
|
193
|
-
|
|
194
|
-
const
|
|
195
|
-
this.logger.info(`
|
|
196
|
-
|
|
197
|
-
|
|
515
|
+
const filteredDependencies = dependencies.length > 0 ? dependencies.filter((x) => x.dependent_service.id === serviceId) : [];
|
|
516
|
+
const dependencyIds = filteredDependencies.length > 0 ? filteredDependencies.map((x) => x.supporting_service.id) : [];
|
|
517
|
+
this.logger.info(`Filtered dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(filteredDependencies)}`);
|
|
518
|
+
this.logger.info(`Dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(dependencyIds)}`);
|
|
519
|
+
const dependenciesMissingInBackstage = dependencyIds.length > 0 ? dependencyIds.filter((x) => !entityDependencies.includes(x)) : [];
|
|
520
|
+
this.logger.info(`Dependencies missing in Backstage: ${JSON.stringify(dependenciesMissingInBackstage)}`);
|
|
521
|
+
const dependenciesMissingInPagerDuty = entityDependencies.length > 0 ? entityDependencies.filter((x) => !dependencyIds.includes(x)) : [];
|
|
522
|
+
this.logger.info(`Dependencies missing in PagerDuty: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);
|
|
523
|
+
switch (strategySetting) {
|
|
524
|
+
case "backstage":
|
|
525
|
+
if (dependenciesMissingInPagerDuty.length > 0) {
|
|
526
|
+
this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);
|
|
527
|
+
await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);
|
|
528
|
+
}
|
|
529
|
+
if (dependenciesMissingInBackstage.length > 0) {
|
|
530
|
+
this.logger.info(`Removing dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
|
|
531
|
+
await client.removeServiceRelationFromService(serviceId, dependenciesMissingInBackstage);
|
|
532
|
+
}
|
|
533
|
+
break;
|
|
534
|
+
case "pagerduty":
|
|
535
|
+
this.logger.info(`Updating dependencies on Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
|
|
536
|
+
entity.spec.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);
|
|
537
|
+
this.logger.info(`Updated dependencies for service: ${serviceId}. New dependencies: ${JSON.stringify(newDependencyList)}`);
|
|
538
|
+
break;
|
|
539
|
+
case "both":
|
|
540
|
+
this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)} and Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
|
|
541
|
+
if (dependenciesMissingInPagerDuty.length > 0) {
|
|
542
|
+
await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);
|
|
543
|
+
}
|
|
544
|
+
entity.spec.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);
|
|
545
|
+
break;
|
|
546
|
+
default:
|
|
547
|
+
this.logger.info(`Strategy not defined or set to disabled.`);
|
|
548
|
+
break;
|
|
198
549
|
}
|
|
199
550
|
}
|
|
200
|
-
} else {
|
|
201
|
-
this.logger.info(`No dependencies found for entity: ${entity.metadata.name}`);
|
|
202
|
-
}
|
|
203
|
-
if ((_c = entity.spec) == null ? void 0 : _c.dependencyOf) {
|
|
204
|
-
this.logger.info(`Processing dependents for entity: ${entity.metadata.name}. Dependents: ${JSON.stringify(entity.spec.dependencyOf)}`);
|
|
205
551
|
}
|
|
206
552
|
} catch (error) {
|
|
207
|
-
this.logger.error(`Error processing entity
|
|
208
|
-
this.logger.error(`${error}`);
|
|
553
|
+
this.logger.error(`Error processing entity ${entity.metadata.name}: ${error}`);
|
|
209
554
|
}
|
|
210
555
|
}
|
|
211
556
|
return entity;
|
|
212
557
|
}
|
|
213
558
|
}
|
|
214
|
-
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
if (
|
|
219
|
-
|
|
559
|
+
function addServiceDependencyAnnotations(entity, mappingsDic, dependencies, emit) {
|
|
560
|
+
const dependencyList = [];
|
|
561
|
+
dependencies.forEach((dependencyId) => {
|
|
562
|
+
const foundEntityRef = mappingsDic[dependencyId];
|
|
563
|
+
if (foundEntityRef) {
|
|
564
|
+
dependencyList.push(foundEntityRef);
|
|
565
|
+
const entityRefParts = foundEntityRef.split(":");
|
|
566
|
+
const kind = entityRefParts[0];
|
|
567
|
+
const namespaceName = entityRefParts[1].split("/");
|
|
568
|
+
const namespace = namespaceName[0];
|
|
569
|
+
const name = namespaceName[1];
|
|
570
|
+
emit({
|
|
571
|
+
relation: {
|
|
572
|
+
source: {
|
|
573
|
+
kind: entity.kind,
|
|
574
|
+
namespace: entity.metadata.namespace,
|
|
575
|
+
name: entity.metadata.name
|
|
576
|
+
},
|
|
577
|
+
target: {
|
|
578
|
+
kind,
|
|
579
|
+
namespace,
|
|
580
|
+
name
|
|
581
|
+
},
|
|
582
|
+
type: "dependsOn"
|
|
583
|
+
},
|
|
584
|
+
type: "relation"
|
|
585
|
+
});
|
|
586
|
+
emit({
|
|
587
|
+
relation: {
|
|
588
|
+
source: {
|
|
589
|
+
kind,
|
|
590
|
+
namespace,
|
|
591
|
+
name
|
|
592
|
+
},
|
|
593
|
+
target: {
|
|
594
|
+
kind: entity.kind,
|
|
595
|
+
namespace: entity.metadata.namespace,
|
|
596
|
+
name: entity.metadata.name
|
|
597
|
+
},
|
|
598
|
+
type: "dependencyOf"
|
|
599
|
+
},
|
|
600
|
+
type: "relation"
|
|
601
|
+
});
|
|
220
602
|
}
|
|
221
603
|
});
|
|
604
|
+
return dependencyList;
|
|
605
|
+
}
|
|
606
|
+
function updateAnnotations(entity, annotations) {
|
|
607
|
+
if (annotations.serviceId && annotations.serviceId !== "") {
|
|
608
|
+
entity.metadata.annotations["pagerduty.com/service-id"] = annotations.serviceId;
|
|
609
|
+
} else {
|
|
610
|
+
delete entity.metadata.annotations["pagerduty.com/service-id"];
|
|
611
|
+
}
|
|
612
|
+
if (annotations.integrationKey && annotations.integrationKey !== "") {
|
|
613
|
+
entity.metadata.annotations["pagerduty.com/integration-key"] = annotations.integrationKey;
|
|
614
|
+
} else {
|
|
615
|
+
delete entity.metadata.annotations["pagerduty.com/integration-key"];
|
|
616
|
+
}
|
|
617
|
+
if (annotations.account && annotations.account !== "") {
|
|
618
|
+
entity.metadata.annotations["pagerduty.com/account"] = annotations.account;
|
|
619
|
+
} else {
|
|
620
|
+
delete entity.metadata.annotations["pagerduty.com/account"];
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
async function buildExistingDependencies(dependencyAnnotations) {
|
|
624
|
+
const dependencies = [];
|
|
625
|
+
if (dependencyAnnotations.length > 0) {
|
|
626
|
+
await Promise.all(
|
|
627
|
+
dependencyAnnotations.map(async (dependency) => {
|
|
628
|
+
const foundServiceId = await client.getServiceIdAnnotationFromCatalog(dependency);
|
|
629
|
+
console.log(`Found service id for ${dependency}: ${foundServiceId}`);
|
|
630
|
+
if (foundServiceId !== "") {
|
|
631
|
+
dependencies.push(foundServiceId);
|
|
632
|
+
}
|
|
633
|
+
})
|
|
634
|
+
);
|
|
635
|
+
}
|
|
222
636
|
return dependencies;
|
|
223
637
|
}
|
|
224
638
|
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/apis/client.ts","../src/processor/PagerDutyEntityProcessor.ts","../src/module.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\nimport type { EntityMapping } from '../types';\nimport { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api';\nimport { PagerDutyEntityMappingResponse, PagerDutyServiceDependency, PagerDutyServiceDependencyResponse } from '@pagerduty/backstage-plugin-common';\n\nexport interface PagerDutyClientOptions {\n discovery: DiscoveryService;\n logger: LoggerService;\n};\n\nexport type BackstageEntityRef = {\n type: string;\n namespace: string;\n name: string;\n}\n\nexport class PagerDutyClient {\n private discovery: DiscoveryService;\n private logger: LoggerService;\n private baseUrl: string = \"\";\n \n constructor({ discovery, logger }: PagerDutyClientOptions) {\n this.discovery = discovery;\n this.logger = logger;\n }\n\n async findServiceMapping({ type, namespace, name }: BackstageEntityRef): Promise<EntityMapping> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity/${type}/${namespace}/${name}`;\n\n try {\n response = await fetch(url, options);\n\n const foundMapping: PagerDutyEntityMappingResponse = await response.json(); \n\n switch (response.status) {\n case 400: \n throw new Error(await response.text());\n case 404:\n return {};\n default: // 200\n this.logger.debug(`Found mapping for ${type}:${namespace}/${name}: ${JSON.stringify(foundMapping.mapping)}`);\n\n return {\n serviceId: foundMapping.mapping.serviceId,\n integrationKey: foundMapping.mapping.integrationKey,\n entityRef: foundMapping.mapping.entityRef,\n account: foundMapping.mapping.account,\n }\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mapping for ${type}:${namespace}/${name}: ${error}`);\n throw new Error(`Failed to retrieve mapping for ${type}:${namespace}/${name}: ${error}`);\n }\n }\n\n async getServiceDependencies(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n let url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/dependencies/service/${serviceId}`;\n\n if (account) {\n url = url.concat(`?account=${account}`);\n }\n\n try {\n response = await fetch(url, options);\n\n const foundDependencies: PagerDutyServiceDependencyResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return [];\n default: // 200\n this.logger.info(`Found mapping for ${serviceId}: ${JSON.stringify(foundDependencies.relationships)}`);\n\n return foundDependencies.relationships;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mapping for ${serviceId}: ${error}`);\n throw new Error(`Failed to retrieve mapping for ${serviceId}: ${error}`);\n }\n }\n\n async getServiceIdAnnotationFromCatalog(entityRef: string): Promise<string> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n // extract type, namespace and name from type:namespace/name\n const [type, rest] = entityRef.split(':');\n const [namespace, name] = rest.split('/');\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/catalog/entity/${type}/${namespace}/${name}`;\n\n try {\n response = await fetch(url, options);\n\n const foundServiceId: string = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return \"\";\n default: // 200\n this.logger.info(`Found serviceId for ${entityRef}: ${JSON.stringify(foundServiceId)}`);\n\n return foundServiceId;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve a PagerDuty service id for ${entityRef}: ${error}`);\n throw new Error(`Failed to retrieve a PagerDuty service id for ${entityRef}: ${error}`);\n }\n }\n\n}","import { DiscoveryService, LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Entity } from \"@backstage/catalog-model\";\nimport { CatalogProcessor } from \"@backstage/plugin-catalog-node\";\nimport { PagerDutyClient } from \"../apis/client\";\n\n/**\n * A function which given an entity, determines if it should be processed for linguist tags.\n * @public\n */\nexport type ShouldProcessEntity = (entity: Entity) => boolean;\n\nexport interface PagerDutyEntityProcessorOptions {\n logger: LoggerService;\n discovery: DiscoveryService;\n};\n\nlet client : PagerDutyClient;\n\nexport class PagerDutyEntityProcessor implements CatalogProcessor {\n private logger: LoggerService;\n private discovery: DiscoveryService;\n\n private shouldProcessEntity: ShouldProcessEntity = (entity: Entity) => {\n return entity.kind === 'Component';\n }\n\n constructor({ logger, discovery }: PagerDutyEntityProcessorOptions) {\n this.logger = logger;\n this.discovery = discovery;\n\n client = new PagerDutyClient({ discovery: this.discovery, logger: this.logger });\n }\n\n getProcessorName(): string {\n return \"PagerDutyEntityProcessor\";\n }\n\n async postProcessEntity(entity: Entity): Promise<Entity> {\n if (this.shouldProcessEntity(entity)) {\n try {\n // Process service mapping overrides\n // Find the service mapping for the entity in database\n const mapping = await client.findServiceMapping({\n type: entity.kind.toLowerCase(),\n namespace: entity.metadata.namespace!.toLowerCase(),\n name: entity.metadata.name.toLowerCase(),\n });\n\n // If mapping exists add the annotations to the entity\n if (mapping.serviceId) { \n \n // If serviceId is present, add the annotations to the entity\n if (mapping.serviceId && mapping.serviceId !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/service-id\"] = mapping.serviceId;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/service-id\"];\n }\n\n // If integrationKey is present, add the annotations to the entity\n if (mapping.integrationKey && mapping.integrationKey !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/integration-key\"] = mapping.integrationKey;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/integration-key\"];\n }\n\n // If account is present, add the annotations to the entity\n if (mapping.account && mapping.account !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/account\"] = mapping.account;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/account\"];\n }\n\n this.logger.debug(`Added annotations to entity ${entity.metadata.name} with service id: ${mapping.serviceId}, integration key: ${mapping.integrationKey} and account: ${mapping.account}`);\n } else {\n this.logger.debug(`No mapping found for entity: ${entity.metadata.name}`);\n }\n\n // Process service dependencies\n if(entity.spec?.dependsOn){\n // Check if ServiceId exists get service dependencies from PagerDuty \n const serviceId = entity.metadata.annotations![\"pagerduty.com/service-id\"];\n\n // Check if service has dependencies configured\n const dependencyAnnotations: string[] = JSON.parse(JSON.stringify(entity.spec?.dependsOn));\n this.logger.info(`Existing dependencies for entity: ${entity.metadata.name}. Dependencies: ${JSON.stringify(dependencyAnnotations)}`);\n\n if (serviceId && dependencyAnnotations?.length > 0) {\n const existingDependencies: string[] = await buildExistingDependencies(dependencyAnnotations);\n\n // Get dependencies from PagerDuty for the service\n const account = entity.metadata.annotations![\"pagerduty.com/account\"];\n const dependencies = await client.getServiceDependencies(serviceId, account);\n\n this.logger.info(`Dependencies from PagerDuty service: ${serviceId}. Dependencies: ${JSON.stringify(dependencies)}`);\n\n // compare dependencies with existing dependencies defined on the entity\n const newDependencies = dependencies.filter((dependency) => !existingDependencies.includes(dependency.dependent_service.id) && dependency.dependent_service.id !== serviceId);\n this.logger.info(`Updated dependencies for service: ${serviceId}. New dependencies: ${JSON.stringify(newDependencies)}`);\n\n // Update dependencies on PagerDuty\n if (newDependencies.length > 0){\n // await client.updateServiceDependencies(serviceId, newDependencies);\n this.logger.info(`Updated dependencies for service: ${serviceId}. New dependencies: ${JSON.stringify(newDependencies)}`);\n }\n }\n }\n else {\n this.logger.info(`No dependencies found for entity: ${entity.metadata.name}`);\n }\n\n if(entity.spec?.dependencyOf){\n this.logger.info(`Processing dependents for entity: ${entity.metadata.name}. Dependents: ${JSON.stringify(entity.spec.dependencyOf)}`);\n }\n\n } catch (error) {\n this.logger.error(`Error processing entity: ${entity.metadata.name}`);\n this.logger.error(`${error}`);\n }\n }\n\n return entity;\n }\n}\n\nasync function buildExistingDependencies(dependencyAnnotations: string[]): Promise<string[]> {\n const dependencies: string[] = [];\n\n // Get all service ids matching the dependency annotations\n dependencyAnnotations.map(async (dependency) => {\n const foundServiceId = await client.getServiceIdAnnotationFromCatalog(dependency);\n\n if (foundServiceId !== \"\") {\n dependencies.push(foundServiceId);\n }\n });\n\n return dependencies;\n\n}","import { coreServices, createBackendModule } from \"@backstage/backend-plugin-api\";\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { PagerDutyEntityProcessor } from \"./processor\";\n\n/** @public */\nexport const pagerDutyEntityProcessor = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'pagerduty-entity-processor',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n catalog: catalogProcessingExtensionPoint,\n discovery: coreServices.discovery,\n },\n async init({ logger, discovery, catalog }) {\n catalog.addProcessor(new PagerDutyEntityProcessor({ logger, discovery}));\n },\n });\n },\n});\n"],"names":["__publicField","fetch","createBackendModule","coreServices","catalogProcessingExtensionPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/apis/client.ts","../src/processor/PagerDutyEntityProcessor.ts","../src/module.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport type {\n RequestInit,\n Response\n} from 'node-fetch';\nimport type { EntityMapping } from '../types';\nimport {\n DiscoveryService,\n LoggerService\n} from '@backstage/backend-plugin-api';\nimport {\n PagerDutyEntityMapping,\n PagerDutyEntityMappingResponse,\n PagerDutyServiceResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n PagerDutySetting,\n PagerDutyEntityMappingsResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nexport interface PagerDutyClientOptions {\n discovery: DiscoveryService;\n logger: LoggerService;\n};\n\nexport type BackstageEntityRef = {\n type: string;\n namespace: string;\n name: string;\n}\n\nexport class PagerDutyClient {\n private discovery: DiscoveryService;\n private logger: LoggerService;\n private baseUrl: string = \"\";\n\n constructor({ discovery, logger }: PagerDutyClientOptions) {\n this.discovery = discovery;\n this.logger = logger;\n }\n\n async addServiceRelationToService(serviceId: string, relations: string[]) : Promise<void> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body: JSON.stringify(relations),\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/dependencies/service/${serviceId}`;\n\n try {\n response = await fetch(url, options);\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\n\n this.logger.info(`Added dependencies to database.`);\n } catch (error) {\n this.logger.error(`Failed to add dependencies: ${error}`);\n throw new Error(`Failed to add dependencies: ${error}`);\n }\n }\n\n async removeServiceRelationFromService(serviceId: string, relations: string[]): Promise<void> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body: JSON.stringify(relations),\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/dependencies/service/${serviceId}`;\n\n try {\n response = await fetch(url, options);\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\n\n this.logger.info(`Removed dependencies from database.`);\n } catch (error) {\n this.logger.error(`Failed to remove dependencies: ${error}`);\n throw new Error(`Failed to remove dependencies: ${error}`);\n }\n }\n\n async getAllServiceMappings(): Promise<Record<string, string>> {\n let response: Response;\n const mappings: Record<string, string> = {};\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n try {\n response = await fetch(url, options);\n\n const foundMappings: PagerDutyEntityMappingsResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return mappings;\n default: // 200\n foundMappings.mappings.forEach(mapping => {\n mappings[mapping.serviceId] = mapping.entityRef;\n });\n\n return mappings;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mappings: ${error}`);\n throw new Error(`Failed to retrieve mappings: ${error}`);\n }\n }\n\n async findServiceMapping({ type, namespace, name }: BackstageEntityRef): Promise<EntityMapping | undefined> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity/${type}/${namespace}/${name}`;\n\n try {\n response = await fetch(url, options);\n\n const foundMapping: PagerDutyEntityMappingResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return undefined;\n default: // 200\n this.logger.debug(`Found mapping for ${type}:${namespace}/${name}: ${JSON.stringify(foundMapping.mapping)}`);\n\n return {\n serviceId: foundMapping.mapping.serviceId,\n integrationKey: foundMapping.mapping.integrationKey,\n entityRef: foundMapping.mapping.entityRef,\n account: foundMapping.mapping.account,\n }\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mapping for ${type}:${namespace}/${name}: ${error}`);\n throw new Error(`Failed to retrieve mapping for ${type}:${namespace}/${name}: ${error}`);\n }\n }\n\n async findServiceMappingById(serviceId: string): Promise<EntityMapping | undefined> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity/service/${serviceId}`;\n\n try {\n response = await fetch(url, options);\n\n const foundMapping: PagerDutyEntityMappingResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return undefined;\n default: // 200\n this.logger.debug(`Found mapping for serviceId ${serviceId}: ${JSON.stringify(foundMapping.mapping)}`);\n\n return {\n serviceId: foundMapping.mapping.serviceId,\n integrationKey: foundMapping.mapping.integrationKey,\n entityRef: foundMapping.mapping.entityRef,\n account: foundMapping.mapping.account,\n };\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mapping for serviceId ${serviceId}: ${error}`);\n throw new Error(`Failed to retrieve mapping for serviceId ${serviceId}: ${error}`);\n }\n }\n\n async insertServiceMapping(mapping: PagerDutyEntityMapping): Promise<void> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n this.logger.info(`Adding mapping for ${mapping.entityRef} to database with payload: ${JSON.stringify(mapping)}`);\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body: JSON.stringify(mapping),\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n try {\n response = await fetch(url, options);\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\n\n this.logger.info(`Mapping for ${mapping.entityRef} added to database.`);\n } catch (error) {\n this.logger.error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);\n throw new Error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);\n }\n }\n\n async getServiceDependencies(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n let url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/dependencies/service/${serviceId}`;\n\n if (account) {\n url = url.concat(`?account=${account}`);\n }\n\n try {\n response = await fetch(url, options);\n\n const foundDependencies: PagerDutyServiceDependencyResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return [];\n default: // 200\n this.logger.info(`Found dependencies for ${serviceId}: ${JSON.stringify(foundDependencies.relationships)}`);\n return foundDependencies.relationships;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve mapping for ${serviceId}: ${error}`);\n throw new Error(`Failed to retrieve mapping for ${serviceId}: ${error}`);\n }\n }\n\n async getServiceIdAnnotationFromCatalog(entityRef: string): Promise<string> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n // extract type, namespace and name from type:namespace/name\n const [type, rest] = entityRef.split(':');\n const [namespace, name] = rest.split('/');\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/catalog/entity/${type}/${namespace}/${name}`;\n\n try {\n response = await fetch(url, options);\n\n const foundServiceId: string = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return \"\";\n default: // 200\n this.logger.info(`Found serviceId for ${entityRef}: ${JSON.stringify(foundServiceId)}`);\n\n return foundServiceId;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve a PagerDuty service id for ${entityRef}: ${error}`);\n throw new Error(`Failed to retrieve a PagerDuty service id for ${entityRef}: ${error}`);\n }\n }\n\n async getServiceIdFromIntegrationKey(integrationKey: string, account?: string): Promise<string> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n let url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/services?integration_key=${integrationKey}`;\n\n if (account) {\n url = url.concat(`&account=${account}`);\n }\n\n try {\n response = await fetch(url, options);\n\n const foundService: PagerDutyServiceResponse = await response.json();\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return \"\";\n default: // 200\n this.logger.info(`Found service id ${foundService.service.id} from integration key ${integrationKey}`);\n\n return foundService.service.id;\n }\n } catch (error) {\n this.logger.error(`Failed to retrieve a PagerDuty service id for integration key ${integrationKey}: ${error}`);\n throw new Error(`Failed to retrieve a PagerDuty service id for integration key ${integrationKey}: ${error}`);\n }\n }\n\n async getIntegrationKeyFromServiceId(serviceId: string, account?: string): Promise<string | undefined> {\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n let url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n if (account) {\n url = url.concat(`?account=${account}`);\n }\n\n try {\n response = await fetch(url, options);\n\n const foundService: PagerDutyServiceResponse = await response.json();\n const backstageIntegration = foundService.service.integrations?.find(integration => integration.vendor?.id === \"PRO19CT\");\n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return \"\";\n default: // 200\n\n if (!backstageIntegration) {\n this.logger.info(`No Backstage integration found in service ${foundService.service.id}`);\n return undefined;\n }\n\n this.logger.info(`Found Backstage integration in service ${foundService.service.id}`);\n return backstageIntegration.integration_key;\n }\n } catch (error) {\n this.logger.error(`No Backstage integration found for service id ${serviceId}: ${error}`);\n throw new Error(`No Backstage integration found for service id ${serviceId}: ${error}`);\n }\n }\n\n async getServiceDependencyStrategySetting(): Promise<string> {\n const SERVICE_DEPENDENCY_SYNC_STRATEGY = \"settings::service-dependency-sync-strategy\";\n\n let response: Response;\n\n if (this.baseUrl === \"\") {\n this.baseUrl = await this.discovery.getBaseUrl('pagerduty');\n }\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n };\n\n const url = `${await this.discovery.getBaseUrl(\n 'pagerduty',\n )}/settings/${SERVICE_DEPENDENCY_SYNC_STRATEGY}`;\n\n try {\n response = await fetch(url, options);\n\n const setting: PagerDutySetting = await response.json(); \n\n switch (response.status) {\n case 400:\n throw new Error(await response.text());\n case 404:\n return \"disabled\"; // if setting does not exist in the database, default to disabled\n default: // 200\n this.logger.info(`Found setting for ${SERVICE_DEPENDENCY_SYNC_STRATEGY}: ${setting.value}`);\n return setting.value;\n }\n } catch (error) {\n this.logger.error(`Error getting value for setting: ${error}`);\n throw new Error(`Error getting value for setting: ${error}`);\n }\n }\n}","import { DiscoveryService, LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Entity } from \"@backstage/catalog-model\";\nimport { CatalogProcessor, CatalogProcessorEmit } from \"@backstage/plugin-catalog-node\";\nimport { LocationSpec } from \"@backstage/plugin-catalog-common\";\nimport { PagerDutyClient } from \"../apis/client\";\n\n/**\n * A function which given an entity, determines if it should be processed for linguist tags.\n * @public\n */\nexport type ShouldProcessEntity = (entity: Entity) => boolean;\n\nexport interface PagerDutyEntityProcessorOptions {\n logger: LoggerService;\n discovery: DiscoveryService;\n};\n\nlet client: PagerDutyClient;\n\nexport class PagerDutyEntityProcessor implements CatalogProcessor {\n private logger: LoggerService;\n private discovery: DiscoveryService;\n\n private shouldProcessEntity: ShouldProcessEntity = (entity: Entity) => {\n return entity.kind === 'Component';\n }\n\n constructor({ logger, discovery }: PagerDutyEntityProcessorOptions) {\n this.logger = logger;\n this.discovery = discovery;\n\n client = new PagerDutyClient({ discovery: this.discovery, logger: this.logger });\n }\n\n getProcessorName(): string {\n return \"PagerDutyEntityProcessor\";\n }\n\n async postProcessEntity(entity: Entity, _location: LocationSpec, emit: CatalogProcessorEmit): Promise<Entity> {\n if (this.shouldProcessEntity(entity)) {\n try {\n // Process service mapping overrides\n // Find the service mapping for the entity in database\n const mapping = await client.findServiceMapping({\n type: entity.kind.toLowerCase(),\n namespace: entity.metadata.namespace!.toLowerCase(),\n name: entity.metadata.name.toLowerCase(),\n });\n\n // If mapping exists add the annotations to the entity\n if (mapping) {\n updateAnnotations(entity,\n {\n serviceId: mapping.serviceId,\n integrationKey: mapping.integrationKey,\n account: mapping.account\n }\n );\n\n this.logger.debug(`Added annotations to entity ${entity.metadata.name} with service id: ${mapping.serviceId}, integration key: ${mapping.integrationKey} and account: ${mapping.account}`);\n } else {\n this.logger.debug(`No mapping found for entity: ${entity.metadata.name}. Adding annotations to the database.`);\n\n // Add the mapping to the database based on entity annotations\n let serviceId = entity.metadata.annotations?.[\"pagerduty.com/service-id\"];\n let integrationKey = entity.metadata.annotations?.[\"pagerduty.com/integration-key\"];\n const account = entity.metadata.annotations?.[\"pagerduty.com/account\"];\n\n // Build the entityRef string\n const entityRef = `${entity.kind.toLowerCase()}:${entity.metadata.namespace?.toLowerCase()}/${entity.metadata.name.toLowerCase()}`;\n\n if (serviceId) {\n // Check for mapping override by user\n const serviceMappingOverrideFound = await client.findServiceMappingById(serviceId);\n\n // If service mapping override is not found\n // insert the mapping into the database\n if (!serviceMappingOverrideFound) {\n // if integrationKey annotation does not exist\n // try to retrieve it from PagerDuty\n if (!integrationKey) {\n const foundIntegrationKey = await client.getIntegrationKeyFromServiceId(serviceId, account);\n\n if (foundIntegrationKey) {\n integrationKey = foundIntegrationKey;\n }\n }\n\n // Insert the mapping into the database\n this.logger.debug(`Inserting mapping for entity: ${entityRef} with service id: ${serviceId}, integration key: ${integrationKey} and account: ${account}`);\n await client.insertServiceMapping({\n entityRef,\n serviceId,\n integrationKey,\n account,\n });\n\n // Add the annotations to the entity\n updateAnnotations(entity,\n {\n serviceId,\n integrationKey,\n account\n }\n );\n }\n else {\n this.logger.debug(`Service mapping override found for service id: ${serviceId}.`);\n updateAnnotations(entity, {}); // delete annotations because user unmapped the service\n }\n }\n else if (integrationKey) {\n serviceId = await client.getServiceIdFromIntegrationKey(integrationKey, account);\n\n // Check for mapping override by user\n const serviceMappingOverrideFound = await client.findServiceMappingById(serviceId);\n\n // If service mapping override is not found\n // insert the mapping into the database\n if (!serviceMappingOverrideFound) {\n // Insert the mapping into the database\n this.logger.debug(`Inserting mapping for entity: ${entityRef} with new service id: ${serviceId}, integration key: ${integrationKey} and account: ${account}`);\n await client.insertServiceMapping({\n entityRef,\n serviceId,\n integrationKey,\n account,\n });\n\n updateAnnotations(entity,\n {\n serviceId,\n integrationKey,\n account\n }\n );\n }\n else {\n this.logger.debug(`Service mapping override found for service id: ${serviceId}. Skipping adding to the database.`);\n updateAnnotations(entity, {}); // delete annotations because user unmapped the service\n }\n }\n }\n\n // Process service dependencies\n // if (entity.spec?.dependsOn) {\n // Check if ServiceId exists get service dependencies from PagerDuty \n const serviceId = entity.metadata.annotations?.[\"pagerduty.com/service-id\"];\n\n // this.logger.info(`Existing dependencies for entity: ${entity.metadata.name}. Dependencies: ${JSON.stringify(dependencyAnnotations)}`);\n\n if (serviceId) {\n const strategySetting = await client.getServiceDependencyStrategySetting();\n\n if (strategySetting && strategySetting !== \"disabled\") {\n // Check if service has dependencies configured\n let dependencyAnnotations: string[] = [];\n\n if (entity.spec?.dependsOn) {\n dependencyAnnotations = JSON.parse(JSON.stringify(entity.spec?.dependsOn));\n }\n\n this.logger.info(`Existing dependencies on entity ${entity.metadata.name}: ${JSON.stringify(dependencyAnnotations)}`);\n\n const newDependencyList: string[] = [];\n const mappings = await client.getAllServiceMappings();\n\n const entityDependencies: string[] = await buildExistingDependencies(dependencyAnnotations);\n this.logger.info(`Dependencies from Annotations in ${serviceId}: ${JSON.stringify(entityDependencies)}`);\n\n // Get dependencies from PagerDuty for the service\n const account = entity.metadata.annotations?.[\"pagerduty.com/account\"];\n const dependencies = await client.getServiceDependencies(serviceId, account);\n const filteredDependencies = dependencies.length > 0 ? dependencies.filter(x => x.dependent_service.id === serviceId) : [];\n const dependencyIds = filteredDependencies.length > 0 ? filteredDependencies.map(x => x.supporting_service.id) : [];\n\n this.logger.info(`Filtered dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(filteredDependencies)}`);\n this.logger.info(`Dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(dependencyIds)}`);\n\n // compare dependencies with existing dependencies defined on the entity\n const dependenciesMissingInBackstage = dependencyIds.length > 0 ? dependencyIds.filter(x => !entityDependencies.includes(x)) : [];\n this.logger.info(`Dependencies missing in Backstage: ${JSON.stringify(dependenciesMissingInBackstage)}`);\n const dependenciesMissingInPagerDuty = entityDependencies.length > 0 ? entityDependencies.filter(x => !dependencyIds.includes(x)) : [];\n this.logger.info(`Dependencies missing in PagerDuty: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);\n\n switch (strategySetting) {\n case \"backstage\":\n // Update dependencies on PagerDuty with dependenciesMissinginPagerDuty\n // Add dependency associations in PagerDuty\n if (dependenciesMissingInPagerDuty.length > 0) {\n this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);\n await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);\n }\n\n // Remove dependency associations in PagerDuty\n if (dependenciesMissingInBackstage.length > 0) {\n this.logger.info(`Removing dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInBackstage)}`);\n await client.removeServiceRelationFromService(serviceId, dependenciesMissingInBackstage);\n }\n\n break;\n case \"pagerduty\":\n // Update dependencies on Backstage with dependenciesMissingInBackstage\n this.logger.info(`Updating dependencies on Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);\n\n entity.spec!.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);\n\n this.logger.info(`Updated dependencies for service: ${serviceId}. New dependencies: ${JSON.stringify(newDependencyList)}`);\n\n break;\n case \"both\":\n // Update dependencies in both PagerDuty and Backstage\n this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)} and Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);\n\n // Add missing dependencies to PagerDuty\n if (dependenciesMissingInPagerDuty.length > 0) {\n await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);\n }\n\n // Add missing dependencies to Backstage\n entity.spec!.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);\n\n break;\n default:\n // Do nothing. Stragety not defined or set to disabled\n this.logger.info(`Strategy not defined or set to disabled.`);\n break;\n }\n }\n }\n\n } catch (error) {\n this.logger.error(`Error processing entity ${entity.metadata.name}: ${error}`);\n }\n }\n\n return entity;\n }\n}\n\nexport function addServiceDependencyAnnotations(entity: Entity, mappingsDic: Record<string, string>, dependencies: string[], emit: CatalogProcessorEmit): string[] {\n const dependencyList: string[] = [];\n dependencies.forEach((dependencyId) => {\n const foundEntityRef = mappingsDic[dependencyId];\n\n if (foundEntityRef) {\n dependencyList.push(foundEntityRef);\n\n const entityRefParts = foundEntityRef.split(\":\");\n const kind = entityRefParts[0];\n const namespaceName = entityRefParts[1].split(\"/\");\n const namespace = namespaceName[0];\n const name = namespaceName[1];\n\n emit({\n relation: {\n source: {\n kind: entity.kind,\n namespace: entity.metadata.namespace!,\n name: entity.metadata.name,\n },\n target: {\n kind: kind,\n namespace: namespace,\n name: name,\n },\n type: \"dependsOn\",\n },\n type: \"relation\"\n });\n\n emit({\n relation: {\n source: {\n kind: kind,\n namespace: namespace,\n name: name,\n },\n target: {\n kind: entity.kind,\n namespace: entity.metadata.namespace!,\n name: entity.metadata.name,\n },\n type: \"dependencyOf\",\n },\n type: \"relation\"\n });\n }\n });\n\n return dependencyList;\n}\n\nexport type AnnotationUpdateProps = {\n serviceId?: string;\n integrationKey?: string;\n account?: string;\n};\n\nfunction updateAnnotations(entity: Entity, annotations: AnnotationUpdateProps): void {\n // If serviceId is present, add the annotations to the entity\n if (annotations.serviceId && annotations.serviceId !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/service-id\"] = annotations.serviceId;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/service-id\"];\n }\n\n // If integrationKey is present, add the annotations to the entity\n if (annotations.integrationKey && annotations.integrationKey !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/integration-key\"] = annotations.integrationKey;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/integration-key\"];\n }\n\n // If account is present, add the annotations to the entity\n if (annotations.account && annotations.account !== \"\") {\n entity.metadata.annotations![\"pagerduty.com/account\"] = annotations.account;\n }\n else {\n delete entity.metadata.annotations![\"pagerduty.com/account\"];\n }\n}\n\nasync function buildExistingDependencies(dependencyAnnotations: string[]): Promise<string[]> {\n const dependencies: string[] = [];\n\n // Get all service ids matching the dependency annotations\n if (dependencyAnnotations.length > 0) {\n await Promise.all(\n dependencyAnnotations.map(async (dependency) => {\n const foundServiceId = await client.getServiceIdAnnotationFromCatalog(dependency);\n console.log(`Found service id for ${dependency}: ${foundServiceId}`);\n\n if (foundServiceId !== \"\") {\n dependencies.push(foundServiceId);\n }\n })\n );\n }\n\n return dependencies;\n\n}","import { coreServices, createBackendModule } from \"@backstage/backend-plugin-api\";\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { PagerDutyEntityProcessor } from \"./processor\";\n\n/** @public */\nexport const pagerDutyEntityProcessor = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'pagerduty-entity-processor',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n catalog: catalogProcessingExtensionPoint,\n discovery: coreServices.discovery,\n },\n async init({ logger, discovery, catalog }) {\n catalog.addProcessor(new PagerDutyEntityProcessor({ logger, discovery}));\n },\n });\n },\n});\n"],"names":["__publicField","fetch","_a","serviceId","createBackendModule","coreServices","catalogProcessingExtensionPoint"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin-entity-processor",
|
|
3
|
-
"version": "0.3.0-next.
|
|
3
|
+
"version": "0.3.0-next.70",
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -36,8 +36,9 @@
|
|
|
36
36
|
"@backstage/backend-plugin-api": "^0.6.20",
|
|
37
37
|
"@backstage/catalog-model": "^1.5.0",
|
|
38
38
|
"@backstage/config": "^1.2.0",
|
|
39
|
+
"@backstage/plugin-catalog-common": "^1.0.25",
|
|
39
40
|
"@backstage/plugin-catalog-node": "^1.12.2",
|
|
40
|
-
"@pagerduty/backstage-plugin-common": "0.2.1-next.
|
|
41
|
+
"@pagerduty/backstage-plugin-common": "0.2.1-next.5",
|
|
41
42
|
"@rjsf/core": "^5.14.3",
|
|
42
43
|
"node-fetch": "^2.6.7",
|
|
43
44
|
"winston": "^3.2.1",
|