From f41099bb31ec1d9b6dd33563f9e9223fe840dd2e Mon Sep 17 00:00:00 2001 From: Yevhenii Huselietov Date: Fri, 29 Sep 2023 16:33:34 +0300 Subject: [PATCH 1/3] Display meaningful error to the output if Gitlab namespace not found inside publish:gitlab Signed-off-by: Yevhenii Huselietov --- .changeset/lazy-doors-wink.md | 5 +++++ .../actions/builtin/publish/gitlab.test.ts | 17 ++++++++++++++ .../actions/builtin/publish/gitlab.ts | 22 ++++++++++++++----- 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 .changeset/lazy-doors-wink.md diff --git a/.changeset/lazy-doors-wink.md b/.changeset/lazy-doors-wink.md new file mode 100644 index 0000000000..aafbb3500e --- /dev/null +++ b/.changeset/lazy-doors-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Display meaningful error to the output if Gitlab namespace not found inside `publish:gitlab`. diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts index 994d1c580a..1174276672 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts @@ -393,4 +393,21 @@ describe('publish:gitlab', () => { visibility: 'private', }); }); + + it('should show proper error message when token has insufficient permissions or namespace not found', async () => { + mockGitlabClient.Namespaces.show.mockRejectedValue({ + message: '404 Namespace Not Found', + }); + const owner = 'infrastructure/devex'; + const repoName = 'backstage'; + + await expect( + action.handler({ + ...mockContext, + input: { repoUrl: `gitlab.com?owner=${owner}&repo=${repoName}` }, + }), + ).rejects.toThrow( + `The namespace ${owner} is not found or the user doesn't have permissions to access it`, + ); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts index dbab7b11b8..2b782f2d75 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts @@ -174,20 +174,30 @@ export function createPublishGitlabAction(options: { [tokenType]: token, }); - let { id: targetNamespace } = (await client.Namespaces.show(owner)) as { - id: number; - }; + let targetNamespaceId; + + try { + const namespaceResponse = (await client.Namespaces.show(owner)) as { + id: number; + }; + + targetNamespaceId = namespaceResponse.id; + } catch (e) { + throw new InputError( + `The namespace ${owner} is not found or the user doesn't have permissions to access it`, + ); + } const { id: userId } = (await client.Users.current()) as { id: number; }; - if (!targetNamespace) { - targetNamespace = userId; + if (!targetNamespaceId) { + targetNamespaceId = userId; } const { id: projectId, http_url_to_repo } = await client.Projects.create({ - namespace_id: targetNamespace, + namespace_id: targetNamespaceId, name: repo, visibility: repoVisibility, ...(topics.length ? { topics } : {}), From a8a749e4c42a782c62de8c3b85713f410a7b6638 Mon Sep 17 00:00:00 2001 From: Yevhenii Huselietov Date: Sun, 1 Oct 2023 16:51:11 +0300 Subject: [PATCH 2/3] Throw only on 404 responses Signed-off-by: Yevhenii Huselietov --- .../src/scaffolder/actions/builtin/publish/gitlab.test.ts | 4 +++- .../src/scaffolder/actions/builtin/publish/gitlab.ts | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts index 1174276672..dc8e3eb0ee 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts @@ -396,7 +396,9 @@ describe('publish:gitlab', () => { it('should show proper error message when token has insufficient permissions or namespace not found', async () => { mockGitlabClient.Namespaces.show.mockRejectedValue({ - message: '404 Namespace Not Found', + response: { + statusCode: 404, + }, }); const owner = 'infrastructure/devex'; const repoName = 'backstage'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts index 2b782f2d75..a7da0555e2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts @@ -183,9 +183,11 @@ export function createPublishGitlabAction(options: { targetNamespaceId = namespaceResponse.id; } catch (e) { - throw new InputError( - `The namespace ${owner} is not found or the user doesn't have permissions to access it`, - ); + if (e.response && e.response.statusCode === 404) { + throw new InputError( + `The namespace ${owner} is not found or the user doesn't have permissions to access it`, + ); + } } const { id: userId } = (await client.Users.current()) as { From c3df534cfbab7ccf1b54d5cca7a30c73e37211a4 Mon Sep 17 00:00:00 2001 From: Yevhenii Huselietov Date: Mon, 2 Oct 2023 21:40:28 +0300 Subject: [PATCH 3/3] Update plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts Co-authored-by: Vincenzo Scamporlino Signed-off-by: Yevhenii Huselietov --- .../src/scaffolder/actions/builtin/publish/gitlab.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts index a7da0555e2..25f78452a4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts @@ -188,6 +188,7 @@ export function createPublishGitlabAction(options: { `The namespace ${owner} is not found or the user doesn't have permissions to access it`, ); } + throw e; } const { id: userId } = (await client.Users.current()) as {