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.
+
-
- Disabling this option allows you to manually define which clusters
- will be included in the stream. Stream will not be updated
- automatically with newly configured clusters.
- (
@@ -258,25 +266,17 @@ export const StreamFormClusters = (props: StreamFormClustersProps) => {
}
await trigger('stream.details');
}}
- sxFormLabel={{ ml: -1 }}
+ sxFormLabel={{ ml: -1, mt: 2 }}
text="Automatically include all existing and recently configured clusters."
/>
)}
/>
+
+ Disable this option if you wish to manually define which clusters
+ are included in the stream. The stream won’t be automatically
+ updated when new clusters are configured.
+
-
- 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`,