@pagerduty/backstage-plugin-entity-processor 0.3.0-next.71 → 0.3.0-next.72

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 CHANGED
@@ -6,21 +6,15 @@ var backendPluginApi = require('@backstage/backend-plugin-api');
6
6
  var alpha = require('@backstage/plugin-catalog-node/alpha');
7
7
  var fetch = require('node-fetch');
8
8
 
9
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
10
 
11
- var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
11
+ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
12
12
 
13
- var __defProp$1 = Object.defineProperty;
14
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
- var __publicField$1 = (obj, key, value) => {
16
- __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
17
- return value;
18
- };
19
13
  class PagerDutyClient {
14
+ discovery;
15
+ logger;
16
+ baseUrl = "";
20
17
  constructor({ discovery, logger }) {
21
- __publicField$1(this, "discovery");
22
- __publicField$1(this, "logger");
23
- __publicField$1(this, "baseUrl", "");
24
18
  this.discovery = discovery;
25
19
  this.logger = logger;
26
20
  }
@@ -48,7 +42,6 @@ class PagerDutyClient {
48
42
  if (!response.ok) {
49
43
  throw new Error(await response.text());
50
44
  }
51
- this.logger.info(`Added dependencies to database.`);
52
45
  } catch (error) {
53
46
  this.logger.error(`Failed to add dependencies: ${error}`);
54
47
  throw new Error(`Failed to add dependencies: ${error}`);
@@ -78,7 +71,6 @@ class PagerDutyClient {
78
71
  if (!response.ok) {
79
72
  throw new Error(await response.text());
80
73
  }
81
- this.logger.info(`Removed dependencies from database.`);
82
74
  } catch (error) {
83
75
  this.logger.error(`Failed to remove dependencies: ${error}`);
84
76
  throw new Error(`Failed to remove dependencies: ${error}`);
@@ -207,7 +199,6 @@ class PagerDutyClient {
207
199
  if (this.baseUrl === "") {
208
200
  this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
209
201
  }
210
- this.logger.info(`Adding mapping for ${mapping.entityRef} to database with payload: ${JSON.stringify(mapping)}`);
211
202
  const options = {
212
203
  method: "POST",
213
204
  headers: {
@@ -227,7 +218,6 @@ class PagerDutyClient {
227
218
  if (!response.ok) {
228
219
  throw new Error(await response.text());
229
220
  }
230
- this.logger.info(`Mapping for ${mapping.entityRef} added to database.`);
231
221
  } catch (error) {
232
222
  this.logger.error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);
233
223
  throw new Error(`Failed to add mapping for ${mapping.entityRef}: ${error}`);
@@ -263,7 +253,6 @@ class PagerDutyClient {
263
253
  case 404:
264
254
  return [];
265
255
  default:
266
- this.logger.info(`Found dependencies for ${serviceId}: ${JSON.stringify(foundDependencies.relationships)}`);
267
256
  return foundDependencies.relationships;
268
257
  }
269
258
  } catch (error) {
@@ -300,7 +289,6 @@ class PagerDutyClient {
300
289
  case 404:
301
290
  return "";
302
291
  default:
303
- this.logger.info(`Found serviceId for ${entityRef}: ${JSON.stringify(foundServiceId)}`);
304
292
  return foundServiceId;
305
293
  }
306
294
  } catch (error) {
@@ -338,7 +326,6 @@ class PagerDutyClient {
338
326
  case 404:
339
327
  return "";
340
328
  default:
341
- this.logger.info(`Found service id ${foundService.service.id} from integration key ${integrationKey}`);
342
329
  return foundService.service.id;
343
330
  }
344
331
  } catch (error) {
@@ -347,7 +334,6 @@ class PagerDutyClient {
347
334
  }
348
335
  }
349
336
  async getIntegrationKeyFromServiceId(serviceId, account) {
350
- var _a;
351
337
  let response;
352
338
  if (this.baseUrl === "") {
353
339
  this.baseUrl = await this.discovery.getBaseUrl("pagerduty");
@@ -371,10 +357,7 @@ class PagerDutyClient {
371
357
  throw new Error(`Failed to get integration key from service id ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);
372
358
  }
373
359
  const foundService = await response.json();
374
- const backstageIntegration = (_a = foundService.service.integrations) == null ? void 0 : _a.find((integration) => {
375
- var _a2;
376
- return ((_a2 = integration.vendor) == null ? void 0 : _a2.id) === "PRO19CT";
377
- });
360
+ const backstageIntegration = foundService.service.integrations?.find((integration) => integration.vendor?.id === "PRO19CT");
378
361
  switch (response.status) {
379
362
  case 400:
380
363
  throw new Error(await response.text());
@@ -382,10 +365,8 @@ class PagerDutyClient {
382
365
  return "";
383
366
  default:
384
367
  if (!backstageIntegration) {
385
- this.logger.info(`No Backstage integration found in service ${foundService.service.id}`);
386
368
  return void 0;
387
369
  }
388
- this.logger.info(`Found Backstage integration in service ${foundService.service.id}`);
389
370
  return backstageIntegration.integration_key;
390
371
  }
391
372
  } catch (error) {
@@ -421,7 +402,6 @@ class PagerDutyClient {
421
402
  case 404:
422
403
  return "disabled";
423
404
  default:
424
- this.logger.info(`Found setting for ${SERVICE_DEPENDENCY_SYNC_STRATEGY}: ${setting.value}`);
425
405
  return setting.value;
426
406
  }
427
407
  } catch (error) {
@@ -438,7 +418,7 @@ async function fetchWithRetries(url, options) {
438
418
  let factor = 2;
439
419
  for (let i = 0; i < maxRetries; i++) {
440
420
  try {
441
- response = await fetch__default["default"](url, options);
421
+ response = await fetch__default.default(url, options);
442
422
  return response;
443
423
  } catch (e) {
444
424
  error = e;
@@ -450,20 +430,14 @@ async function fetchWithRetries(url, options) {
450
430
  throw new Error(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);
451
431
  }
452
432
 
453
- var __defProp = Object.defineProperty;
454
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
455
- var __publicField = (obj, key, value) => {
456
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
457
- return value;
458
- };
459
433
  let client;
460
434
  class PagerDutyEntityProcessor {
435
+ logger;
436
+ discovery;
437
+ shouldProcessEntity = (entity) => {
438
+ return entity.kind === "Component";
439
+ };
461
440
  constructor({ logger, discovery }) {
462
- __publicField(this, "logger");
463
- __publicField(this, "discovery");
464
- __publicField(this, "shouldProcessEntity", (entity) => {
465
- return entity.kind === "Component";
466
- });
467
441
  this.logger = logger;
468
442
  this.discovery = discovery;
469
443
  client = new PagerDutyClient({ discovery: this.discovery, logger: this.logger });
@@ -472,7 +446,6 @@ class PagerDutyEntityProcessor {
472
446
  return "PagerDutyEntityProcessor";
473
447
  }
474
448
  async postProcessEntity(entity, _location, emit) {
475
- var _a, _b, _c, _d, _e, _f, _g, _h;
476
449
  if (this.shouldProcessEntity(entity)) {
477
450
  try {
478
451
  const mapping = await client.findServiceMapping({
@@ -492,10 +465,10 @@ class PagerDutyEntityProcessor {
492
465
  this.logger.debug(`Added annotations to entity ${entity.metadata.name} with service id: ${mapping.serviceId}, integration key: ${mapping.integrationKey} and account: ${mapping.account}`);
493
466
  } else {
494
467
  this.logger.debug(`No mapping found for entity: ${entity.metadata.name}. Adding annotations to the database.`);
495
- let serviceId2 = (_a = entity.metadata.annotations) == null ? void 0 : _a["pagerduty.com/service-id"];
496
- let integrationKey = (_b = entity.metadata.annotations) == null ? void 0 : _b["pagerduty.com/integration-key"];
497
- const account = (_c = entity.metadata.annotations) == null ? void 0 : _c["pagerduty.com/account"];
498
- const entityRef = `${entity.kind.toLowerCase()}:${(_d = entity.metadata.namespace) == null ? void 0 : _d.toLowerCase()}/${entity.metadata.name.toLowerCase()}`;
468
+ let serviceId2 = entity.metadata.annotations?.["pagerduty.com/service-id"];
469
+ let integrationKey = entity.metadata.annotations?.["pagerduty.com/integration-key"];
470
+ const account = entity.metadata.annotations?.["pagerduty.com/account"];
471
+ const entityRef = `${entity.kind.toLowerCase()}:${entity.metadata.namespace?.toLowerCase()}/${entity.metadata.name.toLowerCase()}`;
499
472
  if (serviceId2) {
500
473
  const serviceMappingOverrideFound = await client.findServiceMappingById(serviceId2);
501
474
  if (!serviceMappingOverrideFound) {
@@ -549,54 +522,45 @@ class PagerDutyEntityProcessor {
549
522
  }
550
523
  }
551
524
  }
552
- const serviceId = (_e = entity.metadata.annotations) == null ? void 0 : _e["pagerduty.com/service-id"];
525
+ const serviceId = entity.metadata.annotations?.["pagerduty.com/service-id"];
553
526
  if (serviceId) {
554
527
  const strategySetting = await client.getServiceDependencyStrategySetting();
555
528
  if (strategySetting && strategySetting !== "disabled") {
556
529
  let dependencyAnnotations = [];
557
- if ((_f = entity.spec) == null ? void 0 : _f.dependsOn) {
558
- dependencyAnnotations = JSON.parse(JSON.stringify((_g = entity.spec) == null ? void 0 : _g.dependsOn));
530
+ if (entity.spec?.dependsOn) {
531
+ dependencyAnnotations = JSON.parse(JSON.stringify(entity.spec?.dependsOn));
559
532
  }
560
- this.logger.info(`Existing dependencies on entity ${entity.metadata.name}: ${JSON.stringify(dependencyAnnotations)}`);
561
- const newDependencyList = [];
562
533
  const mappings = await client.getAllServiceMappings();
563
534
  const entityDependencies = await buildExistingDependencies(dependencyAnnotations);
564
- this.logger.info(`Dependencies from Annotations in ${serviceId}: ${JSON.stringify(entityDependencies)}`);
565
- const account = (_h = entity.metadata.annotations) == null ? void 0 : _h["pagerduty.com/account"];
535
+ const account = entity.metadata.annotations?.["pagerduty.com/account"];
566
536
  const dependencies = await client.getServiceDependencies(serviceId, account);
567
- const filteredDependencies = dependencies.length > 0 ? dependencies.filter((x) => x.dependent_service.id === serviceId) : [];
568
- const dependencyIds = filteredDependencies.length > 0 ? filteredDependencies.map((x) => x.supporting_service.id) : [];
569
- this.logger.info(`Filtered dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(filteredDependencies)}`);
570
- this.logger.info(`Dependencies from PagerDuty service ${serviceId}: ${JSON.stringify(dependencyIds)}`);
571
- const dependenciesMissingInBackstage = dependencyIds.length > 0 ? dependencyIds.filter((x) => !entityDependencies.includes(x)) : [];
572
- this.logger.info(`Dependencies missing in Backstage: ${JSON.stringify(dependenciesMissingInBackstage)}`);
573
- const dependenciesMissingInPagerDuty = entityDependencies.length > 0 ? entityDependencies.filter((x) => !dependencyIds.includes(x)) : [];
574
- this.logger.info(`Dependencies missing in PagerDuty: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);
537
+ const filteredDependencies = dependencies.filter((x) => x.dependent_service.id === serviceId);
538
+ const dependencyIds = filteredDependencies.map((x) => x.supporting_service.id);
539
+ const dependenciesMissingInBackstage = dependencyIds.filter((x) => !entityDependencies.includes(x));
540
+ const dependenciesMissingInPagerDuty = entityDependencies.filter((x) => !dependencyIds.includes(x));
575
541
  switch (strategySetting) {
576
542
  case "backstage":
577
543
  if (dependenciesMissingInPagerDuty.length > 0) {
578
- this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);
544
+ this.logger.debug(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)}`);
579
545
  await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);
580
546
  }
581
547
  if (dependenciesMissingInBackstage.length > 0) {
582
- this.logger.info(`Removing dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
548
+ this.logger.debug(`Removing dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
583
549
  await client.removeServiceRelationFromService(serviceId, dependenciesMissingInBackstage);
584
550
  }
585
551
  break;
586
552
  case "pagerduty":
587
- this.logger.info(`Updating dependencies on Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
553
+ this.logger.debug(`Updating dependencies on Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
588
554
  entity.spec.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);
589
- this.logger.info(`Updated dependencies for service: ${serviceId}. New dependencies: ${JSON.stringify(newDependencyList)}`);
590
555
  break;
591
556
  case "both":
592
- this.logger.info(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)} and Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
557
+ this.logger.debug(`Updating dependencies on PagerDuty with: ${JSON.stringify(dependenciesMissingInPagerDuty)} and Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);
593
558
  if (dependenciesMissingInPagerDuty.length > 0) {
594
559
  await client.addServiceRelationToService(serviceId, dependenciesMissingInPagerDuty);
595
560
  }
596
561
  entity.spec.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);
597
562
  break;
598
563
  default:
599
- this.logger.info(`Strategy not defined or set to disabled.`);
600
564
  break;
601
565
  }
602
566
  }
@@ -678,7 +642,6 @@ async function buildExistingDependencies(dependencyAnnotations) {
678
642
  await Promise.all(
679
643
  dependencyAnnotations.map(async (dependency) => {
680
644
  const foundServiceId = await client.getServiceIdAnnotationFromCatalog(dependency);
681
- console.log(`Found service id for ${dependency}: ${foundServiceId}`);
682
645
  if (foundServiceId !== "") {
683
646
  dependencies.push(foundServiceId);
684
647
  }
@@ -705,5 +668,5 @@ const pagerDutyEntityProcessor = backendPluginApi.createBackendModule({
705
668
  }
706
669
  });
707
670
 
708
- exports["default"] = pagerDutyEntityProcessor;
671
+ exports.default = pagerDutyEntityProcessor;
709
672
  //# sourceMappingURL=index.cjs.js.map
@@ -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 {\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to add service relation to service ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to remove service relation from service ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get all service mappings. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to find service mapping. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to find service mapping by id. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to add service mapping. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service depedencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service id annotation from catalog. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service id from integration key ${integrationKey}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get integration key from service id ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options); \n\n if (response.status >= 500) {\n throw new Error(`Failed to get service depedency strategy. API returned a server error. Retrying with the same arguments will not work.`);\n }\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}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\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","_a","fetch","serviceId","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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to add service relation to service ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to remove service relation from service ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get all service mappings. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to find service mapping. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to find service mapping by id. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to add service mapping. API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service depedencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service id annotation from catalog. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get service id from integration key ${integrationKey}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 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 fetchWithRetries(url, options);\n\n if (response.status >= 500) {\n throw new Error(`Failed to get integration key from service id ${serviceId}. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\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 return undefined;\n }\n\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 fetchWithRetries(url, options); \n\n if (response.status >= 500) {\n throw new Error(`Failed to get service depedency strategy. API returned a server error. Retrying with the same arguments will not work.`);\n }\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 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}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\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 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 const mappings = await client.getAllServiceMappings();\n\n const entityDependencies: 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 const filteredDependencies = dependencies.filter(x => x.dependent_service.id === serviceId);\n const dependencyIds = filteredDependencies.map(x => x.supporting_service.id);\n\n // compare dependencies with existing dependencies defined on the entity\n const dependenciesMissingInBackstage = dependencyIds.filter(x => !entityDependencies.includes(x));\n const dependenciesMissingInPagerDuty = entityDependencies.filter(x => !dependencyIds.includes(x));\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.debug(`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.debug(`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.debug(`Updating dependencies on Backstage with: ${JSON.stringify(dependenciesMissingInBackstage)}`);\n\n entity.spec!.dependsOn = addServiceDependencyAnnotations(entity, mappings, dependencyIds, emit);\n\n break;\n case \"both\":\n // Update dependencies in both PagerDuty and Backstage\n this.logger.debug(`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 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\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":["fetch","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.71",
3
+ "version": "0.3.0-next.72",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -10,7 +10,9 @@
10
10
  "types": "dist/index.d.ts"
11
11
  },
12
12
  "backstage": {
13
- "role": "backend-plugin-module"
13
+ "role": "backend-plugin-module",
14
+ "pluginId": "catalog",
15
+ "pluginPackage": "pagerduty-entity-processor"
14
16
  },
15
17
  "homepage": "https://pagerduty.github.io/backstage-plugin-docs/index.html",
16
18
  "repository": {
@@ -31,14 +33,14 @@
31
33
  "postpack": "backstage-cli package postpack"
32
34
  },
33
35
  "dependencies": {
34
- "@backstage/backend-common": "^0.21.6",
35
- "@backstage/backend-defaults": "^0.2.16",
36
- "@backstage/backend-plugin-api": "^0.6.20",
36
+ "@backstage/backend-common": "^0.23.3",
37
+ "@backstage/backend-defaults": "^0.4.1",
38
+ "@backstage/backend-plugin-api": "^0.7.0",
37
39
  "@backstage/catalog-model": "^1.5.0",
38
40
  "@backstage/config": "^1.2.0",
39
41
  "@backstage/plugin-catalog-common": "^1.0.25",
40
- "@backstage/plugin-catalog-node": "^1.12.2",
41
- "@pagerduty/backstage-plugin-common": "0.2.1-next.5",
42
+ "@backstage/plugin-catalog-node": "^1.12.4",
43
+ "@pagerduty/backstage-plugin-common": "0.2.1",
42
44
  "@rjsf/core": "^5.14.3",
43
45
  "node-fetch": "^2.6.7",
44
46
  "winston": "^3.2.1",
@@ -46,7 +48,7 @@
46
48
  "zod": "^3.22.4"
47
49
  },
48
50
  "devDependencies": {
49
- "@backstage/cli": "^0.24.0",
51
+ "@backstage/cli": "^0.26.11",
50
52
  "@types/node": "^20.9.2",
51
53
  "@types/node-fetch": "2.6.11",
52
54
  "@types/supertest": "^2.0.12",