@solo.io/platform-portal-backstage-plugin-backend 0.0.29 → 0.0.30
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/README.md +4 -3
- package/dist/index.cjs.js +39 -19
- package/dist/index.cjs.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -78,15 +78,15 @@ glooPlatformPortal:
|
|
|
78
78
|
clientId: // Update with your client id
|
|
79
79
|
clientSecret: // Update with your client secret
|
|
80
80
|
tokenEndpoint: // Update with your token endpoint
|
|
81
|
-
// This is optional.
|
|
81
|
+
// This is optional. The default value is false.
|
|
82
82
|
debugLogging: false
|
|
83
|
-
// This is optional.
|
|
83
|
+
// This is optional. The default value is 5 minutes.
|
|
84
84
|
syncFrequency:
|
|
85
85
|
hours: 0
|
|
86
86
|
minutes: 1
|
|
87
87
|
seconds: 0
|
|
88
88
|
milliseconds: 0
|
|
89
|
-
// This is optional.
|
|
89
|
+
// This is optional. The default value is 30 seconds.
|
|
90
90
|
syncTimeout:
|
|
91
91
|
hours: 0
|
|
92
92
|
minutes: 0
|
|
@@ -126,6 +126,7 @@ docker run \
|
|
|
126
126
|
-e PORTAL_SERVER_URL=http://host.docker.internal:31080/v1 # replace \
|
|
127
127
|
-e CLIENT_ID= # replace \
|
|
128
128
|
-e CLIENT_SECRET= # replace \
|
|
129
|
+
-e PORTAL_DEBUG_LOGGING=true \
|
|
129
130
|
-e TOKEN_ENDPOINT=.../realms/master/protocol/openid-connect/token # replace \
|
|
130
131
|
-e POSTGRES_USER=postgres \
|
|
131
132
|
-e POSTGRES_PASSWORD=password \
|
package/dist/index.cjs.js
CHANGED
|
@@ -236,37 +236,57 @@ class GlooPlatformPortalProvider {
|
|
|
236
236
|
* Backstage plugin task scheduler.
|
|
237
237
|
* */
|
|
238
238
|
async startScheduler(scheduler) {
|
|
239
|
-
var _a, _b;
|
|
239
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
240
240
|
if (this.debugLogging) {
|
|
241
241
|
this.log("Scheduling backstage catalog sync.");
|
|
242
242
|
}
|
|
243
|
-
const
|
|
243
|
+
const frequencyConfig = (_a = this.config) == null ? void 0 : _a.getOptionalConfig(
|
|
244
244
|
"glooPlatformPortal.backend.syncFrequency"
|
|
245
245
|
);
|
|
246
|
-
const
|
|
246
|
+
const frequency = {
|
|
247
|
+
hours: (_b = frequencyConfig == null ? void 0 : frequencyConfig.getOptionalNumber("hours")) != null ? _b : 0,
|
|
248
|
+
minutes: (_c = frequencyConfig == null ? void 0 : frequencyConfig.getOptionalNumber("minutes")) != null ? _c : 0,
|
|
249
|
+
seconds: (_d = frequencyConfig == null ? void 0 : frequencyConfig.getOptionalNumber("seconds")) != null ? _d : 0,
|
|
250
|
+
milliseconds: (_e = frequencyConfig == null ? void 0 : frequencyConfig.getOptionalNumber("milliseconds")) != null ? _e : 0
|
|
251
|
+
};
|
|
252
|
+
if (Object.values(frequency).every((v) => v === 0)) {
|
|
253
|
+
frequency.minutes = 5;
|
|
254
|
+
if (this.debugLogging) {
|
|
255
|
+
this.log(
|
|
256
|
+
`No frequency value was set, so the default value of ${frequency.minutes} minutes will be used.`
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (this.debugLogging) {
|
|
261
|
+
this.log(`Frequency set to ${JSON.stringify(frequency)}.`);
|
|
262
|
+
}
|
|
263
|
+
const timeoutConfig = (_f = this.config) == null ? void 0 : _f.getOptionalConfig(
|
|
247
264
|
"glooPlatformPortal.backend.syncTimeout"
|
|
248
265
|
);
|
|
266
|
+
const timeout = {
|
|
267
|
+
hours: (_g = timeoutConfig == null ? void 0 : timeoutConfig.getOptionalNumber("hours")) != null ? _g : 0,
|
|
268
|
+
minutes: (_h = timeoutConfig == null ? void 0 : timeoutConfig.getOptionalNumber("minutes")) != null ? _h : 0,
|
|
269
|
+
seconds: (_i = timeoutConfig == null ? void 0 : timeoutConfig.getOptionalNumber("seconds")) != null ? _i : 0,
|
|
270
|
+
milliseconds: (_j = timeoutConfig == null ? void 0 : timeoutConfig.getOptionalNumber("milliseconds")) != null ? _j : 0
|
|
271
|
+
};
|
|
272
|
+
if (Object.values(timeout).every((v) => v === 0)) {
|
|
273
|
+
timeout.seconds = 30;
|
|
274
|
+
if (this.debugLogging) {
|
|
275
|
+
this.log(
|
|
276
|
+
`No timeout value was set. The default value of ${timeout.seconds} seconds will be used.`
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (this.debugLogging) {
|
|
281
|
+
this.log(`Timeout set to ${JSON.stringify(timeout)}.`);
|
|
282
|
+
}
|
|
249
283
|
await scheduler.scheduleTask({
|
|
250
284
|
id: "run_gloo_platform_portal_refresh",
|
|
251
285
|
fn: async () => {
|
|
252
286
|
await this.run();
|
|
253
287
|
},
|
|
254
|
-
frequency
|
|
255
|
-
|
|
256
|
-
minutes: frequency.getOptionalNumber("minutes"),
|
|
257
|
-
seconds: frequency.getOptionalNumber("seconds"),
|
|
258
|
-
milliseconds: frequency.getOptionalNumber("milliseconds")
|
|
259
|
-
} : {
|
|
260
|
-
minutes: 5
|
|
261
|
-
},
|
|
262
|
-
timeout: !!timeout ? {
|
|
263
|
-
hours: timeout.getOptionalNumber("hours"),
|
|
264
|
-
minutes: timeout.getOptionalNumber("minutes"),
|
|
265
|
-
seconds: timeout.getOptionalNumber("seconds"),
|
|
266
|
-
milliseconds: timeout.getOptionalNumber("milliseconds")
|
|
267
|
-
} : {
|
|
268
|
-
seconds: 30
|
|
269
|
-
}
|
|
288
|
+
frequency,
|
|
289
|
+
timeout
|
|
270
290
|
});
|
|
271
291
|
}
|
|
272
292
|
/**
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/provider/configHelpers.ts","../src/provider/utility.ts","../src/provider/GlooPlatformPortalProvider.ts"],"sourcesContent":["import { Config } from '@backstage/config';\n\ntype logFn = (s: string) => any;\n\nexport const getPortalServerUrl = (\n logErr: logFn,\n _: logFn,\n config: Config | undefined,\n) => {\n if (!config) {\n logErr('No backstage config found when getting portal server url.');\n return '';\n }\n let value = config.getOptionalString(\n 'glooPlatformPortal.backend.portalServerUrl',\n );\n // Remove trailing slash if supplied.\n if (!!value && value.at(-1) === '/')\n value = value.substring(0, value.length - 1);\n return value ?? 'http://localhost:31080/v1';\n};\n\nexport const getClientSecret = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client secret.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.clientSecret',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientSecret found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getClientId = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client id.');\n return '';\n }\n const value = config.getOptionalString('glooPlatformPortal.backend.clientId');\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientId found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getTokenEndpoint = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting token endpoint.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.tokenEndpoint',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.tokenEndpoint found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n","import fetch from 'node-fetch';\nimport { AccessTokensResponse } from './api-types';\n\nexport function parseJwt(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n}\n\nexport function objectToUrlFormEncodedPayload(\n requestJSON: Record<string, string>,\n) {\n const formBodyPieces = [] as string[];\n for (const property in requestJSON) {\n if (!requestJSON.hasOwnProperty(property)) continue;\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(\n requestJSON[property as keyof typeof requestJSON],\n );\n formBodyPieces.push(`${encodedKey}=${encodedValue}`);\n }\n const formBodyString = formBodyPieces.join('&');\n return formBodyString;\n}\n\nexport async function doAccessTokenRequest(\n grantType: 'refresh_token' | 'client_credentials',\n tokenEndpoint: string,\n clientId: string,\n clientSecret: string,\n refreshToken?: string,\n) {\n const formData = {} as Record<string, string>;\n //\n // Build the request payload for a new oauth access token.\n //\n formData.grant_type = grantType;\n formData.client_id = clientId;\n formData.client_secret = clientSecret;\n if (grantType === 'refresh_token') {\n if (!refreshToken) {\n return undefined;\n }\n formData.refresh_token = refreshToken;\n }\n //\n // Make the request\n //\n const rawRes = await fetch(tokenEndpoint, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n method: 'POST',\n body: objectToUrlFormEncodedPayload(formData),\n });\n let resJSON: any;\n try {\n resJSON = await rawRes.json();\n } catch {\n throw new Error('Error parsing oauth response.');\n }\n if (!!resJSON.error_description) {\n throw new Error(resJSON.error_description);\n }\n if (!!resJSON.error) {\n throw new Error(resJSON.error);\n }\n //\n // Check for the access token in the response.\n //\n if (!resJSON.access_token) {\n throw new Error(\n \"No 'access_token' property was found in the oauth response body.\",\n );\n }\n return resJSON as AccessTokensResponse;\n}\n\n//\n// From: https://backstage.io/docs/features/software-catalog/descriptor-format\n//\nconst sanitizeRegex = {\n // Each tag must be sequences of [a-z0-9:+#] separated by -, at most 63 characters in total\n tag: /[a-z]|[0-9]|\\:|\\+|\\#|\\-/,\n // Strings of length at least 1, and at most 63\n // Must consist of sequences of [a-z0-9A-Z] possibly separated by one of [-_.].\n name: /[a-z]|[0-9]|[A-Z]|\\-|\\_|\\./,\n // Namespaces must be sequences of [a-zA-Z0-9], possibly separated by -, at most 63 characters in total.\n namespace: /[a-z]|[0-9]|[A-Z]|\\-/,\n};\n\n/**\n * Sanitizes a string before adding it to a backstage entity.\n */\nexport const sanitizeStringForEntity = (\n propertyType: keyof typeof sanitizeRegex,\n propertyValue: string,\n) => {\n return propertyValue\n .split('')\n .map(ch => (!sanitizeRegex[propertyType].test(ch) ? '-' : ch))\n .reduce(\n (prev, cur) =>\n // Don't go over 63 characters.\n prev.length >= 62\n ? prev\n : // Don't repeat \"-\"\n prev.at(-1) === '-' && cur === '-'\n ? prev\n : prev + cur,\n '',\n );\n};\n","import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\nimport { Entity, EntityMeta } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport fetch from 'node-fetch';\nimport { API, APIProduct, APISchema, AccessTokensResponse } from './api-types';\nimport {\n getClientId,\n getClientSecret,\n getPortalServerUrl,\n getTokenEndpoint,\n} from './configHelpers';\nimport {\n doAccessTokenRequest,\n parseJwt,\n sanitizeStringForEntity,\n} from './utility';\n\n/**\n * Provides API entities from the Gloo Platform Portal REST server.\n */\nexport class GlooPlatformPortalProvider implements EntityProvider {\n private connection?: EntityProviderConnection;\n private logger: LoggerService;\n private config: Config;\n private latestTokensResponse?: AccessTokensResponse;\n private debugLogging = false;\n\n log = (s: string) => this.logger?.info(`gloo-platform-portal: ${s}`);\n warn = (s: string) => this.logger?.warn(`gloo-platform-portal: ${s}`);\n error = (s: string) => this.logger?.error(`gloo-platform-portal: ${s}`);\n getProviderName = () => `gloo-platform-portal-backend-provider`;\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n }\n\n //\n // 1. Init class\n //\n constructor(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n ) {\n this.logger = logger;\n this.config = config;\n // Default extra debug-logging to false\n this.debugLogging = !!this.config?.getOptionalBoolean(\n 'glooPlatformPortal.backend.debugLogging',\n );\n this.log('Initializing GlooPlatformPortalProvider.');\n // Get the tokens, then schedule the task to update the catalog.\n this.startTokensRequests().then(() => this.startScheduler(scheduler));\n }\n\n //\n // 2. Get access_token\n //\n async startTokensRequests() {\n //\n // Make the initial request for the access_token.\n if (this.debugLogging) {\n this.log('Making the initial access_token request.');\n }\n if (!this.config) {\n this.error(\n 'Backstage config object not found when doing access token request.',\n );\n return;\n }\n const res = await doAccessTokenRequest(\n 'client_credentials',\n getTokenEndpoint(this.error, this.warn, this.config),\n getClientId(this.error, this.warn, this.config),\n getClientSecret(this.error, this.warn, this.config),\n );\n this.latestTokensResponse = res;\n if (!this.latestTokensResponse) {\n // If there's a problem, wait to restart the access token\n // requests so as to not overload the auth server.\n this.warn('No latest access token. Re-requesting the access_token.');\n setTimeout(this.startTokensRequests.bind(this), 5000);\n return;\n }\n if (this.debugLogging) {\n this.log('Got the access_token.');\n }\n //\n // Parse the access_token JWT to find when it expires.\n const parsedToken = parseJwt(this.latestTokensResponse.access_token);\n if (!parsedToken.exp) {\n this.warn('No `exp` property found in the access_token JWT.');\n }\n const nowDate = new Date();\n const expiresDate = new Date(parsedToken.exp * 1000);\n const millisUntilExpires = expiresDate.getTime() - nowDate.getTime();\n if (millisUntilExpires <= 0) {\n this.warn('access token is expired!');\n this.latestTokensResponse = undefined;\n return;\n }\n if (this.debugLogging) {\n this.log('Setting a timeout to get the next access token.');\n }\n // Set the timeout to request new tokens.\n setTimeout(\n this.startTokensRequests.bind(this),\n // Don't make this request more than once a second,\n // and do the refresh 5 seconds early.\n Math.max(1000, millisUntilExpires - 5000),\n );\n }\n\n /**\n *\n * 3. Schedule sync.\n *\n * This passes the user config into the\n * Backstage plugin task scheduler.\n * */\n async startScheduler(scheduler: SchedulerService) {\n if (this.debugLogging) {\n this.log('Scheduling backstage catalog sync.');\n }\n const frequency = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncFrequency',\n );\n const timeout = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncTimeout',\n );\n await scheduler.scheduleTask({\n id: 'run_gloo_platform_portal_refresh',\n fn: async () => {\n await this.run();\n },\n frequency: !!frequency\n ? {\n hours: frequency.getOptionalNumber('hours'),\n minutes: frequency.getOptionalNumber('minutes'),\n seconds: frequency.getOptionalNumber('seconds'),\n milliseconds: frequency.getOptionalNumber('milliseconds'),\n }\n : {\n minutes: 5,\n },\n timeout: !!timeout\n ? {\n hours: timeout.getOptionalNumber('hours'),\n minutes: timeout.getOptionalNumber('minutes'),\n seconds: timeout.getOptionalNumber('seconds'),\n milliseconds: timeout.getOptionalNumber('milliseconds'),\n }\n : {\n seconds: 30,\n },\n });\n }\n\n /**\n *\n * 4. Return new Backstage entities.\n *\n * Requests API information from the Gloo Platform Portal REST server,\n * and transforms the response into Backstage API entities.\n */\n async run(): Promise<void> {\n if (!this.connection || !this.latestTokensResponse) {\n throw new Error('Not initialized');\n }\n\n const entities: Entity[] = [];\n const bsGroupName = 'solo-io-service-accounts';\n const bsServiceAccountName = 'gloo-platform-portal-service-account';\n const bsSystemName = 'gloo-platform-portal-apis';\n const portalServerUrl = getPortalServerUrl(\n this.error,\n this.warn,\n this.config,\n );\n const apisEndpoint = `${portalServerUrl}/apis`;\n //\n // Make API request\n try {\n const fullRequestURI = apisEndpoint + '?includeSchema=true';\n if (this.debugLogging) {\n this.log(\n `Fetching APIs from ${fullRequestURI} with header: \"Authorization: Bearer ${this.latestTokensResponse.access_token}\"`,\n );\n }\n const res = await fetch(fullRequestURI, {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n });\n const resText = await res.text();\n if (this.debugLogging) {\n this.log('Performed fetch and recieved the response text: ' + resText);\n }\n let processedAPIs = JSON.parse(resText) as API[];\n if (this.debugLogging) {\n this.log('Parsed the text into JSON.');\n }\n\n //\n // The server returns the APIs grouped by APIProduct,\n // so we can convert it back to a list here.\n //\n if (!!processedAPIs?.length && 'apiVersions' in processedAPIs[0]) {\n const apiProducts = processedAPIs as unknown as APIProduct[];\n processedAPIs = apiProducts.reduce((accum, curProd) => {\n accum.push(\n ...curProd.apiVersions.reduce((accumVer, api) => {\n if (!!api.openapiSpecFetchErr) {\n this.warn(\n `Schema fetch error for ${api.apiId} : ${JSON.stringify(\n api.openapiSpecFetchErr,\n )}`,\n );\n }\n accumVer.push({\n apiId: api.apiId,\n apiProductDisplayName: curProd.apiProductDisplayName,\n apiProductId: curProd.apiProductId,\n apiVersion: api.apiVersion,\n contact: api.contact,\n customMetadata: api.customMetadata,\n description: api.description,\n license: api.license,\n termsOfService: api.termsOfService,\n title: api.title,\n usagePlans: api.usagePlans,\n openapiSpec: api.openapiSpec,\n openapiSpecFetchErr: api.openapiSpecFetchErr,\n });\n return accumVer;\n }, [] as API[]),\n );\n return accum;\n }, [] as API[]);\n }\n\n //\n // Convert the APIs to entities\n for (let i = 0; i < processedAPIs.length; i++) {\n const apiVersion = processedAPIs[i];\n let schema = apiVersion.openapiSpec;\n if (!schema && !apiVersion.openapiSpecFetchErr) {\n // If the schema was not attempted to be fetched with\n // the /apis call, we individually fetch it here.\n // This is for backwards compatibility only, for\n // when the schema was not in the /apis response.\n const schemaRes = await fetch(\n `${apisEndpoint}/${apiVersion.apiId}/schema`,\n {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n },\n );\n schema = (await schemaRes.json()) as APISchema;\n }\n entities.push({\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n tags: [\n 'gloo-platform',\n ...(!!apiVersion.apiVersion\n ? [\n 'api-version-' +\n sanitizeStringForEntity('tag', apiVersion.apiVersion),\n ]\n : []),\n ],\n name: sanitizeStringForEntity('name', apiVersion.apiId),\n title: apiVersion.apiId,\n description: apiVersion.description,\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n type: 'openapi',\n lifecycle: 'production',\n system: bsSystemName,\n owner: `user:${bsServiceAccountName}`,\n definition: JSON.stringify(schema),\n },\n });\n }\n if (this.debugLogging) {\n this.log(\n 'Transformed APIs into new entities: ' + JSON.stringify(entities),\n );\n }\n } catch (e) {\n this.error(\n `Could not get APIs from the portal server endpoint or their schemas or transform them into entities (${apisEndpoint}). Error: ${JSON.stringify(\n e,\n )}`,\n );\n }\n\n const locationKey = `gloo-platform-portal-provider`;\n await this.connection.applyMutation({\n type: 'full',\n entities: [\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: bsGroupName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n type: 'service-account-group',\n children: [],\n members: [bsServiceAccountName],\n },\n },\n },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: bsServiceAccountName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n displayName: 'Solo.io Service Account',\n email: '',\n picture: '',\n memberOf: [bsGroupName],\n },\n },\n },\n // {\n // locationKey,\n // entity: {\n // apiVersion: 'backstage.io/v1alpha1',\n // kind: 'Domain',\n // metadata: {\n // tags: ['gloo-platform'],\n // name: 'api-product',\n // description: 'Gloo Platform Portal ApiProduct resources.',\n // annotations: {\n // 'backstage.io/managed-by-location': 'url:' + apisEndpoint,\n // 'backstage.io/managed-by-origin-location':\n // 'url:' + apisEndpoint,\n // },\n // } as EntityMeta,\n // spec: {\n // owner: 'user:' + bsServiceAccountName,\n // },\n // },\n // },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'System',\n metadata: {\n tags: ['gloo-platform'],\n name: bsSystemName,\n title: 'Gloo Platform Portal APIs',\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n owner: `user:${bsServiceAccountName}`,\n // domain: 'api-product',\n },\n },\n },\n ...entities.map(entity => ({ locationKey, entity })),\n ],\n });\n }\n}\n"],"names":["fetch"],"mappings":";;;;;;;;AAIO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,CAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,2DAA2D,CAAA,CAAA;AAClE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACjB,4CAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,CAAC,CAAC,KAAA,IAAS,KAAM,CAAA,EAAA,CAAG,EAAE,CAAM,KAAA,GAAA;AAC9B,IAAA,KAAA,GAAQ,KAAM,CAAA,SAAA,CAAU,CAAG,EAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAC7C,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,2BAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,eAAkB,GAAA,CAC7B,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,uDAAuD,CAAA,CAAA;AAC9D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACnB,yCAAA;AAAA,GACF,CAAA;AACA,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,2EAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,WAAc,GAAA,CACzB,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,mDAAmD,CAAA,CAAA;AAC1D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,iBAAA,CAAkB,qCAAqC,CAAA,CAAA;AAC5E,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,uEAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA,CAAA;AAEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,CAAO,wDAAwD,CAAA,CAAA;AAC/D,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,QAAQ,MAAO,CAAA,iBAAA;AAAA,IACnB,0CAAA;AAAA,GACF,CAAA;AACA,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,UAAA;AAAA,MACE,4EAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,CAAA;AAClB,CAAA;;AC3EO,SAAS,SAAS,KAAe,EAAA;AACtC,EAAA,MAAM,SAAY,GAAA,KAAA,CAAM,KAAM,CAAA,GAAG,EAAE,CAAC,CAAA,CAAA;AACpC,EAAM,MAAA,MAAA,GAAS,UAAU,OAAQ,CAAA,IAAA,EAAM,GAAG,CAAE,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AAC7D,EAAA,MAAM,WAAc,GAAA,kBAAA;AAAA,IAClB,IAAA,CAAK,MAAM,CAAA,CACR,KAAM,CAAA,EAAE,EACR,GAAI,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,EAAA,CAAA,EAAA,EAAK,CAAE,CAAA,UAAA,CAAW,CAAC,CAAE,CAAA,QAAA,CAAS,EAAE,CAAC,CAAG,CAAA,CAAA,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAC5D,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,GACZ,CAAA;AACA,EAAO,OAAA,IAAA,CAAK,MAAM,WAAW,CAAA,CAAA;AAC/B,CAAA;AAEO,SAAS,8BACd,WACA,EAAA;AACA,EAAA,MAAM,iBAAiB,EAAC,CAAA;AACxB,EAAA,KAAA,MAAW,YAAY,WAAa,EAAA;AAClC,IAAI,IAAA,CAAC,WAAY,CAAA,cAAA,CAAe,QAAQ,CAAA;AAAG,MAAA,SAAA;AAC3C,IAAM,MAAA,UAAA,GAAa,mBAAmB,QAAQ,CAAA,CAAA;AAC9C,IAAA,MAAM,YAAe,GAAA,kBAAA;AAAA,MACnB,YAAY,QAAoC,CAAA;AAAA,KAClD,CAAA;AACA,IAAA,cAAA,CAAe,IAAK,CAAA,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAE,CAAA,CAAA,CAAA;AAAA,GACrD;AACA,EAAM,MAAA,cAAA,GAAiB,cAAe,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC9C,EAAO,OAAA,cAAA,CAAA;AACT,CAAA;AAEA,eAAsB,oBACpB,CAAA,SAAA,EACA,aACA,EAAA,QAAA,EACA,cACA,YACA,EAAA;AACA,EAAA,MAAM,WAAW,EAAC,CAAA;AAIlB,EAAA,QAAA,CAAS,UAAa,GAAA,SAAA,CAAA;AACtB,EAAA,QAAA,CAAS,SAAY,GAAA,QAAA,CAAA;AACrB,EAAA,QAAA,CAAS,aAAgB,GAAA,YAAA,CAAA;AAUzB,EAAM,MAAA,MAAA,GAAS,MAAMA,sBAAA,CAAM,aAAe,EAAA;AAAA,IACxC,OAAS,EAAA;AAAA,MACP,cAAgB,EAAA,iDAAA;AAAA,KAClB;AAAA,IACA,MAAQ,EAAA,MAAA;AAAA,IACR,IAAA,EAAM,8BAA8B,QAAQ,CAAA;AAAA,GAC7C,CAAA,CAAA;AACD,EAAI,IAAA,OAAA,CAAA;AACJ,EAAI,IAAA;AACF,IAAU,OAAA,GAAA,MAAM,OAAO,IAAK,EAAA,CAAA;AAAA,GACtB,CAAA,MAAA;AACN,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAAA,GACjD;AACA,EAAI,IAAA,CAAC,CAAC,OAAA,CAAQ,iBAAmB,EAAA;AAC/B,IAAM,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAAA,GAC3C;AACA,EAAI,IAAA,CAAC,CAAC,OAAA,CAAQ,KAAO,EAAA;AACnB,IAAM,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GAC/B;AAIA,EAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,kEAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAKA,MAAM,aAAgB,GAAA;AAAA;AAAA,EAEpB,GAAK,EAAA,yBAAA;AAAA;AAAA;AAAA,EAGL,IAAM,EAAA,4BAAA;AAAA;AAAA,EAEN,SAAW,EAAA,sBAAA;AACb,CAAA,CAAA;AAKa,MAAA,uBAAA,GAA0B,CACrC,YAAA,EACA,aACG,KAAA;AACH,EAAA,OAAO,aACJ,CAAA,KAAA,CAAM,EAAE,CAAA,CACR,IAAI,CAAO,EAAA,KAAA,CAAC,aAAc,CAAA,YAAY,EAAE,IAAK,CAAA,EAAE,CAAI,GAAA,GAAA,GAAM,EAAG,CAC5D,CAAA,MAAA;AAAA,IACC,CAAC,IAAM,EAAA,GAAA;AAAA;AAAA,MAEL,IAAA,CAAK,UAAU,EACX,GAAA,IAAA;AAAA;AAAA,QAEF,IAAA,CAAK,GAAG,CAAE,CAAA,CAAA,KAAM,OAAO,GAAQ,KAAA,GAAA,GAC7B,OACA,IAAO,GAAA,GAAA;AAAA,OAAA;AAAA,KAAA;AAAA,IACb,EAAA;AAAA,GACF,CAAA;AACJ,CAAA;;;;;;;;AC9FO,MAAM,0BAAqD,CAAA;AAAA;AAAA;AAAA;AAAA,EAkBhE,WAAA,CACE,MACA,EAAA,MAAA,EACA,SACA,EAAA;AArBF,IAAQ,aAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAe,EAAA,KAAA,CAAA,CAAA;AAEvB,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,EAAM,CAAC,CAAW,KAAA;AA/BpB,MAAA,IAAA,EAAA,CAAA;AA+BuB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,IAAK,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AACjE,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,EAAO,CAAC,CAAW,KAAA;AAhCrB,MAAA,IAAA,EAAA,CAAA;AAgCwB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,IAAK,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAClE,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,CAAC,CAAW,KAAA;AAjCtB,MAAA,IAAA,EAAA,CAAA;AAiCyB,MAAA,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,KAAM,CAAA,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AACpE,IAAA,aAAA,CAAA,IAAA,EAAA,iBAAA,EAAkB,MAAM,CAAA,qCAAA,CAAA,CAAA,CAAA;AAlC1B,IAAA,IAAA,EAAA,CAAA;AA+CI,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAEd,IAAA,IAAA,CAAK,YAAe,GAAA,CAAC,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,kBAAA;AAAA,MACjC,yCAAA;AAAA,KAAA,CAAA,CAAA;AAEF,IAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA,CAAA;AAEnD,IAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA,CAAA;AAAA,GACtE;AAAA,EArBA,MAAM,QAAQ,UAAqD,EAAA;AACjE,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,mBAAsB,GAAA;AAG1B,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA,CAAA;AAAA,KACrD;AACA,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,MAAK,IAAA,CAAA,KAAA;AAAA,QACH,oEAAA;AAAA,OACF,CAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAA,MAAM,MAAM,MAAM,oBAAA;AAAA,MAChB,oBAAA;AAAA,MACA,iBAAiB,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MACnD,YAAY,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MAC9C,gBAAgB,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,KACpD,CAAA;AACA,IAAA,IAAA,CAAK,oBAAuB,GAAA,GAAA,CAAA;AAC5B,IAAI,IAAA,CAAC,KAAK,oBAAsB,EAAA;AAG9B,MAAA,IAAA,CAAK,KAAK,yDAAyD,CAAA,CAAA;AACnE,MAAA,UAAA,CAAW,IAAK,CAAA,mBAAA,CAAoB,IAAK,CAAA,IAAI,GAAG,GAAI,CAAA,CAAA;AACpD,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA,CAAA;AAAA,KAClC;AAGA,IAAA,MAAM,WAAc,GAAA,QAAA,CAAS,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AACnE,IAAI,IAAA,CAAC,YAAY,GAAK,EAAA;AACpB,MAAA,IAAA,CAAK,KAAK,kDAAkD,CAAA,CAAA;AAAA,KAC9D;AACA,IAAM,MAAA,OAAA,uBAAc,IAAK,EAAA,CAAA;AACzB,IAAA,MAAM,WAAc,GAAA,IAAI,IAAK,CAAA,WAAA,CAAY,MAAM,GAAI,CAAA,CAAA;AACnD,IAAA,MAAM,kBAAqB,GAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAQ,EAAA,CAAA;AACnE,IAAA,IAAI,sBAAsB,CAAG,EAAA;AAC3B,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA,CAAA;AACpC,MAAA,IAAA,CAAK,oBAAuB,GAAA,KAAA,CAAA,CAAA;AAC5B,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,iDAAiD,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,UAAA;AAAA,MACE,IAAA,CAAK,mBAAoB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAAA;AAAA,MAGlC,IAAK,CAAA,GAAA,CAAI,GAAM,EAAA,kBAAA,GAAqB,GAAI,CAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,SAA6B,EAAA;AA3HpD,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4HI,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA,CAAA;AAAA,KAC/C;AACA,IAAM,MAAA,SAAA,GAAA,CAAY,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA;AAAA,MAC7B,0CAAA;AAAA,KAAA,CAAA;AAEF,IAAM,MAAA,OAAA,GAAA,CAAU,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA;AAAA,MAC3B,wCAAA;AAAA,KAAA,CAAA;AAEF,IAAA,MAAM,UAAU,YAAa,CAAA;AAAA,MAC3B,EAAI,EAAA,kCAAA;AAAA,MACJ,IAAI,YAAY;AACd,QAAA,MAAM,KAAK,GAAI,EAAA,CAAA;AAAA,OACjB;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SACT,GAAA;AAAA,QACE,KAAA,EAAO,SAAU,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QAC1C,OAAA,EAAS,SAAU,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC9C,OAAA,EAAS,SAAU,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC9C,YAAA,EAAc,SAAU,CAAA,iBAAA,CAAkB,cAAc,CAAA;AAAA,OAE1D,GAAA;AAAA,QACE,OAAS,EAAA,CAAA;AAAA,OACX;AAAA,MACJ,OAAA,EAAS,CAAC,CAAC,OACP,GAAA;AAAA,QACE,KAAA,EAAO,OAAQ,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS,OAAQ,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC5C,OAAA,EAAS,OAAQ,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,QAC5C,YAAA,EAAc,OAAQ,CAAA,iBAAA,CAAkB,cAAc,CAAA;AAAA,OAExD,GAAA;AAAA,QACE,OAAS,EAAA,EAAA;AAAA,OACX;AAAA,KACL,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAqB,GAAA;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAc,IAAA,CAAC,KAAK,oBAAsB,EAAA;AAClD,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA,CAAA;AAAA,KACnC;AAEA,IAAA,MAAM,WAAqB,EAAC,CAAA;AAC5B,IAAA,MAAM,WAAc,GAAA,0BAAA,CAAA;AACpB,IAAA,MAAM,oBAAuB,GAAA,sCAAA,CAAA;AAC7B,IAAA,MAAM,YAAe,GAAA,2BAAA,CAAA;AACrB,IAAA,MAAM,eAAkB,GAAA,kBAAA;AAAA,MACtB,IAAK,CAAA,KAAA;AAAA,MACL,IAAK,CAAA,IAAA;AAAA,MACL,IAAK,CAAA,MAAA;AAAA,KACP,CAAA;AACA,IAAM,MAAA,YAAA,GAAe,GAAG,eAAe,CAAA,KAAA,CAAA,CAAA;AAGvC,IAAI,IAAA;AACF,MAAA,MAAM,iBAAiB,YAAe,GAAA,qBAAA,CAAA;AACtC,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA;AAAA,UACH,CAAsB,mBAAA,EAAA,cAAc,CAAwC,qCAAA,EAAA,IAAA,CAAK,qBAAqB,YAAY,CAAA,CAAA,CAAA;AAAA,SACpH,CAAA;AAAA,OACF;AACA,MAAM,MAAA,GAAA,GAAM,MAAMA,sBAAA,CAAM,cAAgB,EAAA;AAAA,QACtC,OAAS,EAAA;AAAA,UACP,aAAe,EAAA,CAAA,OAAA,EAAU,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AAAA,SACjE;AAAA,OACD,CAAA,CAAA;AACD,MAAM,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,IAAK,EAAA,CAAA;AAC/B,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA,CAAI,qDAAqD,OAAO,CAAA,CAAA;AAAA,OACvE;AACA,MAAI,IAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACtC,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAA,IAAA,CAAK,IAAI,4BAA4B,CAAA,CAAA;AAAA,OACvC;AAMA,MAAA,IAAI,CAAC,EAAC,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,WAAU,aAAiB,IAAA,aAAA,CAAc,CAAC,CAAG,EAAA;AAChE,QAAA,MAAM,WAAc,GAAA,aAAA,CAAA;AACpB,QAAA,aAAA,GAAgB,WAAY,CAAA,MAAA,CAAO,CAAC,KAAA,EAAO,OAAY,KAAA;AACrD,UAAM,KAAA,CAAA,IAAA;AAAA,YACJ,GAAG,OAAQ,CAAA,WAAA,CAAY,MAAO,CAAA,CAAC,UAAU,GAAQ,KAAA;AAC/C,cAAI,IAAA,CAAC,CAAC,GAAA,CAAI,mBAAqB,EAAA;AAC7B,gBAAK,IAAA,CAAA,IAAA;AAAA,kBACH,CAA0B,uBAAA,EAAA,GAAA,CAAI,KAAK,CAAA,GAAA,EAAM,IAAK,CAAA,SAAA;AAAA,oBAC5C,GAAI,CAAA,mBAAA;AAAA,mBACL,CAAA,CAAA;AAAA,iBACH,CAAA;AAAA,eACF;AACA,cAAA,QAAA,CAAS,IAAK,CAAA;AAAA,gBACZ,OAAO,GAAI,CAAA,KAAA;AAAA,gBACX,uBAAuB,OAAQ,CAAA,qBAAA;AAAA,gBAC/B,cAAc,OAAQ,CAAA,YAAA;AAAA,gBACtB,YAAY,GAAI,CAAA,UAAA;AAAA,gBAChB,SAAS,GAAI,CAAA,OAAA;AAAA,gBACb,gBAAgB,GAAI,CAAA,cAAA;AAAA,gBACpB,aAAa,GAAI,CAAA,WAAA;AAAA,gBACjB,SAAS,GAAI,CAAA,OAAA;AAAA,gBACb,gBAAgB,GAAI,CAAA,cAAA;AAAA,gBACpB,OAAO,GAAI,CAAA,KAAA;AAAA,gBACX,YAAY,GAAI,CAAA,UAAA;AAAA,gBAChB,aAAa,GAAI,CAAA,WAAA;AAAA,gBACjB,qBAAqB,GAAI,CAAA,mBAAA;AAAA,eAC1B,CAAA,CAAA;AACD,cAAO,OAAA,QAAA,CAAA;AAAA,aACT,EAAG,EAAW,CAAA;AAAA,WAChB,CAAA;AACA,UAAO,OAAA,KAAA,CAAA;AAAA,SACT,EAAG,EAAW,CAAA,CAAA;AAAA,OAChB;AAIA,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,aAAA,CAAc,QAAQ,CAAK,EAAA,EAAA;AAC7C,QAAM,MAAA,UAAA,GAAa,cAAc,CAAC,CAAA,CAAA;AAClC,QAAA,IAAI,SAAS,UAAW,CAAA,WAAA,CAAA;AACxB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,CAAW,mBAAqB,EAAA;AAK9C,UAAA,MAAM,YAAY,MAAMA,sBAAA;AAAA,YACtB,CAAG,EAAA,YAAY,CAAI,CAAA,EAAA,UAAA,CAAW,KAAK,CAAA,OAAA,CAAA;AAAA,YACnC;AAAA,cACE,OAAS,EAAA;AAAA,gBACP,aAAe,EAAA,CAAA,OAAA,EAAU,IAAK,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AAAA,eACjE;AAAA,aACF;AAAA,WACF,CAAA;AACA,UAAU,MAAA,GAAA,MAAM,UAAU,IAAK,EAAA,CAAA;AAAA,SACjC;AACA,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,UAAY,EAAA,uBAAA;AAAA,UACZ,IAAM,EAAA,KAAA;AAAA,UACN,QAAU,EAAA;AAAA,YACR,IAAM,EAAA;AAAA,cACJ,eAAA;AAAA,cACA,GAAI,CAAC,CAAC,UAAA,CAAW,UACb,GAAA;AAAA,gBACE,cACE,GAAA,uBAAA,CAAwB,KAAO,EAAA,UAAA,CAAW,UAAU,CAAA;AAAA,kBAExD,EAAC;AAAA,aACP;AAAA,YACA,IAAM,EAAA,uBAAA,CAAwB,MAAQ,EAAA,UAAA,CAAW,KAAK,CAAA;AAAA,YACtD,OAAO,UAAW,CAAA,KAAA;AAAA,YAClB,aAAa,UAAW,CAAA,WAAA;AAAA,YACxB,WAAa,EAAA;AAAA,cACX,kCAAA,EAAoC,OAAO,YAAY,CAAA,CAAA;AAAA,cACvD,yCAAA,EAA2C,OAAO,YAAY,CAAA,CAAA;AAAA,aAChE;AAAA,WACF;AAAA,UACA,IAAM,EAAA;AAAA,YACJ,IAAM,EAAA,SAAA;AAAA,YACN,SAAW,EAAA,YAAA;AAAA,YACX,MAAQ,EAAA,YAAA;AAAA,YACR,KAAA,EAAO,QAAQ,oBAAoB,CAAA,CAAA;AAAA,YACnC,UAAA,EAAY,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AAAA,WACnC;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AACA,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAK,IAAA,CAAA,GAAA;AAAA,UACH,sCAAA,GAAyC,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,SAClE,CAAA;AAAA,OACF;AAAA,aACO,CAAG,EAAA;AACV,MAAK,IAAA,CAAA,KAAA;AAAA,QACH,CAAA,qGAAA,EAAwG,YAAY,CAAA,UAAA,EAAa,IAAK,CAAA,SAAA;AAAA,UACpI,CAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,WAAc,GAAA,CAAA,6BAAA,CAAA,CAAA;AACpB,IAAM,MAAA,IAAA,CAAK,WAAW,aAAc,CAAA;AAAA,MAClC,IAAM,EAAA,MAAA;AAAA,MACN,QAAU,EAAA;AAAA,QACR;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,OAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAM,EAAA,WAAA;AAAA,cACN,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,eAAe,CAAA,CAAA;AAAA,gBAC1D,yCAAA,EAA2C,OAAO,eAAe,CAAA,CAAA;AAAA,eACnE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,IAAM,EAAA,uBAAA;AAAA,cACN,UAAU,EAAC;AAAA,cACX,OAAA,EAAS,CAAC,oBAAoB,CAAA;AAAA,aAChC;AAAA,WACF;AAAA,SACF;AAAA,QACA;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,MAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAM,EAAA,oBAAA;AAAA,cACN,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,eAAe,CAAA,CAAA;AAAA,gBAC1D,yCAAA,EAA2C,OAAO,eAAe,CAAA,CAAA;AAAA,eACnE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,WAAa,EAAA,yBAAA;AAAA,cACb,KAAO,EAAA,EAAA;AAAA,cACP,OAAS,EAAA,EAAA;AAAA,cACT,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,aACxB;AAAA,WACF;AAAA,SACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAqBA;AAAA,UACE,WAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,UAAY,EAAA,uBAAA;AAAA,YACZ,IAAM,EAAA,QAAA;AAAA,YACN,QAAU,EAAA;AAAA,cACR,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,cACtB,IAAM,EAAA,YAAA;AAAA,cACN,KAAO,EAAA,2BAAA;AAAA,cACP,WAAa,EAAA;AAAA,gBACX,kCAAA,EAAoC,OAAO,YAAY,CAAA,CAAA;AAAA,gBACvD,yCAAA,EAA2C,OAAO,YAAY,CAAA,CAAA;AAAA,eAChE;AAAA,aACF;AAAA,YACA,IAAM,EAAA;AAAA,cACJ,KAAA,EAAO,QAAQ,oBAAoB,CAAA,CAAA;AAAA;AAAA,aAErC;AAAA,WACF;AAAA,SACF;AAAA,QACA,GAAG,QAAS,CAAA,GAAA,CAAI,aAAW,EAAE,WAAA,EAAa,QAAS,CAAA,CAAA;AAAA,OACrD;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/provider/configHelpers.ts","../src/provider/utility.ts","../src/provider/GlooPlatformPortalProvider.ts"],"sourcesContent":["import { Config } from '@backstage/config';\n\ntype logFn = (s: string) => any;\n\nexport const getPortalServerUrl = (\n logErr: logFn,\n _: logFn,\n config: Config | undefined,\n) => {\n if (!config) {\n logErr('No backstage config found when getting portal server url.');\n return '';\n }\n let value = config.getOptionalString(\n 'glooPlatformPortal.backend.portalServerUrl',\n );\n // Remove trailing slash if supplied.\n if (!!value && value.at(-1) === '/')\n value = value.substring(0, value.length - 1);\n return value ?? 'http://localhost:31080/v1';\n};\n\nexport const getClientSecret = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client secret.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.clientSecret',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientSecret found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getClientId = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting client id.');\n return '';\n }\n const value = config.getOptionalString('glooPlatformPortal.backend.clientId');\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.clientId found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n\nexport const getTokenEndpoint = (\n logErr: logFn,\n logWarning: logFn,\n config: Config,\n) => {\n if (!config) {\n logErr('No backstage config found when getting token endpoint.');\n return '';\n }\n const value = config.getOptionalString(\n 'glooPlatformPortal.backend.tokenEndpoint',\n );\n if (!value) {\n logWarning(\n 'No glooPlatformPortal.backend.tokenEndpoint found in app-config.local.yaml',\n );\n }\n return value ?? '';\n};\n","import fetch from 'node-fetch';\nimport { AccessTokensResponse } from './api-types';\n\nexport function parseJwt(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n}\n\nexport function objectToUrlFormEncodedPayload(\n requestJSON: Record<string, string>,\n) {\n const formBodyPieces = [] as string[];\n for (const property in requestJSON) {\n if (!requestJSON.hasOwnProperty(property)) continue;\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(\n requestJSON[property as keyof typeof requestJSON],\n );\n formBodyPieces.push(`${encodedKey}=${encodedValue}`);\n }\n const formBodyString = formBodyPieces.join('&');\n return formBodyString;\n}\n\nexport async function doAccessTokenRequest(\n grantType: 'refresh_token' | 'client_credentials',\n tokenEndpoint: string,\n clientId: string,\n clientSecret: string,\n refreshToken?: string,\n) {\n const formData = {} as Record<string, string>;\n //\n // Build the request payload for a new oauth access token.\n //\n formData.grant_type = grantType;\n formData.client_id = clientId;\n formData.client_secret = clientSecret;\n if (grantType === 'refresh_token') {\n if (!refreshToken) {\n return undefined;\n }\n formData.refresh_token = refreshToken;\n }\n //\n // Make the request\n //\n const rawRes = await fetch(tokenEndpoint, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n method: 'POST',\n body: objectToUrlFormEncodedPayload(formData),\n });\n let resJSON: any;\n try {\n resJSON = await rawRes.json();\n } catch {\n throw new Error('Error parsing oauth response.');\n }\n if (!!resJSON.error_description) {\n throw new Error(resJSON.error_description);\n }\n if (!!resJSON.error) {\n throw new Error(resJSON.error);\n }\n //\n // Check for the access token in the response.\n //\n if (!resJSON.access_token) {\n throw new Error(\n \"No 'access_token' property was found in the oauth response body.\",\n );\n }\n return resJSON as AccessTokensResponse;\n}\n\n//\n// From: https://backstage.io/docs/features/software-catalog/descriptor-format\n//\nconst sanitizeRegex = {\n // Each tag must be sequences of [a-z0-9:+#] separated by -, at most 63 characters in total\n tag: /[a-z]|[0-9]|\\:|\\+|\\#|\\-/,\n // Strings of length at least 1, and at most 63\n // Must consist of sequences of [a-z0-9A-Z] possibly separated by one of [-_.].\n name: /[a-z]|[0-9]|[A-Z]|\\-|\\_|\\./,\n // Namespaces must be sequences of [a-zA-Z0-9], possibly separated by -, at most 63 characters in total.\n namespace: /[a-z]|[0-9]|[A-Z]|\\-/,\n};\n\n/**\n * Sanitizes a string before adding it to a backstage entity.\n */\nexport const sanitizeStringForEntity = (\n propertyType: keyof typeof sanitizeRegex,\n propertyValue: string,\n) => {\n return propertyValue\n .split('')\n .map(ch => (!sanitizeRegex[propertyType].test(ch) ? '-' : ch))\n .reduce(\n (prev, cur) =>\n // Don't go over 63 characters.\n prev.length >= 62\n ? prev\n : // Don't repeat \"-\"\n prev.at(-1) === '-' && cur === '-'\n ? prev\n : prev + cur,\n '',\n );\n};\n","import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\nimport { Entity, EntityMeta } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport fetch from 'node-fetch';\nimport { API, APIProduct, APISchema, AccessTokensResponse } from './api-types';\nimport {\n getClientId,\n getClientSecret,\n getPortalServerUrl,\n getTokenEndpoint,\n} from './configHelpers';\nimport {\n doAccessTokenRequest,\n parseJwt,\n sanitizeStringForEntity,\n} from './utility';\n\n/**\n * Provides API entities from the Gloo Platform Portal REST server.\n */\nexport class GlooPlatformPortalProvider implements EntityProvider {\n private connection?: EntityProviderConnection;\n private logger: LoggerService;\n private config: Config;\n private latestTokensResponse?: AccessTokensResponse;\n private debugLogging = false;\n\n log = (s: string) => this.logger?.info(`gloo-platform-portal: ${s}`);\n warn = (s: string) => this.logger?.warn(`gloo-platform-portal: ${s}`);\n error = (s: string) => this.logger?.error(`gloo-platform-portal: ${s}`);\n getProviderName = () => `gloo-platform-portal-backend-provider`;\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n }\n\n //\n // 1. Init class\n //\n constructor(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n ) {\n this.logger = logger;\n this.config = config;\n // Default extra debug-logging to false\n this.debugLogging = !!this.config?.getOptionalBoolean(\n 'glooPlatformPortal.backend.debugLogging',\n );\n this.log('Initializing GlooPlatformPortalProvider.');\n // Get the tokens, then schedule the task to update the catalog.\n this.startTokensRequests().then(() => this.startScheduler(scheduler));\n }\n\n //\n // 2. Get access_token\n //\n async startTokensRequests() {\n //\n // Make the initial request for the access_token.\n if (this.debugLogging) {\n this.log('Making the initial access_token request.');\n }\n if (!this.config) {\n this.error(\n 'Backstage config object not found when doing access token request.',\n );\n return;\n }\n const res = await doAccessTokenRequest(\n 'client_credentials',\n getTokenEndpoint(this.error, this.warn, this.config),\n getClientId(this.error, this.warn, this.config),\n getClientSecret(this.error, this.warn, this.config),\n );\n this.latestTokensResponse = res;\n if (!this.latestTokensResponse) {\n // If there's a problem, wait to restart the access token\n // requests so as to not overload the auth server.\n this.warn('No latest access token. Re-requesting the access_token.');\n setTimeout(this.startTokensRequests.bind(this), 5000);\n return;\n }\n if (this.debugLogging) {\n this.log('Got the access_token.');\n }\n //\n // Parse the access_token JWT to find when it expires.\n const parsedToken = parseJwt(this.latestTokensResponse.access_token);\n if (!parsedToken.exp) {\n this.warn('No `exp` property found in the access_token JWT.');\n }\n const nowDate = new Date();\n const expiresDate = new Date(parsedToken.exp * 1000);\n const millisUntilExpires = expiresDate.getTime() - nowDate.getTime();\n if (millisUntilExpires <= 0) {\n this.warn('access token is expired!');\n this.latestTokensResponse = undefined;\n return;\n }\n if (this.debugLogging) {\n this.log('Setting a timeout to get the next access token.');\n }\n // Set the timeout to request new tokens.\n setTimeout(\n this.startTokensRequests.bind(this),\n // Don't make this request more than once a second,\n // and do the refresh 5 seconds early.\n Math.max(1000, millisUntilExpires - 5000),\n );\n }\n\n /**\n *\n * 3. Schedule sync.\n *\n * This passes the user config into the\n * Backstage plugin task scheduler.\n * */\n async startScheduler(scheduler: SchedulerService) {\n if (this.debugLogging) {\n this.log('Scheduling backstage catalog sync.');\n }\n const frequencyConfig = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncFrequency',\n );\n // Get frequency from the config.\n const frequency = {\n hours: frequencyConfig?.getOptionalNumber('hours') ?? 0,\n minutes: frequencyConfig?.getOptionalNumber('minutes') ?? 0,\n seconds: frequencyConfig?.getOptionalNumber('seconds') ?? 0,\n milliseconds: frequencyConfig?.getOptionalNumber('milliseconds') ?? 0,\n };\n if (Object.values(frequency).every(v => v === 0)) {\n // If there are no values for frequency, set a resonable default instead of 0.\n frequency.minutes = 5;\n if (this.debugLogging) {\n this.log(\n `No frequency value was set, so the default value of ${frequency.minutes} minutes will be used.`,\n );\n }\n }\n if (this.debugLogging) {\n this.log(`Frequency set to ${JSON.stringify(frequency)}.`);\n }\n // Get timeout from the config.\n const timeoutConfig = this.config?.getOptionalConfig(\n 'glooPlatformPortal.backend.syncTimeout',\n );\n const timeout = {\n hours: timeoutConfig?.getOptionalNumber('hours') ?? 0,\n minutes: timeoutConfig?.getOptionalNumber('minutes') ?? 0,\n seconds: timeoutConfig?.getOptionalNumber('seconds') ?? 0,\n milliseconds: timeoutConfig?.getOptionalNumber('milliseconds') ?? 0,\n };\n if (Object.values(timeout).every(v => v === 0)) {\n // If there are no values for timeout, set a resonable default instead of 0.\n timeout.seconds = 30;\n if (this.debugLogging) {\n this.log(\n `No timeout value was set. The default value of ${timeout.seconds} seconds will be used.`,\n );\n }\n }\n if (this.debugLogging) {\n this.log(`Timeout set to ${JSON.stringify(timeout)}.`);\n }\n // Start the sync task on the Backstage scheduler.\n await scheduler.scheduleTask({\n id: 'run_gloo_platform_portal_refresh',\n fn: async () => {\n await this.run();\n },\n frequency,\n timeout,\n });\n }\n\n /**\n *\n * 4. Return new Backstage entities.\n *\n * Requests API information from the Gloo Platform Portal REST server,\n * and transforms the response into Backstage API entities.\n */\n async run(): Promise<void> {\n if (!this.connection || !this.latestTokensResponse) {\n throw new Error('Not initialized');\n }\n\n const entities: Entity[] = [];\n const bsGroupName = 'solo-io-service-accounts';\n const bsServiceAccountName = 'gloo-platform-portal-service-account';\n const bsSystemName = 'gloo-platform-portal-apis';\n const portalServerUrl = getPortalServerUrl(\n this.error,\n this.warn,\n this.config,\n );\n const apisEndpoint = `${portalServerUrl}/apis`;\n //\n // Make API request\n try {\n const fullRequestURI = apisEndpoint + '?includeSchema=true';\n if (this.debugLogging) {\n this.log(\n `Fetching APIs from ${fullRequestURI} with header: \"Authorization: Bearer ${this.latestTokensResponse.access_token}\"`,\n );\n }\n const res = await fetch(fullRequestURI, {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n });\n const resText = await res.text();\n if (this.debugLogging) {\n this.log('Performed fetch and recieved the response text: ' + resText);\n }\n let processedAPIs = JSON.parse(resText) as API[];\n if (this.debugLogging) {\n this.log('Parsed the text into JSON.');\n }\n\n //\n // The server returns the APIs grouped by APIProduct,\n // so we can convert it back to a list here.\n //\n if (!!processedAPIs?.length && 'apiVersions' in processedAPIs[0]) {\n const apiProducts = processedAPIs as unknown as APIProduct[];\n processedAPIs = apiProducts.reduce((accum, curProd) => {\n accum.push(\n ...curProd.apiVersions.reduce((accumVer, api) => {\n if (!!api.openapiSpecFetchErr) {\n this.warn(\n `Schema fetch error for ${api.apiId} : ${JSON.stringify(\n api.openapiSpecFetchErr,\n )}`,\n );\n }\n accumVer.push({\n apiId: api.apiId,\n apiProductDisplayName: curProd.apiProductDisplayName,\n apiProductId: curProd.apiProductId,\n apiVersion: api.apiVersion,\n contact: api.contact,\n customMetadata: api.customMetadata,\n description: api.description,\n license: api.license,\n termsOfService: api.termsOfService,\n title: api.title,\n usagePlans: api.usagePlans,\n openapiSpec: api.openapiSpec,\n openapiSpecFetchErr: api.openapiSpecFetchErr,\n });\n return accumVer;\n }, [] as API[]),\n );\n return accum;\n }, [] as API[]);\n }\n\n //\n // Convert the APIs to entities\n for (let i = 0; i < processedAPIs.length; i++) {\n const apiVersion = processedAPIs[i];\n let schema = apiVersion.openapiSpec;\n if (!schema && !apiVersion.openapiSpecFetchErr) {\n // If the schema was not attempted to be fetched with\n // the /apis call, we individually fetch it here.\n // This is for backwards compatibility only, for\n // when the schema was not in the /apis response.\n const schemaRes = await fetch(\n `${apisEndpoint}/${apiVersion.apiId}/schema`,\n {\n headers: {\n Authorization: `Bearer ${this.latestTokensResponse.access_token}`,\n },\n },\n );\n schema = (await schemaRes.json()) as APISchema;\n }\n entities.push({\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n tags: [\n 'gloo-platform',\n ...(!!apiVersion.apiVersion\n ? [\n 'api-version-' +\n sanitizeStringForEntity('tag', apiVersion.apiVersion),\n ]\n : []),\n ],\n name: sanitizeStringForEntity('name', apiVersion.apiId),\n title: apiVersion.apiId,\n description: apiVersion.description,\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n type: 'openapi',\n lifecycle: 'production',\n system: bsSystemName,\n owner: `user:${bsServiceAccountName}`,\n definition: JSON.stringify(schema),\n },\n });\n }\n if (this.debugLogging) {\n this.log(\n 'Transformed APIs into new entities: ' + JSON.stringify(entities),\n );\n }\n } catch (e) {\n this.error(\n `Could not get APIs from the portal server endpoint or their schemas or transform them into entities (${apisEndpoint}). Error: ${JSON.stringify(\n e,\n )}`,\n );\n }\n\n const locationKey = `gloo-platform-portal-provider`;\n await this.connection.applyMutation({\n type: 'full',\n entities: [\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Group',\n metadata: {\n name: bsGroupName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n type: 'service-account-group',\n children: [],\n members: [bsServiceAccountName],\n },\n },\n },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'User',\n metadata: {\n name: bsServiceAccountName,\n annotations: {\n 'backstage.io/managed-by-location': `url:${portalServerUrl}`,\n 'backstage.io/managed-by-origin-location': `url:${portalServerUrl}`,\n },\n },\n spec: {\n displayName: 'Solo.io Service Account',\n email: '',\n picture: '',\n memberOf: [bsGroupName],\n },\n },\n },\n // {\n // locationKey,\n // entity: {\n // apiVersion: 'backstage.io/v1alpha1',\n // kind: 'Domain',\n // metadata: {\n // tags: ['gloo-platform'],\n // name: 'api-product',\n // description: 'Gloo Platform Portal ApiProduct resources.',\n // annotations: {\n // 'backstage.io/managed-by-location': 'url:' + apisEndpoint,\n // 'backstage.io/managed-by-origin-location':\n // 'url:' + apisEndpoint,\n // },\n // } as EntityMeta,\n // spec: {\n // owner: 'user:' + bsServiceAccountName,\n // },\n // },\n // },\n {\n locationKey,\n entity: {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'System',\n metadata: {\n tags: ['gloo-platform'],\n name: bsSystemName,\n title: 'Gloo Platform Portal APIs',\n annotations: {\n 'backstage.io/managed-by-location': `url:${apisEndpoint}`,\n 'backstage.io/managed-by-origin-location': `url:${apisEndpoint}`,\n },\n } as EntityMeta,\n spec: {\n owner: `user:${bsServiceAccountName}`,\n // domain: 'api-product',\n },\n },\n },\n ...entities.map(entity => ({ locationKey, entity })),\n ],\n });\n }\n}\n"],"names":["fetch"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solo.io/platform-portal-backstage-plugin-backend",
|
|
3
3
|
"description": "A Backstage backend plugin that synchronizes Gloo Platform Portal APIs with the Backstage catalog.",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.30",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|