From a780d5daccabeb004450cc353b0bdf97dd4854dd Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Thu, 14 Nov 2024 12:05:25 -0800 Subject: [PATCH] Web: add aws oidc integration health check before editing and when selecting in discover (#48953) * Add ping aws integration req/resp boilerplate * Add aws health check when selecting existing aws integration for discover flow * Add health check when editing aws oidc integration * Fix lint * Add health check when creating integration --- lib/web/integrations_awsoidc.go | 4 ++ .../Shared/AwsAccount/AwsAccount.test.tsx | 39 +++++++++++- .../Discover/Shared/AwsAccount/AwsAccount.tsx | 39 ++++++++++-- .../EditAwsOidcIntegrationDialog.test.tsx | 62 ++++++++++++++++++- .../EditAwsOidcIntegrationDialog.tsx | 19 +++--- .../Enroll/AwsOidc/AwsOidc.test.tsx | 49 +++++++++++++++ .../Enroll/AwsOidc/useAwsOidcIntegration.tsx | 52 +++++++++++++--- .../src/Integrations/Integrations.tsx | 7 ++- .../Operations/IntegrationOperations.tsx | 2 +- .../Operations/useIntegrationOperation.ts | 28 ++++++++- web/packages/teleport/src/config.ts | 15 +++++ .../src/services/integrations/integrations.ts | 12 ++++ .../src/services/integrations/types.ts | 17 +++++ 13 files changed, 316 insertions(+), 29 deletions(-) diff --git a/lib/web/integrations_awsoidc.go b/lib/web/integrations_awsoidc.go index 52d7d171080..39ebb250a94 100644 --- a/lib/web/integrations_awsoidc.go +++ b/lib/web/integrations_awsoidc.go @@ -1454,6 +1454,10 @@ func (h *Handler) awsOIDCPing(w http.ResponseWriter, r *http.Request, p httprout return nil, trace.Wrap(err) } + if req.RoleARN != "" { + integrationName = "" + } + pingResp, err := clt.IntegrationAWSOIDCClient().Ping(ctx, &integrationv1.PingRequest{ Integration: integrationName, RoleArn: req.RoleARN, diff --git a/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.test.tsx b/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.test.tsx index 8a5f7369395..06a93feb723 100644 --- a/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.test.tsx +++ b/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.test.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { MemoryRouter } from 'react-router'; -import { render, screen } from 'design/utils/testing'; +import { render, screen, fireEvent } from 'design/utils/testing'; import { ContextProvider } from 'teleport'; import { @@ -144,6 +144,27 @@ test('missing permissions for integrations', async () => { expect(screen.getByRole('button', { name: /back/i })).toBeInTheDocument(); }); +test('health check is called after selecting an aws integration', async () => { + const { ctx, discoverCtx, spyPing } = getMockedContexts({ + kind: ResourceKind.Application, + appMeta: { awsConsole: true }, + name: '', + icon: undefined, + keywords: [], + event: DiscoverEventResource.ApplicationHttp, + }); + + renderAwsAccount(ctx, discoverCtx); + + await screen.findByText(/AWS Integrations/i); + + const selectContainer = screen.getByRole('combobox'); + fireEvent.mouseDown(selectContainer); + fireEvent.keyPress(selectContainer, { key: 'Enter' }); + + expect(spyPing).toHaveBeenCalledTimes(1); +}); + function getMockedContexts(resourceSpec: ResourceSpec) { const ctx = createTeleportContext(); const discoverCtx: DiscoverContextState = { @@ -167,7 +188,21 @@ function getMockedContexts(resourceSpec: ResourceSpec) { .spyOn(userEventService, 'captureDiscoverEvent') .mockResolvedValue(undefined as never); - return { ctx, discoverCtx }; + const spyPing = jest + .spyOn(integrationService, 'fetchIntegrations') + .mockResolvedValue({ + items: [ + { + resourceType: 'integration', + name: 'aws-oidc-1', + kind: IntegrationKind.AwsOidc, + spec: { roleArn: '111' }, + statusCode: IntegrationStatusCode.Running, + }, + ], + }); + + return { ctx, discoverCtx, spyPing }; } function renderAwsAccount( diff --git a/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.tsx b/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.tsx index 1c688fef73f..175bc33c656 100644 --- a/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.tsx +++ b/web/packages/teleport/src/Discover/Shared/AwsAccount/AwsAccount.tsx @@ -70,8 +70,12 @@ export function AwsAccount() { eventState, resourceSpec, currentStep, + emitErrorEvent, } = useDiscover(); + const [selectedAwsIntegration, setSelectedAwsIntegration] = + useState