@pagerduty/backstage-plugin-backend 0.8.0-next.13 → 0.8.0-next.14
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 +34 -25
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -48,7 +48,7 @@ async function getAuthToken(accountId) {
|
|
|
48
48
|
return authPersistence.accountTokens.default.authToken;
|
|
49
49
|
}
|
|
50
50
|
} else {
|
|
51
|
-
if (accountId) {
|
|
51
|
+
if (accountId && accountId !== "") {
|
|
52
52
|
if (authPersistence.accountTokens[accountId].authToken !== "" && authPersistence.accountTokens[accountId].authToken.includes("Bearer") && authPersistence.accountTokens[accountId].authTokenExpiryDate > Date.now() || authPersistence.accountTokens[accountId].authToken !== "" && authPersistence.accountTokens[accountId].authToken.includes("Token")) {
|
|
53
53
|
return authPersistence.accountTokens[accountId].authToken;
|
|
54
54
|
}
|
|
@@ -206,14 +206,14 @@ let apiBaseUrl = "https://api.pagerduty.com";
|
|
|
206
206
|
function setAPIBaseUrl(url) {
|
|
207
207
|
apiBaseUrl = url;
|
|
208
208
|
}
|
|
209
|
-
async function getEscalationPolicies(offset, limit) {
|
|
209
|
+
async function getEscalationPolicies(offset, limit, account) {
|
|
210
210
|
var _a;
|
|
211
211
|
let response;
|
|
212
212
|
const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;
|
|
213
213
|
const options = {
|
|
214
214
|
method: "GET",
|
|
215
215
|
headers: {
|
|
216
|
-
Authorization: await getAuthToken(),
|
|
216
|
+
Authorization: await getAuthToken(account),
|
|
217
217
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
218
218
|
"Content-Type": "application/json"
|
|
219
219
|
}
|
|
@@ -259,13 +259,13 @@ async function getAllEscalationPolicies(offset = 0) {
|
|
|
259
259
|
}
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
|
-
async function getOncallUsers(escalationPolicy) {
|
|
262
|
+
async function getOncallUsers(escalationPolicy, account) {
|
|
263
263
|
let response;
|
|
264
264
|
const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;
|
|
265
265
|
const options = {
|
|
266
266
|
method: "GET",
|
|
267
267
|
headers: {
|
|
268
|
-
Authorization: await getAuthToken(),
|
|
268
|
+
Authorization: await getAuthToken(account),
|
|
269
269
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
270
270
|
"Content-Type": "application/json"
|
|
271
271
|
}
|
|
@@ -313,13 +313,13 @@ async function getOncallUsers(escalationPolicy) {
|
|
|
313
313
|
throw new backstagePluginCommon.HttpError(`Failed to parse oncall information: ${error}`, 500);
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
|
-
async function getServiceById(serviceId) {
|
|
316
|
+
async function getServiceById(serviceId, account) {
|
|
317
317
|
let response;
|
|
318
318
|
const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;
|
|
319
319
|
const options = {
|
|
320
320
|
method: "GET",
|
|
321
321
|
headers: {
|
|
322
|
-
Authorization: await getAuthToken(),
|
|
322
|
+
Authorization: await getAuthToken(account),
|
|
323
323
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
324
324
|
"Content-Type": "application/json"
|
|
325
325
|
}
|
|
@@ -348,13 +348,13 @@ async function getServiceById(serviceId) {
|
|
|
348
348
|
throw new backstagePluginCommon.HttpError(`Failed to parse service information: ${error}`, 500);
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
|
-
async function getServiceByIntegrationKey(integrationKey) {
|
|
351
|
+
async function getServiceByIntegrationKey(integrationKey, account) {
|
|
352
352
|
let response;
|
|
353
353
|
const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;
|
|
354
354
|
const options = {
|
|
355
355
|
method: "GET",
|
|
356
356
|
headers: {
|
|
357
|
-
Authorization: await getAuthToken(),
|
|
357
|
+
Authorization: await getAuthToken(account),
|
|
358
358
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
359
359
|
"Content-Type": "application/json"
|
|
360
360
|
}
|
|
@@ -425,13 +425,13 @@ async function getAllServices() {
|
|
|
425
425
|
}
|
|
426
426
|
return allServices;
|
|
427
427
|
}
|
|
428
|
-
async function getChangeEvents(serviceId) {
|
|
428
|
+
async function getChangeEvents(serviceId, account) {
|
|
429
429
|
let response;
|
|
430
430
|
const params = `limit=5&time_zone=UTC&sort_by=timestamp`;
|
|
431
431
|
const options = {
|
|
432
432
|
method: "GET",
|
|
433
433
|
headers: {
|
|
434
|
-
Authorization: await getAuthToken(),
|
|
434
|
+
Authorization: await getAuthToken(account),
|
|
435
435
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
436
436
|
"Content-Type": "application/json"
|
|
437
437
|
}
|
|
@@ -460,13 +460,13 @@ async function getChangeEvents(serviceId) {
|
|
|
460
460
|
throw new backstagePluginCommon.HttpError(`Failed to parse change events information: ${error}`, 500);
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
|
-
async function getIncidents(serviceId) {
|
|
463
|
+
async function getIncidents(serviceId, account) {
|
|
464
464
|
let response;
|
|
465
465
|
const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;
|
|
466
466
|
const options = {
|
|
467
467
|
method: "GET",
|
|
468
468
|
headers: {
|
|
469
|
-
Authorization: await getAuthToken(),
|
|
469
|
+
Authorization: await getAuthToken(account),
|
|
470
470
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
471
471
|
"Content-Type": "application/json"
|
|
472
472
|
}
|
|
@@ -497,12 +497,12 @@ async function getIncidents(serviceId) {
|
|
|
497
497
|
throw new backstagePluginCommon.HttpError(`Failed to parse incidents information: ${error}`, 500);
|
|
498
498
|
}
|
|
499
499
|
}
|
|
500
|
-
async function getServiceStandards(serviceId) {
|
|
500
|
+
async function getServiceStandards(serviceId, account) {
|
|
501
501
|
let response;
|
|
502
502
|
const options = {
|
|
503
503
|
method: "GET",
|
|
504
504
|
headers: {
|
|
505
|
-
Authorization: await getAuthToken(),
|
|
505
|
+
Authorization: await getAuthToken(account),
|
|
506
506
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
507
507
|
"Content-Type": "application/json"
|
|
508
508
|
}
|
|
@@ -528,7 +528,7 @@ async function getServiceStandards(serviceId) {
|
|
|
528
528
|
throw new backstagePluginCommon.HttpError(`Failed to parse service standards information: ${error}`, 500);
|
|
529
529
|
}
|
|
530
530
|
}
|
|
531
|
-
async function getServiceMetrics(serviceId) {
|
|
531
|
+
async function getServiceMetrics(serviceId, account) {
|
|
532
532
|
let response;
|
|
533
533
|
const endDate = luxon.DateTime.now();
|
|
534
534
|
const startDate = endDate.minus({ days: 30 });
|
|
@@ -544,7 +544,7 @@ async function getServiceMetrics(serviceId) {
|
|
|
544
544
|
const options = {
|
|
545
545
|
method: "POST",
|
|
546
546
|
headers: {
|
|
547
|
-
Authorization: await getAuthToken(),
|
|
547
|
+
Authorization: await getAuthToken(account),
|
|
548
548
|
"Accept": "application/vnd.pagerduty+json;version=2",
|
|
549
549
|
"Content-Type": "application/json"
|
|
550
550
|
},
|
|
@@ -573,16 +573,18 @@ async function getServiceMetrics(serviceId) {
|
|
|
573
573
|
async function createComponentEntitiesReferenceDict({ items: componentEntities }) {
|
|
574
574
|
const componentEntitiesDict = {};
|
|
575
575
|
await Promise.all(componentEntities.map(async (entity) => {
|
|
576
|
+
var _a;
|
|
576
577
|
const annotations = JSON.parse(JSON.stringify(entity.metadata.annotations));
|
|
577
578
|
const serviceId = annotations["pagerduty.com/service-id"];
|
|
578
579
|
const integrationKey = annotations["pagerduty.com/integration-key"];
|
|
580
|
+
const account = (_a = annotations["pagerduty.com/account"]) != null ? _a : "";
|
|
579
581
|
if (serviceId !== void 0 && serviceId !== "") {
|
|
580
582
|
componentEntitiesDict[serviceId] = {
|
|
581
583
|
ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),
|
|
582
584
|
name: entity.metadata.name
|
|
583
585
|
};
|
|
584
586
|
} else if (integrationKey !== void 0 && integrationKey !== "") {
|
|
585
|
-
const service = await getServiceByIntegrationKey(integrationKey);
|
|
587
|
+
const service = await getServiceByIntegrationKey(integrationKey, account);
|
|
586
588
|
if (service !== void 0) {
|
|
587
589
|
componentEntitiesDict[service.id] = {
|
|
588
590
|
ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),
|
|
@@ -818,10 +820,11 @@ async function createRouter(options) {
|
|
|
818
820
|
router.get("/oncall-users", async (request, response) => {
|
|
819
821
|
try {
|
|
820
822
|
const escalationPolicyId = request.query.escalation_policy_ids || "";
|
|
823
|
+
const account = request.query.account || "";
|
|
821
824
|
if (escalationPolicyId === "") {
|
|
822
825
|
response.status(400).json("Bad Request: 'escalation_policy_ids[]' is required");
|
|
823
826
|
}
|
|
824
|
-
const oncallUsers = await getOncallUsers(escalationPolicyId);
|
|
827
|
+
const oncallUsers = await getOncallUsers(escalationPolicyId, account);
|
|
825
828
|
const onCallUsersResponse = {
|
|
826
829
|
users: oncallUsers
|
|
827
830
|
};
|
|
@@ -839,10 +842,11 @@ async function createRouter(options) {
|
|
|
839
842
|
router.get("/services/:serviceId", async (request, response) => {
|
|
840
843
|
try {
|
|
841
844
|
const serviceId = request.params.serviceId || "";
|
|
845
|
+
const account = request.query.account || "";
|
|
842
846
|
if (serviceId === "") {
|
|
843
847
|
response.status(400).json("Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter");
|
|
844
848
|
}
|
|
845
|
-
const service = await getServiceById(serviceId);
|
|
849
|
+
const service = await getServiceById(serviceId, account);
|
|
846
850
|
const serviceResponse = {
|
|
847
851
|
service
|
|
848
852
|
};
|
|
@@ -860,8 +864,9 @@ async function createRouter(options) {
|
|
|
860
864
|
router.get("/services", async (request, response) => {
|
|
861
865
|
try {
|
|
862
866
|
const integrationKey = request.query.integration_key || "";
|
|
867
|
+
const account = request.query.account || "";
|
|
863
868
|
if (integrationKey !== "") {
|
|
864
|
-
const service = await getServiceByIntegrationKey(integrationKey);
|
|
869
|
+
const service = await getServiceByIntegrationKey(integrationKey, account);
|
|
865
870
|
const serviceResponse = {
|
|
866
871
|
service
|
|
867
872
|
};
|
|
@@ -886,7 +891,8 @@ async function createRouter(options) {
|
|
|
886
891
|
router.get("/services/:serviceId/change-events", async (request, response) => {
|
|
887
892
|
try {
|
|
888
893
|
const serviceId = request.params.serviceId || "";
|
|
889
|
-
const
|
|
894
|
+
const account = request.query.account || "";
|
|
895
|
+
const changeEvents = await getChangeEvents(serviceId, account);
|
|
890
896
|
const changeEventsResponse = {
|
|
891
897
|
change_events: changeEvents
|
|
892
898
|
};
|
|
@@ -904,7 +910,8 @@ async function createRouter(options) {
|
|
|
904
910
|
router.get("/services/:serviceId/incidents", async (request, response) => {
|
|
905
911
|
try {
|
|
906
912
|
const serviceId = request.params.serviceId || "";
|
|
907
|
-
const
|
|
913
|
+
const account = request.query.account || "";
|
|
914
|
+
const incidents = await getIncidents(serviceId, account);
|
|
908
915
|
const incidentsResponse = {
|
|
909
916
|
incidents
|
|
910
917
|
};
|
|
@@ -922,7 +929,8 @@ async function createRouter(options) {
|
|
|
922
929
|
router.get("/services/:serviceId/standards", async (request, response) => {
|
|
923
930
|
try {
|
|
924
931
|
const serviceId = request.params.serviceId || "";
|
|
925
|
-
const
|
|
932
|
+
const account = request.query.account || "";
|
|
933
|
+
const serviceStandards = await getServiceStandards(serviceId, account);
|
|
926
934
|
const serviceStandardsResponse = {
|
|
927
935
|
standards: serviceStandards
|
|
928
936
|
};
|
|
@@ -940,7 +948,8 @@ async function createRouter(options) {
|
|
|
940
948
|
router.get("/services/:serviceId/metrics", async (request, response) => {
|
|
941
949
|
try {
|
|
942
950
|
const serviceId = request.params.serviceId || "";
|
|
943
|
-
const
|
|
951
|
+
const account = request.query.account || "";
|
|
952
|
+
const metrics = await getServiceMetrics(serviceId, account);
|
|
944
953
|
const metricsResponse = {
|
|
945
954
|
metrics
|
|
946
955
|
};
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/auth/auth.ts","../src/apis/pagerduty.ts","../src/service/router.ts","../src/db/PagerDutyBackendDatabase.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence || !authPersistence.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if(isLegacyConfig){\n if (\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Bearer') &&\n authPersistence.accountTokens.default.authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n // check if accountId is provided\n if (accountId) {\n if (\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Bearer') &&\n authPersistence.accountTokens[accountId].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n\n if (\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Bearer') &&\n authPersistence.accountTokens[defaultFallback].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n logger.info(`tokenInfo: ${JSON.stringify(tokenInfo)}`);\n\n logger.info(`authPersistence.accountTokens: ${JSON.stringify(authPersistence.accountTokens)}`);\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n \n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n accounts?.forEach(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n });\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}","import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\n\nlet apiBaseUrl = 'https://api.pagerduty.com';\nexport function setAPIBaseUrl(url: string): void {\n apiBaseUrl = url;\n}\n\n// Supporting router\n\nasync function getEscalationPolicies(offset: number, limit: number): Promise<[Boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = await response.json() as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(offset: number = 0): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n\n try {\n const res = await getEscalationPolicies(offset, limit);\n const results = res[1];\n\n // if more results exist\n if (res[0]) {\n return results.concat((await getAllEscalationPolicies(offset + limit)));\n }\n\n return results;\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n}\n\nexport async function isEventNoiseReductionEnabled(): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = await response.json() as PagerDutyAbilitiesResponse;\n\n if (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list oncalls. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = await response.json() as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter((oncall) => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => a.user.name > b.user.name ? 1 : -1)\n .map((oncall) => oncall.user);\n\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach((user) => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach((user) => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(integrationKey: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = await response.json() as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n const allServices: PagerDutyService[] = [];\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n response = await fetch(paginatedUrl, options);\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n \n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n\n return allServices;\n}\n\nexport async function getChangeEvents(serviceId: string): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}/change_events?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = await response.json() as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = await response.json() as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(serviceId: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n \n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: body\n };\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n \n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\n","import { AuthService, DiscoveryService, LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { createLegacyAuthAdapters, errorHandler } from '@backstage/backend-common';\nimport { getAllEscalationPolicies, getChangeEvents, getIncidents, getOncallUsers, getServiceById, getServiceByIntegrationKey, setAPIBaseUrl, getServiceStandards, getServiceMetrics, getAllServices } from '../apis/pagerduty';\nimport { HttpError, PagerDutyChangeEventsResponse, PagerDutyIncidentsResponse, PagerDutyOnCallUsersResponse, PagerDutyServiceResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyServicesResponse, PagerDutyEntityMapping, PagerDutyEntityMappingsResponse, PagerDutyService } from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport { PagerDutyBackendStore, RawDbEntityResultRow } from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type { CatalogApi, GetEntitiesResponse } from '@backstage/catalog-client';\n\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n \"pagerduty.com/integration-key\": string;\n \"pagerduty.com/service-id\": string;\n}\n\nexport async function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, { ref: string, name: string }>> {\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = {};\n\n await Promise.all(componentEntities.map(async (entity) => {\n const annotations: Annotations = JSON.parse(JSON.stringify(entity.metadata.annotations));\n const serviceId = annotations['pagerduty.com/service-id'];\n const integrationKey = annotations['pagerduty.com/integration-key'];\n\n if (serviceId !== undefined && serviceId !== \"\") {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n else if (integrationKey !== undefined && integrationKey !== \"\") {\n // get service id from integration key\n const service : PagerDutyService = await getServiceByIntegrationKey(integrationKey);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }));\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<string, {\n ref: string;\n name: string;\n }>,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[]\n ) : Promise<PagerDutyEntityMappingsResponse> {\n\n const result: PagerDutyEntityMappingsResponse = {\n mappings: []\n };\n\n pagerDutyServices.forEach((service) => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (entityMapping.entityRef === \"\" || entityMapping.entityRef === undefined) {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n else {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityRefName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? \"\";\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n } else {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) { return -1; }\n else if (a.serviceName! > b.serviceName!) { return 1; }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get the PagerDuty API Base URL from config\n const baseUrl = config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com';\n setAPIBaseUrl(baseUrl);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response.status(400).json(\"Bad Request: 'service_id' is required\");\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find((mapping) => mapping.serviceId === entity.serviceId);\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== \"\") {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== \"\") {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n }\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);\n\n response.json(result);\n } catch (error) {\n console.log(error);\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity/:type/:namespace/:name', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n\n if (entityType === ''\n || entityNamespace === ''\n || entityName === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n const entityRef = `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(entityRef);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // Add routes\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n try {\n const escalationPolicyList = await getAllEscalationPolicies();\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map((policy) => {\n return {\n label: policy.name,\n value: policy.id,\n };\n });\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string = request.query.escalation_policy_ids as string || '';\n\n if (escalationPolicyId === '') {\n response.status(400).json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n\n if (serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\");\n }\n\n const service = await getServiceById(serviceId);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string = request.query.integration_key as string || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(integrationKey);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services\n }\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/change-events\n router.get('/services/:serviceId/change-events', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n\n const changeEvents = await getChangeEvents(serviceId);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents\n }\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n\n const incidents = await getIncidents(serviceId);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents\n }\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n\n const serviceStandards = await getServiceStandards(serviceId);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards\n }\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n\n const metrics = await getServiceMetrics(serviceId);\n\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics\n };\n\n response.json(metricsResponse);\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}","import { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if(options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n processedDate: new Date(),\n })\n .onConflict('serviceId')\n .merge(['entityRef', 'integrationKey', 'processedDate'])\n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n}","import { AuthService, LoggerService, coreServices, createBackendPlugin } from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { PagerDutyBackendDatabase, PagerDutyBackendStore } from './db';\nimport { CatalogClient } from '@backstage/catalog-client';\n\nclass CatalogFetchApi {\n constructor(\n private readonly logger: LoggerService,\n private readonly auth: AuthService,\n ) {}\n\n async fetch(input: any, init: RequestInit | undefined) : Promise<Response>{\n const request = new Request(input as any, init);\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n request.headers.set('Authorization', `Bearer ${token}`);\n this.logger.debug(`Added token to outgoing request to ${request.url}`);\n return fetch(request);\n }\n}\n\n/** @public */\nexport const pagerDutyPlugin = createBackendPlugin({\n pluginId: 'pagerduty',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n httpRouter: coreServices.httpRouter, \n database: coreServices.database, \n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init({ config, logger, httpRouter, database, discovery, auth }) {\n\n const pagerDutyBackendStore : PagerDutyBackendStore = await PagerDutyBackendDatabase.create(\n await database.getClient(),\n { skipMigrations: true },\n );\n\n httpRouter.use(\n await createRouter({\n config,\n logger,\n store: pagerDutyBackendStore,\n discovery,\n auth,\n catalogApi: new CatalogClient({\n discoveryApi: discovery,\n fetchApi: new CatalogFetchApi(logger, auth),\n })\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/',\n allow: 'unauthenticated',\n });\n },\n });\n }\n});"],"names":["_a","HttpError","fetch","DateTime","createLegacyAuthAdapters","Router","express","errorHandler","resolvePackagePath","uuid","createBackendPlugin","coreServices","CatalogClient"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/auth/auth.ts","../src/apis/pagerduty.ts","../src/service/router.ts","../src/db/PagerDutyBackendDatabase.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence || !authPersistence.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if(isLegacyConfig){\n if (\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Bearer') &&\n authPersistence.accountTokens.default.authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens.default.authToken !== '' &&\n authPersistence.accountTokens.default.authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n // check if accountId is provided\n if (accountId && accountId !== '') {\n if (\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Bearer') &&\n authPersistence.accountTokens[accountId].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[accountId].authToken !== '' &&\n authPersistence.accountTokens[accountId].authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n\n if (\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Bearer') &&\n authPersistence.accountTokens[defaultFallback].authTokenExpiryDate > Date.now()) // case where OAuth token is still valid\n ||\n (authPersistence.accountTokens[defaultFallback].authToken !== '' &&\n authPersistence.accountTokens[defaultFallback].authToken.includes('Token'))) { // case where API token is used\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n logger.info(`tokenInfo: ${JSON.stringify(tokenInfo)}`);\n\n logger.info(`authPersistence.accountTokens: ${JSON.stringify(authPersistence.accountTokens)}`);\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n \n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n accounts?.forEach(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n });\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}","import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\n\nlet apiBaseUrl = 'https://api.pagerduty.com';\nexport function setAPIBaseUrl(url: string): void {\n apiBaseUrl = url;\n}\n\n// Supporting router\n\nasync function getEscalationPolicies(offset: number, limit: number, account?: string): Promise<[Boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = await response.json() as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(offset: number = 0): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n\n try {\n const res = await getEscalationPolicies(offset, limit);\n const results = res[1];\n\n // if more results exist\n if (res[0]) {\n return results.concat((await getAllEscalationPolicies(offset + limit)));\n }\n\n return results;\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = await response.json() as PagerDutyAbilitiesResponse;\n\n if (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string, account?: string): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list oncalls. Rate limit exceeded.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = await response.json() as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter((oncall) => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => a.user.name > b.user.name ? 1 : -1)\n .map((oncall) => oncall.user);\n\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach((user) => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach((user) => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(integrationKey: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = await response.json() as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n const allServices: PagerDutyService[] = [];\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n response = await fetch(paginatedUrl, options);\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n \n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n\n return allServices;\n}\n\nexport async function getChangeEvents(serviceId: string, account?: string): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}/change_events?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = await response.json() as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string, account?: string): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = await response.json() as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(serviceId: string, account?: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string, account?: string): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n \n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n body: body\n };\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n \n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\n","import { AuthService, DiscoveryService, LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { createLegacyAuthAdapters, errorHandler } from '@backstage/backend-common';\nimport { getAllEscalationPolicies, getChangeEvents, getIncidents, getOncallUsers, getServiceById, getServiceByIntegrationKey, setAPIBaseUrl, getServiceStandards, getServiceMetrics, getAllServices } from '../apis/pagerduty';\nimport { HttpError, PagerDutyChangeEventsResponse, PagerDutyIncidentsResponse, PagerDutyOnCallUsersResponse, PagerDutyServiceResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyServicesResponse, PagerDutyEntityMapping, PagerDutyEntityMappingsResponse, PagerDutyService } from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport { PagerDutyBackendStore, RawDbEntityResultRow } from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type { CatalogApi, GetEntitiesResponse } from '@backstage/catalog-client';\n\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n \"pagerduty.com/integration-key\": string;\n \"pagerduty.com/service-id\": string;\n \"pagerduty.com/account\": string;\n}\n\nexport async function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, { ref: string, name: string }>> {\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = {};\n\n await Promise.all(componentEntities.map(async (entity) => {\n const annotations: Annotations = JSON.parse(JSON.stringify(entity.metadata.annotations));\n const serviceId = annotations['pagerduty.com/service-id'];\n const integrationKey = annotations['pagerduty.com/integration-key'];\n const account = annotations['pagerduty.com/account'] ?? \"\";\n\n if (serviceId !== undefined && serviceId !== \"\") {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n else if (integrationKey !== undefined && integrationKey !== \"\") {\n // get service id from integration key\n const service : PagerDutyService = await getServiceByIntegrationKey(integrationKey, account);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }));\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<string, {\n ref: string;\n name: string;\n }>,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[]\n ) : Promise<PagerDutyEntityMappingsResponse> {\n\n const result: PagerDutyEntityMappingsResponse = {\n mappings: []\n };\n\n pagerDutyServices.forEach((service) => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (entityMapping.entityRef === \"\" || entityMapping.entityRef === undefined) {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n else {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityRefName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? \"\";\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n } else {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) { return -1; }\n else if (a.serviceName! > b.serviceName!) { return 1; }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get the PagerDuty API Base URL from config\n const baseUrl = config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com';\n setAPIBaseUrl(baseUrl);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response.status(400).json(\"Bad Request: 'service_id' is required\");\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find((mapping) => mapping.serviceId === entity.serviceId);\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== \"\") {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== \"\") {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n }\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);\n\n response.json(result);\n } catch (error) {\n console.log(error);\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity/:type/:namespace/:name', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n\n if (entityType === ''\n || entityNamespace === ''\n || entityName === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n const entityRef = `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(entityRef);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // Add routes\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n try {\n const escalationPolicyList = await getAllEscalationPolicies();\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map((policy) => {\n return {\n label: policy.name,\n value: policy.id,\n };\n });\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string = request.query.escalation_policy_ids as string || '';\n const account = request.query.account as string || '';\n\n if (escalationPolicyId === '') {\n response.status(400).json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId, account);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\");\n }\n\n const service = await getServiceById(serviceId, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string = request.query.integration_key as string || '';\n const account = request.query.account as string || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(integrationKey, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services\n }\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/change-events\n router.get('/services/:serviceId/change-events', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const changeEvents = await getChangeEvents(serviceId, account);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents\n }\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const incidents = await getIncidents(serviceId, account);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents\n }\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const serviceStandards = await getServiceStandards(serviceId, account);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards\n }\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const metrics = await getServiceMetrics(serviceId, account);\n\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics\n };\n\n response.json(metricsResponse);\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}","import { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if(options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n processedDate: new Date(),\n })\n .onConflict('serviceId')\n .merge(['entityRef', 'integrationKey', 'processedDate'])\n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n}","import { AuthService, LoggerService, coreServices, createBackendPlugin } from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { PagerDutyBackendDatabase, PagerDutyBackendStore } from './db';\nimport { CatalogClient } from '@backstage/catalog-client';\n\nclass CatalogFetchApi {\n constructor(\n private readonly logger: LoggerService,\n private readonly auth: AuthService,\n ) {}\n\n async fetch(input: any, init: RequestInit | undefined) : Promise<Response>{\n const request = new Request(input as any, init);\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n request.headers.set('Authorization', `Bearer ${token}`);\n this.logger.debug(`Added token to outgoing request to ${request.url}`);\n return fetch(request);\n }\n}\n\n/** @public */\nexport const pagerDutyPlugin = createBackendPlugin({\n pluginId: 'pagerduty',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n httpRouter: coreServices.httpRouter, \n database: coreServices.database, \n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init({ config, logger, httpRouter, database, discovery, auth }) {\n\n const pagerDutyBackendStore : PagerDutyBackendStore = await PagerDutyBackendDatabase.create(\n await database.getClient(),\n { skipMigrations: true },\n );\n\n httpRouter.use(\n await createRouter({\n config,\n logger,\n store: pagerDutyBackendStore,\n discovery,\n auth,\n catalogApi: new CatalogClient({\n discoveryApi: discovery,\n fetchApi: new CatalogFetchApi(logger, auth),\n })\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/',\n allow: 'unauthenticated',\n });\n },\n });\n }\n});"],"names":["_a","HttpError","fetch","DateTime","createLegacyAuthAdapters","Router","express","errorHandler","resolvePackagePath","uuid","createBackendPlugin","coreServices","CatalogClient"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,7 @@ interface RouterOptions {
|
|
|
29
29
|
type Annotations = {
|
|
30
30
|
"pagerduty.com/integration-key": string;
|
|
31
31
|
"pagerduty.com/service-id": string;
|
|
32
|
+
"pagerduty.com/account": string;
|
|
32
33
|
};
|
|
33
34
|
declare function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, {
|
|
34
35
|
ref: string;
|