From 7babbfaf3cc4acbbf478bd99fee5b8d1083da979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Tue, 8 Dec 2020 12:06:58 +0100 Subject: [PATCH 1/8] Add support for GitHub Enterprise from integration-config --- plugins/catalog-import/src/api/CatalogImportApi.ts | 2 ++ plugins/catalog-import/src/api/CatalogImportClient.ts | 6 +++++- plugins/catalog-import/src/util/useGithubRepos.ts | 9 ++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-import/src/api/CatalogImportApi.ts b/plugins/catalog-import/src/api/CatalogImportApi.ts index 0ce569171f..414eacf128 100644 --- a/plugins/catalog-import/src/api/CatalogImportApi.ts +++ b/plugins/catalog-import/src/api/CatalogImportApi.ts @@ -16,6 +16,7 @@ import { createApiRef } from '@backstage/core'; import { PartialEntity } from '../util/types'; +import { GitHubIntegrationConfig } from '@backstage/integration' export const catalogImportApiRef = createApiRef({ id: 'plugin.catalog-import.service', @@ -27,6 +28,7 @@ export interface CatalogImportApi { owner: string; repo: string; fileContent: string; + githubIntegrationConfig: GitHubIntegrationConfig; }): Promise<{ link: string; location: string }>; createRepositoryLocation(options: { location: string }): Promise; generateEntityDefinitions(options: { diff --git a/plugins/catalog-import/src/api/CatalogImportClient.ts b/plugins/catalog-import/src/api/CatalogImportClient.ts index aaa110329e..57c6a8490a 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.ts @@ -19,6 +19,7 @@ import { DiscoveryApi, OAuthApi } from '@backstage/core'; import { CatalogImportApi } from './CatalogImportApi'; import { AnalyzeLocationResponse } from '@backstage/plugin-catalog-backend'; import { PartialEntity } from '../util/types'; +import { GitHubIntegrationConfig } from '@backstage/integration' export class CatalogImportClient implements CatalogImportApi { private readonly discoveryApi: DiscoveryApi; @@ -91,15 +92,18 @@ export class CatalogImportClient implements CatalogImportApi { owner, repo, fileContent, + githubIntegrationConfig, }: { owner: string; repo: string; fileContent: string; + githubIntegrationConfig: GitHubIntegrationConfig; }): Promise<{ link: string; location: string }> { const token = await this.githubAuthApi.getAccessToken(['repo']); const octo = new Octokit({ auth: token, + baseUrl: githubIntegrationConfig.apiBaseUrl, }); const branchName = 'backstage-integration'; @@ -179,7 +183,7 @@ export class CatalogImportClient implements CatalogImportApi { return { link: pullRequestResponse.data.html_url, - location: `https://github.com/${owner}/${repo}/blob/${repoData.data.default_branch}/${fileName}`, + location: `https://${githubIntegrationConfig.host}/${owner}/${repo}/blob/${repoData.data.default_branch}/${fileName}`, }; } } diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index a18edc2777..435d260f1b 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -15,15 +15,21 @@ */ import * as YAML from 'yaml'; -import { useApi } from '@backstage/core'; +import { useApi, configApiRef } from '@backstage/core'; import { catalogImportApiRef } from '../api/CatalogImportApi'; import { ConfigSpec } from '../components/ImportComponentPage'; +import { readGitHubIntegrationConfigs } from '@backstage/integration'; export function useGithubRepos() { const api = useApi(catalogImportApiRef); + const config = useApi(configApiRef); const submitPrToRepo = async (selectedRepo: ConfigSpec) => { const [ownerName, repoName] = selectedRepo.location.split('/').slice(-2); + const configs = readGitHubIntegrationConfigs( + config.getOptionalConfigArray('integrations.github') ?? [] + ) + const githubIntegrationConfig = configs[0] const submitPRResponse = await api .submitPrToRepo({ owner: ownerName, @@ -31,6 +37,7 @@ export function useGithubRepos() { fileContent: selectedRepo.config .map(entity => `---\n${YAML.stringify(entity)}`) .join('\n'), + githubIntegrationConfig }) .catch(e => { throw new Error(`Failed to submit PR to repo:\n${e.message}`); From ac454782f2f38ddb466208a6a4f3db1c25059f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Tue, 8 Dec 2020 12:24:18 +0100 Subject: [PATCH 2/8] Add dependency on module --- plugins/catalog-import/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 74cb3635be..86995e1e7a 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -25,6 +25,7 @@ "@backstage/core": "^0.3.2", "@backstage/plugin-catalog": "^0.2.5", "@backstage/plugin-catalog-backend": "^0.3.0", + "@backstage/integration": "^0.1.2", "@backstage/theme": "^0.2.1", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", From a3cb631ca5a1d8b509328224b743145714c871fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Tue, 8 Dec 2020 12:34:31 +0100 Subject: [PATCH 3/8] Ran prettier ... --- plugins/catalog-import/src/api/CatalogImportApi.ts | 2 +- plugins/catalog-import/src/api/CatalogImportClient.ts | 2 +- plugins/catalog-import/src/util/useGithubRepos.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/catalog-import/src/api/CatalogImportApi.ts b/plugins/catalog-import/src/api/CatalogImportApi.ts index 414eacf128..99526a3eaa 100644 --- a/plugins/catalog-import/src/api/CatalogImportApi.ts +++ b/plugins/catalog-import/src/api/CatalogImportApi.ts @@ -16,7 +16,7 @@ import { createApiRef } from '@backstage/core'; import { PartialEntity } from '../util/types'; -import { GitHubIntegrationConfig } from '@backstage/integration' +import { GitHubIntegrationConfig } from '@backstage/integration'; export const catalogImportApiRef = createApiRef({ id: 'plugin.catalog-import.service', diff --git a/plugins/catalog-import/src/api/CatalogImportClient.ts b/plugins/catalog-import/src/api/CatalogImportClient.ts index 57c6a8490a..4ac015ffbf 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.ts @@ -19,7 +19,7 @@ import { DiscoveryApi, OAuthApi } from '@backstage/core'; import { CatalogImportApi } from './CatalogImportApi'; import { AnalyzeLocationResponse } from '@backstage/plugin-catalog-backend'; import { PartialEntity } from '../util/types'; -import { GitHubIntegrationConfig } from '@backstage/integration' +import { GitHubIntegrationConfig } from '@backstage/integration'; export class CatalogImportClient implements CatalogImportApi { private readonly discoveryApi: DiscoveryApi; diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index 435d260f1b..af1ef43c73 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -27,9 +27,9 @@ export function useGithubRepos() { const submitPrToRepo = async (selectedRepo: ConfigSpec) => { const [ownerName, repoName] = selectedRepo.location.split('/').slice(-2); const configs = readGitHubIntegrationConfigs( - config.getOptionalConfigArray('integrations.github') ?? [] - ) - const githubIntegrationConfig = configs[0] + config.getOptionalConfigArray('integrations.github') ?? [], + ); + const githubIntegrationConfig = configs[0]; const submitPRResponse = await api .submitPrToRepo({ owner: ownerName, @@ -37,7 +37,7 @@ export function useGithubRepos() { fileContent: selectedRepo.config .map(entity => `---\n${YAML.stringify(entity)}`) .join('\n'), - githubIntegrationConfig + githubIntegrationConfig, }) .catch(e => { throw new Error(`Failed to submit PR to repo:\n${e.message}`); From d0c62e7dc7acede47ea900fd6efb760a5899de97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Wed, 9 Dec 2020 11:05:29 +0100 Subject: [PATCH 4/8] Add todo and find config by hostname --- .../catalog-import/src/util/useGithubRepos.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index af1ef43c73..7f49bb3363 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -18,6 +18,9 @@ import * as YAML from 'yaml'; import { useApi, configApiRef } from '@backstage/core'; import { catalogImportApiRef } from '../api/CatalogImportApi'; import { ConfigSpec } from '../components/ImportComponentPage'; + +//TODO: O5ten, refactor into a core API instead of direct usage like this +//https://github.com/backstage/backstage/pull/3613#issuecomment-7408929430 import { readGitHubIntegrationConfigs } from '@backstage/integration'; export function useGithubRepos() { @@ -25,11 +28,14 @@ export function useGithubRepos() { const config = useApi(configApiRef); const submitPrToRepo = async (selectedRepo: ConfigSpec) => { - const [ownerName, repoName] = selectedRepo.location.split('/').slice(-2); + const [hostname, ownerName, repoName] = selectedRepo.location.split('/').slice(-3); const configs = readGitHubIntegrationConfigs( - config.getOptionalConfigArray('integrations.github') ?? [], - ); - const githubIntegrationConfig = configs[0]; + config.getOptionalConfigArray('integrations.github') ?? [] + ) + const githubIntegrationConfig = configs.find(v => v.host === hostname); + if(!githubIntegrationConfig) { + throw new Error(`Unable to locate github-integration for repo-location: ${selectedRepo.location}`); + } const submitPRResponse = await api .submitPrToRepo({ owner: ownerName, @@ -37,7 +43,7 @@ export function useGithubRepos() { fileContent: selectedRepo.config .map(entity => `---\n${YAML.stringify(entity)}`) .join('\n'), - githubIntegrationConfig, + githubIntegrationConfig }) .catch(e => { throw new Error(`Failed to submit PR to repo:\n${e.message}`); From 7dda6180b0728d582b0b34be3cd952d01c959018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Wed, 9 Dec 2020 11:11:17 +0100 Subject: [PATCH 5/8] Ran prettier --- .../catalog-import/src/util/useGithubRepos.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index 7f49bb3363..af65799987 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -28,13 +28,17 @@ export function useGithubRepos() { const config = useApi(configApiRef); const submitPrToRepo = async (selectedRepo: ConfigSpec) => { - const [hostname, ownerName, repoName] = selectedRepo.location.split('/').slice(-3); + const [hostname, ownerName, repoName] = selectedRepo.location + .split('/') + .slice(-3); const configs = readGitHubIntegrationConfigs( - config.getOptionalConfigArray('integrations.github') ?? [] - ) + config.getOptionalConfigArray('integrations.github') ?? [], + ); const githubIntegrationConfig = configs.find(v => v.host === hostname); - if(!githubIntegrationConfig) { - throw new Error(`Unable to locate github-integration for repo-location: ${selectedRepo.location}`); + if (!githubIntegrationConfig) { + throw new Error( + `Unable to locate github-integration for repo-location: ${selectedRepo.location}`, + ); } const submitPRResponse = await api .submitPrToRepo({ @@ -43,7 +47,7 @@ export function useGithubRepos() { fileContent: selectedRepo.config .map(entity => `---\n${YAML.stringify(entity)}`) .join('\n'), - githubIntegrationConfig + githubIntegrationConfig, }) .catch(e => { throw new Error(`Failed to submit PR to repo:\n${e.message}`); From 5066852ef299c8bc1f03303ce397b669392c9a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Wed, 9 Dec 2020 11:45:52 +0100 Subject: [PATCH 6/8] Update useGithubRepos.ts --- plugins/catalog-import/src/util/useGithubRepos.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index af65799987..740f0581b1 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -19,8 +19,8 @@ import { useApi, configApiRef } from '@backstage/core'; import { catalogImportApiRef } from '../api/CatalogImportApi'; import { ConfigSpec } from '../components/ImportComponentPage'; -//TODO: O5ten, refactor into a core API instead of direct usage like this -//https://github.com/backstage/backstage/pull/3613#issuecomment-7408929430 +// TODO: (O5ten) Refactor into a core API instead of direct usage like this +// https://github.com/backstage/backstage/pull/3613#issuecomment-7408929430 import { readGitHubIntegrationConfigs } from '@backstage/integration'; export function useGithubRepos() { From 6e47fb65685b27807a568eca5eeead84dea60aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Wed, 9 Dec 2020 15:31:43 +0100 Subject: [PATCH 7/8] Use parseGitUri --- plugins/catalog-import/src/util/useGithubRepos.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-import/src/util/useGithubRepos.ts b/plugins/catalog-import/src/util/useGithubRepos.ts index 740f0581b1..30e77e18a8 100644 --- a/plugins/catalog-import/src/util/useGithubRepos.ts +++ b/plugins/catalog-import/src/util/useGithubRepos.ts @@ -18,6 +18,7 @@ import * as YAML from 'yaml'; import { useApi, configApiRef } from '@backstage/core'; import { catalogImportApiRef } from '../api/CatalogImportApi'; import { ConfigSpec } from '../components/ImportComponentPage'; +import parseGitUri from 'git-url-parse'; // TODO: (O5ten) Refactor into a core API instead of direct usage like this // https://github.com/backstage/backstage/pull/3613#issuecomment-7408929430 @@ -28,9 +29,12 @@ export function useGithubRepos() { const config = useApi(configApiRef); const submitPrToRepo = async (selectedRepo: ConfigSpec) => { - const [hostname, ownerName, repoName] = selectedRepo.location - .split('/') - .slice(-3); + const { + name: repoName, + owner: ownerName, + resource: hostname, + } = parseGitUri(selectedRepo.location); + const configs = readGitHubIntegrationConfigs( config.getOptionalConfigArray('integrations.github') ?? [], ); From e2379035c413535d9589e3b0865d0a5c03830dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96stberg?= Date: Thu, 10 Dec 2020 13:41:24 +0100 Subject: [PATCH 8/8] Update package.json --- plugins/catalog-import/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 86995e1e7a..d92a70d5b1 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -25,7 +25,7 @@ "@backstage/core": "^0.3.2", "@backstage/plugin-catalog": "^0.2.5", "@backstage/plugin-catalog-backend": "^0.3.0", - "@backstage/integration": "^0.1.2", + "@backstage/integration": "^0.1.3", "@backstage/theme": "^0.2.1", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1",