@backstage/plugin-catalog-backend-module-bitbucket-server 0.5.15-next.1 → 0.5.15

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @backstage/plugin-catalog-backend-module-bitbucket-server
2
2
 
3
+ ## 0.5.15
4
+
5
+ ### Patch Changes
6
+
7
+ - 989db63: Aligned event-driven catalog updates with the repository filters configured for the Bitbucket Server provider.
8
+ - Updated dependencies
9
+ - @backstage/integration@2.1.2
10
+ - @backstage/plugin-catalog-common@1.2.0
11
+ - @backstage/catalog-model@1.10.1
12
+ - @backstage/config@1.3.9
13
+ - @backstage/backend-plugin-api@1.10.1
14
+ - @backstage/plugin-catalog-node@2.2.5
15
+ - @backstage/plugin-events-node@0.4.26
16
+
3
17
  ## 0.5.15-next.1
4
18
 
5
19
  ### Patch Changes
@@ -36,7 +36,7 @@
36
36
  "description": "(Optional) Skip archived repositories"
37
37
  }
38
38
  },
39
- "description": "(Optional) Filters applied to discovered catalog files in repositories.",
39
+ "description": "(Optional) Filters applied to scheduled and event-driven catalog updates.",
40
40
  "visibility": "frontend"
41
41
  },
42
42
  "validateLocationsExist": {
@@ -229,7 +229,7 @@
229
229
  "description": "(Optional) Skip archived repositories"
230
230
  }
231
231
  },
232
- "description": "(Optional) Filters applied to discovered catalog files in repositories.",
232
+ "description": "(Optional) Filters applied to scheduled and event-driven catalog updates.",
233
233
  "visibility": "frontend"
234
234
  },
235
235
  "validateLocationsExist": {
package/dist/index.d.ts CHANGED
@@ -154,6 +154,7 @@ declare class BitbucketServerEntityProvider implements EntityProvider {
154
154
  connect(connection: EntityProviderConnection): Promise<void>;
155
155
  refresh(logger: LoggerService): Promise<void>;
156
156
  private findEntities;
157
+ private matchesRepositoryFilters;
157
158
  private isDefaultBranchPush;
158
159
  /**
159
160
  * Checks if the provider is able to handle events
@@ -139,7 +139,7 @@ class BitbucketServerEntityProvider {
139
139
  );
140
140
  const result = [];
141
141
  for await (const project of projects) {
142
- if (this.config?.filters?.projectKey && !this.config.filters.projectKey.test(project.key)) {
142
+ if (!this.matchesRepositoryFilters({ projectKey: project.key })) {
143
143
  continue;
144
144
  }
145
145
  const repositories = BitbucketServerClient.paginated(
@@ -149,10 +149,11 @@ class BitbucketServerEntityProvider {
149
149
  })
150
150
  );
151
151
  for await (const repository of repositories) {
152
- if (this.config?.filters?.repoSlug && !this.config.filters.repoSlug.test(repository.slug)) {
153
- continue;
154
- }
155
- if (this.config?.filters?.skipArchivedRepos && repository.archived) {
152
+ if (!this.matchesRepositoryFilters({
153
+ projectKey: project.key,
154
+ repoSlug: repository.slug,
155
+ archived: repository.archived
156
+ })) {
156
157
  continue;
157
158
  }
158
159
  if (this.config.validateLocationsExist) {
@@ -207,6 +208,19 @@ class BitbucketServerEntityProvider {
207
208
  }
208
209
  return result;
209
210
  }
211
+ matchesRepositoryFilters(options) {
212
+ const filters = this.config.filters;
213
+ if (filters?.projectKey && !filters.projectKey.test(options.projectKey)) {
214
+ return false;
215
+ }
216
+ if (filters?.repoSlug && options.repoSlug !== void 0 && !filters.repoSlug.test(options.repoSlug)) {
217
+ return false;
218
+ }
219
+ if (filters?.skipArchivedRepos && options.archived) {
220
+ return false;
221
+ }
222
+ return true;
223
+ }
210
224
  isDefaultBranchPush(defaultBranch, event) {
211
225
  return event.changes.some((c) => defaultBranch === c.ref.displayId);
212
226
  }
@@ -236,6 +250,13 @@ class BitbucketServerEntityProvider {
236
250
  projectKey: event.repository.project.key,
237
251
  repo: event.repository.slug
238
252
  });
253
+ if (!this.matchesRepositoryFilters({
254
+ projectKey: repository.project.key,
255
+ repoSlug: repository.slug,
256
+ archived: repository.archived
257
+ })) {
258
+ return void 0;
259
+ }
239
260
  for await (const entity of this.parser({
240
261
  client,
241
262
  logger: this.logger,
@@ -277,10 +298,19 @@ class BitbucketServerEntityProvider {
277
298
  if (!this.connection) {
278
299
  throw new Error("Not initialized");
279
300
  }
301
+ if (!this.matchesRepositoryFilters({
302
+ projectKey: event.repository.project.key,
303
+ repoSlug: event.repository.slug
304
+ })) {
305
+ return;
306
+ }
280
307
  const repoSlug = event.repository.slug;
281
308
  const catalogRepoUrl = `https://${this.config.host}/projects/${event.repository.project.key}/repos/${repoSlug}/browse${this.config.catalogPath}`;
282
309
  this.logger.info(`handle repo:push event for ${catalogRepoUrl}`);
283
310
  const targets = await this.getLocationEntity(event);
311
+ if (!targets) {
312
+ return;
313
+ }
284
314
  if (targets.length === 0) {
285
315
  this.logger.error("Failed to create location entity.");
286
316
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"BitbucketServerEntityProvider.cjs.js","sources":["../../src/providers/BitbucketServerEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity, LocationEntity } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport {\n BitbucketServerIntegration,\n ScmIntegrations,\n} from '@backstage/integration';\nimport {\n EntityProvider,\n EntityProviderConnection,\n DeferredEntity,\n CatalogService,\n} from '@backstage/plugin-catalog-node';\nimport { randomUUID } from 'node:crypto';\nimport { BitbucketServerClient, paginated } from '../lib';\nimport {\n BitbucketServerEntityProviderConfig,\n readProviderConfigs,\n} from './BitbucketServerEntityProviderConfig';\nimport {\n BitbucketServerLocationParser,\n defaultBitbucketServerLocationParser,\n} from './BitbucketServerLocationParser';\nimport {\n AuthService,\n BackstageCredentials,\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport { BitbucketServerEvents } from '../lib';\nimport { EventsService } from '@backstage/plugin-events-node';\n\nconst TOPIC_REPO_REFS_CHANGED = 'bitbucketServer.repo:refs_changed';\n\n/**\n * Discovers catalog files located in Bitbucket Server.\n * The provider will search your Bitbucket Server instance and register catalog files matching the configured path\n * as Location entity and via following processing steps add all contained catalog entities.\n * This can be useful as an alternative to static locations or manually adding things to the catalog.\n *\n * @public\n */\nexport class BitbucketServerEntityProvider implements EntityProvider {\n private readonly integration: BitbucketServerIntegration;\n private readonly config: BitbucketServerEntityProviderConfig;\n private readonly parser: BitbucketServerLocationParser;\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n private readonly catalogApi?: CatalogService;\n private readonly events?: EventsService;\n private readonly auth?: AuthService;\n private eventConfigErrorThrown = false;\n private readonly targetAnnotation: string;\n private readonly defaultBranchAnnotation: string;\n\n static fromConfig(\n config: Config,\n options: {\n logger: LoggerService;\n events?: EventsService;\n parser?: BitbucketServerLocationParser;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n catalogApi?: CatalogService;\n auth?: AuthService;\n },\n ): BitbucketServerEntityProvider[] {\n const integrations = ScmIntegrations.fromConfig(config);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return readProviderConfigs(config).map(providerConfig => {\n const integration = integrations.bitbucketServer.byHost(\n providerConfig.host,\n );\n if (!integration) {\n throw new InputError(\n `No BitbucketServer integration found that matches host ${providerConfig.host}`,\n );\n }\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for bitbucketServer-provider:${providerConfig.id}.`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new BitbucketServerEntityProvider(\n providerConfig,\n integration,\n options.logger,\n taskRunner,\n options.parser,\n options.catalogApi,\n options.events,\n options.auth,\n );\n });\n }\n\n private constructor(\n config: BitbucketServerEntityProviderConfig,\n integration: BitbucketServerIntegration,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n parser?: BitbucketServerLocationParser,\n catalogApi?: CatalogService,\n events?: EventsService,\n auth?: AuthService,\n ) {\n this.integration = integration;\n this.config = config;\n this.parser = parser || defaultBitbucketServerLocationParser;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n this.scheduleFn = this.createScheduleFn(taskRunner);\n this.catalogApi = catalogApi;\n this.auth = auth;\n this.targetAnnotation = `${this.config.host.split(':')[0]}/repo-url`;\n this.defaultBranchAnnotation = 'bitbucket.org/default-branch';\n this.events = events;\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:refresh`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n const logger = this.logger.child({\n class: BitbucketServerEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: randomUUID(),\n });\n\n try {\n await this.refresh(logger);\n } catch (error) {\n logger.error(\n `${this.getProviderName()} refresh failed, ${error}`,\n error,\n );\n }\n },\n });\n };\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */\n getProviderName(): string {\n return `bitbucketServer-provider:${this.config.id}`;\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.connect} */\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n\n if (this.events) {\n await this.events.subscribe({\n id: this.getProviderName(),\n topics: [TOPIC_REPO_REFS_CHANGED],\n onEvent: async params => {\n if (params.topic !== TOPIC_REPO_REFS_CHANGED) {\n return;\n }\n\n await this.onRepoPush(\n params.eventPayload as BitbucketServerEvents.RefsChangedEvent,\n );\n },\n });\n }\n }\n\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering catalog files in Bitbucket Server repositories');\n\n const entities = await this.findEntities();\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n locationKey: this.getProviderName(),\n entity: entity,\n })),\n });\n\n logger.info(\n `Committed ${entities.length} entities for Bitbucket Server repositories`,\n );\n }\n\n private async findEntities(): Promise<Entity[]> {\n const client = BitbucketServerClient.fromConfig({\n config: this.integration.config,\n });\n const projects = paginated(options =>\n client.listProjects({ listOptions: options }),\n );\n const result: Entity[] = [];\n for await (const project of projects) {\n if (\n this.config?.filters?.projectKey &&\n !this.config.filters.projectKey.test(project.key)\n ) {\n continue;\n }\n const repositories = paginated(options =>\n client.listRepositories({\n projectKey: project.key,\n listOptions: options,\n }),\n );\n for await (const repository of repositories) {\n if (\n this.config?.filters?.repoSlug &&\n !this.config.filters.repoSlug.test(repository.slug)\n ) {\n continue;\n }\n if (this.config?.filters?.skipArchivedRepos && repository.archived) {\n continue;\n }\n if (this.config.validateLocationsExist) {\n try {\n const response = await client.getFile({\n projectKey: project.key,\n repo: repository.slug,\n path: this.config.catalogPath,\n });\n if (!response.ok) {\n if (response.status === 404) {\n this.logger.debug(\n `Skipping repository ${repository.slug} in project ${project.key} because the catalog file does not exist.`,\n );\n } else {\n this.logger.warn(\n `Unexpected response code ${\n response.status\n } while fetching the catalog file from repository ${\n repository.slug\n } in project ${\n project.key\n }. Response details: ${JSON.stringify(response)}`,\n );\n }\n continue;\n }\n } catch (error) {\n this.logger.error(\n `An error occurred while fetching the catalog file from repository ${repository.slug} in project ${project.key}: ${error}`,\n );\n }\n }\n for await (const entity of this.parser({\n client,\n logger: this.logger,\n location: {\n type: 'url',\n target: `${repository.links.self[0].href}${this.config.catalogPath}`,\n presence: 'optional',\n },\n })) {\n if (entity.metadata.annotations === undefined) {\n entity.metadata.annotations = {};\n }\n if (repository.defaultBranch === undefined) {\n const defaultBranchResponse = await client.getDefaultBranch({\n repo: repository.slug,\n projectKey: project.key,\n });\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n defaultBranchResponse.displayId;\n } else {\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n repository.defaultBranch;\n }\n result.push(entity);\n }\n }\n }\n return result;\n }\n\n private isDefaultBranchPush(\n defaultBranch: String,\n event: BitbucketServerEvents.RefsChangedEvent,\n ): boolean {\n return event.changes.some(c => defaultBranch === c.ref.displayId);\n }\n\n /**\n * Checks if the provider is able to handle events\n * @returns Boolean\n */\n private canHandleEvents(): boolean {\n if (this.catalogApi && this.auth) {\n return true;\n }\n\n if (!this.eventConfigErrorThrown) {\n this.eventConfigErrorThrown = true;\n throw new Error(\n `${this.getProviderName()} not well configured to handle repo:push. Missing CatalogApi and/or AuthService.`,\n );\n }\n\n return false;\n }\n\n private async getLocationEntity(\n event: BitbucketServerEvents.RefsChangedEvent,\n ): Promise<Entity[]> {\n const client = BitbucketServerClient.fromConfig({\n config: this.integration.config,\n });\n const result: Entity[] = [];\n try {\n const repository = await client.getRepository({\n projectKey: event.repository.project.key,\n repo: event.repository.slug,\n });\n\n for await (const entity of this.parser({\n client,\n logger: this.logger,\n location: {\n type: 'url',\n target: `${repository.links.self[0].href}${this.config.catalogPath}`,\n presence: 'optional',\n },\n })) {\n entity.metadata.annotations![\n this.targetAnnotation\n ] = `${repository.links.self[0].href}${this.config.catalogPath}`;\n\n if (entity.metadata.annotations === undefined) {\n entity.metadata.annotations = {};\n }\n\n if (repository.defaultBranch === undefined) {\n const defaultBranchResponse = await client.getDefaultBranch({\n repo: repository.slug,\n projectKey: event.repository.project.key,\n });\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n defaultBranchResponse.displayId;\n } else {\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n repository.defaultBranch;\n }\n result.push(entity);\n }\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n this.logger.error(error.message);\n }\n }\n\n return result;\n }\n\n private async onRepoPush(\n event: BitbucketServerEvents.RefsChangedEvent,\n ): Promise<void> {\n if (!this.canHandleEvents()) {\n this.logger.error(\n 'Bitbucket Server catalog entity provider is not set up to handle events. Missing authService or catalogApi.',\n );\n return;\n }\n\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n const repoSlug = event.repository.slug;\n const catalogRepoUrl: string = `https://${this.config.host}/projects/${event.repository.project.key}/repos/${repoSlug}/browse${this.config.catalogPath}`;\n this.logger.info(`handle repo:push event for ${catalogRepoUrl}`);\n const targets = await this.getLocationEntity(event);\n if (targets.length === 0) {\n this.logger.error('Failed to create location entity.');\n return;\n }\n const existing = await this.findExistingLocations(\n catalogRepoUrl,\n await this.auth!.getOwnServiceCredentials(),\n );\n const stillExisting: LocationEntity[] = [];\n const removed: DeferredEntity[] = [];\n existing.forEach(item => {\n if (\n targets.find(\n value =>\n value.metadata.annotations![this.targetAnnotation] ===\n item.spec.target,\n )\n ) {\n stillExisting.push(item);\n } else {\n removed.push({\n locationKey: this.getProviderName(),\n entity: item,\n });\n }\n });\n\n const added = await this.getAddedEntities(targets, existing);\n\n if (\n stillExisting.length > 0 &&\n stillExisting[0].metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n stillExisting[0].metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n } else if (\n added.length > 0 &&\n added[0].entity.metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n added[0].entity.metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n } else if (\n removed.length > 0 &&\n removed[0].entity.metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n removed[0].entity.metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n }\n\n const promises: Promise<void>[] = [\n this.connection.refresh({\n keys: stillExisting.map(entity => `url:${entity.spec.target}`),\n }),\n ];\n\n if (added.length > 0 || removed.length > 0) {\n promises.push(\n this.connection.applyMutation({\n type: 'delta',\n added: added,\n removed: removed,\n }),\n );\n }\n\n await Promise.all(promises);\n\n return;\n }\n\n private async getAddedEntities(\n targets: Entity[],\n existing: LocationEntity[],\n ): Promise<DeferredEntity[]> {\n const added: DeferredEntity[] = toDeferredEntities(\n targets.filter(\n target =>\n !existing.find(\n item =>\n item.spec.target ===\n target.metadata.annotations![this.targetAnnotation],\n ),\n ),\n this.getProviderName(),\n );\n return added;\n }\n\n private async findExistingLocations(\n catalogRepoUrl: string,\n credentials: BackstageCredentials,\n ): Promise<LocationEntity[]> {\n const filter: Record<string, string> = {};\n filter.kind = 'Location';\n filter[`metadata.annotations.${this.targetAnnotation}`] = catalogRepoUrl;\n\n return this.catalogApi!.getEntities({ filter }, { credentials }).then(\n result => result.items,\n ) as Promise<LocationEntity[]>;\n }\n}\n\nexport function toDeferredEntities(\n targets: Entity[],\n locationKey: string,\n): DeferredEntity[] {\n return targets.map(entity => {\n return {\n locationKey,\n entity,\n };\n });\n}\n"],"names":["ScmIntegrations","readProviderConfigs","InputError","defaultBitbucketServerLocationParser","randomUUID","BitbucketServerClient","paginated"],"mappings":"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"}
1
+ {"version":3,"file":"BitbucketServerEntityProvider.cjs.js","sources":["../../src/providers/BitbucketServerEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity, LocationEntity } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport {\n BitbucketServerIntegration,\n ScmIntegrations,\n} from '@backstage/integration';\nimport {\n EntityProvider,\n EntityProviderConnection,\n DeferredEntity,\n CatalogService,\n} from '@backstage/plugin-catalog-node';\nimport { randomUUID } from 'node:crypto';\nimport { BitbucketServerClient, paginated } from '../lib';\nimport {\n BitbucketServerEntityProviderConfig,\n readProviderConfigs,\n} from './BitbucketServerEntityProviderConfig';\nimport {\n BitbucketServerLocationParser,\n defaultBitbucketServerLocationParser,\n} from './BitbucketServerLocationParser';\nimport {\n AuthService,\n BackstageCredentials,\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport { BitbucketServerEvents } from '../lib';\nimport { EventsService } from '@backstage/plugin-events-node';\n\nconst TOPIC_REPO_REFS_CHANGED = 'bitbucketServer.repo:refs_changed';\n\n/**\n * Discovers catalog files located in Bitbucket Server.\n * The provider will search your Bitbucket Server instance and register catalog files matching the configured path\n * as Location entity and via following processing steps add all contained catalog entities.\n * This can be useful as an alternative to static locations or manually adding things to the catalog.\n *\n * @public\n */\nexport class BitbucketServerEntityProvider implements EntityProvider {\n private readonly integration: BitbucketServerIntegration;\n private readonly config: BitbucketServerEntityProviderConfig;\n private readonly parser: BitbucketServerLocationParser;\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n private readonly catalogApi?: CatalogService;\n private readonly events?: EventsService;\n private readonly auth?: AuthService;\n private eventConfigErrorThrown = false;\n private readonly targetAnnotation: string;\n private readonly defaultBranchAnnotation: string;\n\n static fromConfig(\n config: Config,\n options: {\n logger: LoggerService;\n events?: EventsService;\n parser?: BitbucketServerLocationParser;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n catalogApi?: CatalogService;\n auth?: AuthService;\n },\n ): BitbucketServerEntityProvider[] {\n const integrations = ScmIntegrations.fromConfig(config);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return readProviderConfigs(config).map(providerConfig => {\n const integration = integrations.bitbucketServer.byHost(\n providerConfig.host,\n );\n if (!integration) {\n throw new InputError(\n `No BitbucketServer integration found that matches host ${providerConfig.host}`,\n );\n }\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for bitbucketServer-provider:${providerConfig.id}.`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new BitbucketServerEntityProvider(\n providerConfig,\n integration,\n options.logger,\n taskRunner,\n options.parser,\n options.catalogApi,\n options.events,\n options.auth,\n );\n });\n }\n\n private constructor(\n config: BitbucketServerEntityProviderConfig,\n integration: BitbucketServerIntegration,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n parser?: BitbucketServerLocationParser,\n catalogApi?: CatalogService,\n events?: EventsService,\n auth?: AuthService,\n ) {\n this.integration = integration;\n this.config = config;\n this.parser = parser || defaultBitbucketServerLocationParser;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n this.scheduleFn = this.createScheduleFn(taskRunner);\n this.catalogApi = catalogApi;\n this.auth = auth;\n this.targetAnnotation = `${this.config.host.split(':')[0]}/repo-url`;\n this.defaultBranchAnnotation = 'bitbucket.org/default-branch';\n this.events = events;\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:refresh`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n const logger = this.logger.child({\n class: BitbucketServerEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: randomUUID(),\n });\n\n try {\n await this.refresh(logger);\n } catch (error) {\n logger.error(\n `${this.getProviderName()} refresh failed, ${error}`,\n error,\n );\n }\n },\n });\n };\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */\n getProviderName(): string {\n return `bitbucketServer-provider:${this.config.id}`;\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.connect} */\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n\n if (this.events) {\n await this.events.subscribe({\n id: this.getProviderName(),\n topics: [TOPIC_REPO_REFS_CHANGED],\n onEvent: async params => {\n if (params.topic !== TOPIC_REPO_REFS_CHANGED) {\n return;\n }\n\n await this.onRepoPush(\n params.eventPayload as BitbucketServerEvents.RefsChangedEvent,\n );\n },\n });\n }\n }\n\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering catalog files in Bitbucket Server repositories');\n\n const entities = await this.findEntities();\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n locationKey: this.getProviderName(),\n entity: entity,\n })),\n });\n\n logger.info(\n `Committed ${entities.length} entities for Bitbucket Server repositories`,\n );\n }\n\n private async findEntities(): Promise<Entity[]> {\n const client = BitbucketServerClient.fromConfig({\n config: this.integration.config,\n });\n const projects = paginated(options =>\n client.listProjects({ listOptions: options }),\n );\n const result: Entity[] = [];\n for await (const project of projects) {\n if (!this.matchesRepositoryFilters({ projectKey: project.key })) {\n continue;\n }\n const repositories = paginated(options =>\n client.listRepositories({\n projectKey: project.key,\n listOptions: options,\n }),\n );\n for await (const repository of repositories) {\n if (\n !this.matchesRepositoryFilters({\n projectKey: project.key,\n repoSlug: repository.slug,\n archived: repository.archived,\n })\n ) {\n continue;\n }\n if (this.config.validateLocationsExist) {\n try {\n const response = await client.getFile({\n projectKey: project.key,\n repo: repository.slug,\n path: this.config.catalogPath,\n });\n if (!response.ok) {\n if (response.status === 404) {\n this.logger.debug(\n `Skipping repository ${repository.slug} in project ${project.key} because the catalog file does not exist.`,\n );\n } else {\n this.logger.warn(\n `Unexpected response code ${\n response.status\n } while fetching the catalog file from repository ${\n repository.slug\n } in project ${\n project.key\n }. Response details: ${JSON.stringify(response)}`,\n );\n }\n continue;\n }\n } catch (error) {\n this.logger.error(\n `An error occurred while fetching the catalog file from repository ${repository.slug} in project ${project.key}: ${error}`,\n );\n }\n }\n for await (const entity of this.parser({\n client,\n logger: this.logger,\n location: {\n type: 'url',\n target: `${repository.links.self[0].href}${this.config.catalogPath}`,\n presence: 'optional',\n },\n })) {\n if (entity.metadata.annotations === undefined) {\n entity.metadata.annotations = {};\n }\n if (repository.defaultBranch === undefined) {\n const defaultBranchResponse = await client.getDefaultBranch({\n repo: repository.slug,\n projectKey: project.key,\n });\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n defaultBranchResponse.displayId;\n } else {\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n repository.defaultBranch;\n }\n result.push(entity);\n }\n }\n }\n return result;\n }\n\n private matchesRepositoryFilters(options: {\n projectKey: string;\n repoSlug?: string;\n archived?: boolean;\n }): boolean {\n const filters = this.config.filters;\n if (filters?.projectKey && !filters.projectKey.test(options.projectKey)) {\n return false;\n }\n if (\n filters?.repoSlug &&\n options.repoSlug !== undefined &&\n !filters.repoSlug.test(options.repoSlug)\n ) {\n return false;\n }\n if (filters?.skipArchivedRepos && options.archived) {\n return false;\n }\n return true;\n }\n\n private isDefaultBranchPush(\n defaultBranch: String,\n event: BitbucketServerEvents.RefsChangedEvent,\n ): boolean {\n return event.changes.some(c => defaultBranch === c.ref.displayId);\n }\n\n /**\n * Checks if the provider is able to handle events\n * @returns Boolean\n */\n private canHandleEvents(): boolean {\n if (this.catalogApi && this.auth) {\n return true;\n }\n\n if (!this.eventConfigErrorThrown) {\n this.eventConfigErrorThrown = true;\n throw new Error(\n `${this.getProviderName()} not well configured to handle repo:push. Missing CatalogApi and/or AuthService.`,\n );\n }\n\n return false;\n }\n\n private async getLocationEntity(\n event: BitbucketServerEvents.RefsChangedEvent,\n ): Promise<Entity[] | undefined> {\n const client = BitbucketServerClient.fromConfig({\n config: this.integration.config,\n });\n const result: Entity[] = [];\n try {\n const repository = await client.getRepository({\n projectKey: event.repository.project.key,\n repo: event.repository.slug,\n });\n\n if (\n !this.matchesRepositoryFilters({\n projectKey: repository.project.key,\n repoSlug: repository.slug,\n archived: repository.archived,\n })\n ) {\n return undefined;\n }\n\n for await (const entity of this.parser({\n client,\n logger: this.logger,\n location: {\n type: 'url',\n target: `${repository.links.self[0].href}${this.config.catalogPath}`,\n presence: 'optional',\n },\n })) {\n entity.metadata.annotations![\n this.targetAnnotation\n ] = `${repository.links.self[0].href}${this.config.catalogPath}`;\n\n if (entity.metadata.annotations === undefined) {\n entity.metadata.annotations = {};\n }\n\n if (repository.defaultBranch === undefined) {\n const defaultBranchResponse = await client.getDefaultBranch({\n repo: repository.slug,\n projectKey: event.repository.project.key,\n });\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n defaultBranchResponse.displayId;\n } else {\n entity.metadata.annotations[this.defaultBranchAnnotation] =\n repository.defaultBranch;\n }\n result.push(entity);\n }\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n this.logger.error(error.message);\n }\n }\n\n return result;\n }\n\n private async onRepoPush(\n event: BitbucketServerEvents.RefsChangedEvent,\n ): Promise<void> {\n if (!this.canHandleEvents()) {\n this.logger.error(\n 'Bitbucket Server catalog entity provider is not set up to handle events. Missing authService or catalogApi.',\n );\n return;\n }\n\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n if (\n !this.matchesRepositoryFilters({\n projectKey: event.repository.project.key,\n repoSlug: event.repository.slug,\n })\n ) {\n return;\n }\n\n const repoSlug = event.repository.slug;\n const catalogRepoUrl: string = `https://${this.config.host}/projects/${event.repository.project.key}/repos/${repoSlug}/browse${this.config.catalogPath}`;\n this.logger.info(`handle repo:push event for ${catalogRepoUrl}`);\n const targets = await this.getLocationEntity(event);\n if (!targets) {\n return;\n }\n if (targets.length === 0) {\n this.logger.error('Failed to create location entity.');\n return;\n }\n const existing = await this.findExistingLocations(\n catalogRepoUrl,\n await this.auth!.getOwnServiceCredentials(),\n );\n const stillExisting: LocationEntity[] = [];\n const removed: DeferredEntity[] = [];\n existing.forEach(item => {\n if (\n targets.find(\n value =>\n value.metadata.annotations![this.targetAnnotation] ===\n item.spec.target,\n )\n ) {\n stillExisting.push(item);\n } else {\n removed.push({\n locationKey: this.getProviderName(),\n entity: item,\n });\n }\n });\n\n const added = await this.getAddedEntities(targets, existing);\n\n if (\n stillExisting.length > 0 &&\n stillExisting[0].metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n stillExisting[0].metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n } else if (\n added.length > 0 &&\n added[0].entity.metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n added[0].entity.metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n } else if (\n removed.length > 0 &&\n removed[0].entity.metadata.annotations![this.defaultBranchAnnotation] !==\n undefined &&\n !this.isDefaultBranchPush(\n removed[0].entity.metadata.annotations![this.defaultBranchAnnotation],\n event,\n )\n ) {\n return;\n }\n\n const promises: Promise<void>[] = [\n this.connection.refresh({\n keys: stillExisting.map(entity => `url:${entity.spec.target}`),\n }),\n ];\n\n if (added.length > 0 || removed.length > 0) {\n promises.push(\n this.connection.applyMutation({\n type: 'delta',\n added: added,\n removed: removed,\n }),\n );\n }\n\n await Promise.all(promises);\n\n return;\n }\n\n private async getAddedEntities(\n targets: Entity[],\n existing: LocationEntity[],\n ): Promise<DeferredEntity[]> {\n const added: DeferredEntity[] = toDeferredEntities(\n targets.filter(\n target =>\n !existing.find(\n item =>\n item.spec.target ===\n target.metadata.annotations![this.targetAnnotation],\n ),\n ),\n this.getProviderName(),\n );\n return added;\n }\n\n private async findExistingLocations(\n catalogRepoUrl: string,\n credentials: BackstageCredentials,\n ): Promise<LocationEntity[]> {\n const filter: Record<string, string> = {};\n filter.kind = 'Location';\n filter[`metadata.annotations.${this.targetAnnotation}`] = catalogRepoUrl;\n\n return this.catalogApi!.getEntities({ filter }, { credentials }).then(\n result => result.items,\n ) as Promise<LocationEntity[]>;\n }\n}\n\nexport function toDeferredEntities(\n targets: Entity[],\n locationKey: string,\n): DeferredEntity[] {\n return targets.map(entity => {\n return {\n locationKey,\n entity,\n };\n });\n}\n"],"names":["ScmIntegrations","readProviderConfigs","InputError","defaultBitbucketServerLocationParser","randomUUID","BitbucketServerClient","paginated"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
3
- "version": "0.5.15-next.1",
3
+ "version": "0.5.15",
4
4
  "backstage": {
5
5
  "role": "backend-plugin-module",
6
6
  "pluginId": "catalog",
@@ -64,19 +64,19 @@
64
64
  "test": "backstage-cli package test"
65
65
  },
66
66
  "dependencies": {
67
- "@backstage/backend-plugin-api": "1.10.1-next.1",
68
- "@backstage/catalog-model": "1.10.0",
69
- "@backstage/config": "1.3.9-next.0",
70
- "@backstage/errors": "1.3.1",
71
- "@backstage/integration": "2.1.2-next.1",
72
- "@backstage/plugin-catalog-common": "1.2.0-next.0",
73
- "@backstage/plugin-catalog-node": "2.2.5-next.1",
74
- "@backstage/plugin-events-node": "0.4.26-next.0"
67
+ "@backstage/backend-plugin-api": "^1.10.1",
68
+ "@backstage/catalog-model": "^1.10.1",
69
+ "@backstage/config": "^1.3.9",
70
+ "@backstage/errors": "^1.3.1",
71
+ "@backstage/integration": "^2.1.2",
72
+ "@backstage/plugin-catalog-common": "^1.2.0",
73
+ "@backstage/plugin-catalog-node": "^2.2.5",
74
+ "@backstage/plugin-events-node": "^0.4.26"
75
75
  },
76
76
  "devDependencies": {
77
- "@backstage/backend-test-utils": "1.11.7-next.1",
78
- "@backstage/cli": "0.36.6-next.1",
79
- "@backstage/plugin-events-backend-test-utils": "0.1.59-next.0",
77
+ "@backstage/backend-test-utils": "^1.11.7",
78
+ "@backstage/cli": "^0.36.6",
79
+ "@backstage/plugin-events-backend-test-utils": "^0.1.59",
80
80
  "msw": "^2.0.0"
81
81
  },
82
82
  "configSchema": "config.schema.json"