From e744bb27b90efbb556fd5cdb885a024b61c04e2a Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 13:54:07 -0700 Subject: [PATCH 01/12] feat(clusters): allow operator install method on non-OpenShift platforms ROX-33119: Remove platform gating that restricted the Operator installation method to OpenShift only. Update instruction text in both Init Bundles and CRS flows to be platform-neutral, with qualified sub-bullets for OpenShift vs other platforms and kubectl as an alternative to oc. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 41 ++++++++++++----- .../Clusters/InitBundles/InitBundleForm.tsx | 15 +++---- .../SecureClusterUsingOperator.tsx | 44 ++++++++++++++----- 3 files changed, 68 insertions(+), 32 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index a3be07cb0747e..140493a9fe488 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -26,13 +26,23 @@ function SecureClusterUsingOperator({

- In the Red Hat OpenShift Container Platform web console on the cluster that - you are securing, you have installed the RHACS Operator. + In the cluster that you are securing, you have installed the RHACS Operator.

- For Operator installation, create a new Red Hat OpenShift Container Platform - project. rhacs-operator is a good name choice. + For Operator installation, create a new project or namespace.{' '} + rhacs-operator is a good name choice.

+

To install the RHACS Operator:

+ + + On Red Hat OpenShift Container Platform, use{' '} + Operators > OperatorHub in the web console. + + + On other platforms, apply an image pull secret and use the{' '} + rhacs-operator Helm chart. + +

Apply the cluster registration secret on the secured cluster.

@@ -43,9 +53,9 @@ function SecureClusterUsingOperator({

- In the OpenShift Container Platform web console on the cluster that - you are securing, in the top menu, click + to open - the Import YAML page. + On an OpenShift cluster: In the OpenShift Container Platform web + console on the cluster that you are securing, in the top menu, click{' '} + + to open the Import YAML page.

You can drag the cluster registration secret file or copy and paste @@ -55,11 +65,22 @@ function SecureClusterUsingOperator({

- On the cluster that you are securing, using the Red Hat OpenShift - CLI, run a command similar to the following: + On an OpenShift cluster: using the oc CLI, run a + command similar to the following: +

+ + oc create -f <cluster-registration-secret-file>.yaml -n + stackrox + +
+ +

+ On other clusters: using the kubectl CLI, run a + command similar to the following:

- oc create -f cluster-registration-secret.yaml -n stackrox + kubectl create -f <cluster-registration-secret-file>.yaml -n + stackrox
diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx index 1dbc8d771c71b..71386619553bf 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx @@ -105,7 +105,7 @@ function InitBundleForm(): ReactElement { function onChangePlatform(value) { return setValues({ - installation: value === 'OpenShift' ? 'Operator' : 'Helm', + installation: 'Operator', name: values.name, // redundant but function requires all values platform: value, }); @@ -171,21 +171,16 @@ function InitBundleForm(): ReactElement { id="installation" value={values.installation} handleSelect={onSelectInstallation} - isDisabled={values.platform !== 'OpenShift'} toggleAriaLabel="Installation method menu toggle" aria-label="Select an installation method" > - {Object.entries(installationOptions) - .filter( - ([installationKey]) => - values.platform === 'OpenShift' || - installationKey !== 'Operator' - ) - .map(([installationKey, installationLabel]) => ( + {Object.entries(installationOptions).map( + ([installationKey, installationLabel]) => ( {installationLabel} - ))} + ) + )} diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index 5af37f464c6dc..1cc7e75db6296 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -32,6 +32,7 @@ function SecureClusterUsingOperator({ rel="noopener noreferrer" > Generating and applying an init bundle for RHACS on Red Hat OpenShift + (OpenShift) @@ -43,9 +44,10 @@ function SecureClusterUsingOperator({ target="_blank" rel="noopener noreferrer" > - Installing RHACS on secured clusters by using the Operator + Installing RHACS on secured clusters by using the Operator (OpenShift) + {/* TODO ROX-33550: Add non-OpenShift operator documentation links when available */} )}

@@ -62,13 +64,23 @@ function SecureClusterUsingOperator({

- In the Red Hat OpenShift Container Platform web console on the cluster that - you are securing, you have installed the RHACS Operator. + In the cluster that you are securing, you have installed the RHACS Operator.

- For Operator installation, create a new Red Hat OpenShift Container Platform - project. rhacs-operator is a good name choice. + For Operator installation, create a new project or namespace.{' '} + rhacs-operator is a good name choice.

+

To install the RHACS Operator:

+ + + On Red Hat OpenShift Container Platform, use{' '} + Operators > OperatorHub in the web console. + + + On other platforms, apply an image pull secret and use the{' '} + rhacs-operator Helm chart. + +
Repeat for each secured cluster @@ -97,9 +109,9 @@ function SecureClusterUsingOperator({

- In the OpenShift Container Platform web console on the cluster that - you are securing, in the top menu, click + to open - the Import YAML page. + On an OpenShift cluster: In the OpenShift Container Platform web + console on the cluster that you are securing, in the top menu, click{' '} + + to open the Import YAML page.

You can drag the init bundle file or copy and paste its contents @@ -108,12 +120,20 @@ function SecureClusterUsingOperator({

- On the cluster that you are securing, using the Red Hat OpenShift - CLI, run a command similar to the following: + On an OpenShift cluster: using the oc CLI, run a + command similar to the following: +

+ + oc create -f <init-bundle-file>.yaml -n stackrox + +
+ +

+ On other clusters: using the kubectl CLI, run a + command similar to the following:

- oc create -f name-Operator-secrets-cluster-init-bundle.yaml -n - stackrox + kubectl create -f <init-bundle-file>.yaml -n stackrox
From 01b1c355589ed31c4f728065040ee55185281a83 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 15:35:00 -0700 Subject: [PATCH 02/12] fix(clusters): simplify onChangePlatform and fix ClipboardCopy whitespace Simplify onChangePlatform to only set the platform field instead of resetting installation to Operator on every platform switch, which silently overrode the user's selection. Also fix ClipboardCopy in CRS operator instructions where line wrapping caused whitespace in the copied command text. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 8 ++++---- .../Containers/Clusters/InitBundles/InitBundleForm.tsx | 7 +------ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 140493a9fe488..1d8b98a863631 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -69,8 +69,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- oc create -f <cluster-registration-secret-file>.yaml -n - stackrox + {'oc create -f .yaml -n stackrox'} @@ -79,8 +78,9 @@ function SecureClusterUsingOperator({ command similar to the following:

- kubectl create -f <cluster-registration-secret-file>.yaml -n - stackrox + { + 'kubectl create -f .yaml -n stackrox' + }
diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx index 71386619553bf..05a8f63ea0722 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx @@ -68,7 +68,6 @@ function InitBundleForm(): ReactElement { isSubmitting, isValid, setFieldValue, - setValues, submitForm, touched, values, @@ -104,11 +103,7 @@ function InitBundleForm(): ReactElement { } function onChangePlatform(value) { - return setValues({ - installation: 'Operator', - name: values.name, // redundant but function requires all values - platform: value, - }); + return setFieldValue('platform', value); } function onSelectInstallation(_id: string, value: string) { From 550afd8db718235c19f0d726aae4eb367d1b5394 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 15:37:53 -0700 Subject: [PATCH 03/12] refactor(clusters): narrow InstallationKey and PlatformKey types Remove Record annotations that widened as const types, so InstallationKey resolves to 'Operator' | 'Helm' and PlatformKey to 'OpenShift' | 'EKS' | 'AKS' | 'GKE'. Add oneOf validators to the yup schema for compile-time and runtime safety. Signed-off-by: Saif Chaudhry --- .../src/Containers/Clusters/InitBundles/InitBundleForm.tsx | 4 ++-- .../Containers/Clusters/InitBundles/InitBundleForm.utils.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx index 05a8f63ea0722..4d44cde91ffcb 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx @@ -54,8 +54,8 @@ const validationSchema: yup.ObjectSchema = yup.object().sh 'Name can have only the following characters: letters, digits, period, underscore, hyphen (but no spaces)' ) .required('Bundle name is required'), - installation: yup.string().trim().required(), // Select - platform: yup.string().trim().required(), // Radio + installation: yup.string().trim().oneOf(['Operator', 'Helm']).required(), + platform: yup.string().trim().oneOf(['OpenShift', 'EKS', 'AKS', 'GKE']).required(), }); function InitBundleForm(): ReactElement { diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.utils.ts b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.utils.ts index d26ded813edd8..a9f9a316d3cdb 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.utils.ts +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.utils.ts @@ -2,14 +2,14 @@ import FileSaver from 'file-saver'; import type { GenerateClusterInitBundleResponse } from 'services/ClustersService'; -export const installationOptions: Record = { +export const installationOptions = { Operator: 'Operator (recommended)', Helm: 'Helm chart', } as const; export type InstallationKey = keyof typeof installationOptions; -export const platformOptions: Record = { +export const platformOptions = { OpenShift: 'OpenShift', EKS: 'EKS', AKS: 'AKS', From aec708c28380988a5d58fcda1d0bd6f26203710d Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 15:45:31 -0700 Subject: [PATCH 04/12] fix(clusters): correct grammar in operator instruction text Add missing article in heading ("using the Operator installation method"), replace awkward colon with comma in OpenShift web console bullet, remove redundant clause, and fix plural "secrets" to singular "secret" in CRS apply step. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 9 ++++----- .../Clusters/InitBundles/SecureClusterUsingOperator.tsx | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 1d8b98a863631..249cc9a65078e 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -47,15 +47,14 @@ function SecureClusterUsingOperator({

Apply the cluster registration secret on the secured cluster.

- Perform one of the following tasks to apply the cluster registration - secrets: + Perform one of the following tasks to apply the cluster registration secret:

- On an OpenShift cluster: In the OpenShift Container Platform web - console on the cluster that you are securing, in the top menu, click{' '} - + to open the Import YAML page. + On an OpenShift cluster, in the OpenShift Container Platform web + console, in the top menu, click + to open the{' '} + Import YAML page.

You can drag the cluster registration secret file or copy and paste diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index 1cc7e75db6296..66cc774f7fa06 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -18,7 +18,7 @@ function SecureClusterUsingOperator({ return ( - Secure a cluster using Operator installation method + Secure a cluster using the Operator installation method {version && ( <> @@ -109,9 +109,9 @@ function SecureClusterUsingOperator({

- On an OpenShift cluster: In the OpenShift Container Platform web - console on the cluster that you are securing, in the top menu, click{' '} - + to open the Import YAML page. + On an OpenShift cluster, in the OpenShift Container Platform web + console, in the top menu, click + to open the{' '} + Import YAML page.

You can drag the init bundle file or copy and paste its contents From d95da09401382ba340d4cf8cf9be897e8ad4accf Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 15:47:00 -0700 Subject: [PATCH 05/12] fix(clusters): simplify operator prerequisite wording Rewrite "In the cluster that you are securing, you have installed the RHACS Operator" to lead with the action for clarity. Signed-off-by: Saif Chaudhry --- .../ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx | 2 +- .../Clusters/InitBundles/SecureClusterUsingOperator.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 249cc9a65078e..72b1febfd3441 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -26,7 +26,7 @@ function SecureClusterUsingOperator({

- In the cluster that you are securing, you have installed the RHACS Operator. + You have installed the RHACS Operator on the cluster you are securing.

For Operator installation, create a new project or namespace.{' '} diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index 66cc774f7fa06..a45dc7658e582 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -64,7 +64,7 @@ function SecureClusterUsingOperator({

- In the cluster that you are securing, you have installed the RHACS Operator. + You have installed the RHACS Operator on the cluster you are securing.

For Operator installation, create a new project or namespace.{' '} From edf5a648e46839a3909dd0adee54180c6ab25238 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 16 Mar 2026 15:48:19 -0700 Subject: [PATCH 06/12] fix(clusters): tighten wordy instruction text Remove "by" from "by using", replace redundant "YAML file for the init bundle/cluster registration secret" with "its YAML file", shorten "Perform one of the following tasks to apply..." to "Apply it using one of the following methods:", and simplify the final install step. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 17 +++++------------ .../SecureClusterUsingOperator.tsx | 19 +++++++------------ 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 72b1febfd3441..5e9b9ca27f0b9 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -13,7 +13,7 @@ function SecureClusterUsingOperator({ return (

- You can install secured cluster services on your clusters by using the{' '} + You can install secured cluster services on your clusters using the{' '} SecuredCluster custom resource.

Prerequisites @@ -21,13 +21,11 @@ function SecureClusterUsingOperator({

In the RHACS web portal, you have created a cluster registration secret and - downloaded the YAML file for the cluster registration secret. + downloaded its YAML file.

-

- You have installed the RHACS Operator on the cluster you are securing. -

+

You have installed the RHACS Operator on the cluster you are securing.

For Operator installation, create a new project or namespace.{' '} rhacs-operator is a good name choice. @@ -46,9 +44,7 @@ function SecureClusterUsingOperator({

Apply the cluster registration secret on the secured cluster.

-

- Perform one of the following tasks to apply the cluster registration secret: -

+

Apply it using one of the following methods:

@@ -85,10 +81,7 @@ function SecureClusterUsingOperator({ -

- On the cluster that you are securing, install secured cluster services using - the RHACS Operator. -

+

Install secured cluster services on the cluster using the RHACS Operator.

diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index a45dc7658e582..dced2f978f811 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -51,21 +51,19 @@ function SecureClusterUsingOperator({ )}

- You can install secured cluster services on your clusters by using the{' '} + You can install secured cluster services on your clusters using the{' '} SecuredCluster custom resource.

Prerequisites

- In the RHACS web portal, you have created an init bundle and downloaded the - YAML file for the init bundle. + In the RHACS web portal, you have created an init bundle and downloaded its + YAML file.

-

- You have installed the RHACS Operator on the cluster you are securing. -

+

You have installed the RHACS Operator on the cluster you are securing.

For Operator installation, create a new project or namespace.{' '} rhacs-operator is a good name choice. @@ -89,8 +87,8 @@ function SecureClusterUsingOperator({

Apply the init bundle on the secured cluster.

Applying the init bundle creates the secrets and resources that the secured - cluster needs to communicate with RHACS. Perform one of the following tasks - to apply the init bundle: + cluster needs to communicate with RHACS. Apply it using one of the following + methods:

{version && ( @@ -139,10 +137,7 @@ function SecureClusterUsingOperator({
-

- On the cluster that you are securing, install secured cluster services using - the RHACS Operator. -

+

Install secured cluster services on the cluster using the RHACS Operator.

From 9b6e83ebe0f09b6f70432123dfb283ad781bb312 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 13:51:28 -0700 Subject: [PATCH 07/12] fix(clusters): use HTML entities for ClipboardCopy angle brackets Standardize ClipboardCopy content to use HTML entities (</>) instead of JSX string expressions for angle brackets, matching the pattern used in the InitBundles variant and other ClipboardCopy usages across the codebase. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 5e9b9ca27f0b9..d2dcf1e5a51bb 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -64,7 +64,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- {'oc create -f .yaml -n stackrox'} + oc create -f <cluster-registration-secret-file>.yaml -n stackrox
@@ -73,9 +73,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- { - 'kubectl create -f .yaml -n stackrox' - } + kubectl create -f <cluster-registration-secret-file>.yaml -n stackrox
From 22477e6e9aaccba6d0fae5bc590a8f1686609ffb Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 13:51:43 -0700 Subject: [PATCH 08/12] refactor(clusters): derive oneOf values from option objects Derive Yup oneOf validation values from installationOptions and platformOptions objects instead of hardcoding them. This prevents silent divergence if a new option is added to the source-of-truth objects but not to the schema. Signed-off-by: Saif Chaudhry --- .../Clusters/InitBundles/InitBundleForm.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx index 4d44cde91ffcb..ee1177d83ccd6 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx @@ -54,8 +54,16 @@ const validationSchema: yup.ObjectSchema = yup.object().sh 'Name can have only the following characters: letters, digits, period, underscore, hyphen (but no spaces)' ) .required('Bundle name is required'), - installation: yup.string().trim().oneOf(['Operator', 'Helm']).required(), - platform: yup.string().trim().oneOf(['OpenShift', 'EKS', 'AKS', 'GKE']).required(), + installation: yup + .string() + .trim() + .oneOf(Object.keys(installationOptions) as InstallationKey[]) + .required(), + platform: yup + .string() + .trim() + .oneOf(Object.keys(platformOptions) as PlatformKey[]) + .required(), }); function InitBundleForm(): ReactElement { From a2e72fa430b96a5a355e744b4385a96eb6ec3056 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 13:51:54 -0700 Subject: [PATCH 09/12] fix(clusters): add type annotation to onChangePlatform parameter Add explicit string type to the value parameter to avoid implicit any, consistent with the type narrowing done elsewhere in this PR. Signed-off-by: Saif Chaudhry --- .../src/Containers/Clusters/InitBundles/InitBundleForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx index ee1177d83ccd6..0e043b832d3b7 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/InitBundleForm.tsx @@ -110,7 +110,7 @@ function InitBundleForm(): ReactElement { return setFieldValue(event.target.id, value); } - function onChangePlatform(value) { + function onChangePlatform(value: string) { return setFieldValue('platform', value); } From 3f45cd2b5de49458eaf52c9ae737a36c05098cc3 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 13:52:05 -0700 Subject: [PATCH 10/12] fix(clusters): remove trailing whitespace in instruction text Remove trailing space before closing

tags in both SecureClusterUsingOperator components. Signed-off-by: Saif Chaudhry --- .../ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx | 2 +- .../Clusters/InitBundles/SecureClusterUsingOperator.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index d2dcf1e5a51bb..410cd2e36f2a0 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -43,7 +43,7 @@ function SecureClusterUsingOperator({ -

Apply the cluster registration secret on the secured cluster.

+

Apply the cluster registration secret on the secured cluster.

Apply it using one of the following methods:

diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index dced2f978f811..b7381d866f2c4 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -84,7 +84,7 @@ function SecureClusterUsingOperator({ Repeat for each secured cluster -

Apply the init bundle on the secured cluster.

+

Apply the init bundle on the secured cluster.

Applying the init bundle creates the secrets and resources that the secured cluster needs to communicate with RHACS. Apply it using one of the following From c91af7a6940883b53bc0e35e4db00925b2cbbdea Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 14:15:15 -0700 Subject: [PATCH 11/12] fix(clusters): use JSX expressions for ClipboardCopy angle brackets HTML entities cause prettier to treat the content as plain text and wrap long lines, which introduces newlines in the copied command. JSX string expressions are treated as atomic by prettier and preserve the command as a single line. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 6 ++++-- .../Clusters/InitBundles/SecureClusterUsingOperator.tsx | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 410cd2e36f2a0..1e5f63dc34658 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -64,7 +64,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- oc create -f <cluster-registration-secret-file>.yaml -n stackrox + {'oc create -f .yaml -n stackrox'}
@@ -73,7 +73,9 @@ function SecureClusterUsingOperator({ command similar to the following:

- kubectl create -f <cluster-registration-secret-file>.yaml -n stackrox + { + 'kubectl create -f .yaml -n stackrox' + }
diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index b7381d866f2c4..9a0e9c8d1a857 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -122,7 +122,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- oc create -f <init-bundle-file>.yaml -n stackrox + {'oc create -f .yaml -n stackrox'}
@@ -131,7 +131,7 @@ function SecureClusterUsingOperator({ command similar to the following:

- kubectl create -f <init-bundle-file>.yaml -n stackrox + {'kubectl create -f .yaml -n stackrox'}
From 37648764e8c0fd86ae4a22f2de729042773476d4 Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Tue, 17 Mar 2026 14:18:33 -0700 Subject: [PATCH 12/12] fix(clusters): extract ClipboardCopy commands into variables Move CLI commands into named constants so ClipboardCopy children use simple variable references, avoiding both HTML entity escaping and JSX string expression wrapping for angle brackets. Signed-off-by: Saif Chaudhry --- .../SecureClusterUsingOperator.tsx | 13 +++++-------- .../InitBundles/SecureClusterUsingOperator.tsx | 11 +++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx index 1e5f63dc34658..92751a694f589 100644 --- a/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/ClusterRegistrationSecrets/SecureClusterUsingOperator.tsx @@ -5,6 +5,9 @@ export type SecureClusterUsingOperatorProps = { headingLevel: 'h2' | 'h3'; }; +const ocApplyCommand = 'oc create -f .yaml -n stackrox'; +const kubectlApplyCommand = 'kubectl create -f .yaml -n stackrox'; + function SecureClusterUsingOperator({ headingLevel, }: SecureClusterUsingOperatorProps): ReactElement { @@ -63,20 +66,14 @@ function SecureClusterUsingOperator({ On an OpenShift cluster: using the oc CLI, run a command similar to the following:

- - {'oc create -f .yaml -n stackrox'} - + {ocApplyCommand}

On other clusters: using the kubectl CLI, run a command similar to the following:

- - { - 'kubectl create -f .yaml -n stackrox' - } - + {kubectlApplyCommand}
diff --git a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx index 9a0e9c8d1a857..57188c3e1c450 100644 --- a/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx +++ b/ui/apps/platform/src/Containers/Clusters/InitBundles/SecureClusterUsingOperator.tsx @@ -9,6 +9,9 @@ export type SecureClusterUsingOperatorProps = { headingLevel: 'h2' | 'h3'; }; +const ocApplyCommand = 'oc create -f .yaml -n stackrox'; +const kubectlApplyCommand = 'kubectl create -f .yaml -n stackrox'; + function SecureClusterUsingOperator({ headingLevel, }: SecureClusterUsingOperatorProps): ReactElement { @@ -121,18 +124,14 @@ function SecureClusterUsingOperator({ On an OpenShift cluster: using the oc CLI, run a command similar to the following:

- - {'oc create -f .yaml -n stackrox'} - + {ocApplyCommand}

On other clusters: using the kubectl CLI, run a command similar to the following:

- - {'kubectl create -f .yaml -n stackrox'} - + {kubectlApplyCommand}