@pagerduty/backstage-plugin-scaffolder-actions 0.2.0-next.3 → 0.2.0-next.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -16,15 +16,15 @@ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch$1);
16
16
 
17
17
  let authPersistence;
18
18
  let isLegacyConfig$1 = false;
19
- let _config;
20
- let _legacyConfig;
21
- let _logger;
19
+ let _config$1;
20
+ let _legacyConfig$1;
21
+ let _logger$1;
22
22
  async function getAuthToken(accountId) {
23
23
  if (!authPersistence?.accountTokens) {
24
24
  await loadAuthConfig({
25
- config: _config,
26
- legacyConfig: _legacyConfig,
27
- logger: _logger
25
+ config: _config$1,
26
+ legacyConfig: _legacyConfig$1,
27
+ logger: _logger$1
28
28
  });
29
29
  }
30
30
  if (isLegacyConfig$1) {
@@ -48,34 +48,34 @@ async function getAuthToken(accountId) {
48
48
  async function loadAuthConfig({ config, legacyConfig, logger }) {
49
49
  try {
50
50
  const defaultAccountId = "default";
51
- _config = config;
52
- _legacyConfig = legacyConfig;
53
- _logger = logger;
51
+ _config$1 = config;
52
+ _legacyConfig$1 = legacyConfig;
53
+ _logger$1 = logger;
54
54
  authPersistence = {
55
55
  accountTokens: {}
56
56
  };
57
- if (!readOptionalObject("pagerDuty.accounts")) {
57
+ if (!readOptionalObject$1("pagerDuty.accounts")) {
58
58
  isLegacyConfig$1 = true;
59
59
  logger.warn("No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.");
60
- if (!readOptionalString("pagerDuty.apiToken")) {
60
+ if (!readOptionalString$1("pagerDuty.apiToken")) {
61
61
  logger.warn("No PagerDuty API token found in config file. Trying OAuth token instead...");
62
- if (!readOptionalObject("pagerDuty.oauth")) {
62
+ if (!readOptionalObject$1("pagerDuty.oauth")) {
63
63
  logger.error("No PagerDuty OAuth configuration found in config file.");
64
- } else if (!readOptionalString("pagerDuty.oauth.clientId") || !readOptionalString("pagerDuty.oauth.clientSecret") || !readOptionalString("pagerDuty.oauth.subDomain")) {
64
+ } else if (!readOptionalString$1("pagerDuty.oauth.clientId") || !readOptionalString$1("pagerDuty.oauth.clientSecret") || !readOptionalString$1("pagerDuty.oauth.subDomain")) {
65
65
  logger.error("Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.");
66
66
  } else {
67
67
  const tokenInfo = await getOAuthToken(
68
- readString("pagerDuty.oauth.clientId"),
69
- readString("pagerDuty.oauth.clientSecret"),
70
- readString("pagerDuty.oauth.subDomain"),
71
- readOptionalString("pagerDuty.oauth.region") ?? "us"
68
+ readString$1("pagerDuty.oauth.clientId"),
69
+ readString$1("pagerDuty.oauth.clientSecret"),
70
+ readString$1("pagerDuty.oauth.subDomain"),
71
+ readOptionalString$1("pagerDuty.oauth.region") ?? "us"
72
72
  );
73
73
  authPersistence.accountTokens[defaultAccountId] = tokenInfo;
74
74
  logger.info("PagerDuty OAuth configuration loaded successfully.");
75
75
  }
76
76
  } else {
77
77
  authPersistence.accountTokens[defaultAccountId] = {
78
- authToken: `Token token=${readOptionalString("pagerDuty.apiToken")}`,
78
+ authToken: `Token token=${readOptionalString$1("pagerDuty.apiToken")}`,
79
79
  authTokenExpiryDate: Date.now() + 36e5 * 24 * 365 * 2
80
80
  // 2 years
81
81
  };
@@ -84,7 +84,7 @@ async function loadAuthConfig({ config, legacyConfig, logger }) {
84
84
  } else {
85
85
  logger.info("New PagerDuty accounts configuration found in config file.");
86
86
  isLegacyConfig$1 = false;
87
- const accounts = JSON.parse(JSON.stringify(readOptionalObject("pagerDuty.accounts")));
87
+ const accounts = JSON.parse(JSON.stringify(readOptionalObject$1("pagerDuty.accounts")));
88
88
  logger.info(`Found ${accounts.length} accounts in config file.`);
89
89
  if (accounts && accounts?.length === 1) {
90
90
  logger.info("Only one account found in config file. Setting it as default.");
@@ -129,23 +129,23 @@ async function loadAuthConfig({ config, legacyConfig, logger }) {
129
129
  logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);
130
130
  }
131
131
  }
132
- function readOptionalString(key) {
133
- if (!_config) {
134
- return _legacyConfig.getOptionalString(key);
132
+ function readOptionalString$1(key) {
133
+ if (!_config$1) {
134
+ return _legacyConfig$1.getOptionalString(key);
135
135
  }
136
- return _config.getOptionalString(key);
136
+ return _config$1.getOptionalString(key);
137
137
  }
138
- function readOptionalObject(key) {
139
- if (!_config) {
140
- return _legacyConfig.getOptional(key);
138
+ function readOptionalObject$1(key) {
139
+ if (!_config$1) {
140
+ return _legacyConfig$1.getOptional(key);
141
141
  }
142
- return _config.getOptional(key);
142
+ return _config$1.getOptional(key);
143
143
  }
144
- function readString(key) {
145
- if (!_config) {
146
- return _legacyConfig.getString(key);
144
+ function readString$1(key) {
145
+ if (!_config$1) {
146
+ return _legacyConfig$1.getString(key);
147
147
  }
148
- return _config.getString(key);
148
+ return _config$1.getString(key);
149
149
  }
150
150
  async function getOAuthToken(clientId, clientSecret, subDomain, region) {
151
151
  if (!clientId || !clientSecret || !subDomain) {
@@ -205,11 +205,17 @@ function maskString(str) {
205
205
  const EndpointConfig = {};
206
206
  let fallbackEndpointConfig;
207
207
  let isLegacyConfig = false;
208
- function loadPagerDutyEndpointsFromConfig(config, logger) {
209
- if (config.getOptional("pagerDuty.accounts")) {
208
+ let _config;
209
+ let _legacyConfig;
210
+ let _logger;
211
+ function loadPagerDutyEndpointsFromConfig({ config, legacyConfig, logger }) {
212
+ _config = config;
213
+ _legacyConfig = legacyConfig;
214
+ _logger = logger;
215
+ if (readOptionalObject("pagerDuty.accounts")) {
210
216
  logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);
211
217
  isLegacyConfig = false;
212
- const accounts = config.getOptional("pagerDuty.accounts");
218
+ const accounts = JSON.parse(JSON.stringify(readOptionalObject("pagerDuty.accounts")));
213
219
  if (accounts?.length === 1) {
214
220
  logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);
215
221
  EndpointConfig.default = {
@@ -235,8 +241,8 @@ function loadPagerDutyEndpointsFromConfig(config, logger) {
235
241
  logger.debug(`Loading legacy PagerDuty endpoints from config.`);
236
242
  isLegacyConfig = true;
237
243
  EndpointConfig.default = {
238
- eventsBaseUrl: config.getOptionalString("pagerDuty.eventsBaseUrl") !== void 0 ? config.getString("pagerDuty.eventsBaseUrl") : "https://events.pagerduty.com/v2",
239
- apiBaseUrl: config.getOptionalString("pagerDuty.apiBaseUrl") !== void 0 ? config.getString("pagerDuty.apiBaseUrl") : "https://api.pagerduty.com"
244
+ eventsBaseUrl: readOptionalString("pagerDuty.eventsBaseUrl") !== void 0 ? readString("pagerDuty.eventsBaseUrl") : "https://events.pagerduty.com/v2",
245
+ apiBaseUrl: readOptionalString("pagerDuty.apiBaseUrl") !== void 0 ? readString("pagerDuty.apiBaseUrl") : "https://api.pagerduty.com"
240
246
  };
241
247
  }
242
248
  }
@@ -254,6 +260,7 @@ async function createService(name, description, escalationPolicyId, account, ale
254
260
  let response;
255
261
  const apiBaseUrl = getApiBaseUrl(account);
256
262
  const baseUrl = `${apiBaseUrl}/services`;
263
+ _logger.info(`Creating service '${name}' in account '${account}'...using API base URL: ${apiBaseUrl}`);
257
264
  let body = JSON.stringify({
258
265
  service: {
259
266
  type: "service",
@@ -350,6 +357,7 @@ async function createService(name, description, escalationPolicyId, account, ale
350
357
  }
351
358
  }
352
359
  const token = await getAuthToken(account);
360
+ _logger.info(`Using token: ${token}`);
353
361
  const options = {
354
362
  method: "POST",
355
363
  body,
@@ -392,6 +400,7 @@ async function createServiceIntegration(serviceId, vendorId, account) {
392
400
  const apiBaseUrl = getApiBaseUrl(account);
393
401
  const baseUrl = `${apiBaseUrl}/services`;
394
402
  const token = await getAuthToken(account);
403
+ _logger.info(`Creating service integration for service ID: ${serviceId} in account '${account}'...using API base URL: ${apiBaseUrl} and token: ${token}`);
395
404
  const options = {
396
405
  method: "POST",
397
406
  body: JSON.stringify({
@@ -472,6 +481,24 @@ async function isEventNoiseReductionEnabled(account) {
472
481
  throw new Error(`Failed to parse abilities information: ${error}`);
473
482
  }
474
483
  }
484
+ function readOptionalString(key) {
485
+ if (!_config) {
486
+ return _legacyConfig.getOptionalString(key);
487
+ }
488
+ return _config.getOptionalString(key);
489
+ }
490
+ function readOptionalObject(key) {
491
+ if (!_config) {
492
+ return _legacyConfig.getOptional(key);
493
+ }
494
+ return _config.getOptional(key);
495
+ }
496
+ function readString(key) {
497
+ if (!_config) {
498
+ return _legacyConfig.getString(key);
499
+ }
500
+ return _config.getString(key);
501
+ }
475
502
 
476
503
  const createPagerDutyServiceAction = (props) => {
477
504
  let loggerService;
@@ -481,8 +508,8 @@ const createPagerDutyServiceAction = (props) => {
481
508
  input: zod.z.object({
482
509
  name: zod.z.string().min(1, "name is required").describe("Name of the service"),
483
510
  description: zod.z.string().min(1, "description is required").describe("Description of the service"),
484
- account: zod.z.string().optional().describe("PagerDuty account name"),
485
511
  escalationPolicyId: zod.z.string().min(1, "Escalation policy is required").describe("Escalation policy ID"),
512
+ account: zod.z.string().optional().describe("PagerDuty account name"),
486
513
  alertGrouping: zod.z.string().optional().describe("Alert grouping parameters")
487
514
  }),
488
515
  output: zod.z.object({
@@ -504,6 +531,12 @@ const createPagerDutyServiceAction = (props) => {
504
531
  legacyConfig,
505
532
  logger: loggerService
506
533
  });
534
+ loadPagerDutyEndpointsFromConfig({
535
+ config: configService,
536
+ legacyConfig,
537
+ logger: loggerService
538
+ });
539
+ loggerService.info(`Creating service '${ctx.input.name}' in account '${ctx.input.account}'...`);
507
540
  const service = await createService(
508
541
  ctx.input.name,
509
542
  ctx.input.description,
@@ -516,6 +549,7 @@ const createPagerDutyServiceAction = (props) => {
516
549
  ctx.output("serviceUrl", service.url);
517
550
  ctx.output("serviceId", service.id);
518
551
  const backstageIntegrationId = "PRO19CT";
552
+ loggerService.info(`Creating Backstage Integration for service '${ctx.input.name}' in account '${ctx.input.account}'...`);
519
553
  const integrationKey = await createServiceIntegration(
520
554
  service.id,
521
555
  backstageIntegrationId,
@@ -545,7 +579,6 @@ const pagerDutyScaffolderActions = backendPluginApi.createBackendModule({
545
579
  config,
546
580
  logger
547
581
  }));
548
- loadPagerDutyEndpointsFromConfig(config, logger);
549
582
  }
550
583
  });
551
584
  }
@@ -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 await loadAuthConfig({\n config: _config,\n legacyConfig: _legacyConfig,\n logger: _logger\n });\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\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\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\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.info('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.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 \n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n logger.info(`Found ${accounts.length} accounts in config file.`);\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\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} from '@pagerduty/backstage-plugin-common';\nimport { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string\n}\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nexport function loadPagerDutyEndpointsFromConfig(config: RootConfigService, logger: LoggerService) {\n\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('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: config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? config.getString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('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\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 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 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: ${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","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\";\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 account?: 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 account: z.string().optional().describe('PagerDuty account name'),\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 // Create service in PagerDuty\n const service: CreateServiceResponse = await api.createService(\n ctx.input.name, \n ctx.input.description, \n ctx.input.escalationPolicyId, \n ctx.input.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 const integrationKey = await api.createServiceIntegration(\n service.id, \n backstageIntegrationId,\n ctx.input.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\";\nimport { loadPagerDutyEndpointsFromConfig } from \"./apis/pagerduty\";\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 loadPagerDutyEndpointsFromConfig(config, logger);\n },\n });\n },\n});\n"],"names":["isLegacyConfig","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 await loadAuthConfig({\n config: _config,\n legacyConfig: _legacyConfig,\n logger: _logger\n });\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\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\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\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.info('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.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 \n const accounts: PagerDutyAccountConfig[] = JSON.parse(JSON.stringify(readOptionalObject('pagerDuty.accounts')));\n\n logger.info(`Found ${accounts.length} accounts in config file.`);\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\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} 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 _logger.info(`Creating service '${name}' in account '${account}'...using API base URL: ${apiBaseUrl}`);\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 _logger.info(`Using token: ${token}`);\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 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 _logger.info(`Creating service integration for service ID: ${serviceId} in account '${account}'...using API base URL: ${apiBaseUrl} and token: ${token}`);\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: ${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}\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","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 } 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 account?: 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 account: z.string().optional().describe('PagerDuty account name'),\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 // Create service in PagerDuty\n loggerService.info(`Creating service '${ctx.input.name}' in account '${ctx.input.account}'...`);\n const service: CreateServiceResponse = await api.createService(\n ctx.input.name, \n ctx.input.description, \n ctx.input.escalationPolicyId, \n ctx.input.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 '${ctx.input.account}'...`);\n\n const integrationKey = await api.createServiceIntegration(\n service.id, \n backstageIntegrationId,\n ctx.input.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/dist/index.d.ts CHANGED
@@ -13,8 +13,8 @@ type CreatePagerDutyServiceActionProps = {
13
13
  declare const createPagerDutyServiceAction: (props?: CreatePagerDutyServiceActionProps) => _backstage_plugin_scaffolder_node.TemplateAction<{
14
14
  name: string;
15
15
  description: string;
16
- account?: string | undefined;
17
16
  escalationPolicyId: string;
17
+ account?: string | undefined;
18
18
  alertGrouping?: string | undefined;
19
19
  }, _backstage_types.JsonObject>;
20
20
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pagerduty/backstage-plugin-scaffolder-actions",
3
- "version": "0.2.0-next.3",
3
+ "version": "0.2.0-next.4",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",