@backstage/plugin-catalog-backend-module-azure 0.3.10 → 0.3.11-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/index.d.ts +3 -3
- package/dist/providers/AzureBlobStorageEntityProvider.cjs.js +10 -7
- package/dist/providers/AzureBlobStorageEntityProvider.cjs.js.map +1 -1
- package/dist/providers/AzureDevOpsEntityProvider.cjs.js +12 -9
- package/dist/providers/AzureDevOpsEntityProvider.cjs.js.map +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @backstage/plugin-catalog-backend-module-azure
|
|
2
2
|
|
|
3
|
+
## 0.3.11-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @backstage/plugin-catalog-node@1.20.0-next.1
|
|
9
|
+
- @backstage/backend-plugin-api@1.5.0-next.1
|
|
10
|
+
|
|
11
|
+
## 0.3.11-next.0
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's `erasableSyntaxOnly` setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
|
|
16
|
+
- Updated dependencies
|
|
17
|
+
- @backstage/config@1.3.6-next.0
|
|
18
|
+
- @backstage/integration@1.18.2-next.0
|
|
19
|
+
- @backstage/backend-plugin-api@1.4.5-next.0
|
|
20
|
+
- @backstage/plugin-catalog-common@1.1.7-next.0
|
|
21
|
+
- @backstage/plugin-catalog-node@1.19.2-next.0
|
|
22
|
+
|
|
3
23
|
## 0.3.10
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -51,9 +51,6 @@ declare class AzureDevOpsDiscoveryProcessor implements CatalogProcessor {
|
|
|
51
51
|
* @public
|
|
52
52
|
*/
|
|
53
53
|
declare class AzureDevOpsEntityProvider implements EntityProvider {
|
|
54
|
-
private readonly config;
|
|
55
|
-
private readonly integration;
|
|
56
|
-
private readonly credentialsProvider;
|
|
57
54
|
private readonly logger;
|
|
58
55
|
private readonly scheduleFn;
|
|
59
56
|
private connection?;
|
|
@@ -62,6 +59,9 @@ declare class AzureDevOpsEntityProvider implements EntityProvider {
|
|
|
62
59
|
schedule?: SchedulerServiceTaskRunner;
|
|
63
60
|
scheduler?: SchedulerService;
|
|
64
61
|
}): AzureDevOpsEntityProvider[];
|
|
62
|
+
private readonly config;
|
|
63
|
+
private readonly integration;
|
|
64
|
+
private readonly credentialsProvider;
|
|
65
65
|
private constructor();
|
|
66
66
|
private createScheduleFn;
|
|
67
67
|
/** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */
|
|
@@ -27,13 +27,6 @@ function _interopNamespaceCompat(e) {
|
|
|
27
27
|
var uuid__namespace = /*#__PURE__*/_interopNamespaceCompat(uuid);
|
|
28
28
|
|
|
29
29
|
class AzureBlobStorageEntityProvider {
|
|
30
|
-
constructor(config, integration, credentialsProvider, logger, schedule) {
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.integration = integration;
|
|
33
|
-
this.credentialsProvider = credentialsProvider;
|
|
34
|
-
this.logger = logger.child({ target: this.getProviderName() });
|
|
35
|
-
this.scheduleFn = this.createScheduleFn(schedule);
|
|
36
|
-
}
|
|
37
30
|
logger;
|
|
38
31
|
connection;
|
|
39
32
|
blobServiceClient;
|
|
@@ -69,6 +62,16 @@ class AzureBlobStorageEntityProvider {
|
|
|
69
62
|
);
|
|
70
63
|
});
|
|
71
64
|
}
|
|
65
|
+
config;
|
|
66
|
+
integration;
|
|
67
|
+
credentialsProvider;
|
|
68
|
+
constructor(config, integration, credentialsProvider, logger, schedule) {
|
|
69
|
+
this.config = config;
|
|
70
|
+
this.integration = integration;
|
|
71
|
+
this.credentialsProvider = credentialsProvider;
|
|
72
|
+
this.logger = logger.child({ target: this.getProviderName() });
|
|
73
|
+
this.scheduleFn = this.createScheduleFn(schedule);
|
|
74
|
+
}
|
|
72
75
|
createScheduleFn(taskRunner) {
|
|
73
76
|
return async () => {
|
|
74
77
|
const taskId = `${this.getProviderName()}:refresh`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureBlobStorageEntityProvider.cjs.js","sources":["../../src/providers/AzureBlobStorageEntityProvider.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 {\n AnonymousCredential,\n BlobServiceClient,\n ContainerClient,\n StorageSharedKeyCredential,\n} from '@azure/storage-blob';\nimport { Config } from '@backstage/config';\nimport {\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport {\n EntityProvider,\n EntityProviderConnection,\n locationSpecToLocationEntity,\n} from '@backstage/plugin-catalog-node';\nimport { LocationSpec } from '@backstage/plugin-catalog-common';\nimport * as uuid from 'uuid';\nimport { readAzureBlobStorageConfigs } from './config';\nimport {\n AzureBlobStorageIntergation,\n DefaultAzureCredentialsManager,\n ScmIntegrations,\n} from '@backstage/integration';\nimport { TokenCredential } from '@azure/identity';\nimport { AzureBlobStorageConfig } from './types';\n\n/**\n * Provider which discovers catalog files within an Azure Storage accounts.\n *\n * Use `AzureBlobStorageEntityProvider.fromConfig(...)` to create instances.\n *\n * @public\n */\nexport class AzureBlobStorageEntityProvider implements EntityProvider {\n private readonly logger: LoggerService;\n private connection?: EntityProviderConnection;\n private blobServiceClient?: BlobServiceClient;\n private readonly scheduleFn: () => Promise<void>;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: LoggerService;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n },\n ): AzureBlobStorageEntityProvider[] {\n const providerConfigs = readAzureBlobStorageConfigs(configRoot);\n\n const scmIntegration = ScmIntegrations.fromConfig(configRoot);\n const credentialsProvider =\n DefaultAzureCredentialsManager.fromIntegrations(scmIntegration);\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n const integration = scmIntegration.azureBlobStorage\n .list()\n .filter(\n azureIntegration =>\n azureIntegration.config.accountName === providerConfig.accountName,\n )[0];\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for AzureBlobStorageEntityProvider:${providerConfig.id}.`,\n );\n }\n\n if (!integration) {\n throw new Error(\n `There is no Azure blob storage integration for account. Please add a configuration entry for it under integrations.azureBlobStorage`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new AzureBlobStorageEntityProvider(\n providerConfig,\n integration,\n credentialsProvider,\n options.logger,\n taskRunner,\n );\n });\n }\n private constructor(\n private readonly config: AzureBlobStorageConfig,\n private readonly integration: AzureBlobStorageIntergation,\n private readonly credentialsProvider: DefaultAzureCredentialsManager,\n logger: LoggerService,\n schedule: SchedulerServiceTaskRunner,\n ) {\n this.logger = logger.child({ target: this.getProviderName() });\n this.scheduleFn = this.createScheduleFn(schedule);\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: AzureBlobStorageEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: uuid.v4(),\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 getProviderName(): string {\n return `azureBlobStorage-provider:${this.config.id}`;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n let credential:\n | TokenCredential\n | StorageSharedKeyCredential\n | AnonymousCredential;\n if (this.integration.config.accountKey) {\n credential = new StorageSharedKeyCredential(\n this.integration.config.accountName as string,\n this.integration.config.accountKey as string,\n ); // StorageSharedKeyCredential is only allowed in node.js runtime not in browser\n } else {\n credential = await this.credentialsProvider.getCredentials(\n this.integration.config.accountName as string,\n );\n }\n let blobServiceClientUrl: string;\n\n if (this.integration.config.endpoint) {\n if (this.integration.config.sasToken) {\n blobServiceClientUrl = `${this.integration.config.endpoint}?${this.integration.config.sasToken}`;\n } else {\n blobServiceClientUrl = `${this.integration.config.endpoint}`;\n }\n } else {\n blobServiceClientUrl = `https://${this.integration.config.accountName}.${this.integration.config.host}`;\n }\n\n this.blobServiceClient = new BlobServiceClient(\n blobServiceClientUrl,\n credential,\n );\n await this.scheduleFn();\n }\n\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering Azure Blob Storage blobs');\n\n const keys = await this.listAllBlobKeys();\n logger.info(`Discovered ${keys.length} Azure Blob Storage blobs`);\n\n const locations = keys.map(key => this.createLocationSpec(key));\n\n await this.connection.applyMutation({\n type: 'full',\n entities: locations.map(location => {\n return {\n locationKey: this.getProviderName(),\n entity: locationSpecToLocationEntity({ location }),\n };\n }),\n });\n\n logger.info(\n `Committed ${locations.length} Locations for Azure Blob Storage blobs`,\n );\n }\n\n private async listAllBlobKeys(): Promise<string[]> {\n const keys: string[] = [];\n const containerClient = this.blobServiceClient?.getContainerClient(\n this.config.containerName,\n );\n\n for await (const blob of (\n containerClient as ContainerClient\n ).listBlobsFlat()) {\n if (blob.name) {\n keys.push(blob.name);\n }\n }\n\n return keys;\n }\n\n private createLocationSpec(key: string): LocationSpec {\n return {\n type: 'url',\n target: this.createObjectUrl(key),\n presence: 'required',\n };\n }\n\n private createObjectUrl(key: string): string {\n const endpoint = this.blobServiceClient?.url;\n return `${endpoint}${this.config.containerName}/${key}`;\n }\n}\n"],"names":["readAzureBlobStorageConfigs","ScmIntegrations","DefaultAzureCredentialsManager","uuid","StorageSharedKeyCredential","BlobServiceClient","locationSpecToLocationEntity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AzureBlobStorageEntityProvider.cjs.js","sources":["../../src/providers/AzureBlobStorageEntityProvider.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 {\n AnonymousCredential,\n BlobServiceClient,\n ContainerClient,\n StorageSharedKeyCredential,\n} from '@azure/storage-blob';\nimport { Config } from '@backstage/config';\nimport {\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport {\n EntityProvider,\n EntityProviderConnection,\n locationSpecToLocationEntity,\n} from '@backstage/plugin-catalog-node';\nimport { LocationSpec } from '@backstage/plugin-catalog-common';\nimport * as uuid from 'uuid';\nimport { readAzureBlobStorageConfigs } from './config';\nimport {\n AzureBlobStorageIntergation,\n DefaultAzureCredentialsManager,\n ScmIntegrations,\n} from '@backstage/integration';\nimport { TokenCredential } from '@azure/identity';\nimport { AzureBlobStorageConfig } from './types';\n\n/**\n * Provider which discovers catalog files within an Azure Storage accounts.\n *\n * Use `AzureBlobStorageEntityProvider.fromConfig(...)` to create instances.\n *\n * @public\n */\nexport class AzureBlobStorageEntityProvider implements EntityProvider {\n private readonly logger: LoggerService;\n private connection?: EntityProviderConnection;\n private blobServiceClient?: BlobServiceClient;\n private readonly scheduleFn: () => Promise<void>;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: LoggerService;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n },\n ): AzureBlobStorageEntityProvider[] {\n const providerConfigs = readAzureBlobStorageConfigs(configRoot);\n\n const scmIntegration = ScmIntegrations.fromConfig(configRoot);\n const credentialsProvider =\n DefaultAzureCredentialsManager.fromIntegrations(scmIntegration);\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n const integration = scmIntegration.azureBlobStorage\n .list()\n .filter(\n azureIntegration =>\n azureIntegration.config.accountName === providerConfig.accountName,\n )[0];\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for AzureBlobStorageEntityProvider:${providerConfig.id}.`,\n );\n }\n\n if (!integration) {\n throw new Error(\n `There is no Azure blob storage integration for account. Please add a configuration entry for it under integrations.azureBlobStorage`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new AzureBlobStorageEntityProvider(\n providerConfig,\n integration,\n credentialsProvider,\n options.logger,\n taskRunner,\n );\n });\n }\n private readonly config: AzureBlobStorageConfig;\n private readonly integration: AzureBlobStorageIntergation;\n private readonly credentialsProvider: DefaultAzureCredentialsManager;\n\n private constructor(\n config: AzureBlobStorageConfig,\n integration: AzureBlobStorageIntergation,\n credentialsProvider: DefaultAzureCredentialsManager,\n logger: LoggerService,\n schedule: SchedulerServiceTaskRunner,\n ) {\n this.config = config;\n this.integration = integration;\n this.credentialsProvider = credentialsProvider;\n this.logger = logger.child({ target: this.getProviderName() });\n this.scheduleFn = this.createScheduleFn(schedule);\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: AzureBlobStorageEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: uuid.v4(),\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 getProviderName(): string {\n return `azureBlobStorage-provider:${this.config.id}`;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n let credential:\n | TokenCredential\n | StorageSharedKeyCredential\n | AnonymousCredential;\n if (this.integration.config.accountKey) {\n credential = new StorageSharedKeyCredential(\n this.integration.config.accountName as string,\n this.integration.config.accountKey as string,\n ); // StorageSharedKeyCredential is only allowed in node.js runtime not in browser\n } else {\n credential = await this.credentialsProvider.getCredentials(\n this.integration.config.accountName as string,\n );\n }\n let blobServiceClientUrl: string;\n\n if (this.integration.config.endpoint) {\n if (this.integration.config.sasToken) {\n blobServiceClientUrl = `${this.integration.config.endpoint}?${this.integration.config.sasToken}`;\n } else {\n blobServiceClientUrl = `${this.integration.config.endpoint}`;\n }\n } else {\n blobServiceClientUrl = `https://${this.integration.config.accountName}.${this.integration.config.host}`;\n }\n\n this.blobServiceClient = new BlobServiceClient(\n blobServiceClientUrl,\n credential,\n );\n await this.scheduleFn();\n }\n\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering Azure Blob Storage blobs');\n\n const keys = await this.listAllBlobKeys();\n logger.info(`Discovered ${keys.length} Azure Blob Storage blobs`);\n\n const locations = keys.map(key => this.createLocationSpec(key));\n\n await this.connection.applyMutation({\n type: 'full',\n entities: locations.map(location => {\n return {\n locationKey: this.getProviderName(),\n entity: locationSpecToLocationEntity({ location }),\n };\n }),\n });\n\n logger.info(\n `Committed ${locations.length} Locations for Azure Blob Storage blobs`,\n );\n }\n\n private async listAllBlobKeys(): Promise<string[]> {\n const keys: string[] = [];\n const containerClient = this.blobServiceClient?.getContainerClient(\n this.config.containerName,\n );\n\n for await (const blob of (\n containerClient as ContainerClient\n ).listBlobsFlat()) {\n if (blob.name) {\n keys.push(blob.name);\n }\n }\n\n return keys;\n }\n\n private createLocationSpec(key: string): LocationSpec {\n return {\n type: 'url',\n target: this.createObjectUrl(key),\n presence: 'required',\n };\n }\n\n private createObjectUrl(key: string): string {\n const endpoint = this.blobServiceClient?.url;\n return `${endpoint}${this.config.containerName}/${key}`;\n }\n}\n"],"names":["readAzureBlobStorageConfigs","ScmIntegrations","DefaultAzureCredentialsManager","uuid","StorageSharedKeyCredential","BlobServiceClient","locationSpecToLocationEntity"],"mappings":"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"}
|
|
@@ -27,15 +27,6 @@ function _interopNamespaceCompat(e) {
|
|
|
27
27
|
var uuid__namespace = /*#__PURE__*/_interopNamespaceCompat(uuid);
|
|
28
28
|
|
|
29
29
|
class AzureDevOpsEntityProvider {
|
|
30
|
-
constructor(config, integration, credentialsProvider, logger, taskRunner) {
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.integration = integration;
|
|
33
|
-
this.credentialsProvider = credentialsProvider;
|
|
34
|
-
this.logger = logger.child({
|
|
35
|
-
target: this.getProviderName()
|
|
36
|
-
});
|
|
37
|
-
this.scheduleFn = this.createScheduleFn(taskRunner);
|
|
38
|
-
}
|
|
39
30
|
logger;
|
|
40
31
|
scheduleFn;
|
|
41
32
|
connection;
|
|
@@ -70,6 +61,18 @@ class AzureDevOpsEntityProvider {
|
|
|
70
61
|
);
|
|
71
62
|
});
|
|
72
63
|
}
|
|
64
|
+
config;
|
|
65
|
+
integration;
|
|
66
|
+
credentialsProvider;
|
|
67
|
+
constructor(config, integration, credentialsProvider, logger, taskRunner) {
|
|
68
|
+
this.config = config;
|
|
69
|
+
this.integration = integration;
|
|
70
|
+
this.credentialsProvider = credentialsProvider;
|
|
71
|
+
this.logger = logger.child({
|
|
72
|
+
target: this.getProviderName()
|
|
73
|
+
});
|
|
74
|
+
this.scheduleFn = this.createScheduleFn(taskRunner);
|
|
75
|
+
}
|
|
73
76
|
createScheduleFn(taskRunner) {
|
|
74
77
|
return async () => {
|
|
75
78
|
const taskId = `${this.getProviderName()}:refresh`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureDevOpsEntityProvider.cjs.js","sources":["../../src/providers/AzureDevOpsEntityProvider.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 { Config } from '@backstage/config';\nimport {\n AzureDevOpsCredentialsProvider,\n AzureIntegration,\n DefaultAzureDevOpsCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport {\n EntityProvider,\n EntityProviderConnection,\n locationSpecToLocationEntity,\n} from '@backstage/plugin-catalog-node';\nimport { LocationSpec } from '@backstage/plugin-catalog-common';\nimport { readAzureDevOpsConfigs } from './config';\nimport { AzureDevOpsConfig } from './types';\nimport * as uuid from 'uuid';\nimport { codeSearch, CodeSearchResultItem } from '../lib';\nimport {\n SchedulerService,\n SchedulerServiceTaskRunner,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/**\n * Provider which discovers catalog files within an Azure DevOps repositories.\n *\n * Use `AzureDevOpsEntityProvider.fromConfig(...)` to create instances.\n *\n * @public\n */\nexport class AzureDevOpsEntityProvider implements EntityProvider {\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: LoggerService;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n },\n ): AzureDevOpsEntityProvider[] {\n const providerConfigs = readAzureDevOpsConfigs(configRoot);\n const scmIntegrations = ScmIntegrations.fromConfig(configRoot);\n const credentialsProvider =\n DefaultAzureDevOpsCredentialsProvider.fromIntegrations(scmIntegrations);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n const integration = ScmIntegrations.fromConfig(configRoot).azure.byHost(\n providerConfig.host,\n );\n\n if (!integration) {\n throw new Error(\n `There is no Azure integration for host ${providerConfig.host}. Please add a configuration entry for it under integrations.azure`,\n );\n }\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for AzureDevOpsEntityProvider:${providerConfig.id}.`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new AzureDevOpsEntityProvider(\n providerConfig,\n integration,\n credentialsProvider,\n options.logger,\n taskRunner,\n );\n });\n }\n\n private constructor(\n private readonly config: AzureDevOpsConfig,\n private readonly integration: AzureIntegration,\n private readonly credentialsProvider: AzureDevOpsCredentialsProvider,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\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: AzureDevOpsEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: uuid.v4(),\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 `AzureDevOpsEntityProvider:${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\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering Azure DevOps catalog files');\n\n const files = await codeSearch(\n this.credentialsProvider,\n this.integration.config,\n this.config.organization,\n this.config.project,\n this.config.repository,\n this.config.path,\n this.config.branch || '',\n );\n\n logger.info(`Discovered ${files.length} catalog files`);\n\n const targets = files.map(key => this.createObjectUrl(key));\n const locations = Array.from(new Set(targets)).map(key =>\n this.createLocationSpec(key),\n );\n\n await this.connection.applyMutation({\n type: 'full',\n entities: locations.map(location => {\n return {\n locationKey: this.getProviderName(),\n entity: locationSpecToLocationEntity({ location }),\n };\n }),\n });\n\n logger.info(\n `Committed ${locations.length} locations for AzureDevOps catalog files`,\n );\n }\n\n private createLocationSpec(target: string): LocationSpec {\n return {\n type: 'url',\n target: target,\n presence: 'required',\n };\n }\n\n private createObjectUrl(file: CodeSearchResultItem): string {\n const baseUrl = `https://${this.config.host}/${this.config.organization}/${file.project.name}`;\n\n let fullUrl = `${baseUrl}/_git/${file.repository.name}?path=${file.path}`;\n if (this.config.branch) {\n fullUrl += `&version=GB${this.config.branch}`;\n }\n\n return encodeURI(fullUrl);\n }\n}\n"],"names":["readAzureDevOpsConfigs","ScmIntegrations","DefaultAzureDevOpsCredentialsProvider","integration","uuid","codeSearch","locationSpecToLocationEntity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AzureDevOpsEntityProvider.cjs.js","sources":["../../src/providers/AzureDevOpsEntityProvider.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 { Config } from '@backstage/config';\nimport {\n AzureDevOpsCredentialsProvider,\n AzureIntegration,\n DefaultAzureDevOpsCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport {\n EntityProvider,\n EntityProviderConnection,\n locationSpecToLocationEntity,\n} from '@backstage/plugin-catalog-node';\nimport { LocationSpec } from '@backstage/plugin-catalog-common';\nimport { readAzureDevOpsConfigs } from './config';\nimport { AzureDevOpsConfig } from './types';\nimport * as uuid from 'uuid';\nimport { codeSearch, CodeSearchResultItem } from '../lib';\nimport {\n SchedulerService,\n SchedulerServiceTaskRunner,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/**\n * Provider which discovers catalog files within an Azure DevOps repositories.\n *\n * Use `AzureDevOpsEntityProvider.fromConfig(...)` to create instances.\n *\n * @public\n */\nexport class AzureDevOpsEntityProvider implements EntityProvider {\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: LoggerService;\n schedule?: SchedulerServiceTaskRunner;\n scheduler?: SchedulerService;\n },\n ): AzureDevOpsEntityProvider[] {\n const providerConfigs = readAzureDevOpsConfigs(configRoot);\n const scmIntegrations = ScmIntegrations.fromConfig(configRoot);\n const credentialsProvider =\n DefaultAzureDevOpsCredentialsProvider.fromIntegrations(scmIntegrations);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n const integration = ScmIntegrations.fromConfig(configRoot).azure.byHost(\n providerConfig.host,\n );\n\n if (!integration) {\n throw new Error(\n `There is no Azure integration for host ${providerConfig.host}. Please add a configuration entry for it under integrations.azure`,\n );\n }\n\n if (!options.schedule && !providerConfig.schedule) {\n throw new Error(\n `No schedule provided neither via code nor config for AzureDevOpsEntityProvider:${providerConfig.id}.`,\n );\n }\n\n const taskRunner =\n options.schedule ??\n options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);\n\n return new AzureDevOpsEntityProvider(\n providerConfig,\n integration,\n credentialsProvider,\n options.logger,\n taskRunner,\n );\n });\n }\n\n private readonly config: AzureDevOpsConfig;\n private readonly integration: AzureIntegration;\n private readonly credentialsProvider: AzureDevOpsCredentialsProvider;\n\n private constructor(\n config: AzureDevOpsConfig,\n integration: AzureIntegration,\n credentialsProvider: AzureDevOpsCredentialsProvider,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.config = config;\n this.integration = integration;\n this.credentialsProvider = credentialsProvider;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\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: AzureDevOpsEntityProvider.prototype.constructor.name,\n taskId,\n taskInstanceId: uuid.v4(),\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 `AzureDevOpsEntityProvider:${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\n async refresh(logger: LoggerService) {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n logger.info('Discovering Azure DevOps catalog files');\n\n const files = await codeSearch(\n this.credentialsProvider,\n this.integration.config,\n this.config.organization,\n this.config.project,\n this.config.repository,\n this.config.path,\n this.config.branch || '',\n );\n\n logger.info(`Discovered ${files.length} catalog files`);\n\n const targets = files.map(key => this.createObjectUrl(key));\n const locations = Array.from(new Set(targets)).map(key =>\n this.createLocationSpec(key),\n );\n\n await this.connection.applyMutation({\n type: 'full',\n entities: locations.map(location => {\n return {\n locationKey: this.getProviderName(),\n entity: locationSpecToLocationEntity({ location }),\n };\n }),\n });\n\n logger.info(\n `Committed ${locations.length} locations for AzureDevOps catalog files`,\n );\n }\n\n private createLocationSpec(target: string): LocationSpec {\n return {\n type: 'url',\n target: target,\n presence: 'required',\n };\n }\n\n private createObjectUrl(file: CodeSearchResultItem): string {\n const baseUrl = `https://${this.config.host}/${this.config.organization}/${file.project.name}`;\n\n let fullUrl = `${baseUrl}/_git/${file.repository.name}?path=${file.path}`;\n if (this.config.branch) {\n fullUrl += `&version=GB${this.config.branch}`;\n }\n\n return encodeURI(fullUrl);\n }\n}\n"],"names":["readAzureDevOpsConfigs","ScmIntegrations","DefaultAzureDevOpsCredentialsProvider","integration","uuid","codeSearch","locationSpecToLocationEntity"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-catalog-backend-module-azure",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.11-next.1",
|
|
4
4
|
"description": "A Backstage catalog backend module that helps integrate towards Azure",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin-module",
|
|
@@ -67,16 +67,16 @@
|
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@azure/identity": "^4.0.0",
|
|
69
69
|
"@azure/storage-blob": "^12.5.0",
|
|
70
|
-
"@backstage/backend-plugin-api": "
|
|
71
|
-
"@backstage/config": "
|
|
72
|
-
"@backstage/integration": "
|
|
73
|
-
"@backstage/plugin-catalog-common": "
|
|
74
|
-
"@backstage/plugin-catalog-node": "
|
|
70
|
+
"@backstage/backend-plugin-api": "1.5.0-next.1",
|
|
71
|
+
"@backstage/config": "1.3.6-next.0",
|
|
72
|
+
"@backstage/integration": "1.18.2-next.0",
|
|
73
|
+
"@backstage/plugin-catalog-common": "1.1.7-next.0",
|
|
74
|
+
"@backstage/plugin-catalog-node": "1.20.0-next.1",
|
|
75
75
|
"uuid": "^11.0.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@backstage/backend-test-utils": "
|
|
79
|
-
"@backstage/cli": "
|
|
78
|
+
"@backstage/backend-test-utils": "1.10.0-next.1",
|
|
79
|
+
"@backstage/cli": "0.34.5-next.1",
|
|
80
80
|
"msw": "^1.0.0"
|
|
81
81
|
},
|
|
82
82
|
"configSchema": "config.d.ts"
|