@openshift-assisted/ui-lib 2.52.2 → 2.53.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 (284) hide show
  1. package/build/@types/cim/components/ClusterDeployment/ClusterDeploymentWizard.d.ts +1 -1
  2. package/build/@types/cim/components/ClusterDeployment/ClusterDeploymentWizard.d.ts.map +1 -1
  3. package/build/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts +1 -1
  4. package/build/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts.map +1 -1
  5. package/build/@types/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.d.ts.map +1 -1
  6. package/build/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts +1 -1
  7. package/build/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts.map +1 -1
  8. package/build/@types/cim/components/ClusterDeployment/networking/NetworkTypeDropdown.d.ts +5 -0
  9. package/build/@types/cim/components/ClusterDeployment/networking/NetworkTypeDropdown.d.ts.map +1 -0
  10. package/build/@types/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.d.ts.map +1 -1
  11. package/build/@types/cim/components/ClusterDeployment/types.d.ts +0 -1
  12. package/build/@types/cim/components/ClusterDeployment/types.d.ts.map +1 -1
  13. package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts +4 -4
  14. package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts.map +1 -1
  15. package/build/@types/cim/components/ClusterDeployment/wizardTransition.d.ts.map +1 -1
  16. package/build/@types/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.d.ts.map +1 -1
  17. package/build/@types/cim/components/helpers/clusterDeployment.d.ts.map +1 -1
  18. package/build/@types/cim/components/helpers/versions.d.ts +2 -2
  19. package/build/@types/cim/components/helpers/versions.d.ts.map +1 -1
  20. package/build/@types/cim/components/helpers/versions.test.d.ts +2 -0
  21. package/build/@types/cim/components/helpers/versions.test.d.ts.map +1 -0
  22. package/build/@types/cim/components/modals/CimConfiguration/CimConfigurationModal.d.ts.map +1 -1
  23. package/build/@types/cim/components/modals/CimConfiguration/persist.d.ts +14 -17
  24. package/build/@types/cim/components/modals/CimConfiguration/persist.d.ts.map +1 -1
  25. package/build/@types/cim/hooks/index.d.ts +1 -0
  26. package/build/@types/cim/hooks/index.d.ts.map +1 -1
  27. package/build/@types/cim/hooks/useAgents.d.ts +4 -0
  28. package/build/@types/cim/hooks/useAgents.d.ts.map +1 -0
  29. package/build/@types/cim/types/k8s/agent-cluster-install.d.ts +1 -1
  30. package/build/@types/cim/types/k8s/agent-cluster-install.d.ts.map +1 -1
  31. package/build/@types/common/components/clusterDetail/ClusterCredentials.d.ts.map +1 -1
  32. package/build/@types/common/components/clusterDetail/ConsoleModal.d.ts +0 -5
  33. package/build/@types/common/components/clusterDetail/ConsoleModal.d.ts.map +1 -1
  34. package/build/@types/common/components/clusterWizard/customManifests/CustomManifestsAlert.d.ts +6 -0
  35. package/build/@types/common/components/clusterWizard/customManifests/CustomManifestsAlert.d.ts.map +1 -0
  36. package/build/@types/common/components/clusterWizard/customManifests/index.d.ts +2 -0
  37. package/build/@types/common/components/clusterWizard/customManifests/index.d.ts.map +1 -0
  38. package/build/@types/common/components/clusterWizard/index.d.ts +2 -0
  39. package/build/@types/common/components/clusterWizard/index.d.ts.map +1 -1
  40. package/build/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts +2 -1
  41. package/build/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts.map +1 -1
  42. package/build/@types/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.d.ts +2 -1
  43. package/build/@types/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.d.ts.map +1 -1
  44. package/build/@types/common/components/clusterWizard/networkingSteps/ThirdPartyCNIBanner.d.ts +3 -0
  45. package/build/@types/common/components/clusterWizard/networkingSteps/ThirdPartyCNIBanner.d.ts.map +1 -0
  46. package/build/@types/common/components/clusterWizard/networkingSteps/index.d.ts +1 -0
  47. package/build/@types/common/components/clusterWizard/networkingSteps/index.d.ts.map +1 -1
  48. package/build/@types/common/components/hosts/HostsTable.d.ts.map +1 -1
  49. package/build/@types/common/components/ui/WizardFooter.d.ts +1 -0
  50. package/build/@types/common/components/ui/WizardFooter.d.ts.map +1 -1
  51. package/build/@types/common/components/ui/formik/utils.d.ts +1 -0
  52. package/build/@types/common/components/ui/formik/utils.d.ts.map +1 -1
  53. package/build/@types/common/config/constants.d.ts +2 -2
  54. package/build/@types/common/config/constants.d.ts.map +1 -1
  55. package/build/@types/common/types/networkType.d.ts +2 -1
  56. package/build/@types/common/types/networkType.d.ts.map +1 -1
  57. package/build/@types/common/validationSchemas/networkingValidation.d.ts +10 -0
  58. package/build/@types/common/validationSchemas/networkingValidation.d.ts.map +1 -1
  59. package/build/@types/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.d.ts.map +1 -1
  60. package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.d.ts.map +1 -1
  61. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts.map +1 -1
  62. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.d.ts.map +1 -1
  63. package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts.map +1 -1
  64. package/build/@types/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.d.ts.map +1 -1
  65. package/build/@types/ocm/components/clusterConfiguration/review/ReviewSummary.d.ts.map +1 -1
  66. package/build/@types/ocm/components/{clusterDetail/ClusterProperties.d.ts → clusterConfiguration/review/utils.d.ts} +1 -8
  67. package/build/@types/ocm/components/clusterConfiguration/review/utils.d.ts.map +1 -0
  68. package/build/@types/ocm/components/clusterConfiguration/review/utils.test.d.ts +2 -0
  69. package/build/@types/ocm/components/clusterConfiguration/review/utils.test.d.ts.map +1 -0
  70. package/build/@types/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.d.ts.map +1 -1
  71. package/build/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.d.ts +1 -0
  72. package/build/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.d.ts.map +1 -1
  73. package/build/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.d.ts +1 -1
  74. package/build/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.d.ts.map +1 -1
  75. package/build/@types/ocm/components/clusterDetail/ClusterDetailsButtonGroup.d.ts.map +1 -1
  76. package/build/@types/ocm/components/clusterDetail/index.d.ts +0 -1
  77. package/build/@types/ocm/components/clusterDetail/index.d.ts.map +1 -1
  78. package/build/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts.map +1 -1
  79. package/build/@types/ocm/components/clusterWizard/HostDiscovery.d.ts.map +1 -1
  80. package/build/@types/ocm/components/clusters/AssistedInstallerHeader.d.ts +5 -1
  81. package/build/@types/ocm/components/clusters/AssistedInstallerHeader.d.ts.map +1 -1
  82. package/build/@types/ocm/components/clusters/ClustersTable.d.ts.map +1 -1
  83. package/build/@types/ocm/components/hosts/HostsTableEmptyState.d.ts.map +1 -1
  84. package/build/@types/ocm/hooks/useClusterCustomManifests.d.ts.map +1 -1
  85. package/build/@types/ocm/hooks/useLateBinding.d.ts.map +1 -1
  86. package/build/@types/ocm/hooks/useUISettings.d.ts.map +1 -1
  87. package/build/@types/ocm/services/ClusterDetailsService.d.ts +2 -1
  88. package/build/@types/ocm/services/ClusterDetailsService.d.ts.map +1 -1
  89. package/build/cjs/cim/components/ClusterDeployment/ClusterDeploymentWizard.js +9 -1
  90. package/build/cjs/cim/components/ClusterDeployment/ClusterDeploymentWizard.js.map +1 -1
  91. package/build/cjs/cim/components/ClusterDeployment/NetworkConfiguration.js +46 -7
  92. package/build/cjs/cim/components/ClusterDeployment/NetworkConfiguration.js.map +1 -1
  93. package/build/cjs/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.js +22 -21
  94. package/build/cjs/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.js.map +1 -1
  95. package/build/cjs/cim/components/ClusterDeployment/networkConfigurationValidation.js +25 -9
  96. package/build/cjs/cim/components/ClusterDeployment/networkConfigurationValidation.js.map +1 -1
  97. package/build/cjs/cim/components/ClusterDeployment/networking/NetworkTypeDropdown.js +35 -0
  98. package/build/cjs/cim/components/ClusterDeployment/networking/NetworkTypeDropdown.js.map +1 -0
  99. package/build/cjs/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.js +4 -4
  100. package/build/cjs/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.js.map +1 -1
  101. package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js +13 -18
  102. package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js.map +1 -1
  103. package/build/cjs/cim/components/ClusterDeployment/wizardTransition.js +5 -1
  104. package/build/cjs/cim/components/ClusterDeployment/wizardTransition.js.map +1 -1
  105. package/build/cjs/cim/components/Hypershift/modals/NodePoolForm.js +1 -1
  106. package/build/cjs/cim/components/Hypershift/modals/NodePoolForm.js.map +1 -1
  107. package/build/cjs/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.js +1 -4
  108. package/build/cjs/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.js.map +1 -1
  109. package/build/cjs/cim/components/helpers/clusterDeployment.js +14 -10
  110. package/build/cjs/cim/components/helpers/clusterDeployment.js.map +1 -1
  111. package/build/cjs/cim/components/helpers/versions.js +39 -28
  112. package/build/cjs/cim/components/helpers/versions.js.map +1 -1
  113. package/build/cjs/cim/components/helpers/versions.test.js +423 -0
  114. package/build/cjs/cim/components/helpers/versions.test.js.map +1 -0
  115. package/build/cjs/cim/components/modals/CimConfiguration/CimConfigurationModal.js +39 -16
  116. package/build/cjs/cim/components/modals/CimConfiguration/CimConfigurationModal.js.map +1 -1
  117. package/build/cjs/cim/components/modals/CimConfiguration/persist.js +96 -136
  118. package/build/cjs/cim/components/modals/CimConfiguration/persist.js.map +1 -1
  119. package/build/cjs/cim/hooks/index.js +1 -0
  120. package/build/cjs/cim/hooks/index.js.map +1 -1
  121. package/build/cjs/cim/hooks/useAgents.js +13 -0
  122. package/build/cjs/cim/hooks/useAgents.js.map +1 -0
  123. package/build/cjs/common/components/clusterDetail/ClusterCredentials.js +10 -9
  124. package/build/cjs/common/components/clusterDetail/ClusterCredentials.js.map +1 -1
  125. package/build/cjs/common/components/clusterDetail/ConsoleModal.js +1 -10
  126. package/build/cjs/common/components/clusterDetail/ConsoleModal.js.map +1 -1
  127. package/build/cjs/common/components/clusterWizard/customManifests/CustomManifestsAlert.js +32 -0
  128. package/build/cjs/common/components/clusterWizard/customManifests/CustomManifestsAlert.js.map +1 -0
  129. package/build/cjs/common/components/clusterWizard/customManifests/index.js +5 -0
  130. package/build/cjs/common/components/clusterWizard/customManifests/index.js.map +1 -0
  131. package/build/cjs/common/components/clusterWizard/index.js +2 -0
  132. package/build/cjs/common/components/clusterWizard/index.js.map +1 -1
  133. package/build/cjs/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js +8 -2
  134. package/build/cjs/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js.map +1 -1
  135. package/build/cjs/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.js +2 -2
  136. package/build/cjs/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.js +29 -19
  137. package/build/cjs/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.js.map +1 -1
  138. package/build/cjs/common/components/clusterWizard/networkingSteps/ThirdPartyCNIBanner.js +20 -0
  139. package/build/cjs/common/components/clusterWizard/networkingSteps/ThirdPartyCNIBanner.js.map +1 -0
  140. package/build/cjs/common/components/clusterWizard/networkingSteps/index.js +1 -0
  141. package/build/cjs/common/components/clusterWizard/networkingSteps/index.js.map +1 -1
  142. package/build/cjs/common/components/hosts/HostsTable.js +2 -1
  143. package/build/cjs/common/components/hosts/HostsTable.js.map +1 -1
  144. package/build/cjs/common/components/ui/WizardFooter.js +6 -1
  145. package/build/cjs/common/components/ui/WizardFooter.js.map +1 -1
  146. package/build/cjs/common/components/ui/formik/utils.js +5 -1
  147. package/build/cjs/common/components/ui/formik/utils.js.map +1 -1
  148. package/build/cjs/common/config/constants.js +13 -2
  149. package/build/cjs/common/config/constants.js.map +1 -1
  150. package/build/cjs/common/types/networkType.js +9 -8
  151. package/build/cjs/common/types/networkType.js.map +1 -1
  152. package/build/cjs/common/validationSchemas/networkingValidation.js +19 -1
  153. package/build/cjs/common/validationSchemas/networkingValidation.js.map +1 -1
  154. package/build/cjs/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.js +4 -1
  155. package/build/cjs/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.js.map +1 -1
  156. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js +1 -20
  157. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js.map +1 -1
  158. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js +7 -6
  159. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js.map +1 -1
  160. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.js +6 -9
  161. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.js.map +1 -1
  162. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js +4 -4
  163. package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js.map +1 -1
  164. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.js +2 -2
  165. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.js.map +1 -1
  166. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js +6 -5
  167. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js.map +1 -1
  168. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewSummary.js +5 -2
  169. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewSummary.js.map +1 -1
  170. package/build/cjs/ocm/components/clusterConfiguration/review/utils.js +57 -0
  171. package/build/cjs/ocm/components/clusterConfiguration/review/utils.js.map +1 -0
  172. package/build/cjs/ocm/components/{clusterDetail/ClusterProperties.test.js → clusterConfiguration/review/utils.test.js} +13 -13
  173. package/build/cjs/ocm/components/clusterConfiguration/review/utils.test.js.map +1 -0
  174. package/build/cjs/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.js +2 -2
  175. package/build/cjs/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.js.map +1 -1
  176. package/build/cjs/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.js.map +1 -1
  177. package/build/cjs/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.js +3 -7
  178. package/build/cjs/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.js.map +1 -1
  179. package/build/cjs/ocm/components/clusterDetail/ClusterDetailsButtonGroup.js +8 -2
  180. package/build/cjs/ocm/components/clusterDetail/ClusterDetailsButtonGroup.js.map +1 -1
  181. package/build/cjs/ocm/components/clusterDetail/index.js +1 -3
  182. package/build/cjs/ocm/components/clusterDetail/index.js.map +1 -1
  183. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js +10 -1
  184. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js.map +1 -1
  185. package/build/cjs/ocm/components/clusterWizard/HostDiscovery.js +4 -1
  186. package/build/cjs/ocm/components/clusterWizard/HostDiscovery.js.map +1 -1
  187. package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js +2 -2
  188. package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js.map +1 -1
  189. package/build/cjs/ocm/components/clusters/ClusterPage.js +1 -1
  190. package/build/cjs/ocm/components/clusters/ClusterPage.js.map +1 -1
  191. package/build/cjs/ocm/components/clusters/ClustersTable.js +3 -2
  192. package/build/cjs/ocm/components/clusters/ClustersTable.js.map +1 -1
  193. package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js +1 -1
  194. package/build/cjs/ocm/components/hosts/HostsTableEmptyState.js +2 -1
  195. package/build/cjs/ocm/components/hosts/HostsTableEmptyState.js.map +1 -1
  196. package/build/cjs/ocm/hooks/useClusterCustomManifests.js +3 -15
  197. package/build/cjs/ocm/hooks/useClusterCustomManifests.js.map +1 -1
  198. package/build/cjs/ocm/hooks/useLateBinding.js +41 -26
  199. package/build/cjs/ocm/hooks/useLateBinding.js.map +1 -1
  200. package/build/cjs/ocm/hooks/usePullSecret.js +2 -2
  201. package/build/cjs/ocm/hooks/useUISettings.js +1 -1
  202. package/build/cjs/ocm/hooks/useUISettings.js.map +1 -1
  203. package/build/cjs/ocm/services/ClusterDetailsService.js +4 -2
  204. package/build/cjs/ocm/services/ClusterDetailsService.js.map +1 -1
  205. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx +10 -2
  206. package/lib/cim/components/ClusterDeployment/NetworkConfiguration.tsx +55 -6
  207. package/lib/cim/components/ClusterDeployment/customManifests/ClusterDeploymentCustomManifestsStep.tsx +18 -2
  208. package/lib/cim/components/ClusterDeployment/networkConfigurationValidation.ts +22 -8
  209. package/lib/cim/components/ClusterDeployment/networking/NetworkTypeDropdown.tsx +81 -0
  210. package/lib/cim/components/ClusterDeployment/review/ClusterDeploymentReviewStep.tsx +18 -14
  211. package/lib/cim/components/ClusterDeployment/types.ts +0 -1
  212. package/lib/cim/components/ClusterDeployment/use-networking-formik.ts +14 -22
  213. package/lib/cim/components/ClusterDeployment/wizardTransition.ts +5 -1
  214. package/lib/cim/components/Hypershift/modals/NodePoolForm.tsx +2 -2
  215. package/lib/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.tsx +2 -5
  216. package/lib/cim/components/helpers/clusterDeployment.ts +9 -4
  217. package/lib/cim/components/helpers/versions.test.ts +465 -0
  218. package/lib/cim/components/helpers/versions.ts +37 -31
  219. package/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx +45 -18
  220. package/lib/cim/components/modals/CimConfiguration/persist.ts +97 -199
  221. package/lib/cim/hooks/index.tsx +1 -0
  222. package/lib/cim/hooks/useAgents.tsx +15 -0
  223. package/lib/cim/types/k8s/agent-cluster-install.ts +1 -1
  224. package/lib/common/components/clusterDetail/ClusterCredentials.tsx +49 -53
  225. package/lib/common/components/clusterDetail/ConsoleModal.tsx +0 -35
  226. package/lib/common/components/clusterWizard/customManifests/CustomManifestsAlert.tsx +39 -0
  227. package/lib/common/components/clusterWizard/customManifests/index.tsx +1 -0
  228. package/lib/common/components/clusterWizard/index.ts +2 -0
  229. package/lib/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.tsx +8 -1
  230. package/lib/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.tsx +2 -2
  231. package/lib/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.tsx +36 -26
  232. package/lib/common/components/clusterWizard/networkingSteps/ThirdPartyCNIBanner.tsx +28 -0
  233. package/lib/common/components/clusterWizard/networkingSteps/index.ts +1 -0
  234. package/lib/common/components/hosts/HostsTable.tsx +2 -0
  235. package/lib/common/components/ui/WizardFooter.tsx +10 -0
  236. package/lib/common/components/ui/formik/utils.ts +6 -0
  237. package/lib/common/config/constants.ts +14 -1
  238. package/lib/common/types/networkType.ts +9 -8
  239. package/lib/common/validationSchemas/networkingValidation.tsx +39 -1
  240. package/lib/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx +6 -3
  241. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.tsx +10 -45
  242. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx +11 -9
  243. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkTypeDropdown.tsx +7 -24
  244. package/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts +6 -5
  245. package/lib/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.tsx +1 -1
  246. package/lib/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.tsx +10 -4
  247. package/lib/ocm/components/clusterConfiguration/review/ReviewSummary.tsx +9 -2
  248. package/lib/ocm/components/{clusterDetail/ClusterProperties.test.ts → clusterConfiguration/review/utils.test.ts} +1 -1
  249. package/lib/ocm/components/clusterConfiguration/review/utils.tsx +61 -0
  250. package/lib/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.ts +2 -0
  251. package/lib/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.ts +1 -0
  252. package/lib/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.ts +2 -0
  253. package/lib/ocm/components/clusterDetail/ClusterDetailsButtonGroup.tsx +27 -2
  254. package/lib/ocm/components/clusterDetail/index.ts +0 -1
  255. package/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +10 -1
  256. package/lib/ocm/components/clusterWizard/HostDiscovery.tsx +4 -0
  257. package/lib/ocm/components/clusters/AssistedInstallerHeader.tsx +6 -2
  258. package/lib/ocm/components/clusters/ClusterPage.tsx +1 -1
  259. package/lib/ocm/components/clusters/ClustersTable.tsx +59 -49
  260. package/lib/ocm/components/featureSupportLevels/featureStateUtils.ts +1 -1
  261. package/lib/ocm/components/hosts/HostsTableEmptyState.tsx +2 -0
  262. package/lib/ocm/hooks/useClusterCustomManifests.ts +3 -0
  263. package/lib/ocm/hooks/useLateBinding.ts +45 -24
  264. package/lib/ocm/hooks/usePullSecret.ts +2 -2
  265. package/lib/ocm/hooks/useUISettings.ts +3 -1
  266. package/lib/ocm/services/ClusterDetailsService.ts +6 -0
  267. package/package.json +9 -9
  268. package/build/@types/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.d.ts +0 -7
  269. package/build/@types/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.d.ts.map +0 -1
  270. package/build/@types/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.d.ts +0 -8
  271. package/build/@types/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.d.ts.map +0 -1
  272. package/build/@types/ocm/components/clusterDetail/ClusterProperties.d.ts.map +0 -1
  273. package/build/@types/ocm/components/clusterDetail/ClusterProperties.test.d.ts +0 -2
  274. package/build/@types/ocm/components/clusterDetail/ClusterProperties.test.d.ts.map +0 -1
  275. package/build/cjs/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.js +0 -33
  276. package/build/cjs/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.js.map +0 -1
  277. package/build/cjs/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.js +0 -40
  278. package/build/cjs/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.js.map +0 -1
  279. package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js +0 -77
  280. package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js.map +0 -1
  281. package/build/cjs/ocm/components/clusterDetail/ClusterProperties.test.js.map +0 -1
  282. package/lib/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.tsx +0 -74
  283. package/lib/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.tsx +0 -69
  284. package/lib/ocm/components/clusterDetail/ClusterProperties.tsx +0 -169
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { Alert, AlertVariant, Stack, StackItem } from '@patternfly/react-core';
3
+ import { useTranslation } from '../../../hooks';
4
+
5
+ export const CustomManifestsAlert = ({
6
+ usesExternalPlatform,
7
+ usesThirdPartyCNI,
8
+ }: {
9
+ usesExternalPlatform: boolean;
10
+ usesThirdPartyCNI: boolean;
11
+ }) => {
12
+ const { t } = useTranslation();
13
+
14
+ let title: string;
15
+ let body: string;
16
+
17
+ if (usesExternalPlatform && usesExternalPlatform) {
18
+ title = t("ai:You're using an external platform and a third-party CNI");
19
+ body = t('ai:Make sure to upload the required custom and CNI manifests in this step.');
20
+ } else if (usesExternalPlatform) {
21
+ title = t("ai:You're using an external platform");
22
+ body = t('ai:Make sure to upload the required custom manifests in this step.');
23
+ } else if (usesThirdPartyCNI) {
24
+ title = t("ai:You're using a third-party CNI");
25
+ body = t('ai:Make sure to upload the required CNI manifests in this step.');
26
+ } else {
27
+ return null;
28
+ }
29
+
30
+ return (
31
+ <Stack>
32
+ <StackItem>
33
+ <Alert variant={AlertVariant.info} isInline title={title}>
34
+ {body}
35
+ </Alert>
36
+ </StackItem>
37
+ </Stack>
38
+ );
39
+ };
@@ -0,0 +1 @@
1
+ export * from './CustomManifestsAlert';
@@ -7,3 +7,5 @@ export { ClusterValidations, HostsValidations } from './ReviewValidations';
7
7
  export * from './clusterDetailsValidation';
8
8
  export * from './types';
9
9
  export * from './validationsInfoUtils';
10
+ export * from './customManifests';
11
+ export * from './networkingSteps';
@@ -59,6 +59,7 @@ export interface AvailableSubnetsControlProps {
59
59
  isViewerMode?: boolean;
60
60
  hosts?: Host[];
61
61
  isMultiNodeCluster?: boolean;
62
+ allowSingleStackIPv6?: boolean;
62
63
  }
63
64
 
64
65
  export const AvailableSubnetsControl = ({
@@ -70,6 +71,7 @@ export const AvailableSubnetsControl = ({
70
71
  isViewerMode = false,
71
72
  hosts,
72
73
  isMultiNodeCluster = true,
74
+ allowSingleStackIPv6 = false,
73
75
  }: AvailableSubnetsControlProps) => {
74
76
  const { t } = useTranslation();
75
77
  const { values, errors, setFieldValue } = useFormikContext<NetworkConfigurationValues>();
@@ -207,7 +209,12 @@ export const AvailableSubnetsControl = ({
207
209
  isDualStack && values.machineNetworks && values.machineNetworks.length > 1;
208
210
 
209
211
  // Determine available subnets for primary dropdown
210
- const primaryMachineSubnets = isDualStack && supportsIPv6Primary ? allSubnets : IPv4Subnets;
212
+ let primaryMachineSubnets: HostSubnet[];
213
+ if ((isDualStack && supportsIPv6Primary) || (!isDualStack && allowSingleStackIPv6)) {
214
+ primaryMachineSubnets = allSubnets;
215
+ } else {
216
+ primaryMachineSubnets = IPv4Subnets;
217
+ }
211
218
 
212
219
  // Determine available subnets for secondary dropdown
213
220
  const secondaryMachineSubnets = React.useMemo(() => {
@@ -55,10 +55,10 @@ export const ManagedNetworkingControlGroup = ({
55
55
  value={'userManaged'}
56
56
  label={
57
57
  <>
58
- <span>{t('ai:User-Managed Networking')}</span>{' '}
58
+ <span>{t('ai:User-Managed networking')}</span>{' '}
59
59
  <PopoverIcon
60
60
  bodyContent={t(
61
- "ai:With User-Managed Networking, you'll need to provide and configure a load balancer for the API and ingress endpoints.",
61
+ "ai:With User-Managed networking, you'll need to provide and configure a load balancer for the API and ingress endpoints.",
62
62
  )}
63
63
  />
64
64
  </>
@@ -10,9 +10,10 @@ import {
10
10
  NETWORK_TYPE_SDN,
11
11
  } from '../../../types';
12
12
  import { getFieldId } from '../../ui';
13
- import { DUAL_STACK, IPV4_STACK, NO_SUBNET_SET } from '../../../config';
13
+ import { DUAL_STACK, NO_SUBNET_SET, SINGLE_STACK } from '../../../config';
14
14
  import { RadioField } from '../../ui/formik';
15
15
  import { ConfirmationModal, PopoverIcon } from '../../ui';
16
+ import { useTranslation } from '../../../hooks/use-translation-wrapper';
16
17
  import { reorderNetworksByCurrentPrimary } from './reorderNetworks';
17
18
  import {
18
19
  Cluster,
@@ -36,6 +37,7 @@ export type StackTypeControlGroupProps = {
36
37
  hostSubnets: HostSubnets;
37
38
  defaultNetworkValues: StackTypeDefaultNetworkValues;
38
39
  isViewerMode?: boolean;
40
+ allowSingleStackIPv6?: boolean;
39
41
  };
40
42
 
41
43
  const hasDualStackConfigurationChanged = (
@@ -60,17 +62,21 @@ export const StackTypeControlGroup = ({
60
62
  hostSubnets,
61
63
  defaultNetworkValues,
62
64
  isViewerMode = false,
65
+ allowSingleStackIPv6 = false,
63
66
  }: StackTypeControlGroupProps) => {
67
+ const { t } = useTranslation();
64
68
  const { setFieldValue, values, validateForm } = useFormikContext<NetworkConfigurationValues>();
65
69
  const [openConfirmModal, setConfirmModal] = React.useState(false);
66
70
 
71
+ const singleStackLabel = allowSingleStackIPv6 ? t('ai:Single stack') : t('ai:IPv4');
72
+
67
73
  const IPv6Subnets = hostSubnets.filter((subnet) => Address6.isValid(subnet.subnet));
68
74
  const cidrIPv6 = IPv6Subnets.length >= 1 ? IPv6Subnets[0].subnet : NO_SUBNET_SET;
69
75
  const shouldSetSingleStack =
70
76
  !isViewerMode && !isDualStackSelectable && values.stackType === DUAL_STACK;
71
77
 
72
78
  const setSingleStack = React.useCallback(() => {
73
- setFieldValue('stackType', IPV4_STACK);
79
+ setFieldValue('stackType', SINGLE_STACK);
74
80
 
75
81
  // Determine whether the first machine network is IPv4
76
82
  const firstNetwork = values.machineNetworks?.[0];
@@ -94,7 +100,8 @@ export const StackTypeControlGroup = ({
94
100
  }
95
101
  }
96
102
  }
97
- // Ensure single-stack inputs are IPv4 after switching from dual-stack
103
+
104
+ // Set cluster/service to IPv4 defaults when switching to single-stack
98
105
  if (values.clusterNetworks && values.clusterNetworks.length >= 1) {
99
106
  const defaultCluster =
100
107
  defaultNetworkValues.clusterNetworksIpv4 && defaultNetworkValues.clusterNetworksIpv4[0];
@@ -196,28 +203,27 @@ export const StackTypeControlGroup = ({
196
203
  }
197
204
  }
198
205
  if (values.clusterNetworks && values.clusterNetworks?.length < 2) {
199
- setFieldValue(
200
- 'clusterNetworks',
201
- [
202
- ...values.clusterNetworks,
203
- defaultNetworkValues.clusterNetworksDualstack?.length
204
- ? defaultNetworkValues.clusterNetworksDualstack[1]
205
- : { cidr: '', hostPrefix: '', clusterId: clusterId },
206
- ],
207
- false,
208
- );
206
+ const firstClusterCidr = values.clusterNetworks[0]?.cidr;
207
+ const isPrimaryIPv6 = firstClusterCidr && Address6.isValid(firstClusterCidr);
208
+ const missingFamilyNetworkDefault =
209
+ defaultNetworkValues.clusterNetworksDualstack?.[isPrimaryIPv6 ? 0 : 1];
210
+ const secondClusterNetwork = missingFamilyNetworkDefault ?? {
211
+ cidr: '',
212
+ hostPrefix: '',
213
+ clusterId: clusterId,
214
+ };
215
+ setFieldValue('clusterNetworks', [...values.clusterNetworks, secondClusterNetwork], false);
209
216
  }
210
217
  if (values.serviceNetworks && values.serviceNetworks?.length < 2) {
211
- setFieldValue(
212
- 'serviceNetworks',
213
- [
214
- ...values.serviceNetworks,
215
- defaultNetworkValues.serviceNetworksDualstack?.length
216
- ? defaultNetworkValues.serviceNetworksDualstack[1]
217
- : { cidr: '', clusterId: clusterId },
218
- ],
219
- false,
220
- );
218
+ const firstServiceCidr = values.serviceNetworks[0]?.cidr;
219
+ const isPrimaryIPv6 = firstServiceCidr && Address6.isValid(firstServiceCidr);
220
+ const missingFamilyNetworkDefault =
221
+ defaultNetworkValues.serviceNetworksDualstack?.[isPrimaryIPv6 ? 0 : 1];
222
+ const secondServiceNetwork = missingFamilyNetworkDefault ?? {
223
+ cidr: '',
224
+ clusterId: clusterId,
225
+ };
226
+ setFieldValue('serviceNetworks', [...values.serviceNetworks, secondServiceNetwork], false);
221
227
  }
222
228
  // Initialize VIPs for dual-stack
223
229
  if (values.apiVips && values.apiVips.length < 2) {
@@ -290,14 +296,18 @@ export const StackTypeControlGroup = ({
290
296
  <SplitItem>
291
297
  <RadioField
292
298
  name={'stackType'}
293
- value={IPV4_STACK}
299
+ value={SINGLE_STACK}
294
300
  isDisabled={!isDualStackSelectable || isViewerMode}
295
- label="IPv4&nbsp;"
301
+ label={`${singleStackLabel}\u00A0`}
296
302
  />
297
303
  </SplitItem>
298
304
  <SplitItem>
299
305
  <PopoverIcon
300
- bodyContent="Select this when your hosts are using only IPv4."
306
+ bodyContent={
307
+ allowSingleStackIPv6
308
+ ? t('ai:Select a single address family (IPv4 or IPv6) for your machine network.')
309
+ : t('ai:Select this when your hosts are using only IPv4.')
310
+ }
301
311
  buttonStyle={{ top: '-4px' }}
302
312
  />
303
313
  </SplitItem>
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { useTranslation } from '../../../hooks';
3
+ import { Alert, AlertVariant, Stack, StackItem } from '@patternfly/react-core';
4
+ import { RED_HAT_CNI_SUPPORT_MATRIX_LINK } from '../../../config';
5
+ import { ExternalLink } from '../../ui';
6
+
7
+ export const ThirdPartyCNIBanner = () => {
8
+ const { t } = useTranslation();
9
+
10
+ return (
11
+ <StackItem>
12
+ <Alert variant={AlertVariant.warning} isInline title={t('ai:Third-party CNI')}>
13
+ <Stack hasGutter>
14
+ <StackItem>
15
+ {t(
16
+ 'ai:Third-party CNIs require uploading CNI manifests. Please verify you have the required manifests and that the chosen CNI is compatible with your platform and OpenShift version.',
17
+ )}
18
+ </StackItem>
19
+ <StackItem>
20
+ <ExternalLink href={RED_HAT_CNI_SUPPORT_MATRIX_LINK}>
21
+ {t('ai:Red Hat CNI Support Matrix')}
22
+ </ExternalLink>
23
+ </StackItem>
24
+ </Stack>
25
+ </Alert>
26
+ </StackItem>
27
+ );
28
+ };
@@ -14,3 +14,4 @@ export { VirtualIPControlGroup } from './VirtualIPControlGroup';
14
14
  export type { VirtualIPControlGroupProps } from './VirtualIPControlGroup';
15
15
  export { default as AdvancedNetworkFields } from './AdvancedNetworkFields';
16
16
  export type { AdvancedNetworkFieldsProps } from './AdvancedNetworkFields';
17
+ export * from './ThirdPartyCNIBanner';
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { Spinner } from '@patternfly/react-core';
2
3
  import { ConnectedIcon } from '@patternfly/react-icons/dist/js/icons/connected-icon';
3
4
  import { HostsNotShowingLink, HostsNotShowingLinkProps } from '../clusterConfiguration';
4
5
  import { Host } from '@openshift-assisted/types/assisted-installer-service';
@@ -29,6 +30,7 @@ export const HostsTableEmptyState = ({
29
30
  icon={ConnectedIcon}
30
31
  title={t('ai:Waiting for host...', { count: +isSNO })}
31
32
  content={t('ai:Hosts may take a few minutes to appear here after booting.')}
33
+ primaryAction={<Spinner size="xl" />}
32
34
  secondaryActions={
33
35
  setDiscoveryHintModalOpen && [
34
36
  <HostsNotShowingLink
@@ -27,6 +27,7 @@ export type WizardFooterGenericProps = {
27
27
  submittingText?: string;
28
28
  nextButtonText?: string;
29
29
  isNextButtonLoading?: boolean;
30
+ isWaitingForHosts?: boolean;
30
31
  };
31
32
 
32
33
  type WizardFooterProps = WizardFooterGenericProps & {
@@ -53,6 +54,7 @@ export const WizardFooter: React.FC<WizardFooterProps> = ({
53
54
  cluster,
54
55
  onFetchEvents,
55
56
  isNextButtonLoading,
57
+ isWaitingForHosts,
56
58
  }) => {
57
59
  const { t } = useTranslation();
58
60
  submittingText = submittingText || t('ai:Saving changes...');
@@ -119,6 +121,14 @@ export const WizardFooter: React.FC<WizardFooterProps> = ({
119
121
  </Content>
120
122
  </ActionListItem>
121
123
  )}
124
+ {isWaitingForHosts && !isSubmitting && (
125
+ <ActionListItem>
126
+ <Content component={ContentVariants.small}>
127
+ <Spinner size="sm" data-testid="wizard-footer-hosts-spinner" />{' '}
128
+ {t('ai:Waiting for hosts to be ready...')}
129
+ </Content>
130
+ </ActionListItem>
131
+ )}
122
132
  <SplitItem isFilled />
123
133
  {cluster && onFetchEvents && (
124
134
  <ActionListItem>
@@ -126,6 +126,12 @@ export const allSubnetsIPv4 = (
126
126
  return !!networks?.every((network) => network.cidr && Address4.isValid(network.cidr));
127
127
  };
128
128
 
129
+ export const allSubnetsIPv6 = (
130
+ networks: (MachineNetwork | ClusterNetwork | ServiceNetwork)[] | undefined,
131
+ ) => {
132
+ return !!networks?.every((network) => network.cidr && Address6.isValid(network.cidr));
133
+ };
134
+
129
135
  export const labelsToArray = (labels: { [key in string]: string } = {}): string[] => {
130
136
  const result: string[] = [];
131
137
  for (const key in labels) {
@@ -289,8 +289,10 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6 = {
289
289
  export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
290
290
  ClusterDefaultConfig,
291
291
  | 'clusterNetworksIpv4'
292
+ | 'clusterNetworksIpv6'
292
293
  | 'clusterNetworksDualstack'
293
294
  | 'serviceNetworksIpv4'
295
+ | 'serviceNetworksIpv6'
294
296
  | 'serviceNetworksDualstack'
295
297
  > = {
296
298
  clusterNetworksIpv4: [
@@ -299,6 +301,12 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
299
301
  hostPrefix: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.clusterNetworkHostPrefix,
300
302
  },
301
303
  ],
304
+ clusterNetworksIpv6: [
305
+ {
306
+ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.clusterNetworkCidr,
307
+ hostPrefix: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.clusterNetworkHostPrefix,
308
+ },
309
+ ],
302
310
  clusterNetworksDualstack: [
303
311
  {
304
312
  cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.clusterNetworkCidr,
@@ -310,6 +318,7 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
310
318
  },
311
319
  ],
312
320
  serviceNetworksIpv4: [{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.serviceNetworkCidr }],
321
+ serviceNetworksIpv6: [{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.serviceNetworkCidr }],
313
322
  serviceNetworksDualstack: [
314
323
  { cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.serviceNetworkCidr },
315
324
  { cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.serviceNetworkCidr },
@@ -333,7 +342,7 @@ export const MS_PER_DAY = 1000 * 60 * 60 * 24;
333
342
 
334
343
  export const NO_SUBNET_SET = 'NO_SUBNET_SET';
335
344
 
336
- export const IPV4_STACK = 'singleStack';
345
+ export const SINGLE_STACK = 'singleStack';
337
346
  export const DUAL_STACK = 'dualStack';
338
347
 
339
348
  export const PREFIX_MAX_RESTRICTION = {
@@ -384,7 +393,11 @@ export const singleClusterOperators = [
384
393
  OPERATOR_NAME_NODE_MAINTENANCE,
385
394
  OPERATOR_NAME_FENCE_AGENTS_REMEDIATION,
386
395
  OPERATOR_NAME_KUBE_DESCHEDULER,
396
+ OPERATOR_NAME_METALLB,
387
397
  OPERATOR_NAME_CLUSTER_OBSERVABILITY,
398
+ OPERATOR_NAME_OADP,
399
+ OPERATOR_NAME_LSO,
400
+ OPERATOR_NAME_NUMA_RESOURCES,
388
401
  OPERATOR_NAME_LOKI,
389
402
  OPERATOR_NAME_OPENSHIFT_LOGGING,
390
403
  ];
@@ -1,4 +1,5 @@
1
1
  import type { FeatureSupportLevelId } from '@openshift-assisted/types/assisted-installer-service';
2
+ import { TFunction } from 'i18next';
2
3
 
3
4
  export type NetworkTypeKey =
4
5
  | 'OVNKubernetes'
@@ -15,14 +16,14 @@ export const NETWORK_TYPE_CILIUM: NetworkTypeKey = 'Cilium';
15
16
  export const NETWORK_TYPE_CALICO: NetworkTypeKey = 'Calico';
16
17
  export const NETWORK_TYPE_NONE: NetworkTypeKey = 'None';
17
18
 
18
- export const NETWORK_TYPE_LABELS: Record<string, string> = {
19
- [NETWORK_TYPE_OVN]: 'Open Virtual Networking (OVN)',
20
- [NETWORK_TYPE_SDN]: 'Software-Defined Networking (SDN)',
21
- [NETWORK_TYPE_CISCO_ACI]: 'Cisco ACI',
22
- [NETWORK_TYPE_CILIUM]: 'Isovalent Cilium',
23
- [NETWORK_TYPE_CALICO]: 'Tigera Calico',
24
- [NETWORK_TYPE_NONE]: 'None (Custom CNI)',
25
- };
19
+ export const NETWORK_TYPE_LABELS = (t: TFunction): Record<string, string> => ({
20
+ [NETWORK_TYPE_OVN]: t('ai:Open Virtual Networking (OVN)'),
21
+ [NETWORK_TYPE_SDN]: t('ai:Software-Defined Networking (SDN)'),
22
+ [NETWORK_TYPE_CISCO_ACI]: t('ai:Cisco ACI'),
23
+ [NETWORK_TYPE_CILIUM]: t('ai:Isovalent Cilium'),
24
+ [NETWORK_TYPE_CALICO]: t('ai:Tigera Calico'),
25
+ [NETWORK_TYPE_NONE]: t('ai:None (Custom CNI)'),
26
+ });
26
27
 
27
28
  export const NETWORK_TYPE_FEATURE_IDS: Record<string, FeatureSupportLevelId> = {
28
29
  [NETWORK_TYPE_OVN]: 'OVN_NETWORK_TYPE',
@@ -13,7 +13,8 @@ import {
13
13
  ipBlockValidationSchema,
14
14
  } from './addressValidation';
15
15
  import { isMajorMinorVersionEqualOrGreater } from '../utils';
16
- import { allSubnetsIPv4 } from '../components/ui/formik/utils';
16
+ import { allSubnetsIPv4, allSubnetsIPv6 } from '../components/ui/formik/utils';
17
+ import { SINGLE_STACK } from '../config';
17
18
 
18
19
  export const machineNetworksValidationSchema = Yup.array().of(
19
20
  Yup.object({ cidr: hostSubnetValidationSchema, clusterId: Yup.string() }),
@@ -111,3 +112,40 @@ export const IPv4ValidationSchema = Yup.array().test(
111
112
  `All network subnets must be IPv4.`,
112
113
  (values?: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv4(values),
113
114
  );
115
+
116
+ export const IPv6ValidationSchema = Yup.array().test(
117
+ 'single-stack-ipv6',
118
+ 'All network subnets must be IPv6.',
119
+ (values?: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv6(values),
120
+ );
121
+
122
+ export const clusterNetworksSchema = (
123
+ t: TFunction,
124
+ stackType: string,
125
+ primaryCidr: string | undefined,
126
+ openshiftVersion?: string,
127
+ ) => {
128
+ const singleStackFamilySchema =
129
+ primaryCidr && isCIDR.v6(primaryCidr) ? IPv6ValidationSchema : IPv4ValidationSchema;
130
+
131
+ const stackFamilySchema =
132
+ stackType === SINGLE_STACK
133
+ ? singleStackFamilySchema
134
+ : dualStackValidationSchema(t('ai:cluster network'), t, openshiftVersion);
135
+ return clusterNetworksValidationSchema(t).concat(stackFamilySchema);
136
+ };
137
+
138
+ export const serviceNetworksSchema = (
139
+ t: TFunction,
140
+ stackType: string,
141
+ primaryCidr: string | undefined,
142
+ openshiftVersion?: string,
143
+ ) => {
144
+ const singleStackFamilySchema =
145
+ primaryCidr && isCIDR.v6(primaryCidr) ? IPv6ValidationSchema : IPv4ValidationSchema;
146
+ const stackFamilySchema =
147
+ stackType === SINGLE_STACK
148
+ ? singleStackFamilySchema
149
+ : dualStackValidationSchema(t('ai:service network'), t, openshiftVersion);
150
+ return serviceNetworkValidationSchema(t).concat(stackFamilySchema);
151
+ };
@@ -11,7 +11,7 @@ import {
11
11
  import { useField } from 'formik';
12
12
  import toNumber from 'lodash-es/toNumber';
13
13
  import { getFieldId, PopoverIcon, PreviewBadgePosition, TechnologyPreview } from '../../../common';
14
-
14
+ import { useFeature } from '../../hooks/use-feature';
15
15
  import {
16
16
  NewFeatureSupportLevelMap,
17
17
  useNewFeatureSupportLevel,
@@ -45,6 +45,8 @@ interface ControlPlaneNodesOption {
45
45
  value: number;
46
46
  label: string;
47
47
  badge?: React.ReactNode;
48
+ /** When true, option is omitted from the list (e.g. product mode does not offer this topology). */
49
+ hidden?: boolean;
48
50
  }
49
51
 
50
52
  interface ControlPlaneNodesDropdownProps {
@@ -71,7 +73,7 @@ const ControlPlaneNodesDropdown: React.FC<ControlPlaneNodesDropdownProps> = ({
71
73
  const [field, , { setValue }] = useField<number>(INPUT_NAME);
72
74
  const [isOpen, setOpen] = React.useState<boolean>(false);
73
75
  const newFeatureSupportLevelContext = useNewFeatureSupportLevel();
74
-
76
+ const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE');
75
77
  const snoExpansion = newFeatureSupportLevelContext.isFeatureSupported(
76
78
  'SINGLE_NODE_EXPANSION',
77
79
  featureSupportLevelData ?? undefined,
@@ -100,11 +102,12 @@ const ControlPlaneNodesDropdown: React.FC<ControlPlaneNodesDropdownProps> = ({
100
102
  tnaSupport === 'tech-preview' ? (
101
103
  <TechnologyPreview position={PreviewBadgePosition.default} />
102
104
  ) : undefined,
105
+ hidden: isSingleClusterFeatureEnabled,
103
106
  },
104
107
  { value: 3, label: '3 (highly available cluster)' },
105
108
  { value: 4, label: '4 (highly available cluster+)' },
106
109
  { value: 5, label: '5 (highly available cluster++)' },
107
- ];
110
+ ].filter(({ hidden }) => !hidden);
108
111
 
109
112
  React.useEffect(() => {
110
113
  if (!field.value) {
@@ -3,19 +3,21 @@ import {
3
3
  Content,
4
4
  ContentVariants,
5
5
  Alert,
6
- AlertVariant,
7
6
  Grid,
8
7
  FormGroup,
9
8
  Switch,
10
9
  Tooltip,
11
- Stack,
12
- StackItem,
13
10
  } from '@patternfly/react-core';
14
11
 
15
12
  import { CustomManifests } from './components/CustomManifests';
16
13
  import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
17
14
  import { CustomManifestFormState } from './components/propTypes';
18
- import { ClustersAPI, ClusterWizardStepHeader, isThirdPartyCNI } from '../../../../common';
15
+ import {
16
+ ClustersAPI,
17
+ ClusterWizardStepHeader,
18
+ CustomManifestsAlert,
19
+ isThirdPartyCNI,
20
+ } from '../../../../common';
19
21
  import { getFieldId } from '../../../../common/components/ui/formik';
20
22
  import { isOciPlatformType } from '../../utils';
21
23
  import DeleteCustomManifestModal from './DeleteCustomManifestModal';
@@ -90,46 +92,6 @@ export const CustomManifestsPage = ({
90
92
  ? 'Custom manifests are required when using a third-party CNI or Oracle Cloud Infrastructure.'
91
93
  : '';
92
94
 
93
- const showExternalPlatformReminder = isOciPlatformType(cluster);
94
- const showThirdPartyCnIReminder = isThirdPartyCNI(cluster.networkType);
95
- const showCombinedReminder = showExternalPlatformReminder && showThirdPartyCnIReminder;
96
- let reminderAlerts: React.ReactNode = null;
97
- if (showCombinedReminder) {
98
- reminderAlerts = (
99
- <Stack>
100
- <StackItem>
101
- <Alert
102
- variant={AlertVariant.info}
103
- isInline
104
- title="You're using an external platform and a third-party CNI"
105
- >
106
- Make sure to upload the required custom and CNI manifests in this step.
107
- </Alert>
108
- </StackItem>
109
- </Stack>
110
- );
111
- } else if (showExternalPlatformReminder) {
112
- reminderAlerts = (
113
- <Stack>
114
- <StackItem>
115
- <Alert variant={AlertVariant.info} isInline title="You're using an external platform">
116
- Make sure to upload the required custom manifests in this step.
117
- </Alert>
118
- </StackItem>
119
- </Stack>
120
- );
121
- } else if (showThirdPartyCnIReminder) {
122
- reminderAlerts = (
123
- <Stack>
124
- <StackItem>
125
- <Alert variant={AlertVariant.info} isInline title="You're using a third-party CNI">
126
- Make sure to upload the required CNI manifests in this step.
127
- </Alert>
128
- </StackItem>
129
- </Stack>
130
- );
131
- }
132
-
133
95
  return (
134
96
  <Grid hasGutter>
135
97
  <Content>
@@ -157,7 +119,10 @@ export const CustomManifestsPage = ({
157
119
  {!useCustomManifests && <div style={{ minHeight: '250px' }} aria-hidden="true" />}
158
120
  {useCustomManifests && (
159
121
  <>
160
- {reminderAlerts}
122
+ <CustomManifestsAlert
123
+ usesExternalPlatform={isOciPlatformType(cluster)}
124
+ usesThirdPartyCNI={isThirdPartyCNI(cluster.networkType)}
125
+ />
161
126
  <Alert
162
127
  isInline
163
128
  variant="warning"
@@ -9,7 +9,7 @@ import {
9
9
  getFormikErrorFields,
10
10
  getHostSubnets,
11
11
  HostSubnets,
12
- IPV4_STACK,
12
+ SINGLE_STACK,
13
13
  isSNO,
14
14
  LoadingState,
15
15
  NetworkConfigurationValues,
@@ -113,18 +113,20 @@ const NetworkConfigurationForm: React.FC<{
113
113
  clusterWizardContext.moveNext();
114
114
  }, [addAlert, cluster.id, clusterWizardContext, dispatch, isSingleClusterFeatureEnabled]);
115
115
 
116
+ const isNextDisabled =
117
+ isSubmitting ||
118
+ isAutoSaveRunning ||
119
+ !!alerts.length ||
120
+ !isValid ||
121
+ !canNextNetwork({ cluster });
122
+
116
123
  const footer = (
117
124
  <ClusterWizardFooter
118
125
  cluster={cluster}
119
126
  errorFields={errorFields}
120
127
  isSubmitting={isSubmitting}
121
- isNextDisabled={
122
- isSubmitting ||
123
- isAutoSaveRunning ||
124
- !!alerts.length ||
125
- !isValid ||
126
- !canNextNetwork({ cluster })
127
- }
128
+ isNextDisabled={isNextDisabled}
129
+ isWaitingForHosts={!canNextNetwork({ cluster })}
128
130
  onNext={() => void onNext()}
129
131
  onBack={() => clusterWizardContext.moveBack()}
130
132
  isBackDisabled={isSubmitting || isAutoSaveRunning}
@@ -262,7 +264,7 @@ const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
262
264
  if (values.vipDhcpAllocation) {
263
265
  delete params.apiVips;
264
266
  delete params.ingressVips;
265
- } else if (values.stackType === IPV4_STACK) {
267
+ } else if (values.stackType === SINGLE_STACK) {
266
268
  // The API will rebuild the default machineNetwork
267
269
  params.machineNetworks = [];
268
270
  }