add analyzers to the CatalogBuilder

Signed-off-by: Kiss Miklos <miklos@roadie.io>
This commit is contained in:
Kiss Miklos
2022-09-30 10:34:10 +02:00
parent 3cbe42d8a9
commit e74ac1c708
11 changed files with 47 additions and 22 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/plugin-catalog-backend-module-github': minor
---
Added `GitHubLocationAnalyzer`. This can be used to add to the `CatalogBuilder`. When added this will be used by `RepoLocationAnalyzer` to figure out if the given url that you are trying to import from the /catalog-import page already contains catalog-info.yaml files.
Added `GitHubLocationAnalyzer`. This can be used to add to the `CatalogBuilder`. When added this will be used by `RepoLocationAnalyzer` to figure out if the given URL that you are trying to import from the /catalog-import page already contains catalog-info.yaml files.
@@ -3,6 +3,8 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-backend';
import { AnalyzeOptions } from '@backstage/plugin-catalog-backend';
import { BackendFeature } from '@backstage/backend-plugin-api';
import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
@@ -13,7 +15,9 @@ import { GithubCredentialsProvider } from '@backstage/integration';
import { GitHubIntegrationConfig } from '@backstage/integration';
import { LocationSpec } from '@backstage/plugin-catalog-backend';
import { Logger } from 'winston';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-backend';
import { TaskRunner } from '@backstage/backend-tasks';
import { TaskScheduleDefinition } from '@backstage/backend-tasks';
@@ -70,6 +74,24 @@ export type GithubEntityProviderCatalogModuleOptions = {
schedule?: TaskScheduleDefinition;
};
// @public (undocumented)
export class GitHubLocationAnalyzer implements ScmLocationAnalyzer {
constructor(options: GitHubLocationAnalyzerOptions);
// (undocumented)
analyze({
url,
catalogFilename,
}: AnalyzeOptions): Promise<AnalyzeLocationExistingEntity[]>;
// (undocumented)
getIntegrationType(): string;
}
// @public (undocumented)
export type GitHubLocationAnalyzerOptions = {
config: Config;
discovery: PluginEndpointDiscovery;
};
// @public
export type GithubMultiOrgConfig = Array<{
name: string;
@@ -27,10 +27,12 @@ import {
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { Config } from '@backstage/config';
/** @public */
export type GitHubLocationAnalyzerOptions = {
config: Config;
discovery: PluginEndpointDiscovery;
};
/** @public */
export class GitHubLocationAnalyzer implements ScmLocationAnalyzer {
private readonly catalogClient: CatalogApi;
private readonly config: Config;
@@ -30,3 +30,4 @@ export type { GithubMultiOrgConfig } from './lib';
export { githubEntityProviderCatalogModule } from './module';
export type { GithubEntityProviderCatalogModuleOptions } from './module';
export { GitHubLocationAnalyzer } from './analyzers/GitHubLocationAnalyzer';
export type { GitHubLocationAnalyzerOptions } from './analyzers/GitHubLocationAnalyzer';
+15 -1
View File
@@ -87,6 +87,12 @@ export type AnalyzeLocationResponse = {
generateEntities: AnalyzeLocationGenerateEntity[];
};
// @public (undocumented)
export type AnalyzeOptions = {
url: string;
catalogFilename?: string;
};
// @public (undocumented)
export class AnnotateLocationEntityProcessor implements CatalogProcessor {
constructor(options: { integrations: ScmIntegrationRegistry });
@@ -134,6 +140,9 @@ export class CatalogBuilder {
addEntityProvider(
...providers: Array<EntityProvider | Array<EntityProvider>>
): CatalogBuilder;
addLocationAnalyzers(
...analyzers: Array<ScmLocationAnalyzer | Array<ScmLocationAnalyzer>>
): CatalogBuilder;
// @alpha
addPermissionRules(
...permissionRules: Array<
@@ -219,7 +228,6 @@ export type CatalogEnvironment = {
config: Config;
reader: UrlReader;
permissions: PermissionEvaluator | PermissionAuthorizer;
discovery: PluginEndpointDiscovery;
};
// @alpha
@@ -533,6 +541,12 @@ export type ProcessingIntervalFunction = () => number;
export { processingResult };
// @public (undocumented)
export type ScmLocationAnalyzer = {
getIntegrationType(): string;
analyze(options: AnalyzeOptions): Promise<AnalyzeLocationExistingEntity[]>;
};
// @public (undocumented)
export class UrlReaderProcessor implements CatalogProcessor {
constructor(options: { reader: UrlReader; logger: Logger });
-1
View File
@@ -47,7 +47,6 @@
"@backstage/plugin-scaffolder-common": "workspace:^",
"@backstage/plugin-search-common": "workspace:^",
"@backstage/types": "workspace:^",
"@octokit/rest": "^19.0.4",
"@types/express": "^4.17.6",
"codeowners-utils": "^1.0.2",
"core-js": "^3.6.5",
@@ -17,10 +17,7 @@
import { Logger } from 'winston';
import parseGitUrl from 'git-url-parse';
import { Entity } from '@backstage/catalog-model';
import {
GitHubIntegration,
ScmIntegrationRegistry,
} from '@backstage/integration';
import { ScmIntegrationRegistry } from '@backstage/integration';
import {
AnalyzeLocationRequest,
AnalyzeLocationResponse,
@@ -45,9 +42,7 @@ export class RepoLocationAnalyzer implements LocationAnalyzer {
async analyzeLocation(
request: AnalyzeLocationRequest,
): Promise<AnalyzeLocationResponse> {
const integration = this.scmIntegrations.byUrl(
request.location.target,
) as GitHubIntegration;
const integration = this.scmIntegrations.byUrl(request.location.target);
const { owner, name } = parseGitUrl(request.location.target);
let annotationPrefix;
@@ -69,7 +64,7 @@ export class RepoLocationAnalyzer implements LocationAnalyzer {
}
const analyzer = this.analyzers.find(
a => a.getIntegrationType() === integration.type,
a => a.getIntegrationType() === integration?.type,
);
if (analyzer) {
const existingEntityFiles = await analyzer.analyze({
@@ -100,10 +100,12 @@ export type AnalyzeLocationEntityField = {
description: string;
};
/** @public */
export type AnalyzeOptions = {
url: string;
catalogFilename?: string;
};
/** @public */
export type ScmLocationAnalyzer = {
/** The integration type this location analyzer can work with */
@@ -14,11 +14,7 @@
* limitations under the License.
*/
import {
PluginDatabaseManager,
PluginEndpointDiscovery,
UrlReader,
} from '@backstage/backend-common';
import { PluginDatabaseManager, UrlReader } from '@backstage/backend-common';
import {
DefaultNamespaceEntityPolicy,
Entity,
@@ -108,7 +104,6 @@ export type CatalogEnvironment = {
config: Config;
reader: UrlReader;
permissions: PermissionEvaluator | PermissionAuthorizer;
discovery: PluginEndpointDiscovery;
};
/**
@@ -22,7 +22,6 @@ import {
permissionsServiceRef,
urlReaderServiceRef,
httpRouterServiceRef,
discoveryServiceRef,
} from '@backstage/backend-plugin-api';
import { CatalogBuilder } from './CatalogBuilder';
import {
@@ -79,7 +78,6 @@ export const catalogPlugin = createBackendPlugin({
permissions: permissionsServiceRef,
database: databaseServiceRef,
httpRouter: httpRouterServiceRef,
discovery: discoveryServiceRef,
},
async init({
logger,
@@ -88,7 +86,6 @@ export const catalogPlugin = createBackendPlugin({
database,
permissions,
httpRouter,
discovery,
}) {
const winstonLogger = loggerToWinstonLogger(logger);
const builder = await CatalogBuilder.create({
@@ -97,7 +94,6 @@ export const catalogPlugin = createBackendPlugin({
permissions,
database,
logger: winstonLogger,
discovery,
});
builder.addProcessor(...processingExtensions.processors);
builder.addEntityProvider(...processingExtensions.entityProviders);
@@ -70,7 +70,6 @@ export async function startStandaloneServer(
config,
reader,
permissions,
discovery,
});
const catalog = await builder.build();