diff --git a/packages/manager/.changeset/pr-13556-changed-1775141881220.md b/packages/manager/.changeset/pr-13556-changed-1775141881220.md new file mode 100644 index 00000000000..b28ec278a77 --- /dev/null +++ b/packages/manager/.changeset/pr-13556-changed-1775141881220.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Changed +--- + +Logs Delivery copy based on tech writing updates ([#13556](https://github.com/linode/manager/pull/13556)) diff --git a/packages/manager/cypress/e2e/core/delivery/create-destination.spec.ts b/packages/manager/cypress/e2e/core/delivery/create-destination.spec.ts index 8a413f8655f..9dfaa3ed18f 100644 --- a/packages/manager/cypress/e2e/core/delivery/create-destination.spec.ts +++ b/packages/manager/cypress/e2e/core/delivery/create-destination.spec.ts @@ -159,7 +159,7 @@ describe('Create Destination', () => { ); // Switch to manual mode and fill in values - cy.findByLabelText('Enter Bucket manually').click(); + cy.findByLabelText('Enter Bucket details manually').click(); logsDestinationForm.setBucket('my-manual-bucket'); logsDestinationForm.setEndpoint('my-endpoint.com'); diff --git a/packages/manager/cypress/e2e/core/delivery/edit-destination.spec.ts b/packages/manager/cypress/e2e/core/delivery/edit-destination.spec.ts index 9ff583e6185..58e5fb0861d 100644 --- a/packages/manager/cypress/e2e/core/delivery/edit-destination.spec.ts +++ b/packages/manager/cypress/e2e/core/delivery/edit-destination.spec.ts @@ -160,7 +160,9 @@ describe('Edit Destination', () => { ]); // Edit mode defaults to manual bucket entry - cy.findByLabelText('Enter Bucket manually').should('be.checked'); + cy.findByLabelText('Enter Bucket details manually').should( + 'be.checked' + ); // Endpoint should be enabled in manual mode cy.findByLabelText('Endpoint').should('be.enabled'); diff --git a/packages/manager/cypress/support/ui/pages/logs-destination-form.ts b/packages/manager/cypress/support/ui/pages/logs-destination-form.ts index 0e3479c96f6..832a1150aa8 100644 --- a/packages/manager/cypress/support/ui/pages/logs-destination-form.ts +++ b/packages/manager/cypress/support/ui/pages/logs-destination-form.ts @@ -76,7 +76,7 @@ export const logsDestinationForm = { cy.findByLabelText('Endpoint') .should('be.visible') .should('be.enabled') - .should('have.attr', 'placeholder', 'Endpoint for the destination') + .should('have.attr', 'placeholder', 'https://us-ord-1.linodeobjects.com') .clear(); cy.focused().type(endpoint); }, @@ -129,7 +129,7 @@ export const logsDestinationForm = { data: AkamaiObjectStorageDetailsExtended ) => { // Switch to manual bucket entry - cy.findByLabelText('Enter Bucket manually').click(); + cy.findByLabelText('Enter Bucket details manually').click(); logsDestinationForm.setBucket(data.bucket_name); logsDestinationForm.setEndpoint(data.host); diff --git a/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationCreate.test.tsx b/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationCreate.test.tsx index 4df080726c4..f6bfbe2a9a1 100644 --- a/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationCreate.test.tsx +++ b/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationCreate.test.tsx @@ -112,7 +112,9 @@ describe('DestinationCreate', () => { it('should render Endpoint input and allow to type text in manual mode', async () => { renderDestinationCreate(flags); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); @@ -124,7 +126,9 @@ describe('DestinationCreate', () => { it('should render Bucket input and allow to type text in manual mode', async () => { renderDestinationCreate(flags); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const bucketInput = screen.getByLabelText('Bucket'); @@ -223,10 +227,12 @@ describe('DestinationCreate', () => { expect(endpointInput).toBeDisabled(); }); - it('should enable the Endpoint field when "Enter Bucket manually" is selected', async () => { + it('should enable the Endpoint field when "Enter Bucket details manually" is selected', async () => { renderDestinationCreate(flags); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); @@ -237,7 +243,9 @@ describe('DestinationCreate', () => { renderDestinationCreate(flags); // Switch to manual mode and fill in values - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const bucketInput = screen.getByLabelText('Bucket'); @@ -312,7 +320,9 @@ describe('DestinationCreate', () => { await userEvent.type(destinationNameInput, 'Test'); // Switch to manual bucket entry to allow typing - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); diff --git a/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationEdit.test.tsx b/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationEdit.test.tsx index 4e24b0946cd..65a1a4d232f 100644 --- a/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationEdit.test.tsx +++ b/packages/manager/src/features/Delivery/Destinations/DestinationForm/DestinationEdit.test.tsx @@ -114,10 +114,12 @@ describe('DestinationEdit', () => { await waitForElementToBeRemoved(loadingElement); }; - it('should default to "Enter Bucket manually" radio in edit mode', async () => { + it('should default to "Enter Bucket details manually" radio in edit mode', async () => { await renderEditWithMockDestination(); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); expect(manualRadio).toBeChecked(); }); diff --git a/packages/manager/src/features/Delivery/Shared/DestinationAkamaiObjectStorageDetailsForm.tsx b/packages/manager/src/features/Delivery/Shared/DestinationAkamaiObjectStorageDetailsForm.tsx index 495dc28b776..cadd6744cc6 100644 --- a/packages/manager/src/features/Delivery/Shared/DestinationAkamaiObjectStorageDetailsForm.tsx +++ b/packages/manager/src/features/Delivery/Shared/DestinationAkamaiObjectStorageDetailsForm.tsx @@ -103,6 +103,17 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ Bucket + + Choose how to provide bucket details. Selecting a bucket associated with + your account will auto-fill the required settings. Entering a bucket + manually requires you to provide all connection details. + handleBucketConfigurationChange(value)} sx={{ '&[role="radiogroup"]': { mb: 0 } }} @@ -115,7 +126,7 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ /> } - label="Enter Bucket manually" + label="Enter Bucket details manually" value="bucket_entered_manually" /> @@ -155,6 +166,7 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ ); }} options={buckets} + placeholder="Select a Bucket" textFieldProps={{ inputProps: { 'data-pendo-id': `${pendoPageId}Bucket`, @@ -204,7 +216,8 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ onChange={(value) => { field.onChange(value); }} - placeholder="Endpoint for the destination" + placeholder="https://us-ord-1.linodeobjects.com" + tooltipText="The Object Storage service endpoint associated with your bucket's region" value={field.value} /> )} @@ -222,6 +235,7 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ label="Access Key ID" onBlur={field.onBlur} onChange={(value) => field.onChange(value)} + tooltipText="The access key identifier used for authentication" value={field.value} /> )} @@ -239,6 +253,7 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ label="Secret Access Key" onBlur={field.onBlur} onChange={(value) => field.onChange(value)} + tooltipText="The confidential security credential used with Access Key ID to access Object Storage" value={field.value} /> )} @@ -268,6 +283,7 @@ export const DestinationAkamaiObjectStorageDetailsForm = ({ optional placeholder="Prefix for log storage path" sx={{ maxWidth: 416 }} + tooltipText="The path prefix used for organizing uploaded objects" value={field.value} /> )} diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.test.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.test.tsx index ef5b7ace07a..cab0123f0ab 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.test.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.test.tsx @@ -156,7 +156,7 @@ describe('StreamFormClusters', () => { it('should filter clusters by name', async () => { await renderComponentWithoutSelectedClusters(); - const input = screen.getByPlaceholderText('Search'); + const input = screen.getByPlaceholderText('Search for a cluster'); // Type test value inside the search await userEvent.click(input); @@ -169,7 +169,7 @@ describe('StreamFormClusters', () => { it('should filter clusters by region with search input', async () => { await renderComponentWithoutSelectedClusters(); - const input = screen.getByPlaceholderText('Search'); + const input = screen.getByPlaceholderText('Search for a cluster'); // Type test value inside the search await userEvent.click(input); @@ -185,7 +185,7 @@ describe('StreamFormClusters', () => { it('should filter clusters by log generation status with search input', async () => { await renderComponentWithoutSelectedClusters(); - const input = screen.getByPlaceholderText('Search'); + const input = screen.getByPlaceholderText('Search for a cluster'); // Type test value inside the search await userEvent.click(input); @@ -198,7 +198,7 @@ describe('StreamFormClusters', () => { it('should filter clusters by log generation status with autocomplete', async () => { await renderComponentWithoutSelectedClusters(); - const input = screen.getByPlaceholderText('Log Generation'); + const input = screen.getByPlaceholderText('Logging Status'); // Enabled filter option await userEvent.click(input); @@ -488,7 +488,7 @@ describe('StreamFormClusters', () => { it('should only display regions that have clusters and the required capability', async () => { await renderComponentWithoutSelectedClusters(); - const regionSelect = screen.getByPlaceholderText('Select Region'); + const regionSelect = screen.getByPlaceholderText('Select a Region'); await userEvent.click(regionSelect); const regionOptions = await screen.findAllByRole('option'); diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.tsx index 808f8c9d9a4..965139aeb76 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClusters.tsx @@ -234,12 +234,20 @@ export const StreamFormClusters = (props: StreamFormClustersProps) => { ) : ( <> + + Select the LKE clusters that will send audit logs to the configured + destination. Logging must be enabled for a cluster before it can be + selected. To enable logging for a cluster, use the Linode API to{' '} + + update the cluster + {' '} + to set audit_logs_enabled to true. + - - Select the LKE clusters that will send audit logs to the configured - destination. Logging must be enabled for a cluster before it can be - selected. To enable logging for a cluster, use the Linode API{' '} - - update the cluster - {' '} - to set audit_logs_enabled to true. - { }} label="Search" onSearch={(value) => setSearchText(value)} - placeholder="Search" + placeholder="Search for a cluster" value={searchText} /> @@ -313,7 +313,7 @@ export const StreamFormClusters = (props: StreamFormClustersProps) => { onChange={(_, region) => { setRegionFilter(region?.id ?? ''); }} - placeholder="Select Region" + placeholder="Select a Region" regionFilter="core" regions={visibleRegions ?? []} sx={{ @@ -325,7 +325,7 @@ export const StreamFormClusters = (props: StreamFormClustersProps) => { label="" onChange={(_, option) => setLogGenerationFilter(option?.value)} options={logGenerationOptions} - placeholder="Log Generation" + placeholder="Logging Status" sx={{ width: '160px !important', }} diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClustersTableContent.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClustersTableContent.tsx index 5fdfacccc4f..c9a5dca93bc 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClustersTableContent.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/Clusters/StreamFormClustersTableContent.tsx @@ -95,7 +95,7 @@ export const StreamFormClusterTableContent = ({ > Region - Log Generation + Logging Status diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.test.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.test.tsx index 232825b95f1..05baff6bd18 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.test.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.test.tsx @@ -240,7 +240,9 @@ describe('StreamFormDelivery', () => { expect(endpointInput).toBeDisabled(); // Switch to manual mode - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); // Now Endpoint should be enabled @@ -256,7 +258,9 @@ describe('StreamFormDelivery', () => { ); // Switch to manual mode - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); // Type the test value inside the input @@ -332,13 +336,15 @@ describe('StreamFormDelivery', () => { expect(endpointInput).toBeDisabled(); }); - it('should enable the Endpoint field when "Enter Bucket manually" is selected', async () => { + it('should enable the Endpoint field when "Enter Bucket details manually" is selected', async () => { await renderComponentAndAddNewDestinationName( destinationType.AkamaiObjectStorage, flags ); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); @@ -352,7 +358,9 @@ describe('StreamFormDelivery', () => { ); // Switch to manual mode and fill in values - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const bucketInput = screen.getByLabelText('Bucket'); diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.tsx index 0b99c5b24e4..59012122f46 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/Delivery/StreamFormDelivery.tsx @@ -289,6 +289,9 @@ export const StreamFormDelivery = (props: StreamFormDeliveryProps) => { inputProps: { 'data-pendo-id': `Logs Delivery Streams ${capitalizedMode}-Destination Name`, }, + tooltipPosition: 'right', + tooltipText: + 'Select an existing destination from the list or create a new one by entering a name and clicking Create.', }} value={field.value ? { label: field.value } : null} /> diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamCreate.test.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamCreate.test.tsx index 49744d734af..f32fc8730c7 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamCreate.test.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamCreate.test.tsx @@ -56,7 +56,9 @@ describe('StreamCreate', () => { ); await userEvent.click(createNewTestDestination); - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamEdit.test.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamEdit.test.tsx index bb2f144b5cc..4f2850ff542 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamEdit.test.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamEdit.test.tsx @@ -102,7 +102,9 @@ describe('StreamEdit', () => { await userEvent.click(createNewTestDestination); // Switch to manual bucket entry mode - const manualRadio = screen.getByLabelText('Enter Bucket manually'); + const manualRadio = screen.getByLabelText( + 'Enter Bucket details manually' + ); await userEvent.click(manualRadio); const endpointInput = screen.getByLabelText('Endpoint'); diff --git a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamFormGeneralInfo.tsx b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamFormGeneralInfo.tsx index 56097376e38..29deccfb8c2 100644 --- a/packages/manager/src/features/Delivery/Streams/StreamForm/StreamFormGeneralInfo.tsx +++ b/packages/manager/src/features/Delivery/Streams/StreamForm/StreamFormGeneralInfo.tsx @@ -42,9 +42,9 @@ export const StreamFormGeneralInfo = (props: StreamFormGeneralInfoProps) => { const capitalizedMode = capitalize(mode); const description = { audit_logs: - 'Audit logs record state-changing operations on cloud resources and authentication events, delivered in CloudEvents JSON format.', + 'Audit logs record state-changing operations on cloud resources and authentication events, and are delivered in CloudEvents JSON format.', lke_audit_logs: - 'Kubernetes API server audit logs capture state-changing operations on LKE-E cluster resources.', + 'Kubernetes API server audit logs capture state-changing operations on LKE-E cluster resources, and are delivered in native Kubernetes audit format.', }; const pendoIds = { audit_logs: `Logs Delivery Streams ${capitalizedMode}-Audit Logs`,