From ced85b598e92416ff78d4efc0906f6532f091d34 Mon Sep 17 00:00:00 2001 From: Oliver Sand Date: Thu, 12 Aug 2021 12:41:17 +0200 Subject: [PATCH] Fix catalog import not detecting yaml files correctly if query parameters are used Signed-off-by: Oliver Sand --- .changeset/funny-pants-unite.md | 5 ++ .../src/api/CatalogImportClient.test.ts | 47 +++++++++++++++++++ .../src/api/CatalogImportClient.ts | 21 ++++----- 3 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 .changeset/funny-pants-unite.md diff --git a/.changeset/funny-pants-unite.md b/.changeset/funny-pants-unite.md new file mode 100644 index 0000000000..349cf54b8f --- /dev/null +++ b/.changeset/funny-pants-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +Fix importing yaml files from URLs with trailing query parameters. diff --git a/plugins/catalog-import/src/api/CatalogImportClient.test.ts b/plugins/catalog-import/src/api/CatalogImportClient.test.ts index eb6f754a0a..44f33dc660 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.test.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.test.ts @@ -171,6 +171,53 @@ describe('CatalogImportClient', () => { }); }); + it('should add yaml location, if url includes query parameters', async () => { + catalogApi.addLocation.mockResolvedValueOnce({ + location: { + id: 'id-0', + type: 'url', + target: 'http://example.com/folder/catalog-info.yaml?branch=test', + }, + entities: [ + { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'my-entity', + namespace: 'my-namespace', + }, + }, + ], + }); + + await expect( + catalogImportClient.analyzeUrl( + 'http://example.com/folder/catalog-info.yaml?branch=test', + ), + ).resolves.toEqual({ + locations: [ + { + entities: [ + { + kind: 'Component', + name: 'my-entity', + namespace: 'my-namespace', + }, + ], + target: 'http://example.com/folder/catalog-info.yaml?branch=test', + }, + ], + type: 'locations', + }); + + expect(catalogApi.addLocation).toBeCalledTimes(1); + expect(catalogApi.addLocation.mock.calls[0][0]).toEqual({ + type: 'url', + target: 'http://example.com/folder/catalog-info.yaml?branch=test', + dryRun: true, + }); + }); + it('should reject for integrations that are not github ones', async () => { await expect( catalogImportClient.analyzeUrl( diff --git a/plugins/catalog-import/src/api/CatalogImportClient.ts b/plugins/catalog-import/src/api/CatalogImportClient.ts index aa29c95247..dd727a64a7 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.ts @@ -16,20 +16,20 @@ import { CatalogApi } from '@backstage/catalog-client'; import { EntityName } from '@backstage/catalog-model'; -import { - GitHubIntegrationConfig, - ScmIntegrationRegistry, -} from '@backstage/integration'; -import { Base64 } from 'js-base64'; -import { Octokit } from '@octokit/rest'; -import { PartialEntity } from '../types'; -import { AnalyzeResult, CatalogImportApi } from './CatalogImportApi'; -import { getGithubIntegrationConfig } from './GitHub'; import { DiscoveryApi, IdentityApi, OAuthApi, } from '@backstage/core-plugin-api'; +import { + GitHubIntegrationConfig, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { Octokit } from '@octokit/rest'; +import { Base64 } from 'js-base64'; +import { PartialEntity } from '../types'; +import { AnalyzeResult, CatalogImportApi } from './CatalogImportApi'; +import { getGithubIntegrationConfig } from './GitHub'; export class CatalogImportClient implements CatalogImportApi { private readonly discoveryApi: DiscoveryApi; @@ -53,7 +53,7 @@ export class CatalogImportClient implements CatalogImportApi { } async analyzeUrl(url: string): Promise { - if (url.match(/\.ya?ml$/)) { + if (new URL(url).pathname.match(/\.ya?ml$/)) { const location = await this.catalogApi.addLocation({ type: 'url', target: url, @@ -340,7 +340,6 @@ export class CatalogImportClient implements CatalogImportApi { ), ); }); - return { link: pullRequestResponse.data.html_url, location: `https://${githubIntegrationConfig.host}/${owner}/${repo}/blob/${repoData.data.default_branch}/${fileName}`,