@pagerduty/backstage-plugin-scaffolder-actions 0.2.0-next.9 → 0.2.1
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 +30 -46
- package/dist/index.cjs.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs.js
CHANGED
|
@@ -213,6 +213,18 @@ let isLegacyConfig = false;
|
|
|
213
213
|
let _config;
|
|
214
214
|
let _legacyConfig;
|
|
215
215
|
let _logger;
|
|
216
|
+
function setFallbackEndpointConfig(account) {
|
|
217
|
+
fallbackEndpointConfig = {
|
|
218
|
+
eventsBaseUrl: account.eventsBaseUrl !== void 0 ? account.eventsBaseUrl : "https://events.pagerduty.com/v2",
|
|
219
|
+
apiBaseUrl: account.apiBaseUrl !== void 0 ? account.apiBaseUrl : "https://api.pagerduty.com"
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function insertEndpointConfig(account) {
|
|
223
|
+
EndpointConfig[account.id] = {
|
|
224
|
+
eventsBaseUrl: account.eventsBaseUrl !== void 0 ? account.eventsBaseUrl : "https://events.pagerduty.com/v2",
|
|
225
|
+
apiBaseUrl: account.apiBaseUrl !== void 0 ? account.apiBaseUrl : "https://api.pagerduty.com"
|
|
226
|
+
};
|
|
227
|
+
}
|
|
216
228
|
function loadPagerDutyEndpointsFromConfig({ config, legacyConfig, logger }) {
|
|
217
229
|
_config = config;
|
|
218
230
|
_legacyConfig = legacyConfig;
|
|
@@ -231,15 +243,9 @@ function loadPagerDutyEndpointsFromConfig({ config, legacyConfig, logger }) {
|
|
|
231
243
|
_logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);
|
|
232
244
|
accounts?.forEach((account) => {
|
|
233
245
|
if (account.isDefault) {
|
|
234
|
-
|
|
235
|
-
eventsBaseUrl: account.eventsBaseUrl !== void 0 ? account.eventsBaseUrl : "https://events.pagerduty.com/v2",
|
|
236
|
-
apiBaseUrl: account.apiBaseUrl !== void 0 ? account.apiBaseUrl : "https://api.pagerduty.com"
|
|
237
|
-
};
|
|
246
|
+
setFallbackEndpointConfig(account);
|
|
238
247
|
}
|
|
239
|
-
|
|
240
|
-
eventsBaseUrl: account.eventsBaseUrl !== void 0 ? account.eventsBaseUrl : "https://events.pagerduty.com/v2",
|
|
241
|
-
apiBaseUrl: account.apiBaseUrl !== void 0 ? account.apiBaseUrl : "https://api.pagerduty.com"
|
|
242
|
-
};
|
|
248
|
+
insertEndpointConfig(account);
|
|
243
249
|
});
|
|
244
250
|
}
|
|
245
251
|
} else {
|
|
@@ -260,7 +266,7 @@ function getApiBaseUrl(account) {
|
|
|
260
266
|
}
|
|
261
267
|
return fallbackEndpointConfig.apiBaseUrl;
|
|
262
268
|
}
|
|
263
|
-
async function createService(name, description, escalationPolicyId, account, alertGrouping) {
|
|
269
|
+
async function createService({ name, description, escalationPolicyId, account, alertGrouping }) {
|
|
264
270
|
let alertGroupingParameters = "null";
|
|
265
271
|
let response;
|
|
266
272
|
const apiBaseUrl = getApiBaseUrl(account);
|
|
@@ -373,21 +379,16 @@ async function createService(name, description, escalationPolicyId, account, ale
|
|
|
373
379
|
try {
|
|
374
380
|
response = await fetch__default.default(baseUrl, options);
|
|
375
381
|
} catch (error) {
|
|
376
|
-
_logger.error(`Failed to create service: ${error}`);
|
|
377
382
|
throw new Error(`Failed to create service: ${error}`);
|
|
378
383
|
}
|
|
379
384
|
switch (response.status) {
|
|
380
385
|
case 400:
|
|
381
|
-
_logger.error(`Failed to create service. Caller provided invalid arguments.`);
|
|
382
386
|
throw new Error(`Failed to create service. Caller provided invalid arguments.`);
|
|
383
387
|
case 401:
|
|
384
|
-
_logger.error(`Failed to create service. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
385
388
|
throw new Error(`Failed to create service. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
386
389
|
case 402:
|
|
387
|
-
_logger.error(`Failed to create service. Account does not have the abilities to perform the action.`);
|
|
388
390
|
throw new Error(`Failed to create service. Account does not have the abilities to perform the action.`);
|
|
389
391
|
case 403:
|
|
390
|
-
_logger.error(`Failed to create service. Caller is not authorized to view the requested resource.`);
|
|
391
392
|
throw new Error(`Failed to create service. Caller is not authorized to view the requested resource.`);
|
|
392
393
|
}
|
|
393
394
|
let result;
|
|
@@ -400,11 +401,10 @@ async function createService(name, description, escalationPolicyId, account, ale
|
|
|
400
401
|
};
|
|
401
402
|
return createServiceResult;
|
|
402
403
|
} catch (error) {
|
|
403
|
-
_logger.error(`Failed to parse service information: ${error}`);
|
|
404
404
|
throw new Error(`Failed to parse service information: ${error}`);
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
|
-
async function createServiceIntegration(serviceId, vendorId, account) {
|
|
407
|
+
async function createServiceIntegration({ serviceId, vendorId, account }) {
|
|
408
408
|
let response;
|
|
409
409
|
const apiBaseUrl = getApiBaseUrl(account);
|
|
410
410
|
const baseUrl = `${apiBaseUrl}/services`;
|
|
@@ -433,21 +433,16 @@ async function createServiceIntegration(serviceId, vendorId, account) {
|
|
|
433
433
|
try {
|
|
434
434
|
response = await fetch__default.default(`${baseUrl}/${serviceId}/integrations`, options);
|
|
435
435
|
} catch (error) {
|
|
436
|
-
|
|
437
|
-
throw new Error(`Failed to create service: ${error}`);
|
|
436
|
+
throw new Error(`Failed to create service integration: ${error}`);
|
|
438
437
|
}
|
|
439
438
|
switch (response.status) {
|
|
440
439
|
case 400:
|
|
441
|
-
_logger.error(`Failed to create service integration. Caller provided invalid arguments.`);
|
|
442
440
|
throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);
|
|
443
441
|
case 401:
|
|
444
|
-
_logger.error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
445
442
|
throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
446
443
|
case 403:
|
|
447
|
-
_logger.error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);
|
|
448
444
|
throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);
|
|
449
445
|
case 429:
|
|
450
|
-
_logger.error(`Failed to create service integration. Rate limit exceeded.`);
|
|
451
446
|
throw new Error(`Failed to create service integration. Rate limit exceeded.`);
|
|
452
447
|
}
|
|
453
448
|
let result;
|
|
@@ -455,7 +450,6 @@ async function createServiceIntegration(serviceId, vendorId, account) {
|
|
|
455
450
|
result = await response.json();
|
|
456
451
|
return result.integration.integration_key ?? "";
|
|
457
452
|
} catch (error) {
|
|
458
|
-
_logger.error(`Failed to parse service information: ${error}`);
|
|
459
453
|
throw new Error(`Failed to parse service information: ${error}`);
|
|
460
454
|
}
|
|
461
455
|
}
|
|
@@ -474,18 +468,14 @@ async function isEventNoiseReductionEnabled(account) {
|
|
|
474
468
|
try {
|
|
475
469
|
response = await fetch__default.default(`${baseUrl}/abilities`, options);
|
|
476
470
|
} catch (error) {
|
|
477
|
-
_logger.error(`Failed to read abilities: ${error}`);
|
|
478
471
|
throw new Error(`Failed to read abilities: ${error}`);
|
|
479
472
|
}
|
|
480
473
|
switch (response.status) {
|
|
481
474
|
case 401:
|
|
482
|
-
_logger.error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
483
475
|
throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
484
476
|
case 403:
|
|
485
|
-
_logger.error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);
|
|
486
477
|
throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);
|
|
487
478
|
case 429:
|
|
488
|
-
_logger.error(`Failed to read abilities. Rate limit exceeded.`);
|
|
489
479
|
throw new Error(`Failed to read abilities. Rate limit exceeded.`);
|
|
490
480
|
}
|
|
491
481
|
let result;
|
|
@@ -496,7 +486,6 @@ async function isEventNoiseReductionEnabled(account) {
|
|
|
496
486
|
}
|
|
497
487
|
return false;
|
|
498
488
|
} catch (error) {
|
|
499
|
-
_logger.error(`Failed to parse abilities information: ${error}`);
|
|
500
489
|
throw new Error(`Failed to parse abilities information: ${error}`);
|
|
501
490
|
}
|
|
502
491
|
}
|
|
@@ -539,21 +528,16 @@ async function getEscalationPolicies(offset, limit, account) {
|
|
|
539
528
|
try {
|
|
540
529
|
response = await fetch__default.default(`${baseUrl}?${params}`, options);
|
|
541
530
|
} catch (error) {
|
|
542
|
-
_logger.error(`Failed to retrieve escalation policies: ${error}`);
|
|
543
531
|
throw new Error(`Failed to retrieve escalation policies: ${error}`);
|
|
544
532
|
}
|
|
545
533
|
switch (response.status) {
|
|
546
534
|
case 400:
|
|
547
|
-
_logger.error(`Failed to list escalation policies. Caller provided invalid arguments.`);
|
|
548
535
|
throw new backstagePluginCommon.HttpError("Failed to list escalation policies. Caller provided invalid arguments.", 400);
|
|
549
536
|
case 401:
|
|
550
|
-
_logger.error(`Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.`);
|
|
551
537
|
throw new backstagePluginCommon.HttpError("Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.", 401);
|
|
552
538
|
case 403:
|
|
553
|
-
_logger.error(`Failed to list escalation policies. Caller is not authorized to view the requested resource.`);
|
|
554
539
|
throw new backstagePluginCommon.HttpError("Failed to list escalation policies. Caller is not authorized to view the requested resource.", 403);
|
|
555
540
|
case 429:
|
|
556
|
-
_logger.error(`Failed to list escalation policies. Rate limit exceeded.`);
|
|
557
541
|
throw new backstagePluginCommon.HttpError("Failed to list escalation policies. Rate limit exceeded.", 429);
|
|
558
542
|
}
|
|
559
543
|
let result;
|
|
@@ -561,7 +545,6 @@ async function getEscalationPolicies(offset, limit, account) {
|
|
|
561
545
|
result = await response.json();
|
|
562
546
|
return [result.more ?? false, result.escalation_policies];
|
|
563
547
|
} catch (error) {
|
|
564
|
-
_logger.error(`Failed to parse escalation policy information: ${error}`);
|
|
565
548
|
throw new backstagePluginCommon.HttpError(`Failed to parse escalation policy information: ${error}`, 500);
|
|
566
549
|
}
|
|
567
550
|
}
|
|
@@ -635,25 +618,26 @@ const createPagerDutyServiceAction = (props) => {
|
|
|
635
618
|
logger: loggerService
|
|
636
619
|
});
|
|
637
620
|
const account = await getAccountByEscalationPolicyId(ctx.input.escalationPolicyId);
|
|
638
|
-
loggerService.info(`Creating service '${ctx.input.name}' in account '${account}'
|
|
639
|
-
const service = await createService(
|
|
640
|
-
ctx.input.name,
|
|
641
|
-
ctx.input.description,
|
|
642
|
-
ctx.input.escalationPolicyId,
|
|
621
|
+
loggerService.info(`Creating service '${ctx.input.name}' in account '${account}'.`);
|
|
622
|
+
const service = await createService({
|
|
623
|
+
name: ctx.input.name,
|
|
624
|
+
description: ctx.input.description,
|
|
625
|
+
escalationPolicyId: ctx.input.escalationPolicyId,
|
|
643
626
|
account,
|
|
644
|
-
ctx.input.alertGrouping
|
|
645
|
-
);
|
|
627
|
+
alertGrouping: ctx.input.alertGrouping
|
|
628
|
+
});
|
|
646
629
|
loggerService.info(`Service '${ctx.input.name}' created successfully!`);
|
|
647
630
|
loggerService.info(`Alert grouping set to '${service.alertGrouping}'`);
|
|
648
631
|
ctx.output("serviceUrl", service.url);
|
|
649
632
|
ctx.output("serviceId", service.id);
|
|
633
|
+
ctx.output("account", account);
|
|
650
634
|
const backstageIntegrationId = "PRO19CT";
|
|
651
|
-
loggerService.info(`Creating Backstage Integration for service '${ctx.input.name}' in account '${account}'
|
|
652
|
-
const integrationKey = await createServiceIntegration(
|
|
653
|
-
service.id,
|
|
654
|
-
backstageIntegrationId,
|
|
635
|
+
loggerService.info(`Creating Backstage Integration for service '${ctx.input.name}' in account '${account}'.`);
|
|
636
|
+
const integrationKey = await createServiceIntegration({
|
|
637
|
+
serviceId: service.id,
|
|
638
|
+
vendorId: backstageIntegrationId,
|
|
655
639
|
account
|
|
656
|
-
);
|
|
640
|
+
});
|
|
657
641
|
loggerService.info(`Backstage Integration for service '${ctx.input.name}' created successfully!`);
|
|
658
642
|
ctx.output("integrationKey", integrationKey);
|
|
659
643
|
} catch (error) {
|
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/actions/custom.ts","../src/module.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\nimport { Config } from \"@backstage/config\";\n\nexport type LoadAuthConfigProps = {\n config: RootConfigService | undefined;\n legacyConfig: Config;\n logger: LoggerService;\n}\n\ntype JsonValue = boolean | number | string | null | JsonArray | JsonObject;\n\ninterface JsonObject {\n [x: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\nlet _config: RootConfigService | undefined;\nlet _legacyConfig: Config;\nlet _logger: LoggerService;\n\nexport async function getAuthToken(accountId?: string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n _logger.debug('Auth config not loaded. Loading auth config...');\n await loadAuthConfig({\n config: _config,\n legacyConfig: _legacyConfig,\n logger: _logger\n });\n }\n\n if (isLegacyConfig) {\n _logger.debug('Using legacy config for auth token retrieval.');\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\n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n _logger.debug('Using new config for auth token retrieval.');\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\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n _logger.debug('No account ID provided. Using default account token.');\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\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig({ config, legacyConfig, logger }: LoadAuthConfigProps) {\n try {\n const defaultAccountId = 'default';\n\n // set config and logger\n _config = config;\n _legacyConfig = legacyConfig;\n _logger = logger;\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if (!readOptionalObject('pagerDuty.accounts')) {\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!readOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!readOptionalObject('pagerDuty.oauth')) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!readOptionalString('pagerDuty.oauth.clientId') || !readOptionalString('pagerDuty.oauth.clientSecret') || !readOptionalString('pagerDuty.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 readString('pagerDuty.oauth.clientId'),\n readString('pagerDuty.oauth.clientSecret'),\n readString('pagerDuty.oauth.subDomain'),\n readOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.debug('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${readOptionalString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.debug('PagerDuty API token loaded successfully.');\n }\n }\n else { // new accounts config is present\n logger.debug('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n\n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n if (accounts && accounts?.length === 1) {\n logger.debug('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n await Promise.all(\n accounts?.map(async account => {\n const maskedAccountId = maskString(account.id);\n\n if (account.isDefault && !authPersistence.defaultAccount) {\n logger.debug(`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.debug(`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.debug(`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\nfunction readOptionalString(key: string): string | undefined {\n if (!_config) {\n return _legacyConfig.getOptionalString(key);\n }\n\n return _config.getOptionalString(key);\n\n}\n\nfunction readOptionalObject(key: string): JsonValue | undefined {\n if (!_config) {\n return _legacyConfig.getOptional(key);\n }\n\n return _config.getOptional(key);\n}\n\nfunction readString(key: string): string {\n if (!_config) {\n return _legacyConfig.getString(key);\n }\n\n return _config.getString(key);\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';\nimport {\n CreateServiceResponse,\n} from '../types';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyIntegrationResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyAccountConfig,\n PagerDutyEscalationPolicy,\n HttpError,\n PagerDutyEscalationPoliciesResponse,\n} from '@pagerduty/backstage-plugin-common';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\n\ntype JsonValue = boolean | number | string | null | JsonArray | JsonObject;\n\ninterface JsonObject {\n [x: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\nexport type LoadEndpointConfigProps = {\n config: RootConfigService | undefined;\n legacyConfig: Config;\n logger: LoggerService;\n}\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string\n}\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nlet _config: RootConfigService | undefined;\nlet _legacyConfig: Config;\nlet _logger: LoggerService;\n\nexport function loadPagerDutyEndpointsFromConfig({config, legacyConfig, logger} : LoadEndpointConfigProps) {\n\n // set config and logger\n _config = config;\n _legacyConfig = legacyConfig;\n _logger = logger;\n\n if (readOptionalObject('pagerDuty.accounts')) {\n _logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n if (accounts?.length === 1) {\n _logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n _logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl !== undefined ? account.eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl !== undefined ? account.apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl !== undefined ? account.eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl !== undefined ? account.apiBaseUrl : 'https://api.pagerduty.com'\n };\n });\n }\n }\n else {\n _logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: readOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? readString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: readOptionalString('pagerDuty.apiBaseUrl') !== undefined ? readString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\n };\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\n// Supporting custom actions\nexport async function createService(name: string, description: string, escalationPolicyId: string, account?: string, alertGrouping?: string): Promise<CreateServiceResponse> {\n let alertGroupingParameters = \"null\";\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n // Set default body\n let body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n alert_creation: 'create_alerts_and_incidents',\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n },\n });\n\n // Override body if alert grouping is enabled and passed as parameter\n if (await isEventNoiseReductionEnabled(account) && alertGrouping !== undefined) {\n alertGroupingParameters = alertGrouping;\n\n switch (alertGroupingParameters) {\n case \"intelligent\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n case \"time\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n config: {\n timeout: 0,\n },\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n case \"content_based\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n config: {\n aggregate: 'all',\n time_window: 0,\n fields: [\n 'source',\n 'summary',\n ],\n },\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n default:\n break;\n }\n }\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: body,\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n _logger.error(`Failed to create service: ${error}`);\n throw new Error(`Failed to create service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n _logger.error(`Failed to create service. Caller provided invalid arguments.`);\n throw new Error(`Failed to create service. Caller provided invalid arguments.`);\n case 401:\n _logger.error(`Failed to create service. Caller did not supply credentials or did not provide the correct credentials.`);\n throw new Error(`Failed to create service. Caller did not supply credentials or did not provide the correct credentials.`);\n case 402:\n _logger.error(`Failed to create service. Account does not have the abilities to perform the action.`);\n throw new Error(`Failed to create service. Account does not have the abilities to perform the action.`);\n case 403:\n _logger.error(`Failed to create service. Caller is not authorized to view the requested resource.`);\n throw new Error(`Failed to create service. Caller is not authorized to view the requested resource.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n const createServiceResult: CreateServiceResponse = {\n url: result.service.html_url,\n id: result.service.id,\n alertGrouping: alertGroupingParameters,\n };\n\n return createServiceResult;\n\n } catch (error) {\n _logger.error(`Failed to parse service information: ${error}`);\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function createServiceIntegration(serviceId: string, vendorId: string, account?: string): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n }\n }\n }),\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}/integrations`, options);\n } catch (error) {\n _logger.error(`Failed to create service integration: ${error}`);\n throw new Error(`Failed to create service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n _logger.error(`Failed to create service integration. Caller provided invalid arguments.`);\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n _logger.error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n _logger.error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n _logger.error(`Failed to create service integration. Rate limit exceeded.`);\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = await response.json() as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n\n } catch (error) {\n _logger.error(`Failed to parse service information: ${error}`);\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = getApiBaseUrl(account);\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\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 _logger.error(`Failed to read abilities: ${error}`);\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n switch (response.status) {\n case 401:\n _logger.error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n _logger.error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\n case 429:\n _logger.error(`Failed to read abilities. Rate limit exceeded.`);\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 _logger.error(`Failed to parse abilities information: ${error}`);\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nfunction readOptionalString(key: string): string | undefined {\n if (!_config) {\n return _legacyConfig.getOptionalString(key);\n }\n\n return _config.getOptionalString(key);\n\n}\n\nfunction readOptionalObject(key: string): JsonValue | undefined {\n if (!_config) {\n return _legacyConfig.getOptional(key);\n }\n\n return _config.getOptional(key);\n}\n\nfunction readString(key: string): string {\n if (!_config) {\n return _legacyConfig.getString(key);\n }\n\n return _config.getString(key);\n}\n\nexport async function getAccountByEscalationPolicyId(escalationPolicyId: string): Promise<string> {\n const escalationPoliciesList : PagerDutyEscalationPolicy[] = await getAllEscalationPolicies();\n\n // find escalation policy by id and return account\n const escalationPolicy = escalationPoliciesList.find((policy) => policy.id === escalationPolicyId);\n \n return escalationPolicy?.account ?? ''; \n}\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\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetch(`${baseUrl}?${params}`, options);\n } catch (error) {\n _logger.error(`Failed to retrieve escalation policies: ${error}`);\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n _logger.error(`Failed to list escalation policies. Caller provided invalid arguments.`);\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n _logger.error(`Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.`)\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 _logger.error(`Failed to list escalation policies. Caller is not authorized to view the requested resource.`);\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n _logger.error(`Failed to list escalation policies. Rate limit exceeded.`);\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 _logger.error(`Failed to parse escalation policy information: ${error}`);\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async (account) => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach((policy) => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n","import { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { z } from 'zod';\nimport * as api from '../apis/pagerduty';\nimport { CreateServiceResponse } from '../types';\nimport { loadAuthConfig } from '../auth/auth';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { Config } from \"@backstage/config\";\nimport { loadBackendConfig } from \"@backstage/backend-common\";\nimport { loadPagerDutyEndpointsFromConfig, getAccountByEscalationPolicyId } from '../apis/pagerduty';\n\nexport type CreatePagerDutyServiceActionProps = {\n config: RootConfigService;\n logger: LoggerService;\n};\n\nexport const createPagerDutyServiceAction = (props? : CreatePagerDutyServiceActionProps) => {\n\n let loggerService: LoggerService;\n\n return createTemplateAction<{\n name: string;\n description: string;\n escalationPolicyId: string;\n alertGrouping?: string;\n }>({\n id: 'pagerduty:service:create',\n schema: {\n input: z.object({\n name: z.string().min(1, \"name is required\").describe('Name of the service'),\n description: z.string().min(1, \"description is required\").describe('Description of the service'),\n escalationPolicyId: z.string().min(1, \"Escalation policy is required\").describe('Escalation policy ID'),\n alertGrouping: z.string().optional().describe('Alert grouping parameters'),\n }),\n output: z.object({\n serviceUrl: z.string().describe('PagerDuty Service URL'),\n serviceId: z.string().describe('PagerDuty Service ID'),\n integrationKey: z.string().describe('Backstage Integration Key'),\n }),\n },\n\n async handler(ctx) {\n try { \n loggerService = props?.logger ? props.logger : ctx.logger;\n const configService = props?.config;\n\n const legacyConfig: Config = await loadBackendConfig({\n logger: loggerService,\n argv: [],\n });\n\n // Load the auth configuration\n await loadAuthConfig({\n config: configService, \n legacyConfig: legacyConfig,\n logger: loggerService,\n });\n\n // Load endpoint configuration\n loadPagerDutyEndpointsFromConfig({\n config: configService,\n legacyConfig: legacyConfig,\n logger: loggerService,\n });\n\n const account: string = await getAccountByEscalationPolicyId(ctx.input.escalationPolicyId);\n\n // Create service in PagerDuty\n loggerService.info(`Creating service '${ctx.input.name}' in account '${account}'...`);\n const service: CreateServiceResponse = await api.createService(\n ctx.input.name, \n ctx.input.description, \n ctx.input.escalationPolicyId, \n account,\n ctx.input.alertGrouping);\n loggerService.info(`Service '${ctx.input.name}' created successfully!`);\n loggerService.info(`Alert grouping set to '${service.alertGrouping}'`);\n\n ctx.output('serviceUrl', service.url);\n ctx.output('serviceId', service.id);\n\n // Create Backstage Integration in PagerDuty service\n const backstageIntegrationId = 'PRO19CT'; // ID for Backstage integration\n\n loggerService.info(`Creating Backstage Integration for service '${ctx.input.name}' in account '${account}'...`);\n\n const integrationKey = await api.createServiceIntegration(\n service.id, \n backstageIntegrationId,\n account\n );\n loggerService.info(`Backstage Integration for service '${ctx.input.name}' created successfully!`);\n\n ctx.output('integrationKey', integrationKey);\n } catch (error) {\n loggerService.error(`${error}`);\n }\n\n }\n });\n};\n","import { coreServices, createBackendModule } from \"@backstage/backend-plugin-api\";\nimport { scaffolderActionsExtensionPoint } from \"@backstage/plugin-scaffolder-node/alpha\";\nimport { createPagerDutyServiceAction } from \"./actions/custom\";\n\n\n/** @public */\nexport const pagerDutyScaffolderActions = createBackendModule({\n pluginId: 'scaffolder',\n moduleId: 'pagerduty-actions',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scaffolder: scaffolderActionsExtensionPoint,\n },\n async init({ config, logger, scaffolder }) {\n\n scaffolder.addActions(createPagerDutyServiceAction({\n config,\n logger\n }));\n },\n });\n },\n});\n"],"names":["isLegacyConfig","_config","_legacyConfig","_logger","readOptionalObject","readOptionalString","readString","HttpError","fetch","createTemplateAction","z","loadBackendConfig","api.createService","api.createServiceIntegration","createBackendModule","coreServices","scaffolderActionsExtensionPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/auth/auth.ts","../src/apis/pagerduty.ts","../src/actions/custom.ts","../src/module.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\nimport { Config } from \"@backstage/config\";\n\nexport type LoadAuthConfigProps = {\n config: RootConfigService | undefined;\n legacyConfig: Config;\n logger: LoggerService;\n}\n\ntype JsonValue = boolean | number | string | null | JsonArray | JsonObject;\n\ninterface JsonObject {\n [x: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\nlet _config: RootConfigService | undefined;\nlet _legacyConfig: Config;\nlet _logger: LoggerService;\n\nexport async function getAuthToken(accountId?: string): Promise<string> {\n\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n _logger.debug('Auth config not loaded. Loading auth config...');\n await loadAuthConfig({\n config: _config,\n legacyConfig: _legacyConfig,\n logger: _logger\n });\n }\n\n if (isLegacyConfig) {\n _logger.debug('Using legacy config for auth token retrieval.');\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\n return authPersistence.accountTokens.default.authToken;\n }\n }\n else {\n _logger.debug('Using new config for auth token retrieval.');\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\n return authPersistence.accountTokens[accountId].authToken;\n }\n }\n else { // return default account token if accountId is not provided\n const defaultFallback = authPersistence.defaultAccount ?? \"\";\n _logger.debug('No account ID provided. Using default account token.');\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\n return authPersistence.accountTokens[defaultFallback].authToken;\n }\n }\n }\n\n return '';\n}\n\nexport async function loadAuthConfig({ config, legacyConfig, logger }: LoadAuthConfigProps) {\n try {\n const defaultAccountId = 'default';\n\n // set config and logger\n _config = config;\n _legacyConfig = legacyConfig;\n _logger = logger;\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if (!readOptionalObject('pagerDuty.accounts')) {\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!readOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!readOptionalObject('pagerDuty.oauth')) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!readOptionalString('pagerDuty.oauth.clientId') || !readOptionalString('pagerDuty.oauth.clientSecret') || !readOptionalString('pagerDuty.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 readString('pagerDuty.oauth.clientId'),\n readString('pagerDuty.oauth.clientSecret'),\n readString('pagerDuty.oauth.subDomain'),\n readOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.debug('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${readOptionalString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.debug('PagerDuty API token loaded successfully.');\n }\n }\n else { // new accounts config is present\n logger.debug('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n\n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n if (accounts && accounts?.length === 1) {\n logger.debug('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n await Promise.all(\n accounts?.map(async account => {\n const maskedAccountId = maskString(account.id);\n\n if (account.isDefault && !authPersistence.defaultAccount) {\n logger.debug(`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.debug(`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.debug(`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\nfunction readOptionalString(key: string): string | undefined {\n if (!_config) {\n return _legacyConfig.getOptionalString(key);\n }\n\n return _config.getOptionalString(key);\n\n}\n\nfunction readOptionalObject(key: string): JsonValue | undefined {\n if (!_config) {\n return _legacyConfig.getOptional(key);\n }\n\n return _config.getOptional(key);\n}\n\nfunction readString(key: string): string {\n if (!_config) {\n return _legacyConfig.getString(key);\n }\n\n return _config.getString(key);\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';\nimport {\n CreateServiceResponse,\n} from '../types';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyIntegrationResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyAccountConfig,\n PagerDutyEscalationPolicy,\n HttpError,\n PagerDutyEscalationPoliciesResponse,\n} from '@pagerduty/backstage-plugin-common';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\n\ntype JsonValue = boolean | number | string | null | JsonArray | JsonObject;\n\ninterface JsonObject {\n [x: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\nexport type LoadEndpointConfigProps = {\n config: RootConfigService | undefined;\n legacyConfig: Config;\n logger: LoggerService;\n}\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string\n}\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nlet _config: RootConfigService | undefined;\nlet _legacyConfig: Config;\nlet _logger: LoggerService;\n\nexport function setFallbackEndpointConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl !== undefined ? account.eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl !== undefined ? account.apiBaseUrl : 'https://api.pagerduty.com'\n };\n}\n\nexport function insertEndpointConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl !== undefined ? account.eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl !== undefined ? account.apiBaseUrl : 'https://api.pagerduty.com'\n };\n}\n\nexport function loadPagerDutyEndpointsFromConfig({config, legacyConfig, logger} : LoadEndpointConfigProps) {\n\n // set config and logger\n _config = config;\n _legacyConfig = legacyConfig;\n _logger = logger;\n\n if (readOptionalObject('pagerDuty.accounts')) {\n _logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n if (accounts?.length === 1) {\n _logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n _logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n }\n else {\n _logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: readOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? readString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: readOptionalString('pagerDuty.apiBaseUrl') !== undefined ? readString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\n };\n }\n}\n\nexport function getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\nexport type CreateServiceProps = {\n name: string;\n description: string;\n escalationPolicyId: string;\n account?: string;\n alertGrouping?: string;\n}\n\n// Supporting custom actions\nexport async function createService({name, description, escalationPolicyId, account, alertGrouping} : CreateServiceProps): Promise<CreateServiceResponse> {\n let alertGroupingParameters = \"null\";\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n // Set default body\n let body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n alert_creation: 'create_alerts_and_incidents',\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n },\n });\n\n // Override body if alert grouping is enabled and passed as parameter\n if (await isEventNoiseReductionEnabled(account) && alertGrouping !== undefined) {\n alertGroupingParameters = alertGrouping;\n\n switch (alertGroupingParameters) {\n case \"intelligent\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n case \"time\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n config: {\n timeout: 0,\n },\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n case \"content_based\":\n body = JSON.stringify({\n service: {\n type: 'service',\n name: name,\n description: description,\n escalation_policy: {\n id: escalationPolicyId,\n type: 'escalation_policy_reference',\n },\n alert_creation: 'create_alerts_and_incidents',\n alert_grouping_parameters: {\n type: alertGroupingParameters,\n config: {\n aggregate: 'all',\n time_window: 0,\n fields: [\n 'source',\n 'summary',\n ],\n },\n },\n auto_pause_notifications_parameters: {\n enabled: true,\n timeout: 300,\n },\n },\n });\n break;\n default:\n break;\n }\n }\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: body,\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to create service: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service. Caller did not supply credentials or did not provide the correct credentials.`);\n case 402:\n throw new Error(`Failed to create service. Account does not have the abilities to perform the action.`);\n case 403:\n throw new Error(`Failed to create service. Caller is not authorized to view the requested resource.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = await response.json() as PagerDutyServiceResponse;\n\n const createServiceResult: CreateServiceResponse = {\n url: result.service.html_url,\n id: result.service.id,\n alertGrouping: alertGroupingParameters,\n };\n\n return createServiceResult;\n\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n}\n\nexport async function createServiceIntegration({serviceId, vendorId, account} : CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n }\n }\n }),\n headers: {\n Authorization: token,\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetch(`${baseUrl}/${serviceId}/integrations`, options);\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = await response.json() as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = getApiBaseUrl(account);\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\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\nfunction readOptionalString(key: string): string | undefined {\n if (!_config) {\n return _legacyConfig.getOptionalString(key);\n }\n\n return _config.getOptionalString(key);\n}\n\nfunction readOptionalObject(key: string): JsonValue | undefined {\n if (!_config) {\n return _legacyConfig.getOptional(key);\n }\n\n return _config.getOptional(key);\n}\n\nfunction readString(key: string): string {\n if (!_config) {\n return _legacyConfig.getString(key);\n }\n\n return _config.getString(key);\n}\n\nexport async function getAccountByEscalationPolicyId(escalationPolicyId: string): Promise<string> {\n const escalationPoliciesList : PagerDutyEscalationPolicy[] = await getAllEscalationPolicies();\n\n // find escalation policy by id and return account\n const escalationPolicy = escalationPoliciesList.find((policy) => policy.id === escalationPolicyId);\n \n return escalationPolicy?.account ?? ''; \n}\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\n const apiBaseUrl = getApiBaseUrl(account);\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(): Promise<PagerDutyEscalationPolicy[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async (account) => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach((policy) => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n","import { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { z } from 'zod';\nimport * as api from '../apis/pagerduty';\nimport { CreateServiceResponse } from '../types';\nimport { loadAuthConfig } from '../auth/auth';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\nimport { Config } from \"@backstage/config\";\nimport { loadBackendConfig } from \"@backstage/backend-common\";\nimport { loadPagerDutyEndpointsFromConfig, getAccountByEscalationPolicyId } from '../apis/pagerduty';\n\nexport type CreatePagerDutyServiceActionProps = {\n config: RootConfigService;\n logger: LoggerService;\n};\n\nexport const createPagerDutyServiceAction = (props?: CreatePagerDutyServiceActionProps) => {\n\n let loggerService: LoggerService;\n\n return createTemplateAction<{\n name: string;\n description: string;\n escalationPolicyId: string;\n alertGrouping?: string;\n }>({\n id: 'pagerduty:service:create',\n schema: {\n input: z.object({\n name: z.string().min(1, \"name is required\").describe('Name of the service'),\n description: z.string().min(1, \"description is required\").describe('Description of the service'),\n escalationPolicyId: z.string().min(1, \"Escalation policy is required\").describe('Escalation policy ID'),\n alertGrouping: z.string().optional().describe('Alert grouping parameters'),\n }),\n output: z.object({\n serviceUrl: z.string().describe('PagerDuty Service URL'),\n serviceId: z.string().describe('PagerDuty Service ID'),\n integrationKey: z.string().describe('Backstage Integration Key'),\n }),\n },\n\n async handler(ctx) {\n try {\n loggerService = props?.logger ? props.logger : ctx.logger;\n const configService = props?.config;\n\n const legacyConfig: Config = await loadBackendConfig({\n logger: loggerService,\n argv: [],\n });\n\n // Load the auth configuration\n await loadAuthConfig({\n config: configService,\n legacyConfig: legacyConfig,\n logger: loggerService,\n });\n\n // Load endpoint configuration\n loadPagerDutyEndpointsFromConfig({\n config: configService,\n legacyConfig: legacyConfig,\n logger: loggerService,\n });\n\n const account: string = await getAccountByEscalationPolicyId(ctx.input.escalationPolicyId);\n\n // Create service in PagerDuty\n loggerService.info(`Creating service '${ctx.input.name}' in account '${account}'.`);\n const service: CreateServiceResponse = await api.createService({\n name: ctx.input.name,\n description: ctx.input.description,\n escalationPolicyId: ctx.input.escalationPolicyId,\n account: account,\n alertGrouping: ctx.input.alertGrouping\n });\n loggerService.info(`Service '${ctx.input.name}' created successfully!`);\n loggerService.info(`Alert grouping set to '${service.alertGrouping}'`);\n\n ctx.output('serviceUrl', service.url);\n ctx.output('serviceId', service.id);\n ctx.output('account', account);\n\n // Create Backstage Integration in PagerDuty service\n const backstageIntegrationId = 'PRO19CT'; // ID for Backstage integration\n\n loggerService.info(`Creating Backstage Integration for service '${ctx.input.name}' in account '${account}'.`);\n\n const integrationKey = await api.createServiceIntegration({\n serviceId: service.id,\n vendorId: backstageIntegrationId,\n account\n });\n loggerService.info(`Backstage Integration for service '${ctx.input.name}' created successfully!`);\n\n ctx.output('integrationKey', integrationKey);\n } catch (error) {\n loggerService.error(`${error}`);\n }\n\n }\n });\n};\n","import { coreServices, createBackendModule } from \"@backstage/backend-plugin-api\";\nimport { scaffolderActionsExtensionPoint } from \"@backstage/plugin-scaffolder-node/alpha\";\nimport { createPagerDutyServiceAction } from \"./actions/custom\";\n\n\n/** @public */\nexport const pagerDutyScaffolderActions = createBackendModule({\n pluginId: 'scaffolder',\n moduleId: 'pagerduty-actions',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scaffolder: scaffolderActionsExtensionPoint,\n },\n async init({ config, logger, scaffolder }) {\n\n scaffolder.addActions(createPagerDutyServiceAction({\n config,\n logger\n }));\n },\n });\n },\n});\n"],"names":["isLegacyConfig","_config","_legacyConfig","_logger","readOptionalObject","readOptionalString","readString","HttpError","fetch","createTemplateAction","z","loadBackendConfig","api.createService","api.createServiceIntegration","createBackendModule","coreServices","scaffolderActionsExtensionPoint"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin-scaffolder-actions",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@backstage/cli": "^0.26.10",
|
|
49
|
+
"@types/jest": "^29.5.12",
|
|
49
50
|
"@types/node": "^20.9.2",
|
|
50
51
|
"@types/node-fetch": "2.6.11",
|
|
51
52
|
"@types/supertest": "^2.0.12",
|