@backstage/plugin-catalog-backend-module-azure 0.1.23 → 0.1.24-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 +28 -5
- package/alpha/package.json +1 -1
- package/dist/alpha.cjs.js +4 -2
- package/dist/alpha.cjs.js.map +1 -1
- package/dist/cjs/{AzureDevOpsEntityProvider-6fe9022c.cjs.js → AzureDevOpsEntityProvider-59d39deb.cjs.js} +5 -2
- package/dist/cjs/AzureDevOpsEntityProvider-59d39deb.cjs.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/package.json +8 -8
- package/dist/cjs/AzureDevOpsEntityProvider-6fe9022c.cjs.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
# @backstage/plugin-catalog-backend-module-azure
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.24-next.1
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
7
|
- Updated dependencies
|
|
8
|
-
- @backstage/backend-
|
|
9
|
-
- @backstage/
|
|
10
|
-
- @backstage/
|
|
11
|
-
- @backstage/backend-
|
|
8
|
+
- @backstage/backend-tasks@0.5.10-next.1
|
|
9
|
+
- @backstage/plugin-catalog-node@1.4.6-next.1
|
|
10
|
+
- @backstage/backend-common@0.19.7-next.1
|
|
11
|
+
- @backstage/backend-plugin-api@0.6.5-next.1
|
|
12
|
+
- @backstage/config@1.1.0
|
|
13
|
+
- @backstage/catalog-model@1.4.2
|
|
14
|
+
- @backstage/errors@1.2.2
|
|
15
|
+
- @backstage/integration@1.7.1-next.0
|
|
16
|
+
- @backstage/types@1.1.1
|
|
17
|
+
- @backstage/plugin-catalog-common@1.0.16
|
|
18
|
+
|
|
19
|
+
## 0.1.24-next.0
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- 890e3b5ad4: Make sure to include the error message when ingestion fails
|
|
24
|
+
- Updated dependencies
|
|
25
|
+
- @backstage/integration@1.7.1-next.0
|
|
26
|
+
- @backstage/backend-common@0.19.7-next.0
|
|
27
|
+
- @backstage/config@1.1.0
|
|
28
|
+
- @backstage/backend-plugin-api@0.6.5-next.0
|
|
29
|
+
- @backstage/backend-tasks@0.5.10-next.0
|
|
30
|
+
- @backstage/catalog-model@1.4.2
|
|
31
|
+
- @backstage/errors@1.2.2
|
|
32
|
+
- @backstage/types@1.1.1
|
|
33
|
+
- @backstage/plugin-catalog-common@1.0.16
|
|
34
|
+
- @backstage/plugin-catalog-node@1.4.6-next.0
|
|
12
35
|
|
|
13
36
|
## 0.1.22
|
|
14
37
|
|
package/alpha/package.json
CHANGED
package/dist/alpha.cjs.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var backendCommon = require('@backstage/backend-common');
|
|
4
6
|
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
5
7
|
var alpha = require('@backstage/plugin-catalog-node/alpha');
|
|
6
|
-
var AzureDevOpsEntityProvider = require('./cjs/AzureDevOpsEntityProvider-
|
|
8
|
+
var AzureDevOpsEntityProvider = require('./cjs/AzureDevOpsEntityProvider-59d39deb.cjs.js');
|
|
7
9
|
require('@backstage/integration');
|
|
8
10
|
require('@backstage/plugin-catalog-node');
|
|
9
11
|
require('@backstage/backend-tasks');
|
|
@@ -33,5 +35,5 @@ const catalogModuleAzureDevOpsEntityProvider = backendPluginApi.createBackendMod
|
|
|
33
35
|
}
|
|
34
36
|
});
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
exports["default"] = catalogModuleAzureDevOpsEntityProvider;
|
|
37
39
|
//# sourceMappingURL=alpha.cjs.js.map
|
package/dist/alpha.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.cjs.js","sources":["../src/module/catalogModuleAzureDevOpsEntityProvider.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 { loggerToWinstonLogger } from '@backstage/backend-common';\nimport {\n createBackendModule,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { AzureDevOpsEntityProvider } from '../providers';\n\n/**\n * Registers the AzureDevOpsEntityProvider with the catalog processing extension point.\n *\n * @alpha\n */\nexport const catalogModuleAzureDevOpsEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'azureDevOpsEntityProvider',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n catalog: catalogProcessingExtensionPoint,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ config, catalog, logger, scheduler }) {\n catalog.addEntityProvider(\n AzureDevOpsEntityProvider.fromConfig(config, {\n logger: loggerToWinstonLogger(logger),\n scheduler,\n }),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","catalogProcessingExtensionPoint","AzureDevOpsEntityProvider","loggerToWinstonLogger"],"mappings":"
|
|
1
|
+
{"version":3,"file":"alpha.cjs.js","sources":["../src/module/catalogModuleAzureDevOpsEntityProvider.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 { loggerToWinstonLogger } from '@backstage/backend-common';\nimport {\n createBackendModule,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { AzureDevOpsEntityProvider } from '../providers';\n\n/**\n * Registers the AzureDevOpsEntityProvider with the catalog processing extension point.\n *\n * @alpha\n */\nexport const catalogModuleAzureDevOpsEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'azureDevOpsEntityProvider',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n catalog: catalogProcessingExtensionPoint,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ config, catalog, logger, scheduler }) {\n catalog.addEntityProvider(\n AzureDevOpsEntityProvider.fromConfig(config, {\n logger: loggerToWinstonLogger(logger),\n scheduler,\n }),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","catalogProcessingExtensionPoint","AzureDevOpsEntityProvider","loggerToWinstonLogger"],"mappings":";;;;;;;;;;;;;;AA6BO,MAAM,yCAAyCA,oCAAoB,CAAA;AAAA,EACxE,QAAU,EAAA,SAAA;AAAA,EACV,QAAU,EAAA,2BAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQD,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,QAAQ,OAAS,EAAA,MAAA,EAAQ,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,iBAAA;AAAA,UACNE,mDAAA,CAA0B,WAAW,MAAQ,EAAA;AAAA,YAC3C,MAAA,EAAQC,oCAAsB,MAAM,CAAA;AAAA,YACpC,SAAA;AAAA,WACD,CAAA;AAAA,SACH,CAAA;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
|
|
@@ -168,7 +168,10 @@ class AzureDevOpsEntityProvider {
|
|
|
168
168
|
try {
|
|
169
169
|
await this.refresh(logger);
|
|
170
170
|
} catch (error) {
|
|
171
|
-
logger.error(
|
|
171
|
+
logger.error(
|
|
172
|
+
`${this.getProviderName()} refresh failed, ${error}`,
|
|
173
|
+
error
|
|
174
|
+
);
|
|
172
175
|
}
|
|
173
176
|
}
|
|
174
177
|
});
|
|
@@ -233,4 +236,4 @@ class AzureDevOpsEntityProvider {
|
|
|
233
236
|
|
|
234
237
|
exports.AzureDevOpsEntityProvider = AzureDevOpsEntityProvider;
|
|
235
238
|
exports.codeSearch = codeSearch;
|
|
236
|
-
//# sourceMappingURL=AzureDevOpsEntityProvider-
|
|
239
|
+
//# sourceMappingURL=AzureDevOpsEntityProvider-59d39deb.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureDevOpsEntityProvider-59d39deb.cjs.js","sources":["../../src/lib/azure.ts","../../src/providers/config.ts","../../src/providers/AzureDevOpsEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2021 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 fetch from 'node-fetch';\nimport {\n AzureDevOpsCredentialsProvider,\n AzureIntegrationConfig,\n} from '@backstage/integration';\n\nexport interface CodeSearchResponse {\n count: number;\n results: CodeSearchResultItem[];\n}\n\nexport interface CodeSearchResultItem {\n fileName: string;\n path: string;\n repository: {\n name: string;\n };\n project: {\n name: string;\n };\n branch?: string;\n}\n\nconst isCloud = (host: string) => host === 'dev.azure.com';\nconst PAGE_SIZE = 1000;\n\n// codeSearch returns all files that matches the given search path.\nexport async function codeSearch(\n credentialsProvider: AzureDevOpsCredentialsProvider,\n azureConfig: AzureIntegrationConfig,\n org: string,\n project: string,\n repo: string,\n path: string,\n): Promise<CodeSearchResultItem[]> {\n const searchBaseUrl = isCloud(azureConfig.host)\n ? 'https://almsearch.dev.azure.com'\n : `https://${azureConfig.host}`;\n const searchUrl = `${searchBaseUrl}/${org}/_apis/search/codesearchresults?api-version=6.0-preview.1`;\n\n let items: CodeSearchResultItem[] = [];\n let hasMorePages = true;\n\n do {\n const credentials = await credentialsProvider.getCredentials({\n url: `https://${azureConfig.host}/${org}`,\n });\n\n const response = await fetch(searchUrl, {\n headers: {\n ...credentials?.headers,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n searchText: `path:${path} repo:${repo || '*'} proj:${project || '*'}`,\n $orderBy: [\n {\n field: 'path',\n sortOrder: 'ASC',\n },\n ],\n $skip: items.length,\n $top: PAGE_SIZE,\n }),\n });\n\n if (response.status !== 200) {\n throw new Error(\n `Azure DevOps search failed with response status ${response.status}`,\n );\n }\n\n const body: CodeSearchResponse = await response.json();\n items = [...items, ...body.results];\n hasMorePages = body.count > items.length;\n } while (hasMorePages);\n\n return items;\n}\n","/*\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 { readTaskScheduleDefinitionFromConfig } from '@backstage/backend-tasks';\nimport { Config } from '@backstage/config';\nimport { AzureDevOpsConfig } from './types';\n\nexport function readAzureDevOpsConfigs(config: Config): AzureDevOpsConfig[] {\n const configs: AzureDevOpsConfig[] = [];\n\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.azureDevOps',\n );\n\n if (!providerConfigs) {\n return configs;\n }\n\n for (const id of providerConfigs.keys()) {\n configs.push(readAzureDevOpsConfig(id, providerConfigs.getConfig(id)));\n }\n\n return configs;\n}\n\nfunction readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig {\n const organization = config.getString('organization');\n const project = config.getString('project');\n const host = config.getOptionalString('host') || 'dev.azure.com';\n const repository = config.getOptionalString('repository') || '*';\n const branch = config.getOptionalString('branch');\n const path = config.getOptionalString('path') || '/catalog-info.yaml';\n\n const schedule = config.has('schedule')\n ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule'))\n : undefined;\n\n return {\n id,\n host,\n organization,\n project,\n repository,\n branch,\n path,\n schedule,\n };\n}\n","/*\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 { PluginTaskScheduler, TaskRunner } from '@backstage/backend-tasks';\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 { Logger } from 'winston';\nimport { AzureDevOpsConfig } from './types';\nimport * as uuid from 'uuid';\nimport { codeSearch, CodeSearchResultItem } from '../lib';\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: Logger;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: Logger;\n schedule?: TaskRunner;\n scheduler?: PluginTaskScheduler;\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: Logger,\n taskRunner: TaskRunner,\n ) {\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n private createScheduleFn(taskRunner: TaskRunner): () => 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-backend#EntityProvider.getProviderName} */\n getProviderName(): string {\n return `AzureDevOpsEntityProvider:${this.config.id}`;\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async refresh(logger: Logger) {\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 );\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":["fetch","readTaskScheduleDefinitionFromConfig","ScmIntegrations","DefaultAzureDevOpsCredentialsProvider","integration","uuid","locationSpecToLocationEntity"],"mappings":"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"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var integration = require('@backstage/integration');
|
|
6
6
|
var pluginCatalogNode = require('@backstage/plugin-catalog-node');
|
|
7
|
-
var AzureDevOpsEntityProvider = require('./cjs/AzureDevOpsEntityProvider-
|
|
7
|
+
var AzureDevOpsEntityProvider = require('./cjs/AzureDevOpsEntityProvider-59d39deb.cjs.js');
|
|
8
8
|
require('@backstage/backend-tasks');
|
|
9
9
|
require('uuid');
|
|
10
10
|
require('node-fetch');
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-catalog-backend-module-azure",
|
|
3
3
|
"description": "A Backstage catalog backend module that helps integrate towards Azure",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.24-next.1",
|
|
5
5
|
"main": "./dist/index.cjs.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -43,15 +43,15 @@
|
|
|
43
43
|
"clean": "backstage-cli package clean"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@backstage/backend-common": "^0.19.
|
|
47
|
-
"@backstage/backend-plugin-api": "^0.6.
|
|
48
|
-
"@backstage/backend-tasks": "^0.5.
|
|
46
|
+
"@backstage/backend-common": "^0.19.7-next.1",
|
|
47
|
+
"@backstage/backend-plugin-api": "^0.6.5-next.1",
|
|
48
|
+
"@backstage/backend-tasks": "^0.5.10-next.1",
|
|
49
49
|
"@backstage/catalog-model": "^1.4.2",
|
|
50
50
|
"@backstage/config": "^1.1.0",
|
|
51
51
|
"@backstage/errors": "^1.2.2",
|
|
52
|
-
"@backstage/integration": "^1.7.0",
|
|
52
|
+
"@backstage/integration": "^1.7.1-next.0",
|
|
53
53
|
"@backstage/plugin-catalog-common": "^1.0.16",
|
|
54
|
-
"@backstage/plugin-catalog-node": "^1.4.
|
|
54
|
+
"@backstage/plugin-catalog-node": "^1.4.6-next.1",
|
|
55
55
|
"@backstage/types": "^1.1.1",
|
|
56
56
|
"lodash": "^4.17.21",
|
|
57
57
|
"node-fetch": "^2.6.7",
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
"winston": "^3.2.1"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@backstage/backend-test-utils": "^0.2.
|
|
63
|
-
"@backstage/cli": "^0.
|
|
62
|
+
"@backstage/backend-test-utils": "^0.2.6-next.1",
|
|
63
|
+
"@backstage/cli": "^0.23.0-next.1",
|
|
64
64
|
"@types/lodash": "^4.14.151",
|
|
65
65
|
"luxon": "^3.0.0",
|
|
66
66
|
"msw": "^1.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AzureDevOpsEntityProvider-6fe9022c.cjs.js","sources":["../../src/lib/azure.ts","../../src/providers/config.ts","../../src/providers/AzureDevOpsEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2021 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 fetch from 'node-fetch';\nimport {\n AzureDevOpsCredentialsProvider,\n AzureIntegrationConfig,\n} from '@backstage/integration';\n\nexport interface CodeSearchResponse {\n count: number;\n results: CodeSearchResultItem[];\n}\n\nexport interface CodeSearchResultItem {\n fileName: string;\n path: string;\n repository: {\n name: string;\n };\n project: {\n name: string;\n };\n branch?: string;\n}\n\nconst isCloud = (host: string) => host === 'dev.azure.com';\nconst PAGE_SIZE = 1000;\n\n// codeSearch returns all files that matches the given search path.\nexport async function codeSearch(\n credentialsProvider: AzureDevOpsCredentialsProvider,\n azureConfig: AzureIntegrationConfig,\n org: string,\n project: string,\n repo: string,\n path: string,\n): Promise<CodeSearchResultItem[]> {\n const searchBaseUrl = isCloud(azureConfig.host)\n ? 'https://almsearch.dev.azure.com'\n : `https://${azureConfig.host}`;\n const searchUrl = `${searchBaseUrl}/${org}/_apis/search/codesearchresults?api-version=6.0-preview.1`;\n\n let items: CodeSearchResultItem[] = [];\n let hasMorePages = true;\n\n do {\n const credentials = await credentialsProvider.getCredentials({\n url: `https://${azureConfig.host}/${org}`,\n });\n\n const response = await fetch(searchUrl, {\n headers: {\n ...credentials?.headers,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n searchText: `path:${path} repo:${repo || '*'} proj:${project || '*'}`,\n $orderBy: [\n {\n field: 'path',\n sortOrder: 'ASC',\n },\n ],\n $skip: items.length,\n $top: PAGE_SIZE,\n }),\n });\n\n if (response.status !== 200) {\n throw new Error(\n `Azure DevOps search failed with response status ${response.status}`,\n );\n }\n\n const body: CodeSearchResponse = await response.json();\n items = [...items, ...body.results];\n hasMorePages = body.count > items.length;\n } while (hasMorePages);\n\n return items;\n}\n","/*\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 { readTaskScheduleDefinitionFromConfig } from '@backstage/backend-tasks';\nimport { Config } from '@backstage/config';\nimport { AzureDevOpsConfig } from './types';\n\nexport function readAzureDevOpsConfigs(config: Config): AzureDevOpsConfig[] {\n const configs: AzureDevOpsConfig[] = [];\n\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.azureDevOps',\n );\n\n if (!providerConfigs) {\n return configs;\n }\n\n for (const id of providerConfigs.keys()) {\n configs.push(readAzureDevOpsConfig(id, providerConfigs.getConfig(id)));\n }\n\n return configs;\n}\n\nfunction readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig {\n const organization = config.getString('organization');\n const project = config.getString('project');\n const host = config.getOptionalString('host') || 'dev.azure.com';\n const repository = config.getOptionalString('repository') || '*';\n const branch = config.getOptionalString('branch');\n const path = config.getOptionalString('path') || '/catalog-info.yaml';\n\n const schedule = config.has('schedule')\n ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule'))\n : undefined;\n\n return {\n id,\n host,\n organization,\n project,\n repository,\n branch,\n path,\n schedule,\n };\n}\n","/*\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 { PluginTaskScheduler, TaskRunner } from '@backstage/backend-tasks';\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 { Logger } from 'winston';\nimport { AzureDevOpsConfig } from './types';\nimport * as uuid from 'uuid';\nimport { codeSearch, CodeSearchResultItem } from '../lib';\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: Logger;\n private readonly scheduleFn: () => Promise<void>;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n configRoot: Config,\n options: {\n logger: Logger;\n schedule?: TaskRunner;\n scheduler?: PluginTaskScheduler;\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: Logger,\n taskRunner: TaskRunner,\n ) {\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n private createScheduleFn(taskRunner: TaskRunner): () => 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(`${this.getProviderName()} refresh failed`, error);\n }\n },\n });\n };\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.getProviderName} */\n getProviderName(): string {\n return `AzureDevOpsEntityProvider:${this.config.id}`;\n }\n\n /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async refresh(logger: Logger) {\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 );\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":["fetch","readTaskScheduleDefinitionFromConfig","ScmIntegrations","DefaultAzureDevOpsCredentialsProvider","integration","uuid","locationSpecToLocationEntity"],"mappings":"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"}
|