Skip to content

MGMT-22465: Merge the contents of releases/v2.17-cim into master#3319

Merged
openshift-merge-bot[bot] merged 20 commits intoopenshift-assisted:masterfrom
jgyselov:sync_master
Dec 17, 2025
Merged

MGMT-22465: Merge the contents of releases/v2.17-cim into master#3319
openshift-merge-bot[bot] merged 20 commits intoopenshift-assisted:masterfrom
jgyselov:sync_master

Conversation

@jgyselov
Copy link
Contributor

@jgyselov jgyselov commented Dec 15, 2025

https://issues.redhat.com/browse/MGMT-22465

Summary by CodeRabbit

Release Notes

  • New Features

    • Custom manifests configuration support in cluster deployment wizard.
    • Config map management for manifest references with validation.
    • External platform integration options in cluster configuration.
    • GPU and label-based filtering capabilities for host discovery.
    • Arbiter node configuration support for two-node clusters.
    • Multiple SSH keys support in security configuration.
  • Bug Fixes

    • Corrected error messages for improved clarity.
    • Enhanced host selection and binding logic.
  • Localization

    • Expanded translations for new platform integrations, requirements messaging, and config map workflows across all supported languages.

✏️ Tip: You can customize this high-level summary in your review settings.

jgyselov and others added 20 commits October 8, 2025 12:49
…penshift-assisted#3151)

* Add External platforms field

* Restructure files related to CIM cluster deployment wizard

* Create SelectFieldWithSearch component

* Update '@openshift-console/dynamic-plugin-sdk'

* CIM custom manifest step

* CIM custom manifests review

* Make 'Baremetal' the default external platform
…ft-assisted#3224)

* Clean up ClusterDetailsFormFields

* Allow TNA arbiter in CIM
Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>
… link (openshift-assisted#3271)

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>
…he host is installing (openshift-assisted#3219)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: jgyselov <jgyselov@redhat.com>
Co-authored-by: jgyselov <jgyselov@redhat.com>
…fra env host table (openshift-assisted#3307)

* Add GPUs column to infra agent table

* Add labels column and filtering to infra agent table

---------

Co-authored-by: jgyselov <jgyselov@redhat.com>
Co-authored-by: jgyselov <jgyselov@redhat.com>
…ring binding (openshift-assisted#3309)

Co-authored-by: jgyselov <jgyselov@redhat.com>
…sisted#3314)

* Handle empty labels in infra env host table

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* format fix

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

---------

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>
…assisted#3220)

* Fix bug - the option to remove host from the cluster disabled while the host is installing

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* icon from agent status Available is confusing

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

---------

Signed-off-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: Julie Gyselova <jgyselov@redhat.com>
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Dec 15, 2025
@openshift-ci-robot
Copy link

@jgyselov: This pull request explicitly references no jira issue.

Details

In response to this:

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci bot requested review from ammont82 and batzionb December 15, 2025 15:45
@openshift-ci openshift-ci bot added approved Indicates a PR has been approved by an approver from all required OWNERS files. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. labels Dec 15, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 15, 2025

Walkthrough

Comprehensive update across localization files for multiple languages, UI components for custom manifests and external platform configuration, new hooks for Kubernetes ConfigMap watching, label-based filtering for hosts, GPU and labels column display, and systematic refactoring of component export patterns and import paths.

Changes

Cohort / File(s) Summary
Localization Files (en, es, fr, ja, ko, zh)
libs/locales/lib/en/translation.json, libs/locales/lib/es/translation.json, libs/locales/lib/fr/translation.json, libs/locales/lib/ja/translation.json, libs/locales/lib/ko/translation.json, libs/locales/lib/zh/translation.json
Added 50+ new translation keys across all locales for config maps, arbiter, external platforms, GPU, vendor information, cluster requirements, and error messages; corrected spelling of "occurred" in error strings; added pluralization variants.
Custom Manifests Components
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx, ConfigMapForm.tsx, ConfigMapDetail.tsx, index.tsx
New step component for configuring custom manifest ConfigMaps; form with validation including cross-map manifest-name uniqueness; detail component with expand/collapse and remove functionality.
Cluster Review & Config Map Display
libs/ui-lib/lib/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.tsx, ReviewConfigMapsTable.tsx, index.tsx
Enhanced review step to display external partner platform and custom manifests; new table component to render ConfigMap references and their data keys.
Cluster Details & External Platforms
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ACMClusterDeploymentDetailsStep.tsx, ClusterDeploymentDetailsForm.tsx, ClusterDeploymentDetailsStep.tsx, ClusterDetailsFormFields.tsx, index.tsx
Converted components to named exports; added ExternalPlatformsDropdown integration; updated import paths; improved type handling for OpenShift version selection.
Host Discovery & Selection
libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostDiscoveryTable.tsx, ClusterDeploymentHostsDiscovery.tsx, ClusterDeploymentHostsDiscoveryStep.tsx, index.tsx
Added GPU and labels columns to host table; updated import paths; converted to named exports; included arbiter agents in host count logic.
Host Selection & Advanced
libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.tsx, ClusterDeploymentHostsSelection.tsx, ClusterDeploymentHostsSelectionAdvanced.tsx, ClusterDeploymentHostsSelectionBasic.tsx, index.tsx
Added TNA cluster detection; new host requirement text localization; updated export patterns to named exports; added hostsBinding prop.
Networking Configuration
libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx, ClusterDeploymentNetworkingStep.tsx, ClusterDeploymentHostsNetworkTable.tsx, index.tsx
Removed exported defaultNetworkSettings; updated to use CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4; enabled multiple SSH keys support via SecurityFields; converted to named exports.
Wizard Integration
libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx, constants.ts, types.ts, wizardTransition.ts, index.ts
Added 'custom-manifests' step to wizard; updated step imports and routing; added manifestsConfigMapRefs to agent cluster install spec.
Cluster Deployment Helpers
libs/ui-lib/lib/cim/components/helpers/agentClusterInstall.ts, agents.ts, toAssisted.ts, versions.ts
New getIsTNACluster helper; added arbiter agents support; extended Host with nodeLabels; added platform extraction and version fallback logic; replaced version comparison utilities.
Form & UI Components
libs/ui-lib/lib/common/components/ui/OpenShiftSelectWithSearch.tsx, OpenShiftVersionDropdown.tsx, OpenShiftVersionModal.tsx, formik/SelectFieldWithSearch.tsx, formik/index.tsx
Refactored OpenShift version selection to use single customItem instead of customItems array; new SelectFieldWithSearch component for multi/single-select with typeahead; updated helper text handling.
Cluster Configuration UI
libs/ui-lib/lib/common/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx, ExternalPlatformsDropdown.tsx, SecurityFields.tsx, index.ts
New ExternalPlatformsDropdown component with getPlatforms helper; added allowMultipleKeys option to SecurityFields; control plane selection now syncs userManagedNetworking and platform fields.
Hosts Table & Utilities
libs/ui-lib/lib/common/components/hosts/tableUtils.tsx, utils.ts, status.tsx
Added gpusColumn and labelsColumn; added getHostLabels utility; replaced PlusIcon with ConnectedIcon for available status.
Kubernetes Hooks & Types
libs/ui-lib/lib/cim/hooks/useConfigMaps.tsx, useK8sWatchResource.tsx, types.tsx, index.tsx, libs/ui-lib/lib/cim/types/models.tsx, k8s/agent-cluster-install.ts
New useConfigMaps hook and generic useK8sWatchResource wrapper; new K8sWatchHookProps and K8sWatchHookListProps types; AgentClusterInstallModel; manifestsConfigMapRefs spec extension.
InfraEnv Agent Filtering
libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx, InfraTableToolbar.tsx
Added label-based filtering with UI controls; integrated labelFilter, setLabelFilter, hostLabels throughout filtering pipeline.
Agent Table Filtering
libs/ui-lib/lib/cim/components/Agent/tableUtils.tsx
New filterByLabels and getAllLabels utilities; extended filterHosts and useAgentsFilter to support labelFilter parameter; added hostLabels to hook return.
Validation & Utilities
libs/ui-lib/lib/common/components/clusterWizard/clusterDetailsValidation.ts, types.ts, formik/validationSchemas.ts
Updated to use i18n 'ai:Required field' messages; changed customOpenshiftSelect from OpenshiftVersionOptionType to string; updated SSH key list validation to per-line regex checks.
OCM Components
libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx, OcmOpenShiftVersionSelect.tsx, OpenshiftVersionHelperText.tsx, networkConfiguration/networkConfigurationValidation.ts
Updated OpenShift version selection to use customItem (singular); changed selectedVersionValue type from string|undefined to string|null; replaced sshPublicKeyListValidationSchema with sshPublicKeyValidationSchema.
Documentation & Config
libs/ui-lib/lib/common/config/docs_links.ts, libs/ui-lib/lib/common/utils.ts, libs/ui-lib/lib/ocm/components/Routes.tsx, libs/ui-lib/package.json
Refactored getOpenShiftNetworkingDocsLink version handling; exported getComparableVersionInt; added UILibRoutesProps type; bumped @openshift-console/dynamic-plugin-sdk to 1.0.0.
Modal & Misc
libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx, EditSSHKeyModal.tsx, MassApproveAgentModal.tsx, libs/ui-lib/lib/cim/utils.ts
Fixed error message spelling ("occurred"); added appendPatch utility for generating Kubernetes patches; improved optional chaining in hostname extraction.
Test Updates
libs/ui-lib-tests/cypress/integration/use-cases/create-cluster/validations-new-cluster-page.cy.ts
Updated expected validation error message from "Required." to "Required field".
Hypershift Components
libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.tsx, types.ts, modals/ManageHostsModal.tsx
Updated OpenShift version selection to use customItem (singular); changed customOpenshiftSelect type from OpenshiftVersionOptionType to string|null; updated replica count handling with explicit undefined check.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ClusterDeploymentWizard
    participant ConfigMapForm
    participant useConfigMaps
    participant K8sAPI
    participant ReviewStep

    User->>ClusterDeploymentWizard: Navigate to custom-manifests step
    ClusterDeploymentWizard->>ConfigMapForm: Render form with namespace
    ConfigMapForm->>useConfigMaps: Hook initialization with namespace/isList
    useConfigMaps->>K8sAPI: Watch ConfigMap resources
    K8sAPI-->>useConfigMaps: ConfigMap list [loading, data, error]
    useConfigMaps-->>ConfigMapForm: [configMaps, isLoaded, error]
    ConfigMapForm->>ConfigMapForm: Compute Fuse search index
    User->>ConfigMapForm: Search and select ConfigMaps
    ConfigMapForm->>ConfigMapForm: Validate manifest name uniqueness
    ConfigMapForm->>ConfigMapForm: Sync Formik configMaps state
    User->>ConfigMapForm: Click Next
    ConfigMapForm->>ConfigMapForm: Submit form, show loading
    ConfigMapForm->>K8sAPI: Patch agentClusterInstall.spec.manifestsConfigMapRefs
    K8sAPI-->>ConfigMapForm: Patch success/error
    ConfigMapForm->>ClusterDeploymentWizard: Navigate to review step
    ClusterDeploymentWizard->>ReviewStep: Render with manifestsConfigMapRefs
    ReviewStep->>ReviewConfigMapsTable: Render table
    ReviewConfigMapsTable->>useConfigMaps: Fetch referenced ConfigMaps
    K8sAPI-->>ReviewConfigMapsTable: ConfigMap data
    ReviewConfigMapsTable-->>ReviewStep: Expand rows with key-value pairs
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • Scope: Across 60+ files with heterogeneous changes: new features (custom manifests, external platforms, label filtering), systematic export pattern refactoring, type/API changes, and extensive localization additions.
  • Key areas requiring careful attention:
    • Custom manifests workflow validation logic and ConfigMap reference handling across multiple components
    • Hook integration chain (useConfigMaps → useK8sWatchResource) and proper resource typing
    • Export pattern migration from default to named exports and impact on import statements throughout the codebase
    • OpenShift version selection refactoring (customItems → customItem, type shape changes from OpenshiftVersionOptionType to string)
    • Form value type changes (customOpenshiftSelect: OpenshiftVersionOptionType | null → string | null) and all downstream consumers
    • Label filtering state propagation through InfraEnvAgentTable → InfraTableToolbar and corresponding hook updates
    • Import path reorganization correctness, particularly for common, helpers, and types imports
    • Validation schema updates and i18n message key consistency across all translation files
    • Host requirement text localization and TNA cluster detection logic

Possibly related PRs

  • PR #3151: Directly related—adds custom-manifests/config-map workflow, external platform dropdown, locale keys, useConfigMaps hook, ReviewConfigMapsTable, and manifestsConfigMapRefs integration (overlaps significantly with main PR).
  • PR #3283: Related—adds GPU and labels columns to host tables, label filtering state management, and getHostLabels utility (overlapping code in tableUtils.tsx and InfraEnv components).
  • PR #2952: Related—adds arbiter/TNA support and related UI strings ("Arbiter", "Two nodes control plane...", getIsTNACluster) in the same feature area.

Suggested labels

lgtm, size/XXL, ok-to-test

Suggested reviewers

  • batzionb
  • rawagner
  • ammont82
  • celdrake

Poem

🐰 Manifests now bloom, in config maps they rest,
With labels and GPUs, the hosts are blessed,
Translations dance across the global stage,
Named exports reign o'er each component's page,
Custom platforms call—the wizard's grand quest!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title accurately summarizes the main intent of the PR: merging the contents of releases/v2.17-cim branch into master. It is clear, concise, and directly related to the actual changes (translation files, component restructuring, and feature additions).
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
libs/ui-lib/lib/common/components/ui/OpenShiftVersionDropdown.tsx (1)

63-74: Missing dependency in useEffect could cause stale closure.

The useEffect references customItem and versions in its body, but neither is included in the dependency array. If customItem or versions changes while customOpenshiftSelect remains the same, the effect won't re-run with the updated values.

Consider adding the missing dependencies:

   React.useEffect(() => {
     let defaultVersion = versions.find((item) => item.default);
     if (customOpenshiftSelect && customItem) {
       defaultVersion = customItem;
     } else if (customOpenshiftSelect) {
       defaultVersion = versions.find((item) => item.value === customOpenshiftSelect);
     }

     setCurrent(defaultVersion?.label || '');
     setValue(defaultVersion?.value || '');
     // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [customOpenshiftSelect]);
+  }, [customOpenshiftSelect, customItem, versions]);
🟡 Minor comments (9)
libs/ui-lib/lib/common/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx-90-96 (1)

90-96: Verify type-safe comparison for control plane count.

The condition uses strict equality (value === 1), but the parameter value is typed as string | number. Since Line 97 calls setValue(toNumber(value)), it appears value might be received as a string from the dropdown selection.

Consider using a type-safe comparison to ensure the condition works correctly:

-    if (value === 1) {
+    if (toNumber(value) === 1) {
      setFieldValue('userManagedNetworking', true);
      setFieldValue('platform', 'none');
    } else {
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx-95-97 (1)

95-97: Handle potential undefined namespace in config map link.

The code uses a type assertion as string on agentClusterInstall.metadata?.namespace, which could be undefined. This would result in an invalid URL path containing "undefined".

             <AlertActionLink
               key="define-config-map"
               component={'a'}
-              href={`/k8s/ns/${
-                agentClusterInstall.metadata?.namespace as string
-              }/core~v1~ConfigMap`}
+              href={`/k8s/ns/${
+                agentClusterInstall.metadata?.namespace || ''
+              }/core~v1~ConfigMap`}
               target="_blank"
               rel="noopener noreferrer"
             >

Alternatively, conditionally render the link only when namespace is defined:

-          actionLinks={[
+          actionLinks={
+            agentClusterInstall.metadata?.namespace ? [
               <AlertActionLink
                 key="define-config-map"
                 component={'a'}
                 href={`/k8s/ns/${agentClusterInstall.metadata.namespace}/core~v1~ConfigMap`}
                 target="_blank"
                 rel="noopener noreferrer"
               >
                 {t('ai:Define a config map')} <ExternalLinkAltIcon />
               </AlertActionLink>,
-          ]}
+            ] : []
+          }
libs/ui-lib/lib/cim/components/InfraEnv/InfraTableToolbar.tsx-205-209 (1)

205-209: Inconsistent optional chaining on labelFilter.

Line 207 uses labelFilter.filter() without optional chaining, while line 235 uses labelFilter?.includes(). The status filter at line 154 uses statusFilter?.filter() consistently. This inconsistency could cause a runtime error if labelFilter is undefined.

         <ToolbarFilter
           labels={labelFilter}
-          deleteLabel={(_, label) => setLabelFilter(labelFilter.filter((f) => f !== label))}
+          deleteLabel={(_, label) => setLabelFilter(labelFilter?.filter((f) => f !== label) ?? [])}
           deleteLabelGroup={() => setLabelFilter([])}
           categoryName={'Labels'}
         >
libs/ui-lib/lib/common/components/ui/formik/SelectFieldWithSearch.tsx-247-263 (1)

247-263: Missing key on React Fragment causes warning.

When using <> (Fragment shorthand) inside .map() with multiple sibling elements, React requires a key. Use the explicit <React.Fragment key={...}> syntax.

           selectOptions.map((option, index) => (
-              <>
+              <React.Fragment key={`option-group-${index}`}>
                 {option.showDivider && <Divider component="li" key={`divider-${index}`} />}
                 <SelectOption
                   hasCheckbox={isMultiSelect && !option.isAriaDisabled}
                   isSelected={
                     isMultiSelect && Array.isArray(value)
                       ? value.some((v) => isEqual(v, option.value))
                       : value === option.value
                   }
-                  key={`option-${index}`}
                   isFocused={focusedItemIndex === index}
                   ref={null}
                   {...option}
                 />
-              </>
+              </React.Fragment>
           ))
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapDetail.tsx-160-169 (1)

160-169: Remove button is not accessible to keyboard users.

The remove button is only visible on mouse hover (onMouseEnter/onMouseLeave). Keyboard-only users cannot access this functionality since focus states aren't handled.

Consider adding focus handling to show the button when the section receives keyboard focus:

       <Grid
         onMouseEnter={() => setShowRemoveButton(true)}
         onMouseLeave={() => setShowRemoveButton(false)}
+        onFocus={() => setShowRemoveButton(true)}
+        onBlur={(e) => {
+          if (!e.currentTarget.contains(e.relatedTarget as Node)) {
+            setShowRemoveButton(false);
+          }
+        }}
         hasGutter
       >

Committable suggestion skipped: line range outside the PR's diff.

libs/locales/lib/ja/translation.json-609-609 (1)

609-609: Fix Japanese typo and restore missing part of proxy help text

Two changed strings need correction:

  • Line 609 ("ai:No results found for {{filter}}"): current value "{{filter}} のケッケが見つかりません" has a typo (“ケッケ”). It should likely be "{{filter}} の結果が見つかりません".

  • Line 908 ("ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations."): current translation only covers commas and *, and omits the “preface with . to include subdomains” instruction. Recommend something like:

-"ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations.": "一覧表示された各ドメインを分ける場合はコンマを使用します。<bold>*</bold> を使用し、すべての宛先のプロキシーをバイパスします。",
+"ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations.": "一覧表示された各ドメインを区切るにはコンマを使用します。サブドメインも含めるにはドメイン名の先頭に <bold>.</bold> を付けます。すべての宛先でプロキシーをバイパスするには <bold>*</bold> を使用します。",

Also applies to: 908-908

libs/locales/lib/es/translation.json-132-132 (1)

132-132: Fix Spanish translation issues for binding and arbiter plural

Two changed entries look off:

  • Line 132 ("ai:Binding hosts..."): current "Hosts vinculantes…" reads as “binding hosts” (adjectival) rather than “binding hosts…” (progressive action). Suggest something like "Vinculando hosts…" to match the English intent.
  • Line 965 ("ai:Arbiter_plural"): value is "Árbitro" (singular) while this key is the plural variant. Prefer "Árbitros" to align with other *_plural keys.

Also applies to: 965-965

libs/locales/lib/fr/translation.json-15-15 (1)

15-15: Plural form uses identical translation as singular.

The plural entry "ai:{{count}} entry_plural" should have a different French translation. In French, "entrées" is the plural form, not "entrée".

- "ai:{{count}} entry_plural": "{{count}} entrée",
+ "ai:{{count}} entry_plural": "{{count}} entrées",
libs/locales/lib/fr/translation.json-28-28 (1)

28-28: Missing whitespace after pipe separator.

The French translation is missing a space after the pipe character (|), affecting readability.

- "ai:{{cpus}} CPU cores | {{memory}} Memory": "{{cpus}} Cœurs de processeurs| {{memory}} Mémoire",
+ "ai:{{cpus}} CPU cores | {{memory}} Memory": "{{cpus}} Cœurs de processeurs | {{memory}} Mémoire",
🧹 Nitpick comments (23)
libs/ui-lib/lib/ocm/components/Routes.tsx (1)

18-24: Consider exporting the props type for better API ergonomics.

The UILibRoutesProps type is well-structured, but it's not exported. Exporting it would allow consumers to reference it for type checking, extending props, or documentation purposes.

Apply this diff to export the type:

-type UILibRoutesProps = {
+export type UILibRoutesProps = {
   allEnabledFeatures: FeatureListType;
   children?: React.ReactNode;
   history?: HistoryRouterProps['history'];
   basename?: string;
   additionalComponents?: React.ReactNode;
 };
libs/ui-lib/lib/cim/utils.ts (1)

12-19: Consider handling the newVal === undefined case explicitly.

When newVal is undefined and existingVal is defined, this creates a patch with { op: 'replace', value: undefined }. Per JSON Patch RFC 6902, if the intent is to remove a value, the 'remove' operation would be more semantically correct.

If setting to undefined is intentional for your use case, this is fine as-is.

 export const appendPatch = <V>(patches: Patch[], path: string, newVal?: V, existingVal?: V) => {
   if (!isEqual(newVal, existingVal)) {
+    if (newVal === undefined && existingVal !== undefined) {
+      patches.push({ op: 'remove', path });
+      return;
+    }
     patches.push({
       op: existingVal === undefined ? 'add' : 'replace',
       path,
       value: newVal,
     });
   }
 };
libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentHostsNetworkTable.tsx (1)

3-23: Import rewiring looks correct; consider path aliases to reduce brittle relative chains.

The updated imports consistently route CIM types/helpers through ../../../types and shared UI bits through the common barrels, so behavior should be unchanged as long as those barrels are up to date. The only downside is the growing number of ../../..-style paths, which can be brittle when files move.

If you find these paths getting harder to manage across the CIM tree, it may be worth introducing (or extending) TS/webpack path aliases (e.g., @cim/types, @cim/helpers, @cim/common/hosts) and gradually migrating imports to those. This is purely optional and doesn’t block this merge.

Based on learnings, this keeps CIM-specific wiring self-contained under libs/ui-lib/lib/cim/ as intended.

libs/ui-lib/lib/common/config/docs_links.ts (1)

49-55: Normalized docs version in networking link looks good; behavior stays consistent with clamping

Using validOcpVersion = getDocsOpenshiftVersion(ocpVersion) both for the isMajorMinorVersionEqualOrGreater check and in the URL keeps the variant selection aligned with the actual docs version you’re linking to, including for versions below MIN_OPENSHIFT_DOCS_VERSION or above LATEST_OPENSHIFT_DOCS_VERSION. This refactor also avoids recomputing the docs version.

If not already covered elsewhere, consider adding/adjusting unit tests for getOpenShiftNetworkingDocsLink for a few key inputs (undefined, below min, between min and 4.18, at 4.18, above latest) to lock in this behavior.

libs/ui-lib/lib/cim/components/helpers/toAssisted.ts (1)

121-131: Clarify the comment to reflect return value format.

The comment states the function matches "4.19.18" or "4.19", but the regex capturing group only returns the major.minor portion. For input "img4.19.18-multi-appsub", the function returns "4.19" (not "4.19.18"). This appears intentional based on the OCP_VERSION_MAJOR_MINOR constant usage, but the comment could be more explicit about what is returned versus what is matched.

Apply this diff to clarify the comment:

-  // Match pattern like "4.19.18" or "4.19" in strings like "img4.19.18-multi-appsub"
+  // Extract major.minor version (e.g., "4.19") from imageSetRef names like "img4.19.18-multi-appsub"
libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx (1)

120-132: Confirm behavior change for default count and consider ?? for clarity

Changing the default from 1 to 0:

count: nodePool.spec.replicas || 0,

means that when spec.replicas is absent (e.g., autoscaling pools), switching to fixed size without editing count will now produce 0 replicas instead of 1. If that’s the intended UX, this is fine; otherwise you may want to keep 1 or introduce a different default.

Also, using nullish coalescing would better reflect the intent and avoid future truthiness pitfalls:

-          count: nodePool.spec.replicas || 0,
+          count: nodePool.spec.replicas ?? 0,
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.tsx (1)

93-110: Custom OpenShift version handling and TNA gating look correct, with a small robustness tweak to consider

The additionalSelectOption memo correctly surfaces a custom version from allVersions only when it isn’t already in the filtered versions list, and wiring it into OpenShiftVersionDropdown via customItem matches the new dropdown API. The allowTNA calculation using values.customOpenshiftSelect || matchingVersion.version plus isMajorMinorVersionEqualOrGreater(current, '4.19') && values.platform === 'baremetal' also reads well.

If customOpenshiftSelect can contain non‑pure version keys (e.g., with suffixes), you might consider normalizing current through allVersions.find(...).version as you do for the versions branch to avoid relying on the helper’s parsing of keys, but that’s an optional hardening rather than a bug.

libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.tsx (1)

22-73: OpenShift version dropdown refactor is consistent and reduces duplication

Using allVersions from useOpenShiftVersionsContext, computing a single updatedSelectOptions entry as the customItem, and centralizing modal open state with showOpenshiftVersionModal make this component align with the shared dropdown/modal behavior used elsewhere. The getHelperText wrapper with string | null also tracks the updated helper signature. Only minor nit is the plural updatedSelectOptions name for a singular item, but that’s purely cosmetic.

libs/ui-lib/lib/cim/types/k8s/agent-cluster-install.ts (1)

61-61: New manifestsConfigMapRefs field is a reasonable, backward‑compatible extension

Adding manifestsConfigMapRefs?: { name: string }[] on spec cleanly models the new custom manifests workflow without affecting existing consumers. If you find this pattern recurring, you could optionally introduce a small named type (e.g., type ConfigMapRef = { name: string };) for readability, but the current inline shape is perfectly serviceable.

libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelectionAdvanced.tsx (1)

7-15: Generic parameter on component is unnecessary and can be simplified

ClusterDeploymentHostsSelectionAdvanced is declared as a generic component (<T extends FormValues>) but the props type is non‑generic and the only use of T is in useFormikContext<T>(). In JSX usage you can’t practically specify T, so it will just collapse to the constraint, making this equivalent to useFormikContext<FormValues>() while adding type‑level noise.

You can simplify by dropping the generic and typing the hook directly, for example:

const { values } = useFormikContext<FormValues>();

or, if you need stronger typing per form in the future, thread the generic through the props type instead of having it only live on the implementation.

Also applies to: 28-38

libs/ui-lib-tests/cypress/integration/use-cases/create-cluster/validations-new-cluster-page.cy.ts (1)

39-45: Updated expected pull-secret validation message is fine; consider const

The new expected text 'Required field' aligns the test with the updated validation copy. Since pullSecretError is never reassigned, it could be a const instead of let for consistency.

libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx (2)

56-59: Consider clarifying the conditional requirement message.

The validation requires at least one config map only when platformType === 'External', but the error message doesn't reflect this conditionality. Consider making the message more explicit about when the requirement applies.

         .min(
           agentClusterInstall.spec?.platformType === 'External' ? 1 : 0,
-          t('ai:At least one config map is required'),
+          t('ai:At least one config map is required for External platform type'),
         ),

63-79: Consider adding error handling for the patch operation.

The onSubmit function doesn't include explicit error handling for the k8sPatch operation. While Formik will catch thrown errors, consider adding user-friendly error handling similar to other wizard steps.

   const onSubmit = async (values: CustomManifestFormType) => {
+    try {
       const patches: Patch[] = [];
       appendPatch(
         patches,
         '/spec/manifestsConfigMapRefs',
         values.configMaps.map(({ name }) => ({ name })),
         agentClusterInstall.spec?.manifestsConfigMapRefs,
       );
 
       if (patches.length > 0) {
         await k8sPatch({
           model: AgentClusterInstallModel,
           resource: agentClusterInstall,
           data: patches,
         });
       }
+    } catch (error) {
+      // Let Formik handle the error with a user-friendly message
+      throw new Error(
+        t('ai:Failed to save custom manifests: {{error}}', {
+          error: error instanceof Error ? error.message : String(error),
+        })
+      );
+    }
   };
libs/ui-lib/lib/common/components/ui/OpenShiftVersionModal.tsx (1)

31-35: Verify new cancel/close semantics for custom OpenShift selection

With OpenShiftSelectWithSearch writing directly to customOpenshiftSelect, the modal now behaves as follows:

  • Clicking Select just closes the modal; the last chosen value is already in the form.
  • Clicking Cancel clears customOpenshiftSelect by setting it to null and closes the modal.
  • Closing via the modal close icon / ESC leaves whatever value was last selected.

This makes Cancel a destructive “clear override” rather than a “revert to previous value”, and its behavior differs from the close icon. Please double-check this matches the intended UX; if “Cancel” should behave like closing, you might want onClose={onCancel} or a stored “original value” to restore.

Also applies to: 40-41, 51-52, 55-63

libs/ui-lib/lib/cim/components/ClusterDeployment/review/ReviewConfigMapsTable.tsx (1)

12-16: Defensively default configMaps to an empty array before filtering

useConfigMaps ultimately returns the raw data from useK8sWatchResource. Since that wrapper doesn’t enforce a default, there’s a real risk that configMaps is undefined before the first watch tick, which would make configMaps.filter(...) throw.

To make this component robust against watcher initialization details, it’s safer to default to an empty array when destructuring:

-  const [configMaps, loaded] = useConfigMaps({
+  const [configMaps = [], loaded] = useConfigMaps({
     namespace: agentClusterInstall.metadata?.namespace,
     isList: true,
   });

You could also slightly reduce work in the filter by precomputing the set of referenced names once, but the main win is guarding against a possible undefined value here.

Also applies to: 17-47

libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx (1)

75-85: Add onOpenChange handler to close dropdown when clicking outside.

The dropdown lacks an onOpenChange handler, which means it won't close when the user clicks outside the dropdown menu. This is inconsistent with the PatternFly dropdown behavior pattern.

       <Dropdown
         isOpen={isOpen}
         toggle={(toggleRef) => (
           <MenuToggle ref={toggleRef} className="pf-v5-u-w-100" onClick={() => setIsOpen(!isOpen)}>
             {value ? platforms[value] : t('ai:Integrate with external partner platforms')}
           </MenuToggle>
         )}
         onSelect={onSelect}
+        onOpenChange={(open) => setIsOpen(open)}
       >
         {options}
       </Dropdown>
libs/ui-lib/lib/common/components/ui/formik/SelectFieldWithSearch.tsx (3)

28-28: createItemId only replaces the first space.

String.replace(' ', '-') only replaces the first occurrence. Use a regex with global flag to replace all spaces.

-const createItemId = (val: string) => `select-multi-typeahead-${val.replace(' ', '-')}`;
+const createItemId = (val: string) => `select-multi-typeahead-${val.replace(/\s+/g, '-')}`;

225-275: Missing Formik validation error display.

Unlike SelectField.tsx which displays validation errors via FormHelperText with error variant, this component only shows helperText. Consider integrating Formik's touched and error states to display validation feedback.

+  const [{ value }, { touched, error }, { setValue }] = useField<unknown | unknown[]>(name);
+  const isValid = !(touched && error);
+  const errorMessage = !isValid ? error : '';

   // ... in the return statement, update the helper text section:
   
-      {helperText && (
+      {(errorMessage || helperText) && (
         <FormHelperText>
           <HelperText>
-            <HelperTextItem>{helperText}</HelperTextItem>
+            <HelperTextItem variant={errorMessage ? 'error' : 'default'}>
+              {errorMessage || helperText}
+            </HelperTextItem>
           </HelperText>
         </FormHelperText>
       )}

166-167: Add type annotation to onSelect callback parameter.

The val parameter is implicitly any. Adding explicit typing improves type safety.

-  const onSelect = React.useCallback(
-    (val) => {
+  const onSelect = React.useCallback(
+    (val: string | number | undefined) => {
libs/ui-lib/lib/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.tsx (1)

162-167: Conditional custom manifests display.

The custom manifests section renders only when manifestsConfigMapRefs has entries. Consider using null instead of undefined as the falsy branch return value for cleaner JSX, though this is a minor style preference.

-          {!!agentClusterInstall.spec?.manifestsConfigMapRefs?.length ? (
+          {agentClusterInstall.spec?.manifestsConfigMapRefs?.length ? (
             <DetailItem
               title={t('ai:Custom manifests')}
               value={<ReviewConfigMapsTable agentClusterInstall={agentClusterInstall} />}
             />
-          ) : undefined}
+          ) : null}
libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx (1)

175-175: Default export retained.

This file retains its default export pattern while other components in this PR were converted to named exports. This creates an inconsistency in the module export patterns within the networking directory.

Consider converting to a named export for consistency with other components in this refactoring effort:

-export default ClusterDeploymentNetworkingForm;
+export { ClusterDeploymentNetworkingForm };

Note: This would require updating any existing default imports to named imports.

libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapForm.tsx (2)

63-76: Potential stale closure in useEffect dependency array.

The eslint-disable for react-hooks/exhaustive-deps suppresses a warning about missing values.configMaps. While this is intentional to prevent an infinite loop (since setFieldValue updates values.configMaps), it means if values.configMaps is modified elsewhere (e.g., by another component or form reset), this effect won't re-run to validate against the latest data.

Consider adding a stable reference check or using a ref to track whether the sync has occurred for the current data load:

  React.useEffect(() => {
    if (loaded && !isError) {
      const newConfigMaps = values.configMaps.map((configMap) => {
        const map = data.find((item) => item.metadata?.name === configMap.name);
        if (map) {
          return { ...configMap, valid: true, manifestNames: Object.keys(map.data || {}) };
        }
        return { ...configMap, valid: false, manifestNames: [] };
      });

      setFieldValue('configMaps', newConfigMaps);
    }
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [data, isError, loaded, setFieldValue]);
+  }, [data, isError, loaded, setFieldValue, values.configMaps.length]);

This limits re-runs to when the count changes, avoiding the infinite loop while still catching resets.


128-143: Verify form validation before navigation.

submitForm() resolves successfully even when Formik validation fails (it just won't call onSubmit). While the Next button is disabled when !isValid, if validation state is stale or the button becomes enabled due to a race condition, the wizard could advance without proper submission.

Consider checking validation explicitly:

  const onNext = React.useCallback(async () => {
    try {
      clearAlerts();
      setSubmitting(true);

      await submitForm();
+     if (!isValid) {
+       return;
+     }
      await goToNextStep();
    } catch (error) {

This adds a defensive check to ensure the form was actually valid before navigating.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f725d4 and 2db36eb.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (86)
  • libs/locales/lib/en/translation.json (18 hunks)
  • libs/locales/lib/es/translation.json (43 hunks)
  • libs/locales/lib/fr/translation.json (43 hunks)
  • libs/locales/lib/ja/translation.json (40 hunks)
  • libs/locales/lib/ko/translation.json (42 hunks)
  • libs/locales/lib/zh/translation.json (40 hunks)
  • libs/ui-lib-tests/cypress/integration/use-cases/create-cluster/validations-new-cluster-page.cy.ts (1 hunks)
  • libs/ui-lib/lib/cim/components/Agent/AgentStatus.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/Agent/tableUtils.tsx (7 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx (5 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/ScaleUpForm.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ACMClusterDeploymentDetailsStep.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.tsx (3 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsStep.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.tsx (5 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/components/AdditionalNTPSourcesDialogToggle.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/components/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/constants.ts (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapDetail.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapForm.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostDiscoveryTable.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostsDiscovery.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostsDiscoveryStep.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.tsx (5 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelection.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelectionAdvanced.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelectionBasic.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/index.ts (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentHostsNetworkTable.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx (3 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingStep.tsx (3 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.tsx (8 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/review/ReviewConfigMapsTable.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/review/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts (2 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/use-networking-formik.ts (3 hunks)
  • libs/ui-lib/lib/cim/components/ClusterDeployment/wizardTransition.ts (2 hunks)
  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.tsx (3 hunks)
  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.ts (1 hunks)
  • libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx (2 hunks)
  • libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx (5 hunks)
  • libs/ui-lib/lib/cim/components/InfraEnv/InfraTableToolbar.tsx (4 hunks)
  • libs/ui-lib/lib/cim/components/helpers/agentClusterInstall.ts (1 hunks)
  • libs/ui-lib/lib/cim/components/helpers/agents.ts (1 hunks)
  • libs/ui-lib/lib/cim/components/helpers/toAssisted.ts (5 hunks)
  • libs/ui-lib/lib/cim/components/helpers/versions.ts (2 hunks)
  • libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx (1 hunks)
  • libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx (2 hunks)
  • libs/ui-lib/lib/cim/hooks/index.tsx (1 hunks)
  • libs/ui-lib/lib/cim/hooks/types.tsx (1 hunks)
  • libs/ui-lib/lib/cim/hooks/useConfigMaps.tsx (1 hunks)
  • libs/ui-lib/lib/cim/hooks/useK8sWatchResource.tsx (1 hunks)
  • libs/ui-lib/lib/cim/types/index.ts (1 hunks)
  • libs/ui-lib/lib/cim/types/k8s/agent-cluster-install.ts (1 hunks)
  • libs/ui-lib/lib/cim/types/models.tsx (1 hunks)
  • libs/ui-lib/lib/cim/utils.ts (2 hunks)
  • libs/ui-lib/lib/common/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx (3 hunks)
  • libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx (1 hunks)
  • libs/ui-lib/lib/common/components/clusterConfiguration/SecurityFields.tsx (3 hunks)
  • libs/ui-lib/lib/common/components/clusterConfiguration/index.ts (1 hunks)
  • libs/ui-lib/lib/common/components/clusterWizard/clusterDetailsValidation.ts (2 hunks)
  • libs/ui-lib/lib/common/components/clusterWizard/types.ts (1 hunks)
  • libs/ui-lib/lib/common/components/hosts/status.tsx (1 hunks)
  • libs/ui-lib/lib/common/components/hosts/tableUtils.tsx (4 hunks)
  • libs/ui-lib/lib/common/components/hosts/utils.ts (1 hunks)
  • libs/ui-lib/lib/common/components/ui/OpenShiftSelectWithSearch.tsx (3 hunks)
  • libs/ui-lib/lib/common/components/ui/OpenShiftVersionDropdown.tsx (5 hunks)
  • libs/ui-lib/lib/common/components/ui/OpenShiftVersionModal.tsx (3 hunks)
  • libs/ui-lib/lib/common/components/ui/formik/SelectFieldWithSearch.tsx (1 hunks)
  • libs/ui-lib/lib/common/components/ui/formik/index.tsx (1 hunks)
  • libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (2 hunks)
  • libs/ui-lib/lib/common/config/docs_links.ts (1 hunks)
  • libs/ui-lib/lib/common/utils.ts (1 hunks)
  • libs/ui-lib/lib/ocm/components/Routes.tsx (1 hunks)
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx (2 hunks)
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.tsx (3 hunks)
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/OpenshiftVersionHelperText.tsx (1 hunks)
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts (2 hunks)
  • libs/ui-lib/package.json (1 hunks)
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts:69-69
Timestamp: 2025-10-19T17:22:52.502Z
Learning: CIM UI changes in the repository openshift-assisted/assisted-installer-ui (e.g., files under libs/ui-lib/lib/cim/) are handled separately by the CIM team and should be tracked via separate issues rather than being included in PRs for other UI components.
📚 Learning: 2025-10-21T04:40:36.292Z
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.tsx:55-63
Timestamp: 2025-10-21T04:40:36.292Z
Learning: In libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.tsx, the network reordering logic in the useEffect (swapping clusterNetworks and serviceNetworks based on the primary machine network's IP family) is for UI consistency only. Validation of empty or invalid CIDRs is handled separately by validation schemas, not by the reordering logic.

Applied to files:

  • libs/ui-lib/lib/cim/components/ClusterDeployment/components/index.tsx
  • libs/ui-lib/lib/common/components/clusterWizard/clusterDetailsValidation.ts
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/index.tsx
  • libs/ui-lib/lib/common/components/clusterConfiguration/index.ts
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/index.tsx
  • libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelectionAdvanced.tsx
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostsDiscovery.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingStep.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapForm.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/components/AdditionalNTPSourcesDialogToggle.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentHostsNetworkTable.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostsDiscoveryStep.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelectionBasic.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.tsx
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts
  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/ScaleUpForm.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx
  • libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/index.ts
  • libs/ui-lib/lib/common/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/use-networking-formik.ts
  • libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostsSelection.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ACMClusterDeploymentDetailsStep.tsx
  • libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.tsx
📚 Learning: 2025-09-02T08:14:13.690Z
Learnt from: jgyselov
Repo: openshift-assisted/assisted-installer-ui PR: 3151
File: libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx:24-36
Timestamp: 2025-09-02T08:14:13.690Z
Learning: In ExternalPlatformsDropdown, "baremetal" is the correct platform type value for the "No platform integration" option and should be selectable as the default, while "none" is filtered out as it's unused/duplicate.

Applied to files:

  • libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx
📚 Learning: 2025-08-11T06:07:38.056Z
Learnt from: ammont82
Repo: openshift-assisted/assisted-installer-ui PR: 3101
File: libs/ui-lib/lib/common/config/docs_links.ts:203-221
Timestamp: 2025-08-11T06:07:38.056Z
Learning: The MetalLB, OADP, Cluster Observability, and NUMA Resources operators in the virtualization bundle don't require version fallback logic in their documentation link functions (getMetalLbLink, getOadpLink, getClusterObservabilityLink, getNumaResourcesLink) in libs/ui-lib/lib/common/config/docs_links.ts, unlike some other operators like LSO and NVIDIA GPU.

Applied to files:

  • libs/ui-lib/lib/common/config/docs_links.ts
📚 Learning: 2025-10-21T04:53:07.362Z
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.tsx:71-91
Timestamp: 2025-10-21T04:53:07.362Z
Learning: In libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.tsx, dual-stack mode requires both IPv4 and IPv6 networks (machineNetworks must have at least 2 entries: one IPv4 and one IPv6). Dual-stack with only IPv6 is not supported—dual-stack must have both IP families present.

Applied to files:

  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx
📚 Learning: 2025-10-20T08:57:04.935Z
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterDetail/ClusterProperties.tsx:43-45
Timestamp: 2025-10-20T08:57:04.935Z
Learning: In the file `libs/ui-lib/lib/ocm/components/clusterDetail/ClusterProperties.tsx`, the `getStackTypeLabel` function returns 'Dual-stack' or 'IPv4' because the system currently only supports IPv4 single-stack clusters. IPv6-only single-stack clusters are not supported.

Applied to files:

  • libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx
📚 Learning: 2025-09-02T08:03:57.204Z
Learnt from: jgyselov
Repo: openshift-assisted/assisted-installer-ui PR: 3151
File: libs/ui-lib/lib/cim/components/ClusterDeployment/constants.ts:25-25
Timestamp: 2025-09-02T08:03:57.204Z
Learning: In the openshift-assisted/assisted-installer-ui repository, non-English translations are handled separately from the main development process. When adding new translation keys to English locale files, it's expected that non-English locale files (es, fr, ja, ko, zh) may not immediately contain the corresponding translations, as these are managed through a different workflow.

Applied to files:

  • libs/locales/lib/ko/translation.json
  • libs/locales/lib/en/translation.json
  • libs/locales/lib/es/translation.json
  • libs/locales/lib/ja/translation.json
  • libs/locales/lib/zh/translation.json
  • libs/locales/lib/fr/translation.json
🧬 Code graph analysis (36)
libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx (1)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)
libs/ui-lib/lib/common/components/hosts/utils.ts (1)
libs/types/assisted-installer-service.d.ts (1)
  • Host (1148-1321)
libs/ui-lib/lib/common/components/clusterWizard/clusterDetailsValidation.ts (1)
libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (3)
  • baseDomainValidationSchema (482-495)
  • dnsNameValidationSchema (471-480)
  • pullSecretValidationSchema (142-161)
libs/ui-lib/lib/cim/components/InfraEnv/InfraTableToolbar.tsx (4)
libs/ui-lib/lib/ocm/services/InfraEnvIdsCacheService.ts (1)
  • key (32-35)
libs/ui-lib/lib/cim/components/Agent/tableUtils.tsx (1)
  • StatusCount (595-595)
libs/ui-lib/lib/common/hooks/index.ts (1)
  • useTranslation (3-3)
libs/ui-lib/lib/cim/components/helpers/agentStatus.tsx (1)
  • agentStatus (52-69)
libs/ui-lib/lib/cim/components/helpers/versions.ts (1)
libs/ui-lib/lib/common/utils.ts (1)
  • getComparableVersionInt (116-129)
libs/ui-lib/lib/common/components/ui/formik/SelectFieldWithSearch.tsx (1)
libs/ui-lib/lib/common/components/ui/formik/types.ts (1)
  • FieldProps (16-38)
libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx (1)
libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (1)
  • sshPublicKeyValidationSchema (106-116)
libs/ui-lib/lib/cim/components/ClusterDeployment/review/ReviewConfigMapsTable.tsx (3)
libs/ui-lib/lib/cim/types/k8s/agent-cluster-install.ts (1)
  • AgentClusterInstallK8sResource (17-82)
libs/ui-lib/lib/cim/hooks/useConfigMaps.tsx (1)
  • useConfigMaps (5-14)
libs/ui-lib/lib/common/components/ui/table/utils.ts (1)
  • genericTableRowKey (15-15)
libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingStep.tsx (1)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapForm.tsx (5)
libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.tsx (1)
  • ClusterDeploymentWizardContext (8-11)
libs/ui-lib/lib/cim/hooks/useConfigMaps.tsx (1)
  • useConfigMaps (5-14)
libs/ui-lib/lib/common/components/ui/WizardFooter.tsx (1)
  • WizardFooter (40-132)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapDetail.tsx (1)
  • ConfigMapDetail (126-191)
libs/ui-lib/lib/cim/components/ClusterDeployment/components/ValidationSection.tsx (1)
  • ValidationSection (18-41)
libs/ui-lib/lib/cim/hooks/useConfigMaps.tsx (2)
libs/ui-lib/lib/cim/hooks/types.tsx (1)
  • K8sWatchHookProps (8-8)
libs/ui-lib/lib/cim/hooks/useK8sWatchResource.tsx (1)
  • useK8sWatchResource (13-27)
libs/ui-lib/lib/cim/components/helpers/agents.ts (2)
libs/ui-lib/lib/cim/types/k8s/agent.ts (1)
  • AgentK8sResource (32-74)
libs/ui-lib/lib/cim/components/helpers/status.ts (2)
  • getAgentStatusKey (46-59)
  • AgentStatus (41-41)
libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostsDiscoveryStep.tsx (1)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)
libs/ui-lib/lib/common/components/clusterConfiguration/SecurityFields.tsx (1)
libs/ui-lib/lib/common/hooks/index.ts (1)
  • useTranslation (3-3)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapDetail.tsx (1)
libs/ui-lib/lib/common/hooks/index.ts (1)
  • useTranslation (3-3)
libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (1)
libs/ui-lib/lib/common/components/ui/formik/utils.ts (1)
  • trimSshPublicKey (20-25)
libs/ui-lib/lib/common/config/docs_links.ts (1)
libs/ui-lib/lib/common/utils.ts (1)
  • isMajorMinorVersionEqualOrGreater (138-143)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx (4)
libs/ui-lib/lib/cim/types/k8s/agent-cluster-install.ts (1)
  • AgentClusterInstallK8sResource (17-82)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ConfigMapForm.tsx (2)
  • CustomManifestFormType (24-30)
  • ConfigMapForm (32-247)
libs/ui-lib/lib/cim/utils.ts (1)
  • appendPatch (12-20)
libs/ui-lib/lib/cim/types/models.tsx (1)
  • AgentClusterInstallModel (3-12)
libs/ui-lib/lib/common/components/ui/OpenShiftVersionModal.tsx (1)
libs/ui-lib/lib/common/components/ui/OpenShiftSelectWithSearch.tsx (1)
  • OpenShiftSelectWithSearch (15-93)
libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx (1)
libs/ui-lib/lib/common/components/hosts/tableUtils.tsx (4)
  • gpusColumn (284-300)
  • memoryColumn (234-257)
  • disksColumn (259-282)
  • labelsColumn (385-411)
libs/ui-lib/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.tsx (1)
libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts (1)
  • ClusterDeploymentHostSelectionStepProps (111-116)
libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts (1)
libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (1)
  • sshPublicKeyValidationSchema (106-116)
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.tsx (2)
libs/ui-lib/lib/common/utils.ts (1)
  • isMajorMinorVersionEqualOrGreater (138-143)
libs/ui-lib/lib/common/components/clusterConfiguration/ExternalPlatformsDropdown.tsx (1)
  • ExternalPlatformsDropdown (18-88)
libs/ui-lib/lib/cim/components/Agent/tableUtils.tsx (2)
libs/types/assisted-installer-service.d.ts (1)
  • Host (1148-1321)
libs/ui-lib/lib/common/components/hosts/utils.ts (2)
  • getHostLabels (208-210)
  • filterByHostname (212-249)
libs/ui-lib/lib/cim/components/ClusterDeployment/networking/ClusterDeploymentNetworkingForm.tsx (1)
libs/ui-lib/lib/common/config/constants.ts (1)
  • CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4 (274-278)
libs/ui-lib/lib/common/components/ui/OpenShiftSelectWithSearch.tsx (3)
libs/ui-lib/lib/common/components/ui/OpenShiftVersionDropdown.tsx (1)
  • HelperTextType (24-24)
libs/ui-lib/lib/common/hooks/index.ts (1)
  • useTranslation (3-3)
libs/ui-lib/lib/common/components/clusterWizard/types.ts (1)
  • ClusterDetailsValues (19-36)
libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx (1)
libs/ui-lib/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx (1)
  • ClusterDeploymentCustomManifestsStep (19-128)
libs/ui-lib/lib/cim/components/helpers/agentClusterInstall.ts (1)
libs/ui-lib/lib/cim/types/k8s/agent-cluster-install.ts (1)
  • AgentClusterInstallK8sResource (17-82)
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsStep.tsx (1)
libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts (1)
  • ClusterDeploymentDetailsStepProps (86-90)
libs/ui-lib/lib/common/components/ui/OpenShiftVersionDropdown.tsx (1)
libs/ui-lib-tests/cypress/fixtures/infra-envs/openshift-versions.ts (1)
  • versions (69-69)
libs/ui-lib/lib/cim/components/ClusterDeployment/hostDiscovery/ClusterDeploymentHostDiscoveryTable.tsx (1)
libs/ui-lib/lib/common/components/hosts/tableUtils.tsx (6)
  • discoveredAtColumn (170-187)
  • cpuCoresColumn (207-232)
  • gpusColumn (284-300)
  • memoryColumn (234-257)
  • disksColumn (259-282)
  • labelsColumn (385-411)
libs/ui-lib/lib/common/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx (1)
libs/ui-lib/lib/common/components/clusterWizard/types.ts (1)
  • ClusterDetailsValues (19-36)
libs/ui-lib/lib/cim/components/ClusterDeployment/use-networking-formik.ts (3)
libs/ui-lib/lib/common/components/ui/formik/validationSchemas.ts (1)
  • sshPublicKeyListValidationSchema (118-140)
libs/ui-lib/lib/cim/components/ClusterDeployment/networkConfigurationValidation.ts (1)
  • getNetworkInitialValues (35-56)
libs/ui-lib/lib/common/config/constants.ts (1)
  • CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4 (274-278)
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ACMClusterDeploymentDetailsStep.tsx (1)
libs/ui-lib/lib/cim/components/ClusterDeployment/index.ts (1)
  • ACMClusterDeploymentDetailsStep (18-18)
libs/ui-lib/lib/cim/components/helpers/toAssisted.ts (2)
libs/ui-lib/lib/cim/components/common/constants.ts (1)
  • OCP_VERSION_MAJOR_MINOR (22-22)
libs/types/assisted-installer-service.d.ts (1)
  • PlatformType (2462-2462)
libs/ui-lib/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.tsx (1)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)

@jgyselov jgyselov changed the title NO-ISSUE: Merge the contents of releases/v2.17-cim into master MGMT-22465: Merge the contents of releases/v2.17-cim into master Dec 16, 2025
@openshift-ci-robot
Copy link

openshift-ci-robot commented Dec 16, 2025

@jgyselov: This pull request references MGMT-22465 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22465

Summary by CodeRabbit

Release Notes

  • New Features

  • Custom manifests configuration support in cluster deployment wizard.

  • Config map management for manifest references with validation.

  • External platform integration options in cluster configuration.

  • GPU and label-based filtering capabilities for host discovery.

  • Arbiter node configuration support for two-node clusters.

  • Multiple SSH keys support in security configuration.

  • Bug Fixes

  • Corrected error messages for improved clarity.

  • Enhanced host selection and binding logic.

  • Localization

  • Expanded translations for new platform integrations, requirements messaging, and config map workflows across all supported languages.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Dec 17, 2025
@openshift-ci
Copy link

openshift-ci bot commented Dec 17, 2025

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jgyselov, LiorSoffer

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot openshift-merge-bot bot merged commit f5603e6 into openshift-assisted:master Dec 17, 2025
11 checks passed
openshift-merge-bot bot pushed a commit that referenced this pull request Dec 18, 2025
* Remove preview badge from bundles card (#3169)

* Migration to PF6 (#3168)

* pf6 deps and codemods updates

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

get emptystate pf6 issues building

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix chip/label changes

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix icon type

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix a prop type that codemods missed

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

update pf5 classnames

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix tokens, some cleanup

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix tests and remaining v5->v6

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

yarn lock

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

work on some cy tests

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix tests for pf6 changes

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix some tests

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

fix build error

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

* Change version of package.json to 2.0.0 for testing

* MGMT-20974: Rremove unnecessary hyphens in helper text operators

* MGMT-20968: align 'learn more about openshift releases' link in the first page of the cluster creation wizard

* MGMT-20965: Put the same min-width in the dropdowns of the first page of the cluster creation wizard

* MGMT-20966: improving the readibility of text on Troubleshooter Modal

* MGMT-20972: Cluster summary section is not collapsable

* MGMT-20964: Detached Warning Message for TMPv2 selection

* Changes in PrismCode to use the correct color

* MGMT-20969: hostname column header is truncated and unredeable

* MGMT-20967: errors beneath text boxes dissapears but icon remains in place

* fix (20975): make bundle selected operators show in count

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

* MGMT-21103: change size of Provisioning type droodown in Add hosts modal

* MGMT-21105: Networking page-machine network dropdown truncate values

* add layout with gutter around cluster progress/buttons

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

* MGMT-21147: R&C page - missing vertical spacing between kubeconfig warning and buttons

* MGMT-21151: inconsistend icon and text alignment in preflight checks in R&C page

* Add data-test-id to MenuToggle components

* Add data-testid to HelperTextItem components

* Add data-testid to BreadCrumb component

* Add data-testid to Spinner component

* Add data-testid to Wizard components

* Add data-testid to Host's network configuration group

* Add data-testid to Use bond option

* Add data-testid to Add hosts modal

* Add more data-testids for tests

* Solving problem with operators count

* Remove duplicated scrollbars

* Solving errors in Networking page

* Add data-testid to close button in Events modal

* Migration of TextContent component

* Solving problems with some old components

* Solving lint issues

* Solving problems with unit tests

* Solving format issues

* Remove unnecessary test

* Solving problems with tests

---------

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>
Co-authored-by: gitdallas <5322142+gitdallas@users.noreply.github.com>

* Use masthead (#3173)

* Button text (#3174)

* OCPBUGS-61953: Update dependency sourcing to remote (#3155)

* Bump axios from 1.6.8 to 1.12.2 (#3180)

Bumps [axios](https://github.com/axios/axios) from 1.6.8 to 1.12.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](axios/axios@v1.6.8...v1.12.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Updating assisted-installer-ui-container image to be consistent with ART for 4.21 (#3179)

Reconciling with https://github.com/openshift/ocp-build-data/tree/4fbe3fab45239dc4be6f5d9d98a0bf36e0274ec9/images/agent-installer-ui.yml

Co-authored-by: AOS Automation Release Team <noreply@redhat.com>

* OCPBUGS-61787: Change NMstate operator docs link (#3182)

* MGMT-21862: Add message about vSphere limitations (#3181)

* OCPBUGS-62680: Include assisted disconnected UI image in release payload (#3188)

* Fixing errors when creating cluster from Assisted Migration (#3191)

* MGMT-21025: installing Two Node OpenShift with Arbiter (TNA) (#3170)

* Clean up ClusterDetailsFormFields

* Allow TNA arbiter in CIM

* Remove unused component (#3193)

* Add unique data-testid to dualstack subnet dropdowns (#3199)

* Tweak spacing between advanced network fields (#3198)

* Tweak host status spacing (#3200)

* Improve alert spacing (#3201)

* MGMT-21825: Textarea field should show both error and helper text (#3202)

* Improve alert spacing

* Show both error and helper text under textarea fields

* Add border to table headers (#3197)

* Remove border from rich input field (#3208)

* Bump happy-dom from 15.10.2 to 20.0.0 (#3211)

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 15.10.2 to 20.0.0.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](capricorn86/happy-dom@v15.10.2...v20.0.0)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Remove nested 'Content' components (#3196)

* Upgrade the PF modal component in /common and /ocm (#3213)

* Bump happy-dom from 20.0.0 to 20.0.2 (#3218)

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](capricorn86/happy-dom@v20.0.0...v20.0.2)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Consistent ISO Download behavior (#3221)

* Add 'noopener noreferrer' to ISO download button (#3222)

* Fix preflight check collapsed styling (#3215)

* Remove unnecessary custom manifest field (#3217)

* Bump vite from 5.4.20 to 5.4.21 (#3223)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.20 to 5.4.21.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.21
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* MGMT-21625: Add Dual-Stack with Primary IPv6 Support (#3190)

This PR adds support for IPv6-primary dual-stack clusters, enabling users to create dual-stack clusters where IPv6 is the primary IP stack (version-aware for OpenShift 4.12+)

* sort OCP versions in create infra (#3171)

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* Update types/parsing for latest lightspeed API (#3226)

* Update release job to use trusted-publishers flow (#3228)

* Update setup-node config (#3232)

* - MGMT-22057:Primary IPv6 should be Tech Preview (#3231)

- MGMT-22045: Change style of Dualstack - IPv4 / IPv6 section headers in subnet dropdown
- When we change the primary machine network IP to ipv6 we have to select the seconday machine network IP to ipv4

* MGMT-22080: Allow users to install Openshift AI as standalone operator in SNO clusters (#3234)

* Release job: Configure Yarn for npm registry (#3235)

* configure yarn before publish (#3239)

* Pass OIDC token to yarn config (#3241)

* MGMT-22047: Add apiVIP and ingressVIP for dual-stack ipv4 and ipv6 (#3246)

* Add apiVIP and ingressVIP for dual-stack ipv4 and ipv6

* Add validations to ensure that users add primary and secondary apiVips and ingressVips when using dual-stack

* Updating tests to dual-stack changes

* Prevent InfraEnv creation on ABI to support OVE Late-Binding workflow (#3244)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* MGMT-22116: Add info about apiVIPs and ingressVIPs for dual-stack in Review and Create page (#3250)

* Add info about apiVIPs and ingressVIPs for dual-stack in Review and Create page

* Fixing review comments

* MGMT-22119: Solving errors with SNO dual-stack (#3249)

* Solving errors with SNO dual-stack

* Solving errors when change between dual-stack and single-stack

* MGMT-22165: Remove what's new link until the info appear in the chatbot (#3253)

* Update logic to extract the tool response (#3255)

* MGMT-17220: dual-stack with second machine network not populates (#3256)

* MGMT-17220: dual-stack with second machine network not populates

* Improving the code

* Make the parsing compatible with new & old API (#3260)

* MGMT-22047: solving errors with dual-stack (#3263)

* MGMT-22047: solving errors with dual-stack
1. Changes in AvailableSubnetsControl.tsx so our corrective setFieldValue calls don’t validate immediately. This avoids heavy, repeated validations the moment you pick the first IPv6 option and should stop the freeze when secondary VIPs are IPv6 and empty.
Specifically, set the third arg to false for:
- Auto-select initialization of machineNetworks
- Duplicate-primary fix that updates machineNetworks.1.cidr
2. Changes in AdvancesNetworkFields.tsx:
-I found the infinite loop in AdvancedNetworkFields.tsx: when the primary machine network flips to IPv6, the effect was swapping clusterNetworks/serviceNetworks even when both entries had the same IP family, causing continuous reorders and a freeze.
-I added guards so we only swap when both entries exist and have opposite families, and the first one mismatches the primary machine family. Lint is clean.

* Solving issues in code

* MGMT-21837: in YAML view in Static Network Configuration we add the radio buttons to change the form to another view (#3268)

* late binding hosts to cluster in ABI (#3259)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* AGENT-1373: Rename feature gate to NoRegistryClusterInstall (#3267)

Update the feature gate name from NoRegistryClusterOperations to
NoRegistryClusterInstall.

* AGENT-1352: Handle cluster reset with late binding (#3270)

* late binding hosts to cluster in ABI

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Handle cluster reset on ABI

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

---------

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* MGMT-22281: Dual stack seconday vips fields not mandatory (#3275)

* Show TechPreview badge only in Primary Machine network when user chooses ipV6 IP (#3276)

* add new fields to above sea level ABI (#3274)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Revert "Handle cluster reset on ABI" (#3281)

This reverts commit d35b70a.

* add loki and logging operators (#3285)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* OCPBUGS-65657: Display OpenShift AI GPU validation message from API (#3279)

Fix UI to show the friendly label and detailed message from the API
instead of displaying the technical validation ID when OpenShift AI
operator is selected without GPU support.

* Bug fix: OVE Agent Installer UI: Red Hat OCP logo not displaying correctly (#3289)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Adding TechPreview Budge for Assisted installer and agent (#3293)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* MGMT-20138 : Show 'Add hosts' tab for all cases (#3297)

* Edit OWNERS file (#3172)

* Bump js-yaml from 4.1.0 to 4.1.1 (#3264)

Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](nodeca/js-yaml@4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump zx from 7.2.3 to 8.8.5 (#3273)

Bumps [zx](https://github.com/google/zx) from 7.2.3 to 8.8.5.
- [Release notes](https://github.com/google/zx/releases)
- [Commits](google/zx@7.2.3...8.8.5)

---
updated-dependencies:
- dependency-name: zx
  dependency-version: 8.8.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump mdast-util-to-hast from 13.2.0 to 13.2.1 (#3287)

Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1.
- [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases)
- [Commits](syntax-tree/mdast-util-to-hast@13.2.0...13.2.1)

---
updated-dependencies:
- dependency-name: mdast-util-to-hast
  dependency-version: 13.2.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* provides parameters for the GET /v2/operators/bundles route (#3306)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Bump js-yaml from 4.1.0 to 4.1.1 (#3310)

Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](nodeca/js-yaml@4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix Cluster summary styling (#3216)

* remove external platforms field from below sea level UI (#3316)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Openshift AI Bundle on SNO enables ODF and LVM which are uncompatible (#3320)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* change ABI above sea level iso size (#3322)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* MGMT-22465: Merge the contents of releases/v2.17-cim into master (#3319)

* Fix patches when there were 0 nodes in hypershift nodepool (#3177)

* Make OVN the default network type if the version is invalid (#3183)

* MGMT-20076: Support external platform in Assisted-installer Kube API (#3151)

* Add External platforms field

* Restructure files related to CIM cluster deployment wizard

* Create SelectFieldWithSearch component

* Update '@openshift-console/dynamic-plugin-sdk'

* CIM custom manifest step

* CIM custom manifests review

* Make 'Baremetal' the default external platform

* Translations for 2.16-cim (#3225)

* MGMT-21025: installing Two Node OpenShift with Arbiter (TNA)  (#3224)

* Clean up ClusterDetailsFormFields

* Allow TNA arbiter in CIM

* Set 'userManagedNetworking' as true with 'external' platform (#3245)

* Tweak TNA-related strings in CIM (#3248)

* Restrict platform options for SNO clusters (#3262)

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* Fix: Undefined OpenShift version producing an incorrect documentation link (#3271)

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* Fix bug - the option to remove host from the cluster disabled while the host is installing (#3219)

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* Implement user interface for the multiple SSH keys (#3292)

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* Edit OWNERS file (#3303)

Co-authored-by: jgyselov <jgyselov@redhat.com>

* Fix arbiter translation (#3304)

Co-authored-by: jgyselov <jgyselov@redhat.com>

* [releases/v2.17-cim] MGMT-22264: Add 'Labels' and 'GPU' columns to infra env host table (#3307)

* Add GPUs column to infra agent table

* Add labels column and filtering to infra agent table

---------

Co-authored-by: jgyselov <jgyselov@redhat.com>

* Prevent mass approve crash when hosts are still discovering (#3305)

Co-authored-by: jgyselov <jgyselov@redhat.com>

* Fix 'Required' translations (#3308)

Co-authored-by: jgyselov <jgyselov@redhat.com>

* Do not exclude hosts with SpecSyncError status from host selection during binding (#3309)

Co-authored-by: jgyselov <jgyselov@redhat.com>

* MGMT-22438: Handle empty labels in infra env host table (#3314)

* Handle empty labels in infra env host table

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* format fix

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

---------

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>

* MGMT-19743: Icon from agent status available is confusing (#3220)

* Fix bug - the option to remove host from the cluster disabled while the host is installing

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

* icon from agent status Available is confusing

Signed-off-by: Elay Aharoni <elayaha@gmail.com>

---------

Signed-off-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: Julie Gyselova <jgyselov@redhat.com>

---------

Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>
Signed-off-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: Lior Soffer <liorsoffer1@gmail.com>
Co-authored-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: OpenShift Cherrypick Robot <openshift-cherrypick-robot@redhat.com>

---------

Signed-off-by: gitdallas <5322142+gitdallas@users.noreply.github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Lior Soffer <liorsoffer1@gmail.com>
Signed-off-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: Montse Ortega Gallart <ammont82@users.noreply.github.com>
Co-authored-by: gitdallas <5322142+gitdallas@users.noreply.github.com>
Co-authored-by: Pawan Pinjarkar <ppinjark@redhat.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: OpenShift Bot <openshift-bot@redhat.com>
Co-authored-by: AOS Automation Release Team <noreply@redhat.com>
Co-authored-by: Linoy Hadad <Linoyaslan@gmail.com>
Co-authored-by: Lior Soffer <liorsoffer1@gmail.com>
Co-authored-by: Rastislav Wagner <rawagner@redhat.com>
Co-authored-by: Elay Aharoni <elayaha@gmail.com>
Co-authored-by: Richard Su <rwsu@redhat.com>
Co-authored-by: Yoav Schwammenthal <33420608+yoavsc0302@users.noreply.github.com>
Co-authored-by: OpenShift Cherrypick Robot <openshift-cherrypick-robot@redhat.com>
@coderabbitai coderabbitai bot mentioned this pull request Jan 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants