@nospt/backstage-plugin-apigee-backend 0.1.1 → 0.1.3
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.
|
@@ -52,6 +52,9 @@ class ApigeeEntityProvider {
|
|
|
52
52
|
if (!this.connection) {
|
|
53
53
|
throw new Error("ApigeeEntityProvider not initialized");
|
|
54
54
|
}
|
|
55
|
+
this.logger.info(
|
|
56
|
+
`[catalog-module-apigee] Starting catalog sync for ${this.orgsConfig.length} org(s): ${this.orgsConfig.map((o) => o.name).join(", ")}`
|
|
57
|
+
);
|
|
55
58
|
const orgResults = await Promise.allSettled(
|
|
56
59
|
this.orgsConfig.map((orgCfg) => this.fetchOrgData(orgCfg))
|
|
57
60
|
);
|
|
@@ -66,6 +69,21 @@ class ApigeeEntityProvider {
|
|
|
66
69
|
orgDataList.push(result.value);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
72
|
+
const totalProxies = orgDataList.reduce(
|
|
73
|
+
(sum, o) => sum + o.proxyMap.size,
|
|
74
|
+
0
|
|
75
|
+
);
|
|
76
|
+
const totalSharedflows = orgDataList.reduce(
|
|
77
|
+
(sum, o) => sum + o.sharedflows.length,
|
|
78
|
+
0
|
|
79
|
+
);
|
|
80
|
+
const totalHubApis = orgDataList.reduce(
|
|
81
|
+
(sum, o) => sum + o.apiHubApis.length,
|
|
82
|
+
0
|
|
83
|
+
);
|
|
84
|
+
this.logger.info(
|
|
85
|
+
`[catalog-module-apigee] Fetched ${orgDataList.length}/${this.orgsConfig.length} org(s): ${totalProxies} proxies, ${totalHubApis} API Hub definitions, ${totalSharedflows} sharedflows`
|
|
86
|
+
);
|
|
69
87
|
const mergedProxyMap = /* @__PURE__ */ new Map();
|
|
70
88
|
for (const orgData of orgDataList) {
|
|
71
89
|
for (const [slug, partial] of orgData.proxyMap) {
|
|
@@ -183,6 +201,9 @@ class ApigeeEntityProvider {
|
|
|
183
201
|
entities.push(entityBuilder.sharedflowToEntity(sf, orgData.orgName, this.options));
|
|
184
202
|
}
|
|
185
203
|
}
|
|
204
|
+
this.logger.info(
|
|
205
|
+
`[catalog-module-apigee] Catalog sync complete \u2014 emitting ${entities.length} entities`
|
|
206
|
+
);
|
|
186
207
|
await this.connection.applyMutation({
|
|
187
208
|
type: "full",
|
|
188
209
|
entities: entities.map((entity) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-provider.cjs.js","sources":["../../src/lib/entity-provider.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport {\n type LoggerService,\n type SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport type {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport type { ApigeeClient } from './apigee-client';\nimport type { ApiHubClient, ApiHubApi } from './api-hub-client';\nimport type { SharedflowClient, ApigeeSharedflow } from './sharedflow-client';\nimport {\n slugify,\n proxyToEntities,\n sharedflowToEntity,\n selectSpec,\n enrichMatchedApiEntity,\n hubOnlyToEntity,\n type OrgSyncData,\n type MergedProxy,\n type EntityBuildOptions,\n type SpecEmbed,\n} from './entity-builder';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Org configuration shape (matches config.d.ts apigee.orgs[n]) */\ninterface OrgConfig {\n name: string;\n projectId: string;\n environments?: string[];\n githubOrgSlug?: string;\n /** proxyName → API Hub apiId override (D-01); set by module.ts from config. */\n apiHubMappings?: Record<string, string>;\n}\n\n/** Data collected for a single org during one sync run. */\ninterface OrgData {\n orgName: string;\n proxyMap: Map<string, MergedProxy>; // slug → MergedProxy (single-org orgs array)\n sharedflows: ApigeeSharedflow[];\n /** proxyName.toLowerCase() → apiType from API Hub */\n apiTypeMap: Map<string, string>;\n /** All API Hub definitions discovered for this org (retained for enrichment). */\n apiHubApis: ApiHubApi[];\n /** GCP project for this org's API Hub instance (D-01 spec fetch). */\n projectId: string;\n /** Org GitHub slug for source-link fallback (D-05). */\n githubOrgSlug?: string;\n /** proxyName → API Hub apiId override (D-01). */\n apiHubMappings?: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum number of spec resolutions (each ~3-4 API Hub round-trips) to run in\n * parallel during a sync. Bounds concurrency so a large catalogue does not open\n * dozens of simultaneous connections while still avoiding fully serial latency.\n */\nconst SPEC_FETCH_CONCURRENCY = 8;\n\n/**\n * Entity provider that discovers Apigee API proxies and sharedflows across\n * one or more organisations and registers them as Backstage entities.\n *\n * Registered with the catalog via `catalogProcessingExtensionPoint.addEntityProvider`.\n * Scheduled via the `SchedulerServiceTaskRunner` injected at construction time.\n */\nexport class ApigeeEntityProvider implements EntityProvider {\n private connection?: EntityProviderConnection;\n\n constructor(\n private readonly taskRunner: SchedulerServiceTaskRunner,\n private readonly logger: LoggerService,\n private readonly orgsConfig: OrgConfig[],\n private readonly apigeeClient: ApigeeClient,\n private readonly apiHubClient: ApiHubClient,\n private readonly sharedflowClient: SharedflowClient,\n private readonly options: EntityBuildOptions,\n ) {}\n\n /** Stable provider name — MUST NOT change; it links entities to this provider. */\n getProviderName(): string {\n return 'apigee-catalog-provider';\n }\n\n /**\n * Called once by the catalog on startup. Stores the connection and registers\n * the recurring sync task with the scheduler.\n */\n async connect(connection: EntityProviderConnection): Promise<void> {\n if (this.connection) {\n throw new Error('ApigeeEntityProvider is already connected');\n }\n this.connection = connection;\n await this.taskRunner.run({\n id: 'catalog-backend-module-apigee:sync',\n fn: async () => {\n await this.run();\n },\n });\n }\n\n /**\n * Executes one full catalog sync:\n * 1. Fetch proxy / sharedflow / API-Hub data for all orgs in parallel.\n * 2. Warn and skip any org that fails (error isolation per org).\n * 3. Deduplicate proxies shared across multiple orgs (D-03).\n * 4. Build entities and call applyMutation exactly once.\n */\n async run(): Promise<void> {\n if (!this.connection) {\n throw new Error('ApigeeEntityProvider not initialized');\n }\n\n // ── Step 1: Parallel fetch ────────────────────────────────────────────\n const orgResults = await Promise.allSettled(\n this.orgsConfig.map(orgCfg => this.fetchOrgData(orgCfg)),\n );\n\n // ── Step 2: Collect successful results; warn on failures ──────────────\n const orgDataList: OrgData[] = [];\n for (let i = 0; i < orgResults.length; i++) {\n const result = orgResults[i];\n if (result.status === 'rejected') {\n this.logger.warn(\n `[catalog-module-apigee] Org '${this.orgsConfig[i].name}' sync failed: ${result.reason}`,\n );\n } else {\n orgDataList.push(result.value);\n }\n }\n\n // ── Step 3: Deduplicate proxies by slug across orgs (D-03) ────────────\n const mergedProxyMap = new Map<string, MergedProxy>();\n for (const orgData of orgDataList) {\n for (const [slug, partial] of orgData.proxyMap) {\n const existing = mergedProxyMap.get(slug);\n if (existing) {\n // Same proxy in multiple orgs: merge orgs array\n existing.orgs.push(...partial.orgs);\n // Merge base paths (deduplicate)\n for (const bp of partial.basePaths) {\n if (!existing.basePaths.includes(bp)) {\n existing.basePaths.push(bp);\n }\n }\n } else {\n mergedProxyMap.set(slug, {\n proxy: partial.proxy,\n basePaths: [...partial.basePaths],\n orgs: [...partial.orgs],\n });\n }\n }\n }\n\n // ── Step 4: Build entities ─────────────────────────────────────────────\n const entities: Entity[] = [];\n\n // Combined API Hub lookup across orgs, keyed by slugified displayName\n // (the human identifier; the resource name's last segment is an opaque\n // UUID and never matches a proxy slug, D-01). First org wins on collision.\n const apiHubById = new Map<string, { api: ApiHubApi; orgData: OrgData }>();\n // proxyName → API Hub apiId overrides collected across orgs (D-01).\n const mappingOverrides = new Map<string, string>();\n for (const orgData of orgDataList) {\n for (const hubApi of orgData.apiHubApis) {\n const id = slugify(\n hubApi.displayName ?? hubApi.name.split('/').pop() ?? '',\n );\n if (id && !apiHubById.has(id)) {\n apiHubById.set(id, { api: hubApi, orgData });\n }\n }\n if (orgData.apiHubMappings) {\n for (const [proxyName, hubId] of Object.entries(orgData.apiHubMappings)) {\n if (!mappingOverrides.has(proxyName)) {\n mappingOverrides.set(proxyName, hubId);\n }\n }\n }\n }\n\n const matchedHubIds = new Set<string>();\n\n // First pass: build entity pairs and split into matched (need a spec fetch)\n // vs. unmatched (ready to emit). Spec fetches are deferred so they can run\n // with bounded concurrency instead of one-at-a-time (WR-03).\n interface MatchedItem {\n component: Entity;\n api: Entity;\n hubApi: ApiHubApi;\n githubOrgSlug?: string;\n realApiId: string;\n projectId: string;\n }\n const matchedItems: MatchedItem[] = [];\n\n for (const [slug, merged] of mergedProxyMap.entries()) {\n // Resolve API type: try each org's apiTypeMap (D-01)\n let apiType: string | undefined;\n for (const orgData of orgDataList) {\n const t =\n orgData.apiTypeMap.get(slug) ??\n orgData.apiTypeMap.get(merged.proxy.name.toLowerCase());\n if (t) {\n apiType = t;\n break;\n }\n }\n const [component, api] = proxyToEntities(merged, apiType, this.options);\n\n // Match proxy → API Hub definition: apiHubMappings override else\n // slug == lowercased apiId (D-01).\n const candidate = (\n mappingOverrides.get(merged.proxy.name) ?? slug\n ).toLowerCase();\n const match = apiHubById.get(candidate);\n if (match) {\n matchedHubIds.add(candidate);\n matchedItems.push({\n component,\n api,\n hubApi: match.api,\n githubOrgSlug: match.orgData.githubOrgSlug,\n realApiId: match.api.name.split('/').pop() ?? candidate,\n projectId: match.orgData.projectId,\n });\n } else {\n // No API Hub match: API keeps has-spec:'false' from proxyToEntities.\n entities.push(component, api);\n }\n }\n\n // D-02/D-03: resolve specs with bounded concurrency, then assemble entities\n // in original order. Per-spec try/catch isolation lives in resolveSpecForApi.\n const matchedSpecs = await this.mapWithConcurrency(\n matchedItems,\n SPEC_FETCH_CONCURRENCY,\n item => this.resolveSpecForApi(item.realApiId, item.projectId),\n );\n matchedItems.forEach((item, i) => {\n entities.push(\n item.component,\n enrichMatchedApiEntity(\n item.api,\n item.hubApi,\n matchedSpecs[i],\n item.githubOrgSlug,\n this.options,\n ),\n );\n });\n\n // Append hub-only API entities for API Hub definitions with no matching\n // proxy (D-04, CAT-05). De-dupe by entity name for hub apis shared across orgs.\n const hubOnlyItems: Array<{\n hubApi: ApiHubApi;\n orgData: OrgData;\n realApiId: string;\n }> = [];\n for (const [id, { api: hubApi, orgData }] of apiHubById.entries()) {\n if (matchedHubIds.has(id)) continue;\n hubOnlyItems.push({\n hubApi,\n orgData,\n realApiId: hubApi.name.split('/').pop() ?? id,\n });\n }\n const hubOnlySpecs = await this.mapWithConcurrency(\n hubOnlyItems,\n SPEC_FETCH_CONCURRENCY,\n item => this.resolveSpecForApi(item.realApiId, item.orgData.projectId),\n );\n const hubOnlyNames = new Set<string>();\n hubOnlyItems.forEach((item, i) => {\n const entity = hubOnlyToEntity(\n item.hubApi,\n item.orgData.orgName,\n hubOnlySpecs[i],\n item.orgData.githubOrgSlug,\n this.options,\n );\n if (hubOnlyNames.has(entity.metadata.name)) return;\n hubOnlyNames.add(entity.metadata.name);\n entities.push(entity);\n });\n\n // Add sharedflow entities\n for (const orgData of orgDataList) {\n for (const sf of orgData.sharedflows) {\n entities.push(sharedflowToEntity(sf, orgData.orgName, this.options));\n }\n }\n\n // ── Step 5: Single full mutation ──────────────────────────────────────\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n // ── Private helpers ──────────────────────────────────────────────────────\n\n /**\n * Maps `items` through `fn` with at most `limit` invocations in flight at\n * once, preserving input order in the returned array. Used to parallelise\n * per-API spec resolution without overwhelming the API Hub backend (WR-03).\n */\n private async mapWithConcurrency<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n ): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const workerCount = Math.max(1, Math.min(limit, items.length));\n const worker = async (): Promise<void> => {\n while (true) {\n const i = next;\n next += 1;\n if (i >= items.length) break;\n results[i] = await fn(items[i]);\n }\n };\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n return results;\n }\n\n /**\n * Fetches a spec's contents subject to the size guard (D-03).\n *\n * Two-stage guard:\n * 1. Pre-fetch: if the spec metadata reports `sizeBytes > specMaxBytes`, skip\n * the download entirely and return a `specUrl` link. NOTE: the API Hub spec\n * metadata endpoint frequently reports `sizeBytes: 0`/undefined, so this\n * stage often cannot fire and the contents are downloaded anyway.\n * 2. Post-decode: enforce `specMaxBytes` against the actual decoded byte\n * length — this is the guard that reliably bounds the *embedded* size.\n *\n * Because stage 1 is unreliable, `specMaxBytes` bounds the size of the spec\n * that gets embedded, not necessarily the size downloaded into memory.\n */\n private async fetchSpecEmbed(\n apiId: string,\n versionId: string,\n specId: string,\n projectId: string,\n ): Promise<SpecEmbed> {\n const spec = await this.apiHubClient.getSpec(\n apiId,\n versionId,\n specId,\n projectId,\n );\n const limit = this.options.specMaxBytes ?? 512000;\n const size = spec.sizeBytes ?? 0;\n if (size > limit) {\n // D-03 stage 1: over the size limit by metadata — link instead of embedding.\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' (${size} bytes) exceeds specMaxBytes (${limit}); linking via spec-url instead of embedding`,\n );\n return { hasSpec: true, specUrl: spec.name };\n }\n const contents = await this.apiHubClient.getSpecContents(\n apiId,\n versionId,\n specId,\n projectId,\n );\n const base64 = contents.contents ?? '';\n const definition = Buffer.from(base64, 'base64').toString('utf-8');\n const decodedBytes = Buffer.byteLength(definition, 'utf-8');\n // Trace decode results so spec-shape regressions (e.g. a renamed contents\n // field, or malformed base64 decoding to garbage) are easy to diagnose.\n this.logger.debug(\n `[catalog-module-apigee] Resolved spec '${spec.name}' (mimeType=${\n contents.mimeType ?? '?'\n }, ${decodedBytes} bytes decoded, metadata sizeBytes=${\n spec.sizeBytes ?? 'n/a'\n })`,\n );\n if (!base64) {\n // Empty payload — record as \"no spec\" rather than embedding an empty string.\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' returned empty contents; treating as no embeddable spec`,\n );\n return { hasSpec: false };\n }\n // D-03 stage 2: the pre-fetch guard can be bypassed when sizeBytes is 0,\n // so enforce the limit against the actual decoded byte length.\n if (decodedBytes > limit) {\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' (${decodedBytes} bytes decoded) exceeds specMaxBytes (${limit}); linking via spec-url instead of embedding`,\n );\n return { hasSpec: true, specUrl: spec.name };\n }\n return { hasSpec: true, definition };\n }\n\n /**\n * Resolves the spec for an API: lists versions, deterministically selects one\n * (D-02), enumerates that version's specs (the versions endpoint does not\n * reliably populate specIds), picks the lexicographically smallest spec ID,\n * then fetches it with the size guard. Per-spec failures are isolated: any\n * error is logged and `undefined` is returned so one bad spec never aborts\n * the whole sync.\n */\n private async resolveSpecForApi(\n apiId: string,\n projectId: string,\n ): Promise<SpecEmbed | undefined> {\n try {\n const versions = await this.apiHubClient.listVersions(apiId, projectId);\n const selection = selectSpec(versions);\n if (!selection) return undefined;\n const specs = await this.apiHubClient.listSpecs(\n apiId,\n selection.versionId,\n projectId,\n );\n const specId = specs\n .map(s => s.name?.split('/').pop() ?? '')\n .filter(Boolean)\n .sort()[0];\n if (!specId) return undefined;\n return await this.fetchSpecEmbed(\n apiId,\n selection.versionId,\n specId,\n projectId,\n );\n } catch (e) {\n this.logger.warn(\n `[catalog-module-apigee] spec fetch failed for ${apiId}: ${e}`,\n );\n return undefined;\n }\n }\n\n /**\n * Fetches all data for one org: proxies, their deployments + revisions,\n * API Hub type map, and sharedflows.\n */\n private async fetchOrgData(orgCfg: OrgConfig): Promise<OrgData> {\n const [proxies, apiHubApis, sharedflows] = await Promise.all([\n this.apigeeClient.listProxies(orgCfg.name),\n this.apiHubClient.listApis(orgCfg.projectId),\n this.sharedflowClient.listSharedflows(orgCfg.name),\n ]);\n\n // Build API Hub type map: slugified displayName → apiType\n const apiTypeMap = new Map<string, string>();\n for (const api of apiHubApis) {\n const id = slugify(api.displayName ?? api.name.split('/').pop() ?? '');\n if (id && api.apiType) {\n apiTypeMap.set(id, api.apiType);\n }\n }\n\n // Fetch deployments + latest revision for all proxies in parallel\n const proxyMap = new Map<string, MergedProxy>();\n await Promise.all(\n proxies.map(async proxy => {\n try {\n const latestRev = proxy.revision?.length\n ? proxy.revision[proxy.revision.length - 1]\n : undefined;\n\n const [deployments, revision] = await Promise.all([\n this.apigeeClient.listDeployments(orgCfg.name, proxy.name),\n latestRev\n ? this.apigeeClient.getProxyRevision(\n orgCfg.name,\n proxy.name,\n latestRev,\n )\n : Promise.resolve({ name: proxy.name, basepaths: [] as string[] }),\n ]);\n\n // Derive lifecycle and environment list from ready deployments\n const readyDeps = deployments.filter(\n d => d.deploymentStatus === 'READY',\n );\n const lifecycle =\n readyDeps.length > 0 ? 'production' : 'experimental';\n const environments = readyDeps.map(d => d.environment);\n\n const orgSyncData: OrgSyncData = {\n slug: slugify(orgCfg.name),\n name: orgCfg.name,\n projectId: orgCfg.projectId,\n environments,\n lifecycle,\n };\n\n proxyMap.set(slugify(proxy.name), {\n proxy,\n basePaths: revision.basepaths ?? [],\n orgs: [orgSyncData],\n });\n } catch (e) {\n this.logger.warn(\n `[catalog-module-apigee] Skipping proxy '${proxy.name}' in org '${orgCfg.name}': ${e}`,\n );\n }\n }),\n );\n\n return {\n orgName: orgCfg.name,\n proxyMap,\n sharedflows,\n apiTypeMap,\n apiHubApis,\n projectId: orgCfg.projectId,\n githubOrgSlug: orgCfg.githubOrgSlug,\n apiHubMappings: orgCfg.apiHubMappings,\n };\n }\n}\n"],"names":["slugify","proxyToEntities","enrichMatchedApiEntity","hubOnlyToEntity","sharedflowToEntity","selectSpec"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entity-provider.cjs.js","sources":["../../src/lib/entity-provider.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport {\n type LoggerService,\n type SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport type {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport type { ApigeeClient } from './apigee-client';\nimport type { ApiHubClient, ApiHubApi } from './api-hub-client';\nimport type { SharedflowClient, ApigeeSharedflow } from './sharedflow-client';\nimport {\n slugify,\n proxyToEntities,\n sharedflowToEntity,\n selectSpec,\n enrichMatchedApiEntity,\n hubOnlyToEntity,\n type OrgSyncData,\n type MergedProxy,\n type EntityBuildOptions,\n type SpecEmbed,\n} from './entity-builder';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Org configuration shape (matches config.d.ts apigee.orgs[n]) */\ninterface OrgConfig {\n name: string;\n projectId: string;\n environments?: string[];\n githubOrgSlug?: string;\n /** proxyName → API Hub apiId override (D-01); set by module.ts from config. */\n apiHubMappings?: Record<string, string>;\n}\n\n/** Data collected for a single org during one sync run. */\ninterface OrgData {\n orgName: string;\n proxyMap: Map<string, MergedProxy>; // slug → MergedProxy (single-org orgs array)\n sharedflows: ApigeeSharedflow[];\n /** proxyName.toLowerCase() → apiType from API Hub */\n apiTypeMap: Map<string, string>;\n /** All API Hub definitions discovered for this org (retained for enrichment). */\n apiHubApis: ApiHubApi[];\n /** GCP project for this org's API Hub instance (D-01 spec fetch). */\n projectId: string;\n /** Org GitHub slug for source-link fallback (D-05). */\n githubOrgSlug?: string;\n /** proxyName → API Hub apiId override (D-01). */\n apiHubMappings?: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum number of spec resolutions (each ~3-4 API Hub round-trips) to run in\n * parallel during a sync. Bounds concurrency so a large catalogue does not open\n * dozens of simultaneous connections while still avoiding fully serial latency.\n */\nconst SPEC_FETCH_CONCURRENCY = 8;\n\n/**\n * Entity provider that discovers Apigee API proxies and sharedflows across\n * one or more organisations and registers them as Backstage entities.\n *\n * Registered with the catalog via `catalogProcessingExtensionPoint.addEntityProvider`.\n * Scheduled via the `SchedulerServiceTaskRunner` injected at construction time.\n */\nexport class ApigeeEntityProvider implements EntityProvider {\n private connection?: EntityProviderConnection;\n\n constructor(\n private readonly taskRunner: SchedulerServiceTaskRunner,\n private readonly logger: LoggerService,\n private readonly orgsConfig: OrgConfig[],\n private readonly apigeeClient: ApigeeClient,\n private readonly apiHubClient: ApiHubClient,\n private readonly sharedflowClient: SharedflowClient,\n private readonly options: EntityBuildOptions,\n ) {}\n\n /** Stable provider name — MUST NOT change; it links entities to this provider. */\n getProviderName(): string {\n return 'apigee-catalog-provider';\n }\n\n /**\n * Called once by the catalog on startup. Stores the connection and registers\n * the recurring sync task with the scheduler.\n */\n async connect(connection: EntityProviderConnection): Promise<void> {\n if (this.connection) {\n throw new Error('ApigeeEntityProvider is already connected');\n }\n this.connection = connection;\n await this.taskRunner.run({\n id: 'catalog-backend-module-apigee:sync',\n fn: async () => {\n await this.run();\n },\n });\n }\n\n /**\n * Executes one full catalog sync:\n * 1. Fetch proxy / sharedflow / API-Hub data for all orgs in parallel.\n * 2. Warn and skip any org that fails (error isolation per org).\n * 3. Deduplicate proxies shared across multiple orgs (D-03).\n * 4. Build entities and call applyMutation exactly once.\n */\n async run(): Promise<void> {\n if (!this.connection) {\n throw new Error('ApigeeEntityProvider not initialized');\n }\n\n this.logger.info(\n `[catalog-module-apigee] Starting catalog sync for ${\n this.orgsConfig.length\n } org(s): ${this.orgsConfig.map(o => o.name).join(', ')}`,\n );\n\n // ── Step 1: Parallel fetch ────────────────────────────────────────────\n const orgResults = await Promise.allSettled(\n this.orgsConfig.map(orgCfg => this.fetchOrgData(orgCfg)),\n );\n\n // ── Step 2: Collect successful results; warn on failures ──────────────\n const orgDataList: OrgData[] = [];\n for (let i = 0; i < orgResults.length; i++) {\n const result = orgResults[i];\n if (result.status === 'rejected') {\n this.logger.warn(\n `[catalog-module-apigee] Org '${this.orgsConfig[i].name}' sync failed: ${result.reason}`,\n );\n } else {\n orgDataList.push(result.value);\n }\n }\n\n const totalProxies = orgDataList.reduce(\n (sum, o) => sum + o.proxyMap.size,\n 0,\n );\n const totalSharedflows = orgDataList.reduce(\n (sum, o) => sum + o.sharedflows.length,\n 0,\n );\n const totalHubApis = orgDataList.reduce(\n (sum, o) => sum + o.apiHubApis.length,\n 0,\n );\n this.logger.info(\n `[catalog-module-apigee] Fetched ${orgDataList.length}/${this.orgsConfig.length} org(s): ` +\n `${totalProxies} proxies, ${totalHubApis} API Hub definitions, ${totalSharedflows} sharedflows`,\n );\n\n // ── Step 3: Deduplicate proxies by slug across orgs (D-03) ────────────\n const mergedProxyMap = new Map<string, MergedProxy>();\n for (const orgData of orgDataList) {\n for (const [slug, partial] of orgData.proxyMap) {\n const existing = mergedProxyMap.get(slug);\n if (existing) {\n // Same proxy in multiple orgs: merge orgs array\n existing.orgs.push(...partial.orgs);\n // Merge base paths (deduplicate)\n for (const bp of partial.basePaths) {\n if (!existing.basePaths.includes(bp)) {\n existing.basePaths.push(bp);\n }\n }\n } else {\n mergedProxyMap.set(slug, {\n proxy: partial.proxy,\n basePaths: [...partial.basePaths],\n orgs: [...partial.orgs],\n });\n }\n }\n }\n\n // ── Step 4: Build entities ─────────────────────────────────────────────\n const entities: Entity[] = [];\n\n // Combined API Hub lookup across orgs, keyed by slugified displayName\n // (the human identifier; the resource name's last segment is an opaque\n // UUID and never matches a proxy slug, D-01). First org wins on collision.\n const apiHubById = new Map<string, { api: ApiHubApi; orgData: OrgData }>();\n // proxyName → API Hub apiId overrides collected across orgs (D-01).\n const mappingOverrides = new Map<string, string>();\n for (const orgData of orgDataList) {\n for (const hubApi of orgData.apiHubApis) {\n const id = slugify(\n hubApi.displayName ?? hubApi.name.split('/').pop() ?? '',\n );\n if (id && !apiHubById.has(id)) {\n apiHubById.set(id, { api: hubApi, orgData });\n }\n }\n if (orgData.apiHubMappings) {\n for (const [proxyName, hubId] of Object.entries(orgData.apiHubMappings)) {\n if (!mappingOverrides.has(proxyName)) {\n mappingOverrides.set(proxyName, hubId);\n }\n }\n }\n }\n\n const matchedHubIds = new Set<string>();\n\n // First pass: build entity pairs and split into matched (need a spec fetch)\n // vs. unmatched (ready to emit). Spec fetches are deferred so they can run\n // with bounded concurrency instead of one-at-a-time (WR-03).\n interface MatchedItem {\n component: Entity;\n api: Entity;\n hubApi: ApiHubApi;\n githubOrgSlug?: string;\n realApiId: string;\n projectId: string;\n }\n const matchedItems: MatchedItem[] = [];\n\n for (const [slug, merged] of mergedProxyMap.entries()) {\n // Resolve API type: try each org's apiTypeMap (D-01)\n let apiType: string | undefined;\n for (const orgData of orgDataList) {\n const t =\n orgData.apiTypeMap.get(slug) ??\n orgData.apiTypeMap.get(merged.proxy.name.toLowerCase());\n if (t) {\n apiType = t;\n break;\n }\n }\n const [component, api] = proxyToEntities(merged, apiType, this.options);\n\n // Match proxy → API Hub definition: apiHubMappings override else\n // slug == lowercased apiId (D-01).\n const candidate = (\n mappingOverrides.get(merged.proxy.name) ?? slug\n ).toLowerCase();\n const match = apiHubById.get(candidate);\n if (match) {\n matchedHubIds.add(candidate);\n matchedItems.push({\n component,\n api,\n hubApi: match.api,\n githubOrgSlug: match.orgData.githubOrgSlug,\n realApiId: match.api.name.split('/').pop() ?? candidate,\n projectId: match.orgData.projectId,\n });\n } else {\n // No API Hub match: API keeps has-spec:'false' from proxyToEntities.\n entities.push(component, api);\n }\n }\n\n // D-02/D-03: resolve specs with bounded concurrency, then assemble entities\n // in original order. Per-spec try/catch isolation lives in resolveSpecForApi.\n const matchedSpecs = await this.mapWithConcurrency(\n matchedItems,\n SPEC_FETCH_CONCURRENCY,\n item => this.resolveSpecForApi(item.realApiId, item.projectId),\n );\n matchedItems.forEach((item, i) => {\n entities.push(\n item.component,\n enrichMatchedApiEntity(\n item.api,\n item.hubApi,\n matchedSpecs[i],\n item.githubOrgSlug,\n this.options,\n ),\n );\n });\n\n // Append hub-only API entities for API Hub definitions with no matching\n // proxy (D-04, CAT-05). De-dupe by entity name for hub apis shared across orgs.\n const hubOnlyItems: Array<{\n hubApi: ApiHubApi;\n orgData: OrgData;\n realApiId: string;\n }> = [];\n for (const [id, { api: hubApi, orgData }] of apiHubById.entries()) {\n if (matchedHubIds.has(id)) continue;\n hubOnlyItems.push({\n hubApi,\n orgData,\n realApiId: hubApi.name.split('/').pop() ?? id,\n });\n }\n const hubOnlySpecs = await this.mapWithConcurrency(\n hubOnlyItems,\n SPEC_FETCH_CONCURRENCY,\n item => this.resolveSpecForApi(item.realApiId, item.orgData.projectId),\n );\n const hubOnlyNames = new Set<string>();\n hubOnlyItems.forEach((item, i) => {\n const entity = hubOnlyToEntity(\n item.hubApi,\n item.orgData.orgName,\n hubOnlySpecs[i],\n item.orgData.githubOrgSlug,\n this.options,\n );\n if (hubOnlyNames.has(entity.metadata.name)) return;\n hubOnlyNames.add(entity.metadata.name);\n entities.push(entity);\n });\n\n // Add sharedflow entities\n for (const orgData of orgDataList) {\n for (const sf of orgData.sharedflows) {\n entities.push(sharedflowToEntity(sf, orgData.orgName, this.options));\n }\n }\n\n this.logger.info(\n `[catalog-module-apigee] Catalog sync complete — emitting ${entities.length} entities`,\n );\n\n // ── Step 5: Single full mutation ──────────────────────────────────────\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n // ── Private helpers ──────────────────────────────────────────────────────\n\n /**\n * Maps `items` through `fn` with at most `limit` invocations in flight at\n * once, preserving input order in the returned array. Used to parallelise\n * per-API spec resolution without overwhelming the API Hub backend (WR-03).\n */\n private async mapWithConcurrency<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n ): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const workerCount = Math.max(1, Math.min(limit, items.length));\n const worker = async (): Promise<void> => {\n while (true) {\n const i = next;\n next += 1;\n if (i >= items.length) break;\n results[i] = await fn(items[i]);\n }\n };\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n return results;\n }\n\n /**\n * Fetches a spec's contents subject to the size guard (D-03).\n *\n * Two-stage guard:\n * 1. Pre-fetch: if the spec metadata reports `sizeBytes > specMaxBytes`, skip\n * the download entirely and return a `specUrl` link. NOTE: the API Hub spec\n * metadata endpoint frequently reports `sizeBytes: 0`/undefined, so this\n * stage often cannot fire and the contents are downloaded anyway.\n * 2. Post-decode: enforce `specMaxBytes` against the actual decoded byte\n * length — this is the guard that reliably bounds the *embedded* size.\n *\n * Because stage 1 is unreliable, `specMaxBytes` bounds the size of the spec\n * that gets embedded, not necessarily the size downloaded into memory.\n */\n private async fetchSpecEmbed(\n apiId: string,\n versionId: string,\n specId: string,\n projectId: string,\n ): Promise<SpecEmbed> {\n const spec = await this.apiHubClient.getSpec(\n apiId,\n versionId,\n specId,\n projectId,\n );\n const limit = this.options.specMaxBytes ?? 512000;\n const size = spec.sizeBytes ?? 0;\n if (size > limit) {\n // D-03 stage 1: over the size limit by metadata — link instead of embedding.\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' (${size} bytes) exceeds specMaxBytes (${limit}); linking via spec-url instead of embedding`,\n );\n return { hasSpec: true, specUrl: spec.name };\n }\n const contents = await this.apiHubClient.getSpecContents(\n apiId,\n versionId,\n specId,\n projectId,\n );\n const base64 = contents.contents ?? '';\n const definition = Buffer.from(base64, 'base64').toString('utf-8');\n const decodedBytes = Buffer.byteLength(definition, 'utf-8');\n // Trace decode results so spec-shape regressions (e.g. a renamed contents\n // field, or malformed base64 decoding to garbage) are easy to diagnose.\n this.logger.debug(\n `[catalog-module-apigee] Resolved spec '${spec.name}' (mimeType=${\n contents.mimeType ?? '?'\n }, ${decodedBytes} bytes decoded, metadata sizeBytes=${\n spec.sizeBytes ?? 'n/a'\n })`,\n );\n if (!base64) {\n // Empty payload — record as \"no spec\" rather than embedding an empty string.\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' returned empty contents; treating as no embeddable spec`,\n );\n return { hasSpec: false };\n }\n // D-03 stage 2: the pre-fetch guard can be bypassed when sizeBytes is 0,\n // so enforce the limit against the actual decoded byte length.\n if (decodedBytes > limit) {\n this.logger.warn(\n `[catalog-module-apigee] Spec '${spec.name}' (${decodedBytes} bytes decoded) exceeds specMaxBytes (${limit}); linking via spec-url instead of embedding`,\n );\n return { hasSpec: true, specUrl: spec.name };\n }\n return { hasSpec: true, definition };\n }\n\n /**\n * Resolves the spec for an API: lists versions, deterministically selects one\n * (D-02), enumerates that version's specs (the versions endpoint does not\n * reliably populate specIds), picks the lexicographically smallest spec ID,\n * then fetches it with the size guard. Per-spec failures are isolated: any\n * error is logged and `undefined` is returned so one bad spec never aborts\n * the whole sync.\n */\n private async resolveSpecForApi(\n apiId: string,\n projectId: string,\n ): Promise<SpecEmbed | undefined> {\n try {\n const versions = await this.apiHubClient.listVersions(apiId, projectId);\n const selection = selectSpec(versions);\n if (!selection) return undefined;\n const specs = await this.apiHubClient.listSpecs(\n apiId,\n selection.versionId,\n projectId,\n );\n const specId = specs\n .map(s => s.name?.split('/').pop() ?? '')\n .filter(Boolean)\n .sort()[0];\n if (!specId) return undefined;\n return await this.fetchSpecEmbed(\n apiId,\n selection.versionId,\n specId,\n projectId,\n );\n } catch (e) {\n this.logger.warn(\n `[catalog-module-apigee] spec fetch failed for ${apiId}: ${e}`,\n );\n return undefined;\n }\n }\n\n /**\n * Fetches all data for one org: proxies, their deployments + revisions,\n * API Hub type map, and sharedflows.\n */\n private async fetchOrgData(orgCfg: OrgConfig): Promise<OrgData> {\n const [proxies, apiHubApis, sharedflows] = await Promise.all([\n this.apigeeClient.listProxies(orgCfg.name),\n this.apiHubClient.listApis(orgCfg.projectId),\n this.sharedflowClient.listSharedflows(orgCfg.name),\n ]);\n\n // Build API Hub type map: slugified displayName → apiType\n const apiTypeMap = new Map<string, string>();\n for (const api of apiHubApis) {\n const id = slugify(api.displayName ?? api.name.split('/').pop() ?? '');\n if (id && api.apiType) {\n apiTypeMap.set(id, api.apiType);\n }\n }\n\n // Fetch deployments + latest revision for all proxies in parallel\n const proxyMap = new Map<string, MergedProxy>();\n await Promise.all(\n proxies.map(async proxy => {\n try {\n const latestRev = proxy.revision?.length\n ? proxy.revision[proxy.revision.length - 1]\n : undefined;\n\n const [deployments, revision] = await Promise.all([\n this.apigeeClient.listDeployments(orgCfg.name, proxy.name),\n latestRev\n ? this.apigeeClient.getProxyRevision(\n orgCfg.name,\n proxy.name,\n latestRev,\n )\n : Promise.resolve({ name: proxy.name, basepaths: [] as string[] }),\n ]);\n\n // Derive lifecycle and environment list from ready deployments\n const readyDeps = deployments.filter(\n d => d.deploymentStatus === 'READY',\n );\n const lifecycle =\n readyDeps.length > 0 ? 'production' : 'experimental';\n const environments = readyDeps.map(d => d.environment);\n\n const orgSyncData: OrgSyncData = {\n slug: slugify(orgCfg.name),\n name: orgCfg.name,\n projectId: orgCfg.projectId,\n environments,\n lifecycle,\n };\n\n proxyMap.set(slugify(proxy.name), {\n proxy,\n basePaths: revision.basepaths ?? [],\n orgs: [orgSyncData],\n });\n } catch (e) {\n this.logger.warn(\n `[catalog-module-apigee] Skipping proxy '${proxy.name}' in org '${orgCfg.name}': ${e}`,\n );\n }\n }),\n );\n\n return {\n orgName: orgCfg.name,\n proxyMap,\n sharedflows,\n apiTypeMap,\n apiHubApis,\n projectId: orgCfg.projectId,\n githubOrgSlug: orgCfg.githubOrgSlug,\n apiHubMappings: orgCfg.apiHubMappings,\n };\n }\n}\n"],"names":["slugify","proxyToEntities","enrichMatchedApiEntity","hubOnlyToEntity","sharedflowToEntity","selectSpec"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nospt/backstage-plugin-apigee-backend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Backstage backend plugin bootstrap for Apigee integration",
|
|
6
6
|
"author": "NOS SGPS, S.A.",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@backstage/backend-plugin-api": "^1.8.0",
|
|
49
49
|
"@backstage/catalog-model": "^1.7.3",
|
|
50
50
|
"@backstage/plugin-catalog-node": "^1.13.0",
|
|
51
|
-
"@nospt/backstage-plugin-apigee-common": "^0.1.
|
|
51
|
+
"@nospt/backstage-plugin-apigee-common": "^0.1.3",
|
|
52
52
|
"express": "^4.17.1",
|
|
53
53
|
"google-auth-library": "^9.15.1",
|
|
54
54
|
"node-fetch": "^2.7.0"
|