@openshift-assisted/ui-lib 2.50.0 → 2.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/build/@types/cim/components/Agent/BMHStatusInfo.d.ts.map +1 -1
  2. package/build/@types/cim/components/Agent/MinimalHWRequirements.d.ts.map +1 -1
  3. package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts +1 -1
  4. package/build/@types/cim/components/ClusterDeployment/wizardTransition.d.ts +1 -1
  5. package/build/@types/cim/components/ClusterDeployment/wizardTransition.d.ts.map +1 -1
  6. package/build/@types/cim/components/Hypershift/DetailsPage/ConditionsTable.d.ts.map +1 -1
  7. package/build/@types/cim/components/Hypershift/DetailsPage/HostedClusterProgress.d.ts.map +1 -1
  8. package/build/@types/cim/components/Hypershift/DetailsPage/NodePoolsProgress.d.ts.map +1 -1
  9. package/build/@types/cim/components/Hypershift/utils/status.d.ts +2 -2
  10. package/build/@types/cim/components/Hypershift/utils/status.d.ts.map +1 -1
  11. package/build/@types/cim/components/InfraEnv/EnvironmentDetails.d.ts.map +1 -1
  12. package/build/@types/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.d.ts.map +1 -1
  13. package/build/@types/cim/components/helpers/agentStatus.d.ts +1 -1
  14. package/build/@types/cim/components/helpers/agentStatus.d.ts.map +1 -1
  15. package/build/@types/cim/components/modals/MassDeleteAgentModal.d.ts.map +1 -1
  16. package/build/@types/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.d.ts.map +1 -1
  17. package/build/@types/common/components/clusterDetail/FinalizingProgress.d.ts +1 -1
  18. package/build/@types/common/components/clusterDetail/FinalizingProgress.d.ts.map +1 -1
  19. package/build/@types/common/components/clusterDetail/OperatorsProgressItem.d.ts.map +1 -1
  20. package/build/@types/common/components/clusterDetail/ProgressBarTexts.d.ts.map +1 -1
  21. package/build/@types/common/components/clusterWizard/ReviewValidations.d.ts.map +1 -1
  22. package/build/@types/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.d.ts.map +1 -1
  23. package/build/@types/common/components/hosts/HostPropertyValidationPopover.d.ts.map +1 -1
  24. package/build/@types/common/components/hosts/HostStatus.d.ts.map +1 -1
  25. package/build/@types/common/components/hosts/HostValidationGroups.d.ts.map +1 -1
  26. package/build/@types/common/components/hosts/Hostname.d.ts.map +1 -1
  27. package/build/@types/common/components/hosts/MassChangeHostnameModal.d.ts.map +1 -1
  28. package/build/@types/common/components/hosts/VMRebootConfigurationInfo.d.ts.map +1 -1
  29. package/build/@types/common/components/hosts/status.d.ts.map +1 -1
  30. package/build/@types/common/components/storage/DisksTable.d.ts.map +1 -1
  31. package/build/@types/common/components/storage/StorageUtils.d.ts +1 -1
  32. package/build/@types/common/components/storage/StorageUtils.d.ts.map +1 -1
  33. package/build/@types/common/components/ui/WizardNavItem.d.ts.map +1 -1
  34. package/build/@types/common/components/ui/formik/RemovableField.d.ts.map +1 -1
  35. package/build/@types/common/components/ui/formik/RichInputField.d.ts.map +1 -1
  36. package/build/@types/common/components/ui/index.d.ts +0 -1
  37. package/build/@types/common/components/ui/index.d.ts.map +1 -1
  38. package/build/@types/common/config/constants.d.ts +7 -0
  39. package/build/@types/common/config/constants.d.ts.map +1 -1
  40. package/build/@types/common/config/docs_links.d.ts +1 -0
  41. package/build/@types/common/config/docs_links.d.ts.map +1 -1
  42. package/build/@types/common/types/ui-settings.d.ts +0 -1
  43. package/build/@types/common/types/ui-settings.d.ts.map +1 -1
  44. package/build/@types/common/validationSchemas/addressValidation.d.ts.map +1 -1
  45. package/build/@types/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.d.ts.map +1 -1
  46. package/build/@types/ocm/components/clusterConfiguration/OcmOperatorProgressItem.d.ts.map +1 -1
  47. package/build/@types/ocm/components/clusterConfiguration/OpenshiftVersionHelperText.d.ts.map +1 -1
  48. package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.d.ts.map +1 -1
  49. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.d.ts.map +1 -1
  50. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts.map +1 -1
  51. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.d.ts +9 -0
  52. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.d.ts.map +1 -0
  53. package/build/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.d.ts.map +1 -1
  54. package/build/@types/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.d.ts.map +1 -1
  55. package/build/@types/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.d.ts.map +1 -1
  56. package/build/@types/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.d.ts.map +1 -1
  57. package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.d.ts.map +1 -1
  58. package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.d.ts +22 -0
  59. package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.d.ts.map +1 -1
  60. package/build/@types/ocm/components/clusterDetail/ClusterProperties.d.ts.map +1 -1
  61. package/build/@types/ocm/components/clusterDetail/HostInventoryExpandable.d.ts +1 -1
  62. package/build/@types/ocm/components/clusterDetail/HostInventoryExpandable.d.ts.map +1 -1
  63. package/build/@types/ocm/components/clusterDetail/OpenShiftVersionDetail.d.ts.map +1 -1
  64. package/build/@types/ocm/components/clusterDetail/ResetClusterModal.d.ts.map +1 -1
  65. package/build/@types/ocm/components/clusterWizard/ClusterDetails.d.ts.map +1 -1
  66. package/build/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts +2 -2
  67. package/build/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts.map +1 -1
  68. package/build/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts +0 -8
  69. package/build/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts.map +1 -1
  70. package/build/@types/ocm/components/clusterWizard/ClusterWizardContextProvider.d.ts.map +1 -1
  71. package/build/@types/ocm/components/clusterWizard/constants.d.ts.map +1 -1
  72. package/build/@types/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.d.ts.map +1 -1
  73. package/build/@types/ocm/components/clusterWizard/wizardTransition.d.ts +1 -1
  74. package/build/@types/ocm/components/clusterWizard/wizardTransition.d.ts.map +1 -1
  75. package/build/@types/ocm/components/clusters/ClusterStatus.d.ts.map +1 -1
  76. package/build/@types/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts.map +1 -1
  77. package/build/@types/ocm/components/featureSupportLevels/featureStateUtils.d.ts.map +1 -1
  78. package/build/@types/ocm/components/ui/InfoLinkWithModal.d.ts.map +1 -1
  79. package/build/@types/ocm/components/utils.d.ts +1 -0
  80. package/build/@types/ocm/components/utils.d.ts.map +1 -1
  81. package/build/@types/ocm/hooks/useUISettings.d.ts.map +1 -1
  82. package/build/@types/ocm/services/ClusterDetailsService.d.ts +1 -2
  83. package/build/@types/ocm/services/ClusterDetailsService.d.ts.map +1 -1
  84. package/build/@types/ocm/services/types.d.ts +0 -1
  85. package/build/@types/ocm/services/types.d.ts.map +1 -1
  86. package/build/@types/ocm/store/slices/current-cluster/slice.d.ts +3 -3
  87. package/build/cjs/cim/components/Agent/BMHStatusInfo.js +4 -4
  88. package/build/cjs/cim/components/Agent/BMHStatusInfo.js.map +1 -1
  89. package/build/cjs/cim/components/Agent/MinimalHWRequirements.js +2 -2
  90. package/build/cjs/cim/components/Agent/MinimalHWRequirements.js.map +1 -1
  91. package/build/cjs/cim/components/Hypershift/DetailsPage/ConditionsTable.js +7 -6
  92. package/build/cjs/cim/components/Hypershift/DetailsPage/ConditionsTable.js.map +1 -1
  93. package/build/cjs/cim/components/Hypershift/DetailsPage/HostedClusterProgress.js +3 -2
  94. package/build/cjs/cim/components/Hypershift/DetailsPage/HostedClusterProgress.js.map +1 -1
  95. package/build/cjs/cim/components/Hypershift/DetailsPage/NodePoolsProgress.js +2 -2
  96. package/build/cjs/cim/components/Hypershift/DetailsPage/NodePoolsProgress.js.map +1 -1
  97. package/build/cjs/cim/components/Hypershift/utils/status.js +8 -7
  98. package/build/cjs/cim/components/Hypershift/utils/status.js.map +1 -1
  99. package/build/cjs/cim/components/InfraEnv/EnvironmentDetails.js +4 -4
  100. package/build/cjs/cim/components/InfraEnv/EnvironmentDetails.js.map +1 -1
  101. package/build/cjs/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.js +3 -3
  102. package/build/cjs/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.js.map +1 -1
  103. package/build/cjs/cim/components/helpers/agentStatus.js +3 -2
  104. package/build/cjs/cim/components/helpers/agentStatus.js.map +1 -1
  105. package/build/cjs/cim/components/modals/MassDeleteAgentModal.js +2 -2
  106. package/build/cjs/cim/components/modals/MassDeleteAgentModal.js.map +1 -1
  107. package/build/cjs/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.js +2 -1
  108. package/build/cjs/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.js.map +1 -1
  109. package/build/cjs/common/components/clusterDetail/FinalizingProgress.js +8 -7
  110. package/build/cjs/common/components/clusterDetail/FinalizingProgress.js.map +1 -1
  111. package/build/cjs/common/components/clusterDetail/OperatorsProgressItem.js +4 -4
  112. package/build/cjs/common/components/clusterDetail/OperatorsProgressItem.js.map +1 -1
  113. package/build/cjs/common/components/clusterDetail/ProgressBarTexts.js +5 -4
  114. package/build/cjs/common/components/clusterDetail/ProgressBarTexts.js.map +1 -1
  115. package/build/cjs/common/components/clusterWizard/ReviewValidations.js +7 -6
  116. package/build/cjs/common/components/clusterWizard/ReviewValidations.js.map +1 -1
  117. package/build/cjs/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.js +2 -2
  118. package/build/cjs/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.js.map +1 -1
  119. package/build/cjs/common/components/hosts/HostPropertyValidationPopover.js +6 -6
  120. package/build/cjs/common/components/hosts/HostPropertyValidationPopover.js.map +1 -1
  121. package/build/cjs/common/components/hosts/HostStatus.js +2 -1
  122. package/build/cjs/common/components/hosts/HostStatus.js.map +1 -1
  123. package/build/cjs/common/components/hosts/HostValidationGroups.js +6 -6
  124. package/build/cjs/common/components/hosts/HostValidationGroups.js.map +1 -1
  125. package/build/cjs/common/components/hosts/Hostname.js +4 -3
  126. package/build/cjs/common/components/hosts/Hostname.js.map +1 -1
  127. package/build/cjs/common/components/hosts/MassChangeHostnameModal.js +2 -2
  128. package/build/cjs/common/components/hosts/MassChangeHostnameModal.js.map +1 -1
  129. package/build/cjs/common/components/hosts/VMRebootConfigurationInfo.js +2 -1
  130. package/build/cjs/common/components/hosts/VMRebootConfigurationInfo.js.map +1 -1
  131. package/build/cjs/common/components/hosts/status.js +19 -13
  132. package/build/cjs/common/components/hosts/status.js.map +1 -1
  133. package/build/cjs/common/components/storage/DisksTable.js +4 -2
  134. package/build/cjs/common/components/storage/DisksTable.js.map +1 -1
  135. package/build/cjs/common/components/storage/StorageUtils.js +3 -2
  136. package/build/cjs/common/components/storage/StorageUtils.js.map +1 -1
  137. package/build/cjs/common/components/ui/WizardNavItem.js +2 -2
  138. package/build/cjs/common/components/ui/WizardNavItem.js.map +1 -1
  139. package/build/cjs/common/components/ui/formik/RemovableField.js +3 -3
  140. package/build/cjs/common/components/ui/formik/RemovableField.js.map +1 -1
  141. package/build/cjs/common/components/ui/formik/RichInputField.js +4 -4
  142. package/build/cjs/common/components/ui/formik/RichInputField.js.map +1 -1
  143. package/build/cjs/common/components/ui/formik/TextAreaField.js +1 -1
  144. package/build/cjs/common/components/ui/formik/TextAreaField.js.map +1 -1
  145. package/build/cjs/common/components/ui/index.js +1 -3
  146. package/build/cjs/common/components/ui/index.js.map +1 -1
  147. package/build/cjs/common/config/constants.js +19 -2
  148. package/build/cjs/common/config/constants.js.map +1 -1
  149. package/build/cjs/common/config/docs_links.js +3 -2
  150. package/build/cjs/common/config/docs_links.js.map +1 -1
  151. package/build/cjs/common/validationSchemas/addressValidation.js +19 -5
  152. package/build/cjs/common/validationSchemas/addressValidation.js.map +1 -1
  153. package/build/cjs/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js +1 -7
  154. package/build/cjs/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js.map +1 -1
  155. package/build/cjs/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js +4 -4
  156. package/build/cjs/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js.map +1 -1
  157. package/build/cjs/ocm/components/clusterConfiguration/OpenshiftVersionHelperText.js +5 -2
  158. package/build/cjs/ocm/components/clusterConfiguration/OpenshiftVersionHelperText.js.map +1 -1
  159. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js +90 -6
  160. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js.map +1 -1
  161. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.js +3 -3
  162. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.js.map +1 -1
  163. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js +5 -2
  164. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js.map +1 -1
  165. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.js +68 -0
  166. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.js.map +1 -0
  167. package/build/cjs/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.js +5 -3
  168. package/build/cjs/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.js.map +1 -1
  169. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js +1 -1
  170. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js.map +1 -1
  171. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.js +11 -7
  172. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.js.map +1 -1
  173. package/build/cjs/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.js +5 -2
  174. package/build/cjs/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.js.map +1 -1
  175. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.js +1 -1
  176. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.js.map +1 -1
  177. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.js +1 -1
  178. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.js.map +1 -1
  179. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.js +31 -3
  180. package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.js.map +1 -1
  181. package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js +1 -5
  182. package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js.map +1 -1
  183. package/build/cjs/ocm/components/clusterDetail/HostInventoryExpandable.js +5 -4
  184. package/build/cjs/ocm/components/clusterDetail/HostInventoryExpandable.js.map +1 -1
  185. package/build/cjs/ocm/components/clusterDetail/OpenShiftVersionDetail.js +4 -3
  186. package/build/cjs/ocm/components/clusterDetail/OpenShiftVersionDetail.js.map +1 -1
  187. package/build/cjs/ocm/components/clusterDetail/ResetClusterModal.js +4 -2
  188. package/build/cjs/ocm/components/clusterDetail/ResetClusterModal.js.map +1 -1
  189. package/build/cjs/ocm/components/clusterWizard/ClusterDetails.js +18 -10
  190. package/build/cjs/ocm/components/clusterWizard/ClusterDetails.js.map +1 -1
  191. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js +4 -5
  192. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js.map +1 -1
  193. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContext.js.map +1 -1
  194. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContextProvider.js +13 -31
  195. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContextProvider.js.map +1 -1
  196. package/build/cjs/ocm/components/clusterWizard/constants.js +1 -0
  197. package/build/cjs/ocm/components/clusterWizard/constants.js.map +1 -1
  198. package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js +24 -46
  199. package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js.map +1 -1
  200. package/build/cjs/ocm/components/clusterWizard/disconnected/ReviewStep.js +1 -1
  201. package/build/cjs/ocm/components/clusterWizard/disconnected/ReviewStep.js.map +1 -1
  202. package/build/cjs/ocm/components/clusterWizard/wizardTransition.js +9 -1
  203. package/build/cjs/ocm/components/clusterWizard/wizardTransition.js.map +1 -1
  204. package/build/cjs/ocm/components/clusters/ClusterStatus.js +13 -7
  205. package/build/cjs/ocm/components/clusters/ClusterStatus.js.map +1 -1
  206. package/build/cjs/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js +7 -6
  207. package/build/cjs/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js.map +1 -1
  208. package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js +6 -0
  209. package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js.map +1 -1
  210. package/build/cjs/ocm/components/ui/InfoLinkWithModal.js +2 -2
  211. package/build/cjs/ocm/components/ui/InfoLinkWithModal.js.map +1 -1
  212. package/build/cjs/ocm/components/utils.js +4 -1
  213. package/build/cjs/ocm/components/utils.js.map +1 -1
  214. package/build/cjs/ocm/hooks/useUISettings.js +0 -1
  215. package/build/cjs/ocm/hooks/useUISettings.js.map +1 -1
  216. package/build/cjs/ocm/services/ClusterDetailsService.js +2 -2
  217. package/build/cjs/ocm/services/ClusterDetailsService.js.map +1 -1
  218. package/lib/cim/components/Agent/BMHStatusInfo.tsx +12 -4
  219. package/lib/cim/components/Agent/MinimalHWRequirements.tsx +4 -2
  220. package/lib/cim/components/Hypershift/DetailsPage/ConditionsTable.tsx +13 -7
  221. package/lib/cim/components/Hypershift/DetailsPage/HostedClusterProgress.tsx +8 -4
  222. package/lib/cim/components/Hypershift/DetailsPage/NodePoolsProgress.tsx +6 -2
  223. package/lib/cim/components/Hypershift/utils/status.tsx +20 -9
  224. package/lib/cim/components/InfraEnv/EnvironmentDetails.tsx +11 -4
  225. package/lib/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.tsx +4 -6
  226. package/lib/cim/components/helpers/agentStatus.tsx +7 -3
  227. package/lib/cim/components/modals/MassDeleteAgentModal.tsx +12 -5
  228. package/lib/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.tsx +5 -2
  229. package/lib/common/components/clusterDetail/FinalizingProgress.tsx +21 -10
  230. package/lib/common/components/clusterDetail/OperatorsProgressItem.tsx +11 -5
  231. package/lib/common/components/clusterDetail/ProgressBarTexts.tsx +17 -5
  232. package/lib/common/components/clusterWizard/ReviewValidations.tsx +15 -6
  233. package/lib/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.tsx +0 -2
  234. package/lib/common/components/hosts/HostPropertyValidationPopover.tsx +9 -5
  235. package/lib/common/components/hosts/HostStatus.tsx +14 -3
  236. package/lib/common/components/hosts/HostValidationGroups.tsx +9 -5
  237. package/lib/common/components/hosts/Hostname.tsx +7 -4
  238. package/lib/common/components/hosts/MassChangeHostnameModal.tsx +6 -2
  239. package/lib/common/components/hosts/VMRebootConfigurationInfo.tsx +12 -3
  240. package/lib/common/components/hosts/status.tsx +46 -13
  241. package/lib/common/components/storage/DisksTable.tsx +15 -4
  242. package/lib/common/components/storage/StorageUtils.tsx +6 -4
  243. package/lib/common/components/ui/WizardNavItem.tsx +4 -7
  244. package/lib/common/components/ui/formik/RemovableField.tsx +8 -4
  245. package/lib/common/components/ui/formik/RichInputField.tsx +10 -6
  246. package/lib/common/components/ui/formik/TextAreaField.tsx +1 -1
  247. package/lib/common/components/ui/index.ts +0 -2
  248. package/lib/common/config/constants.ts +18 -0
  249. package/lib/common/config/docs_links.ts +2 -0
  250. package/lib/common/types/ui-settings.ts +0 -1
  251. package/lib/common/validationSchemas/addressValidation.tsx +20 -12
  252. package/lib/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.tsx +1 -8
  253. package/lib/ocm/components/clusterConfiguration/OcmOperatorProgressItem.tsx +11 -5
  254. package/lib/ocm/components/clusterConfiguration/OpenshiftVersionHelperText.tsx +8 -7
  255. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.tsx +155 -20
  256. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.tsx +8 -6
  257. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx +6 -3
  258. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.tsx +157 -0
  259. package/lib/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.tsx +6 -3
  260. package/lib/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.tsx +3 -7
  261. package/lib/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.tsx +28 -15
  262. package/lib/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.tsx +8 -2
  263. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.tsx +1 -0
  264. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.tsx +2 -2
  265. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx +63 -24
  266. package/lib/ocm/components/clusterDetail/ClusterProperties.tsx +2 -6
  267. package/lib/ocm/components/clusterDetail/HostInventoryExpandable.tsx +11 -5
  268. package/lib/ocm/components/clusterDetail/OpenShiftVersionDetail.tsx +8 -5
  269. package/lib/ocm/components/clusterDetail/ResetClusterModal.tsx +6 -3
  270. package/lib/ocm/components/clusterWizard/ClusterDetails.tsx +19 -14
  271. package/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +5 -7
  272. package/lib/ocm/components/clusterWizard/ClusterWizardContext.tsx +0 -8
  273. package/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx +14 -54
  274. package/lib/ocm/components/clusterWizard/constants.ts +1 -0
  275. package/lib/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.tsx +27 -65
  276. package/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx +1 -1
  277. package/lib/ocm/components/clusterWizard/wizardTransition.ts +9 -1
  278. package/lib/ocm/components/clusters/ClusterStatus.tsx +30 -8
  279. package/lib/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.tsx +12 -8
  280. package/lib/ocm/components/featureSupportLevels/featureStateUtils.ts +6 -0
  281. package/lib/ocm/components/ui/InfoLinkWithModal.tsx +4 -2
  282. package/lib/ocm/components/utils.ts +4 -0
  283. package/lib/ocm/hooks/useUISettings.ts +0 -1
  284. package/lib/ocm/services/ClusterDetailsService.ts +0 -3
  285. package/lib/ocm/services/types.ts +0 -1
  286. package/package.json +4 -4
  287. package/build/@types/common/components/ui/UiIcon.d.ts +0 -11
  288. package/build/@types/common/components/ui/UiIcon.d.ts.map +0 -1
  289. package/build/@types/ocm/components/clusterConfiguration/CustomManifestCheckbox.d.ts +0 -8
  290. package/build/@types/ocm/components/clusterConfiguration/CustomManifestCheckbox.d.ts.map +0 -1
  291. package/build/cjs/common/components/ui/UiIcon.js +0 -11
  292. package/build/cjs/common/components/ui/UiIcon.js.map +0 -1
  293. package/build/cjs/ocm/components/clusterConfiguration/CustomManifestCheckbox.js +0 -58
  294. package/build/cjs/ocm/components/clusterConfiguration/CustomManifestCheckbox.js.map +0 -1
  295. package/lib/common/components/ui/UiIcon.tsx +0 -21
  296. package/lib/ocm/components/clusterConfiguration/CustomManifestCheckbox.tsx +0 -114
@@ -1,10 +1,25 @@
1
1
  import React from 'react';
2
- import { Content, ContentVariants, Alert, Grid } from '@patternfly/react-core';
2
+ import {
3
+ Content,
4
+ ContentVariants,
5
+ Alert,
6
+ AlertVariant,
7
+ Grid,
8
+ FormGroup,
9
+ Switch,
10
+ Tooltip,
11
+ Stack,
12
+ StackItem,
13
+ } from '@patternfly/react-core';
3
14
 
4
15
  import { CustomManifests } from './components/CustomManifests';
5
16
  import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
6
17
  import { CustomManifestFormState } from './components/propTypes';
7
- import { ClusterWizardStepHeader } from '../../../../common';
18
+ import { ClustersAPI, ClusterWizardStepHeader } from '../../../../common';
19
+ import { isOciPlatformType, isThirdPartyCNI } from '../../utils';
20
+ import DeleteCustomManifestModal from './DeleteCustomManifestModal';
21
+ import { ClustersService } from '../../../services';
22
+ import { useClusterWizardContext } from '../../clusterWizard/ClusterWizardContext';
8
23
 
9
24
  export const CustomManifestsPage = ({
10
25
  cluster,
@@ -12,22 +27,142 @@ export const CustomManifestsPage = ({
12
27
  }: {
13
28
  cluster: Cluster;
14
29
  onFormStateChange(formState: CustomManifestFormState): void;
15
- }) => (
16
- <Grid hasGutter>
17
- <Content>
18
- <ClusterWizardStepHeader>Custom manifests</ClusterWizardStepHeader>
19
- <Content component={ContentVariants.small}>
20
- Upload additional manifests that will be applied at the install time for advanced
21
- configuration of the cluster.
22
- </Content>
23
- </Content>
24
- <Alert
25
- isInline
26
- variant="warning"
27
- title={
28
- 'No validation is performed for the custom manifest contents. Only include resources that are necessary for initial setup to reduce the chance of installation failures.'
30
+ }) => {
31
+ const clusterWizardContext = useClusterWizardContext();
32
+ const isRequired = isThirdPartyCNI(cluster.networkType) || isOciPlatformType(cluster);
33
+ const [useCustomManifests, setUseCustomManifests] = React.useState(isRequired);
34
+ const [isDeleteModalOpen, setDeleteModalOpen] = React.useState(false);
35
+
36
+ React.useEffect(() => {
37
+ if (isRequired || clusterWizardContext.uiSettings?.customManifestsAdded) {
38
+ setUseCustomManifests(true);
39
+ }
40
+ }, [isRequired, clusterWizardContext]);
41
+
42
+ // The form unmounts when the switch is off, but its last state persists in the parent.
43
+ React.useEffect(() => {
44
+ if (!useCustomManifests) {
45
+ onFormStateChange({
46
+ isValid: true,
47
+ isSubmitting: false,
48
+ isAutoSaveRunning: false,
49
+ errors: {},
50
+ touched: {},
51
+ isEmpty: true,
52
+ });
53
+ }
54
+ }, [useCustomManifests, onFormStateChange]);
55
+
56
+ const handleSwitchChange = React.useCallback(
57
+ (_event: React.FormEvent<HTMLInputElement>, on: boolean) => {
58
+ if (!on && clusterWizardContext.uiSettings?.customManifestsAdded) {
59
+ setDeleteModalOpen(true);
60
+ } else {
61
+ setUseCustomManifests(on);
62
+ if (!on) {
63
+ void clusterWizardContext.updateUISettings({ customManifestsAdded: false });
64
+ }
29
65
  }
30
- />
31
- <CustomManifests cluster={cluster} onFormStateChange={onFormStateChange} />
32
- </Grid>
33
- );
66
+ },
67
+ [clusterWizardContext],
68
+ );
69
+
70
+ const handleCloseDeleteModal = React.useCallback(() => {
71
+ setDeleteModalOpen(false);
72
+ }, []);
73
+
74
+ const cleanCustomManifests = React.useCallback(async () => {
75
+ if (!clusterWizardContext.uiSettings?.customManifestsAdded || !cluster.id) return;
76
+ const { data: manifests } = await ClustersAPI.getManifests(cluster.id);
77
+ await ClustersService.removeClusterManifests(manifests, cluster.id);
78
+ setUseCustomManifests(false);
79
+ setDeleteModalOpen(false);
80
+ await clusterWizardContext.updateUISettings({ customManifestsAdded: false });
81
+ }, [cluster.id, clusterWizardContext]);
82
+
83
+ const tooltipWhenDisabled = isRequired
84
+ ? 'Custom manifests are required when using a third-party CNI or Oracle Cloud Infrastructure.'
85
+ : '';
86
+
87
+ const showExternalPlatformReminder = isOciPlatformType(cluster);
88
+ const showThirdPartyCnIReminder = isThirdPartyCNI(cluster.networkType);
89
+ const showCombinedReminder = showExternalPlatformReminder && showThirdPartyCnIReminder;
90
+ let reminderAlerts: React.ReactNode = null;
91
+ if (showCombinedReminder) {
92
+ reminderAlerts = (
93
+ <Stack>
94
+ <StackItem>
95
+ <Alert
96
+ variant={AlertVariant.info}
97
+ isInline
98
+ title="You're using an external platform and a third-party CNI"
99
+ >
100
+ Make sure to upload the required custom and CNI manifests in this step.
101
+ </Alert>
102
+ </StackItem>
103
+ </Stack>
104
+ );
105
+ } else if (showExternalPlatformReminder) {
106
+ reminderAlerts = (
107
+ <Stack>
108
+ <StackItem>
109
+ <Alert variant={AlertVariant.info} isInline title="You're using an external platform">
110
+ Make sure to upload the required custom manifests in this step.
111
+ </Alert>
112
+ </StackItem>
113
+ </Stack>
114
+ );
115
+ } else if (showThirdPartyCnIReminder) {
116
+ reminderAlerts = (
117
+ <Stack>
118
+ <StackItem>
119
+ <Alert variant={AlertVariant.info} isInline title="You're using a third-party CNI">
120
+ Make sure to upload the required CNI manifests in this step.
121
+ </Alert>
122
+ </StackItem>
123
+ </Stack>
124
+ );
125
+ }
126
+
127
+ return (
128
+ <Grid hasGutter>
129
+ <Content>
130
+ <ClusterWizardStepHeader>Custom manifests</ClusterWizardStepHeader>
131
+ <Content component={ContentVariants.small}>
132
+ Upload additional manifests that will be applied at the install time for advanced
133
+ configuration of the cluster.
134
+ </Content>
135
+ </Content>
136
+ <FormGroup fieldId="use-custom-manifests" label="">
137
+ <Tooltip content={tooltipWhenDisabled} hidden={!isRequired}>
138
+ <span style={{ display: 'inline-block', cursor: isRequired ? 'not-allowed' : undefined }}>
139
+ <Switch
140
+ id="use-custom-manifests"
141
+ isChecked={useCustomManifests}
142
+ isDisabled={isRequired}
143
+ onChange={handleSwitchChange}
144
+ label="Use custom manifests"
145
+ />
146
+ </span>
147
+ </Tooltip>
148
+ </FormGroup>
149
+ {!useCustomManifests && <div style={{ minHeight: '120px' }} aria-hidden="true" />}
150
+ {useCustomManifests && (
151
+ <>
152
+ {reminderAlerts}
153
+ <Alert
154
+ isInline
155
+ variant="warning"
156
+ title="No validation is performed for the custom manifest contents. Only include resources that are necessary for initial setup to reduce the chance of installation failures."
157
+ />
158
+ <CustomManifests cluster={cluster} onFormStateChange={onFormStateChange} />
159
+ </>
160
+ )}
161
+ <DeleteCustomManifestModal
162
+ isOpen={isDeleteModalOpen}
163
+ onClose={handleCloseDeleteModal}
164
+ onDelete={() => void cleanCustomManifests()}
165
+ />
166
+ </Grid>
167
+ );
168
+ };
@@ -23,9 +23,9 @@ import {
23
23
  VirtualIPControlGroupProps,
24
24
  AdvancedNetworkFields,
25
25
  } from '../../../../common/components/clusterWizard/networkingSteps';
26
+ import { NetworkTypeDropDown } from './NetworkTypeDropdown';
26
27
  import { selectCurrentClusterPermissionsState } from '../../../store/slices/current-cluster/selectors';
27
28
  import { OcmCheckbox } from '../../ui/OcmFormFields';
28
- import { NetworkTypeControlGroup } from '../../../../common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup';
29
29
  import {
30
30
  NewFeatureSupportLevelData,
31
31
  NewFeatureSupportLevelMap,
@@ -259,11 +259,13 @@ const NetworkConfiguration = ({
259
259
  />
260
260
  </StackItem>
261
261
  )}
262
- {isSDNSupported && (
263
- <StackItem>
264
- <NetworkTypeControlGroup isDisabled={isViewerMode} isSDNSelectable={isSDNSelectable} />
265
- </StackItem>
266
- )}
262
+ <StackItem>
263
+ <NetworkTypeDropDown
264
+ isDisabled={isViewerMode}
265
+ isSDNSelectable={isSDNSelectable}
266
+ featureSupportLevelData={featureSupportLevelData}
267
+ />
268
+ </StackItem>
267
269
 
268
270
  {!(isUserManagedNetworking && !isSNOCluster) && (
269
271
  <StackItem>
@@ -236,9 +236,13 @@ const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
236
236
  const isMultiNodeCluster = !isSNO(cluster);
237
237
  const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';
238
238
 
239
+ // Only send VIPs that have a non-empty IP;
240
+ const apiVips = (values.apiVips || []).filter((v) => (v?.ip ?? '').trim() !== '');
241
+ const ingressVips = (values.ingressVips || []).filter((v) => (v?.ip ?? '').trim() !== '');
242
+
239
243
  const params: V2ClusterUpdateParams = {
240
- apiVips: values.apiVips,
241
- ingressVips: values.ingressVips,
244
+ apiVips,
245
+ ingressVips,
242
246
  sshPublicKey: values.sshPublicKey,
243
247
  vipDhcpAllocation: values.vipDhcpAllocation,
244
248
  networkType: values.networkType,
@@ -247,7 +251,6 @@ const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
247
251
  serviceNetworks: values.serviceNetworks,
248
252
  userManagedNetworking: isUserManagedNetworking,
249
253
  };
250
-
251
254
  if (params.userManagedNetworking) {
252
255
  params.apiVips = [];
253
256
  params.ingressVips = [];
@@ -0,0 +1,157 @@
1
+ import React from 'react';
2
+ import { useField, useFormikContext } from 'formik';
3
+ import {
4
+ Alert,
5
+ AlertVariant,
6
+ Dropdown,
7
+ DropdownItem,
8
+ FormGroup,
9
+ MenuToggle,
10
+ MenuToggleElement,
11
+ Stack,
12
+ StackItem,
13
+ Tooltip,
14
+ } from '@patternfly/react-core';
15
+ import {
16
+ NETWORK_TYPE_CALICO,
17
+ NETWORK_TYPE_CILIUM,
18
+ NETWORK_TYPE_CISCO_ACI,
19
+ NETWORK_TYPE_LABELS,
20
+ NETWORK_TYPE_NONE,
21
+ NETWORK_TYPE_OVN,
22
+ NETWORK_TYPE_SDN,
23
+ } from '../../../../common/config';
24
+ import { getFieldId, ExternalLink } from '../../../../common/components/ui';
25
+ import {
26
+ NewFeatureSupportLevelMap,
27
+ useNewFeatureSupportLevel,
28
+ } from '../../../../common/components/newFeatureSupportLevels';
29
+ import { TechnologyPreview } from '../../../../common/components/ui/TechnologyPreview';
30
+ import type { NetworkConfigurationValues } from '../../../../common/types/clusters';
31
+ import { isThirdPartyCNI } from '../../utils';
32
+ import { RED_HAT_CNI_SUPPORT_MATRIX_LINK } from '../../../../common/config/docs_links';
33
+
34
+ export interface NetworkTypeDropDownProps {
35
+ isDisabled?: boolean;
36
+ isSDNSelectable: boolean;
37
+ featureSupportLevelData: NewFeatureSupportLevelMap | null;
38
+ }
39
+
40
+ export const NetworkTypeDropDown = ({
41
+ isDisabled = false,
42
+ isSDNSelectable,
43
+ featureSupportLevelData,
44
+ }: NetworkTypeDropDownProps) => {
45
+ const [field, , { setValue }] = useField<string>('networkType');
46
+ const [isOpen, setOpen] = React.useState(false);
47
+ const { values } = useFormikContext<NetworkConfigurationValues>();
48
+ const { getFeatureDisabledReason } = useNewFeatureSupportLevel();
49
+ const fieldId = getFieldId('networkType', 'input');
50
+ const showThirdPartyBanner = isThirdPartyCNI(values.networkType);
51
+
52
+ const sdnDisabledReason = React.useMemo(() => {
53
+ if (!isSDNSelectable) {
54
+ return 'SDN is not supported for SNO clusters or when IPv6 is detected.';
55
+ }
56
+ return getFeatureDisabledReason('SDN_NETWORK_TYPE', featureSupportLevelData ?? undefined);
57
+ }, [isSDNSelectable, featureSupportLevelData, getFeatureDisabledReason]);
58
+
59
+ React.useEffect(() => {
60
+ if (field.value === NETWORK_TYPE_SDN && sdnDisabledReason) {
61
+ setValue(NETWORK_TYPE_OVN);
62
+ }
63
+ }, [sdnDisabledReason, field.value, setValue]);
64
+
65
+ const currentDisplayValue = NETWORK_TYPE_LABELS[field.value];
66
+
67
+ const dropdownItems = Object.entries(NETWORK_TYPE_LABELS).map(([value, label]) => {
68
+ const isSDN = value === NETWORK_TYPE_SDN;
69
+ const disabledReason = isSDN ? sdnDisabledReason : undefined;
70
+ const isTechPreview = [
71
+ NETWORK_TYPE_CISCO_ACI,
72
+ NETWORK_TYPE_CILIUM,
73
+ NETWORK_TYPE_CALICO,
74
+ NETWORK_TYPE_NONE,
75
+ ].includes(value);
76
+ return (
77
+ <DropdownItem
78
+ key={value}
79
+ id={value}
80
+ value={value}
81
+ isAriaDisabled={disabledReason !== undefined}
82
+ >
83
+ <Tooltip hidden={!disabledReason} content={disabledReason} position="top">
84
+ <div>
85
+ {label}
86
+ {isTechPreview && (
87
+ <span onClick={(event) => event.stopPropagation()}>
88
+ <TechnologyPreview testId={`${value}-support-level`} />
89
+ </span>
90
+ )}
91
+ </div>
92
+ </Tooltip>
93
+ </DropdownItem>
94
+ );
95
+ });
96
+
97
+ const onSelect = (event?: React.MouseEvent<Element, MouseEvent>, nextValue?: string): void => {
98
+ if (nextValue) {
99
+ setValue(nextValue);
100
+ }
101
+ setOpen(false);
102
+ };
103
+
104
+ const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (
105
+ <MenuToggle
106
+ ref={toggleRef}
107
+ onClick={() => setOpen(!isOpen)}
108
+ isExpanded={isOpen}
109
+ isDisabled={isDisabled}
110
+ id={fieldId}
111
+ className="pf-v6-u-w-100"
112
+ style={{ minWidth: '100%' }}
113
+ >
114
+ {currentDisplayValue}
115
+ </MenuToggle>
116
+ );
117
+
118
+ return (
119
+ <Stack hasGutter>
120
+ <StackItem>
121
+ <FormGroup fieldId={fieldId} label="Network type" id={`form-control__${fieldId}`}>
122
+ <Dropdown
123
+ id={`${fieldId}-dropdown`}
124
+ onOpenChange={(open: boolean) => setOpen(open)}
125
+ onSelect={onSelect}
126
+ toggle={toggle}
127
+ isOpen={isOpen}
128
+ >
129
+ {dropdownItems}
130
+ </Dropdown>
131
+ </FormGroup>
132
+ </StackItem>
133
+ {showThirdPartyBanner && (
134
+ <StackItem>
135
+ <Alert
136
+ variant={AlertVariant.warning}
137
+ isInline
138
+ title="Third-party CNI (Technology Preview)"
139
+ >
140
+ <Stack hasGutter>
141
+ <StackItem>
142
+ Third-party CNIs require uploading CNI manifests. Please verify you have the
143
+ required manifests and that the chosen CNI is compatible with your platform and
144
+ OpenShift version.
145
+ </StackItem>
146
+ <StackItem>
147
+ <ExternalLink href={RED_HAT_CNI_SUPPORT_MATRIX_LINK}>
148
+ Red Hat CNI Support Matrix
149
+ </ExternalLink>
150
+ </StackItem>
151
+ </Stack>
152
+ </Alert>
153
+ </StackItem>
154
+ )}
155
+ </Stack>
156
+ );
157
+ };
@@ -1,14 +1,17 @@
1
1
  import React from 'react';
2
+ import { Icon } from '@patternfly/react-core';
2
3
  import { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon';
3
- import { UiIcon, SupportedPlatformType } from '../../../../common';
4
+ import { SupportedPlatformType } from '../../../../common';
4
5
  import { ExternalPlatformLinks } from './constants';
5
6
 
6
7
  const PlatformIntegrationNote = ({ platformType }: { platformType: SupportedPlatformType }) => {
7
8
  const integrationPlatformLink = ExternalPlatformLinks[platformType];
8
9
  return (
9
10
  <p>
10
- <UiIcon status="warning" icon={<ExclamationTriangleIcon />} /> You will need to modify your
11
- platform configuration after cluster installation is completed.{' '}
11
+ <Icon status="warning">
12
+ <ExclamationTriangleIcon />
13
+ </Icon>{' '}
14
+ You will need to modify your platform configuration after cluster installation is completed.{' '}
12
15
  {!!integrationPlatformLink && (
13
16
  <a
14
17
  href={integrationPlatformLink || ''}
@@ -1,12 +1,8 @@
1
1
  import { Title } from '@patternfly/react-core';
2
2
  import { Table, TableVariant, Tbody, Td, Tr } from '@patternfly/react-table';
3
3
  import React from 'react';
4
- import { genericTableRowKey, isDualStack } from '../../../../common';
5
- import {
6
- getManagementType,
7
- getStackTypeLabel,
8
- getNetworkType,
9
- } from '../../clusterDetail/ClusterProperties';
4
+ import { genericTableRowKey, isDualStack, NETWORK_TYPE_LABELS } from '../../../../common';
5
+ import { getManagementType, getStackTypeLabel } from '../../clusterDetail/ClusterProperties';
10
6
  import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
11
7
 
12
8
  type ReviewTableRowsType = {
@@ -201,7 +197,7 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
201
197
  cells: [
202
198
  { title: 'Networking type' },
203
199
  {
204
- title: getNetworkType(cluster.networkType),
200
+ title: cluster.networkType ? NETWORK_TYPE_LABELS[cluster.networkType] : '-',
205
201
  props: { 'data-testid': 'networking-type', colSpan: 2 },
206
202
  },
207
203
  ],
@@ -6,20 +6,13 @@ import {
6
6
  Grid,
7
7
  GridItem,
8
8
  gridSpans,
9
+ Icon,
9
10
  } from '@patternfly/react-core';
10
11
  import { CheckCircleIcon } from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
11
12
  import { ExclamationCircleIcon } from '@patternfly/react-icons/dist/js/icons/exclamation-circle-icon';
12
13
  import { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon';
13
14
  import { InfoCircleIcon } from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
14
- import { t_global_color_status_success_default as okColor } from '@patternfly/react-tokens/dist/js/t_global_color_status_success_default';
15
- import { t_global_color_status_info_100 as infoColor } from '@patternfly/react-tokens/dist/js/t_global_color_status_info_100';
16
- import {
17
- ClusterValidations,
18
- DetailItem,
19
- DetailList,
20
- HostsValidations,
21
- UiIcon,
22
- } from '../../../../common';
15
+ import { ClusterValidations, DetailItem, DetailList, HostsValidations } from '../../../../common';
23
16
  import { useClusterWizardContext } from '../../clusterWizard/ClusterWizardContext';
24
17
  import { useOpenShiftVersionsContext } from '../../clusterWizard/OpenShiftVersionsContext';
25
18
  import { wizardStepNames } from '../../clusterWizard/constants';
@@ -102,13 +95,29 @@ const PreflightCheckInfo = ({
102
95
 
103
96
  const getCheckIcon = (validationStatuses: string[]) => {
104
97
  if (validationStatuses.includes('failure') || validationStatuses.includes('error')) {
105
- return <UiIcon size="sm" status="danger" icon={<ExclamationCircleIcon />} />;
98
+ return (
99
+ <Icon size="sm" status="danger">
100
+ <ExclamationCircleIcon />
101
+ </Icon>
102
+ );
106
103
  } else if (validationStatuses.includes('warning')) {
107
- return <UiIcon size="sm" status="warning" icon={<ExclamationTriangleIcon />} />;
104
+ return (
105
+ <Icon size="sm" status="warning">
106
+ <ExclamationTriangleIcon />
107
+ </Icon>
108
+ );
108
109
  } else if (validationStatuses.includes('pending')) {
109
- return <UiIcon size="sm" status="info" icon={<InfoCircleIcon />} />;
110
+ return (
111
+ <Icon size="sm" status="info">
112
+ <InfoCircleIcon />
113
+ </Icon>
114
+ );
110
115
  }
111
- return <UiIcon size="sm" icon={<CheckCircleIcon color={okColor.value} />} />;
116
+ return (
117
+ <Icon status="success" size="sm">
118
+ <CheckCircleIcon />
119
+ </Icon>
120
+ );
112
121
  };
113
122
 
114
123
  const PreflightChecksDetailCollapsed = ({ cluster }: { cluster: Cluster }) => {
@@ -122,9 +131,13 @@ const PreflightChecksDetailCollapsed = ({ cluster }: { cluster: Cluster }) => {
122
131
  );
123
132
 
124
133
  const supportLevelIcon = isFullySupported ? (
125
- <UiIcon size="sm" icon={<CheckCircleIcon color={okColor.value} />} />
134
+ <Icon status="success" size="sm">
135
+ <CheckCircleIcon />
136
+ </Icon>
126
137
  ) : (
127
- <UiIcon size="sm" icon={<InfoCircleIcon color={infoColor.value} />} />
138
+ <Icon status="info" size="sm">
139
+ <InfoCircleIcon />
140
+ </Icon>
128
141
  );
129
142
 
130
143
  const clusterValidations = React.useMemo(
@@ -92,11 +92,17 @@ export const getIpAddressValidationSchema = (protocolVersion: ProtocolVersion) =
92
92
  const protocolVersionLabel = protocolVersion === ProtocolVersion.ipv4 ? 'IPv4' : 'IPv6';
93
93
  return Yup.string().test(
94
94
  protocolVersion,
95
- `Value \${value} is not a valid ${protocolVersionLabel} address`,
95
+ (params: { value?: unknown }) =>
96
+ `Value "${
97
+ params?.value !== undefined ? String(params.value) : ''
98
+ }" is not a valid ${protocolVersionLabel} address`,
96
99
  (value?: string) => {
97
- if (!value) {
100
+ if (value === undefined || value === '') {
98
101
  return true;
99
102
  }
103
+ if (typeof value !== 'string') {
104
+ return false;
105
+ }
100
106
  return isValidAddress(value, protocolVersion);
101
107
  },
102
108
  );
@@ -96,6 +96,7 @@ const getExpandedHostComponent = (protocolType: StaticProtocolType) => {
96
96
  label={`IP address (${getProtocolVersionLabel(protocolVersion)})`}
97
97
  fieldId={getFieldId(`${fieldName}.ips.${protocolVersion}`, 'input')}
98
98
  key={protocolVersion}
99
+ isRequired
99
100
  >
100
101
  <OcmInputField
101
102
  name={`${fieldName}.ips.${protocolVersion}`}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { StaticIpForm } from '../StaticIpForm';
3
3
  import { StaticIpFormProps, StaticIpViewProps } from '../propTypes';
4
4
  import { FormViewHost, FormViewNetworkWideValues } from '../../data/dataTypes';
5
- import { networkWideValidationSchema } from './formViewNetworkWideValidationSchema';
5
+ import { getNetworkWideValidationSchema } from './formViewNetworkWideValidationSchema';
6
6
  import { networkWideToInfraEnvField } from '../../data/formDataToInfraEnvField';
7
7
  import { FormViewNetworkWideFields } from './FormViewNetworkWideFields';
8
8
  import { getFormData, getFormViewNetworkWideValues } from '../../data/fromInfraEnv';
@@ -22,7 +22,7 @@ export const FormViewNetworkWide: React.FC<StaticIpViewProps> = ({ infraEnv, ...
22
22
  setFormProps({
23
23
  infraEnv,
24
24
  ...props,
25
- validationSchema: networkWideValidationSchema,
25
+ validationSchema: getNetworkWideValidationSchema(infraEnv.rendezvousIp),
26
26
  getInitialValues: (infraEnv: InfraEnv) => {
27
27
  return getFormViewNetworkWideValues(infraEnv);
28
28
  },
@@ -95,32 +95,71 @@ const getAddressDataValidationSchema = (protocolVersion: ProtocolVersion, ipConf
95
95
  });
96
96
  };
97
97
 
98
- export const networkWideValidationSchema = Yup.lazy((values: FormViewNetworkWideValues) => {
99
- const ipConfigsValidationSchemas = Yup.object({
100
- ipv4: getAddressDataValidationSchema(ProtocolVersion.ipv4, values.ipConfigs.ipv4),
101
- ipv6: showProtocolVersion(values.protocolType, ProtocolVersion.ipv6)
102
- ? getAddressDataValidationSchema(ProtocolVersion.ipv6, values.ipConfigs.ipv6)
103
- : Yup.object<IpConfig>(),
104
- });
98
+ /**
99
+ * Validates that Rendezvous IP (when set) is within the IPv4 subnet.
100
+ * Default gateway is already validated by getAddressDataValidationSchema (getInMachineNetworkValidationSchema).
101
+ */
102
+ const getRendezvousIpCoherenceTest = (rendezvousIp: string | undefined) => {
103
+ return Yup.object().test(
104
+ 'rendezvous-ip-in-subnet',
105
+ 'Rendezvous IP must be within the IPv4 subnet.',
106
+ (value: unknown, context: Yup.TestContext) => {
107
+ const values = value as FormViewNetworkWideValues | undefined;
108
+ const machineNetwork = values?.ipConfigs?.ipv4?.machineNetwork;
109
+ if (
110
+ !rendezvousIp?.trim() ||
111
+ !machineNetwork?.ip?.trim() ||
112
+ machineNetwork.prefixLength === '' ||
113
+ typeof machineNetwork.prefixLength !== 'number'
114
+ ) {
115
+ return true;
116
+ }
117
+ const inSubnetSchema = getInMachineNetworkValidationSchema(
118
+ ProtocolVersion.ipv4,
119
+ machineNetwork,
120
+ );
121
+ if (!inSubnetSchema.isValidSync(rendezvousIp)) {
122
+ return context.createError({
123
+ path: 'ipConfigs.ipv4.machineNetwork.ip',
124
+ message: 'Rendezvous IP must be within the IPv4 subnet.',
125
+ });
126
+ }
127
+ return true;
128
+ },
129
+ );
130
+ };
105
131
 
106
- return Yup.object({
107
- useVlan: Yup.boolean(),
108
- vlanId: Yup.mixed().when('useVlan', {
109
- is: (useVlan: boolean) => useVlan,
110
- then: () =>
111
- Yup.number()
112
- .required(MUST_BE_A_NUMBER)
113
- .min(1, `Must be more than or equal to 1`)
114
- .max(MAX_VLAN_ID, `Must be less than or equal to ${MAX_VLAN_ID}`)
115
- .test('not-number', MUST_BE_A_NUMBER, () => validateNumber(values.vlanId))
116
- .nullable()
117
- .transform(transformNumber) as Yup.NumberSchema,
118
- }),
119
- protocolType: Yup.string(),
120
- dns: getDNSValidationSchema(values.protocolType),
121
- ipConfigs: ipConfigsValidationSchemas,
132
+ export const getNetworkWideValidationSchema = (rendezvousIp?: string) =>
133
+ Yup.lazy((values: FormViewNetworkWideValues) => {
134
+ const ipConfigsValidationSchemas = Yup.object({
135
+ ipv4: getAddressDataValidationSchema(ProtocolVersion.ipv4, values.ipConfigs.ipv4),
136
+ ipv6: showProtocolVersion(values.protocolType, ProtocolVersion.ipv6)
137
+ ? getAddressDataValidationSchema(ProtocolVersion.ipv6, values.ipConfigs.ipv6)
138
+ : Yup.object<IpConfig>(),
139
+ });
140
+
141
+ const baseSchema = Yup.object({
142
+ useVlan: Yup.boolean(),
143
+ vlanId: Yup.mixed().when('useVlan', {
144
+ is: (useVlan: boolean) => useVlan,
145
+ then: () =>
146
+ Yup.number()
147
+ .required(MUST_BE_A_NUMBER)
148
+ .min(1, `Must be more than or equal to 1`)
149
+ .max(MAX_VLAN_ID, `Must be less than or equal to ${MAX_VLAN_ID}`)
150
+ .test('not-number', MUST_BE_A_NUMBER, () => validateNumber(values.vlanId))
151
+ .nullable()
152
+ .transform(transformNumber) as Yup.NumberSchema,
153
+ }),
154
+ protocolType: Yup.string(),
155
+ dns: getDNSValidationSchema(values.protocolType),
156
+ ipConfigs: ipConfigsValidationSchemas,
157
+ });
158
+
159
+ return baseSchema.concat(getRendezvousIpCoherenceTest(rendezvousIp));
122
160
  });
123
- });
161
+
162
+ export const networkWideValidationSchema = getNetworkWideValidationSchema();
124
163
 
125
164
  export const validateNumber = (vlanId: FormViewNetworkWideValues['vlanId']) => {
126
165
  //We need to validate that value is a number(without letters) and is not an exponential number (ex: 1e2)