@openshift-assisted/ui-lib 2.7.12-cim → 2.8.2-cim

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 (3845) hide show
  1. package/@types/cim/components/Agent/AgentStatus.d.ts +15 -0
  2. package/@types/cim/components/Agent/AgentStatus.d.ts.map +1 -0
  3. package/@types/cim/components/Agent/AgentTable.d.ts +13 -0
  4. package/@types/cim/components/Agent/AgentTable.d.ts.map +1 -0
  5. package/@types/cim/components/Agent/AgentsSelectionHostCountAlerts.d.ts +9 -0
  6. package/@types/cim/components/Agent/AgentsSelectionHostCountAlerts.d.ts.map +1 -0
  7. package/@types/cim/components/Agent/AgentsSelectionHostCountLabelIcon.d.ts +3 -0
  8. package/@types/cim/components/Agent/AgentsSelectionHostCountLabelIcon.d.ts.map +1 -0
  9. package/@types/cim/components/Agent/AgentsSelectionTable.d.ts +17 -0
  10. package/@types/cim/components/Agent/AgentsSelectionTable.d.ts.map +1 -0
  11. package/@types/cim/components/Agent/AgentsSelectionUtils.d.ts +10 -0
  12. package/@types/cim/components/Agent/AgentsSelectionUtils.d.ts.map +1 -0
  13. package/@types/cim/components/Agent/BMCForm.d.ts +5 -0
  14. package/@types/cim/components/Agent/BMCForm.d.ts.map +1 -0
  15. package/@types/cim/components/Agent/BMHStatus.d.ts +8 -0
  16. package/@types/cim/components/Agent/BMHStatus.d.ts.map +1 -0
  17. package/@types/cim/components/Agent/MinimalHWRequirements.d.ts +16 -0
  18. package/@types/cim/components/Agent/MinimalHWRequirements.d.ts.map +1 -0
  19. package/@types/cim/components/Agent/NoAgentsAlert.d.ts +6 -0
  20. package/@types/cim/components/Agent/NoAgentsAlert.d.ts.map +1 -0
  21. package/@types/cim/components/Agent/index.d.ts +4 -0
  22. package/@types/cim/components/Agent/index.d.ts.map +1 -0
  23. package/@types/cim/components/Agent/tableUtils.d.ts +53 -0
  24. package/@types/cim/components/Agent/tableUtils.d.ts.map +1 -0
  25. package/@types/cim/components/Agent/types.d.ts +37 -0
  26. package/@types/cim/components/Agent/types.d.ts.map +1 -0
  27. package/@types/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.d.ts +18 -0
  28. package/@types/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.d.ts.map +1 -0
  29. package/@types/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.d.ts +3 -0
  30. package/@types/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.d.ts.map +1 -0
  31. package/@types/cim/components/ClusterDeployment/ArmCheckbox.d.ts +8 -0
  32. package/@types/cim/components/ClusterDeployment/ArmCheckbox.d.ts.map +1 -0
  33. package/@types/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.d.ts +10 -0
  34. package/@types/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.d.ts.map +1 -0
  35. package/@types/cim/components/ClusterDeployment/ClusterDeploymentCredentials.d.ts +14 -0
  36. package/@types/cim/components/ClusterDeployment/ClusterDeploymentCredentials.d.ts.map +1 -0
  37. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetails.d.ts +14 -0
  38. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetails.d.ts.map +1 -0
  39. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.d.ts +13 -0
  40. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.d.ts.map +1 -0
  41. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.d.ts +18 -0
  42. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.d.ts.map +1 -0
  43. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.d.ts +11 -0
  44. package/@types/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.d.ts.map +1 -0
  45. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.d.ts +5 -0
  46. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.d.ts.map +1 -0
  47. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.d.ts +15 -0
  48. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.d.ts.map +1 -0
  49. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.d.ts +5 -0
  50. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.d.ts.map +1 -0
  51. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.d.ts +5 -0
  52. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.d.ts.map +1 -0
  53. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.d.ts +11 -0
  54. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.d.ts.map +1 -0
  55. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.d.ts +5 -0
  56. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.d.ts.map +1 -0
  57. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.d.ts +16 -0
  58. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.d.ts.map +1 -0
  59. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.d.ts +9 -0
  60. package/@types/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.d.ts.map +1 -0
  61. package/@types/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.d.ts +11 -0
  62. package/@types/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.d.ts.map +1 -0
  63. package/@types/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.d.ts +23 -0
  64. package/@types/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.d.ts.map +1 -0
  65. package/@types/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.d.ts +5 -0
  66. package/@types/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.d.ts.map +1 -0
  67. package/@types/cim/components/ClusterDeployment/ClusterDeploymentProgress.d.ts +14 -0
  68. package/@types/cim/components/ClusterDeployment/ClusterDeploymentProgress.d.ts.map +1 -0
  69. package/@types/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.d.ts +14 -0
  70. package/@types/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.d.ts.map +1 -0
  71. package/@types/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.d.ts +10 -0
  72. package/@types/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.d.ts.map +1 -0
  73. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizard.d.ts +5 -0
  74. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizard.d.ts.map +1 -0
  75. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.d.ts +11 -0
  76. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.d.ts.map +1 -0
  77. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.d.ts +13 -0
  78. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.d.ts.map +1 -0
  79. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.d.ts +4 -0
  80. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.d.ts.map +1 -0
  81. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.d.ts +7 -0
  82. package/@types/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.d.ts.map +1 -0
  83. package/@types/cim/components/ClusterDeployment/ClusterDetailsFormFields.d.ts +16 -0
  84. package/@types/cim/components/ClusterDeployment/ClusterDetailsFormFields.d.ts.map +1 -0
  85. package/@types/cim/components/ClusterDeployment/ClusterInstallationError.d.ts +8 -0
  86. package/@types/cim/components/ClusterDeployment/ClusterInstallationError.d.ts.map +1 -0
  87. package/@types/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.d.ts +8 -0
  88. package/@types/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.d.ts.map +1 -0
  89. package/@types/cim/components/ClusterDeployment/LabelsSelector.d.ts +14 -0
  90. package/@types/cim/components/ClusterDeployment/LabelsSelector.d.ts.map +1 -0
  91. package/@types/cim/components/ClusterDeployment/LocationsSelector.d.ts +7 -0
  92. package/@types/cim/components/ClusterDeployment/LocationsSelector.d.ts.map +1 -0
  93. package/@types/cim/components/ClusterDeployment/LogsDownloadButton.d.ts +12 -0
  94. package/@types/cim/components/ClusterDeployment/LogsDownloadButton.d.ts.map +1 -0
  95. package/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts +10 -0
  96. package/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts.map +1 -0
  97. package/@types/cim/components/ClusterDeployment/ScaleUpForm.d.ts +11 -0
  98. package/@types/cim/components/ClusterDeployment/ScaleUpForm.d.ts.map +1 -0
  99. package/@types/cim/components/ClusterDeployment/ShortCapacitySummary.d.ts +10 -0
  100. package/@types/cim/components/ClusterDeployment/ShortCapacitySummary.d.ts.map +1 -0
  101. package/@types/cim/components/ClusterDeployment/constants.d.ts +15 -0
  102. package/@types/cim/components/ClusterDeployment/constants.d.ts.map +1 -0
  103. package/@types/cim/components/ClusterDeployment/helpers.d.ts +24 -0
  104. package/@types/cim/components/ClusterDeployment/helpers.d.ts.map +1 -0
  105. package/@types/cim/components/ClusterDeployment/index.d.ts +18 -0
  106. package/@types/cim/components/ClusterDeployment/index.d.ts.map +1 -0
  107. package/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts +6 -0
  108. package/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts.map +1 -0
  109. package/@types/cim/components/ClusterDeployment/types.d.ts +177 -0
  110. package/@types/cim/components/ClusterDeployment/types.d.ts.map +1 -0
  111. package/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts +40 -0
  112. package/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts.map +1 -0
  113. package/@types/cim/components/ClusterDeployment/validationSchemas.d.ts +4 -0
  114. package/@types/cim/components/ClusterDeployment/validationSchemas.d.ts.map +1 -0
  115. package/@types/cim/components/ClusterDeployment/wizardTransition.d.ts +11 -0
  116. package/@types/cim/components/ClusterDeployment/wizardTransition.d.ts.map +1 -0
  117. package/@types/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.d.ts +22 -0
  118. package/@types/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.d.ts.map +1 -0
  119. package/@types/cim/components/Hypershift/DetailsPage/ConditionsTable.d.ts +12 -0
  120. package/@types/cim/components/Hypershift/DetailsPage/ConditionsTable.d.ts.map +1 -0
  121. package/@types/cim/components/Hypershift/DetailsPage/HostedClusterProgress.d.ts +8 -0
  122. package/@types/cim/components/Hypershift/DetailsPage/HostedClusterProgress.d.ts.map +1 -0
  123. package/@types/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.d.ts +9 -0
  124. package/@types/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.d.ts.map +1 -0
  125. package/@types/cim/components/Hypershift/DetailsPage/NodePoolStatus.d.ts +9 -0
  126. package/@types/cim/components/Hypershift/DetailsPage/NodePoolStatus.d.ts.map +1 -0
  127. package/@types/cim/components/Hypershift/DetailsPage/NodePoolsProgress.d.ts +19 -0
  128. package/@types/cim/components/Hypershift/DetailsPage/NodePoolsProgress.d.ts.map +1 -0
  129. package/@types/cim/components/Hypershift/DetailsPage/NodePoolsTable.d.ts +26 -0
  130. package/@types/cim/components/Hypershift/DetailsPage/NodePoolsTable.d.ts.map +1 -0
  131. package/@types/cim/components/Hypershift/DetailsPage/index.d.ts +3 -0
  132. package/@types/cim/components/Hypershift/DetailsPage/index.d.ts.map +1 -0
  133. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.d.ts +5 -0
  134. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.d.ts.map +1 -0
  135. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.d.ts +5 -0
  136. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.d.ts.map +1 -0
  137. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.d.ts +2 -0
  138. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.d.ts.map +1 -0
  139. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.d.ts +36 -0
  140. package/@types/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.d.ts.map +1 -0
  141. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.d.ts +5 -0
  142. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.d.ts.map +1 -0
  143. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.d.ts +5 -0
  144. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.d.ts.map +1 -0
  145. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.d.ts +12 -0
  146. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.d.ts.map +1 -0
  147. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.d.ts +2 -0
  148. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.d.ts.map +1 -0
  149. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.d.ts +31 -0
  150. package/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.d.ts.map +1 -0
  151. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.d.ts +6 -0
  152. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.d.ts.map +1 -0
  153. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.d.ts +5 -0
  154. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.d.ts.map +1 -0
  155. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.d.ts +3 -0
  156. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.d.ts.map +1 -0
  157. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.d.ts +24 -0
  158. package/@types/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.d.ts.map +1 -0
  159. package/@types/cim/components/Hypershift/HostedClusterWizard/index.d.ts +4 -0
  160. package/@types/cim/components/Hypershift/HostedClusterWizard/index.d.ts.map +1 -0
  161. package/@types/cim/components/Hypershift/forms/NodePoolAgentsForm.d.ts +11 -0
  162. package/@types/cim/components/Hypershift/forms/NodePoolAgentsForm.d.ts.map +1 -0
  163. package/@types/cim/components/Hypershift/hooks/useSupportedOCPVersions.d.ts +4 -0
  164. package/@types/cim/components/Hypershift/hooks/useSupportedOCPVersions.d.ts.map +1 -0
  165. package/@types/cim/components/Hypershift/hooks/useTemptiflySync.d.ts +7 -0
  166. package/@types/cim/components/Hypershift/hooks/useTemptiflySync.d.ts.map +1 -0
  167. package/@types/cim/components/Hypershift/index.d.ts +5 -0
  168. package/@types/cim/components/Hypershift/index.d.ts.map +1 -0
  169. package/@types/cim/components/Hypershift/modals/AddNodePoolModal.d.ts +13 -0
  170. package/@types/cim/components/Hypershift/modals/AddNodePoolModal.d.ts.map +1 -0
  171. package/@types/cim/components/Hypershift/modals/ManageHostsModal.d.ts +17 -0
  172. package/@types/cim/components/Hypershift/modals/ManageHostsModal.d.ts.map +1 -0
  173. package/@types/cim/components/Hypershift/modals/NodePoolForm.d.ts +19 -0
  174. package/@types/cim/components/Hypershift/modals/NodePoolForm.d.ts.map +1 -0
  175. package/@types/cim/components/Hypershift/modals/RemoveNodePoolModal.d.ts +9 -0
  176. package/@types/cim/components/Hypershift/modals/RemoveNodePoolModal.d.ts.map +1 -0
  177. package/@types/cim/components/Hypershift/types.d.ts +198 -0
  178. package/@types/cim/components/Hypershift/types.d.ts.map +1 -0
  179. package/@types/cim/components/Hypershift/utils/index.d.ts +4 -0
  180. package/@types/cim/components/Hypershift/utils/index.d.ts.map +1 -0
  181. package/@types/cim/components/Hypershift/utils/labels.d.ts +11 -0
  182. package/@types/cim/components/Hypershift/utils/labels.d.ts.map +1 -0
  183. package/@types/cim/components/Hypershift/utils/nodepool.d.ts +4 -0
  184. package/@types/cim/components/Hypershift/utils/nodepool.d.ts.map +1 -0
  185. package/@types/cim/components/Hypershift/utils/status.d.ts +11 -0
  186. package/@types/cim/components/Hypershift/utils/status.d.ts.map +1 -0
  187. package/@types/cim/components/InfraEnv/AddHostDropdown.d.ts +5 -0
  188. package/@types/cim/components/InfraEnv/AddHostDropdown.d.ts.map +1 -0
  189. package/@types/cim/components/InfraEnv/AgentAlerts.d.ts +10 -0
  190. package/@types/cim/components/InfraEnv/AgentAlerts.d.ts.map +1 -0
  191. package/@types/cim/components/InfraEnv/EnvironmentDetails.d.ts +19 -0
  192. package/@types/cim/components/InfraEnv/EnvironmentDetails.d.ts.map +1 -0
  193. package/@types/cim/components/InfraEnv/EnvironmentErrors.d.ts +10 -0
  194. package/@types/cim/components/InfraEnv/EnvironmentErrors.d.ts.map +1 -0
  195. package/@types/cim/components/InfraEnv/InfraEnvAgentTable.d.ts +5 -0
  196. package/@types/cim/components/InfraEnv/InfraEnvAgentTable.d.ts.map +1 -0
  197. package/@types/cim/components/InfraEnv/InfraEnvFormPage.d.ts +36 -0
  198. package/@types/cim/components/InfraEnv/InfraEnvFormPage.d.ts.map +1 -0
  199. package/@types/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.d.ts +9 -0
  200. package/@types/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.d.ts.map +1 -0
  201. package/@types/cim/components/InfraEnv/InfraTableToolbar.d.ts +18 -0
  202. package/@types/cim/components/InfraEnv/InfraTableToolbar.d.ts.map +1 -0
  203. package/@types/cim/components/InfraEnv/index.d.ts +9 -0
  204. package/@types/cim/components/InfraEnv/index.d.ts.map +1 -0
  205. package/@types/cim/components/InfraEnv/types.d.ts +13 -0
  206. package/@types/cim/components/InfraEnv/types.d.ts.map +1 -0
  207. package/@types/cim/components/InfraEnv/utils.d.ts +14 -0
  208. package/@types/cim/components/InfraEnv/utils.d.ts.map +1 -0
  209. package/@types/cim/components/YamlPreview/YamlPreview.d.ts +9 -0
  210. package/@types/cim/components/YamlPreview/YamlPreview.d.ts.map +1 -0
  211. package/@types/cim/components/YamlPreview/index.d.ts +3 -0
  212. package/@types/cim/components/YamlPreview/index.d.ts.map +1 -0
  213. package/@types/cim/components/YamlPreview/useYAMLPreview.d.ts +15 -0
  214. package/@types/cim/components/YamlPreview/useYAMLPreview.d.ts.map +1 -0
  215. package/@types/cim/components/common/InfoAndTroubleshootingNotification.d.ts +8 -0
  216. package/@types/cim/components/common/InfoAndTroubleshootingNotification.d.ts.map +1 -0
  217. package/@types/cim/components/common/ResourceAlerts.d.ts +8 -0
  218. package/@types/cim/components/common/ResourceAlerts.d.ts.map +1 -0
  219. package/@types/cim/components/common/SpecSyncErrAlert.d.ts +6 -0
  220. package/@types/cim/components/common/SpecSyncErrAlert.d.ts.map +1 -0
  221. package/@types/cim/components/common/ValidationsRunningAlert.d.ts +3 -0
  222. package/@types/cim/components/common/ValidationsRunningAlert.d.ts.map +1 -0
  223. package/@types/cim/components/common/constants.d.ts +11 -0
  224. package/@types/cim/components/common/constants.d.ts.map +1 -0
  225. package/@types/cim/components/common/index.d.ts +3 -0
  226. package/@types/cim/components/common/index.d.ts.map +1 -0
  227. package/@types/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.d.ts +9 -0
  228. package/@types/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.d.ts.map +1 -0
  229. package/@types/cim/components/featureSupportLevels/featureStateUtils.d.ts +6 -0
  230. package/@types/cim/components/featureSupportLevels/featureStateUtils.d.ts.map +1 -0
  231. package/@types/cim/components/featureSupportLevels/index.d.ts +2 -0
  232. package/@types/cim/components/featureSupportLevels/index.d.ts.map +1 -0
  233. package/@types/cim/components/helpers/agentClusterInstall.d.ts +4 -0
  234. package/@types/cim/components/helpers/agentClusterInstall.d.ts.map +1 -0
  235. package/@types/cim/components/helpers/agentStatus.d.ts +4 -0
  236. package/@types/cim/components/helpers/agentStatus.d.ts.map +1 -0
  237. package/@types/cim/components/helpers/agents.d.ts +16 -0
  238. package/@types/cim/components/helpers/agents.d.ts.map +1 -0
  239. package/@types/cim/components/helpers/clusterDeployment.d.ts +39 -0
  240. package/@types/cim/components/helpers/clusterDeployment.d.ts.map +1 -0
  241. package/@types/cim/components/helpers/conditions.d.ts +10 -0
  242. package/@types/cim/components/helpers/conditions.d.ts.map +1 -0
  243. package/@types/cim/components/helpers/index.d.ts +12 -0
  244. package/@types/cim/components/helpers/index.d.ts.map +1 -0
  245. package/@types/cim/components/helpers/labels.d.ts +4 -0
  246. package/@types/cim/components/helpers/labels.d.ts.map +1 -0
  247. package/@types/cim/components/helpers/network.d.ts +7 -0
  248. package/@types/cim/components/helpers/network.d.ts.map +1 -0
  249. package/@types/cim/components/helpers/proxy.d.ts +2 -0
  250. package/@types/cim/components/helpers/proxy.d.ts.map +1 -0
  251. package/@types/cim/components/helpers/status.d.ts +27 -0
  252. package/@types/cim/components/helpers/status.d.ts.map +1 -0
  253. package/@types/cim/components/helpers/storage.d.ts +2 -0
  254. package/@types/cim/components/helpers/storage.d.ts.map +1 -0
  255. package/@types/cim/components/helpers/toAssisted.d.ts +13 -0
  256. package/@types/cim/components/helpers/toAssisted.d.ts.map +1 -0
  257. package/@types/cim/components/helpers/units.d.ts +51 -0
  258. package/@types/cim/components/helpers/units.d.ts.map +1 -0
  259. package/@types/cim/components/helpers/versions.d.ts +8 -0
  260. package/@types/cim/components/helpers/versions.d.ts.map +1 -0
  261. package/@types/cim/components/index.d.ts +9 -0
  262. package/@types/cim/components/index.d.ts.map +1 -0
  263. package/@types/cim/components/modals/AddBmcHostModal.d.ts +5 -0
  264. package/@types/cim/components/modals/AddBmcHostModal.d.ts.map +1 -0
  265. package/@types/cim/components/modals/AddBmcHostYamlForm.d.ts +6 -0
  266. package/@types/cim/components/modals/AddBmcHostYamlForm.d.ts.map +1 -0
  267. package/@types/cim/components/modals/AddBmcHostYamlModal.d.ts +5 -0
  268. package/@types/cim/components/modals/AddBmcHostYamlModal.d.ts.map +1 -0
  269. package/@types/cim/components/modals/AddHostModal.d.ts +5 -0
  270. package/@types/cim/components/modals/AddHostModal.d.ts.map +1 -0
  271. package/@types/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.d.ts +5 -0
  272. package/@types/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.d.ts.map +1 -0
  273. package/@types/cim/components/modals/CimConfiguration/CimConfigProgressAlert.d.ts +5 -0
  274. package/@types/cim/components/modals/CimConfiguration/CimConfigProgressAlert.d.ts.map +1 -0
  275. package/@types/cim/components/modals/CimConfiguration/CimConfigurationForm.d.ts +5 -0
  276. package/@types/cim/components/modals/CimConfiguration/CimConfigurationForm.d.ts.map +1 -0
  277. package/@types/cim/components/modals/CimConfiguration/CimConfigurationModal.d.ts +5 -0
  278. package/@types/cim/components/modals/CimConfiguration/CimConfigurationModal.d.ts.map +1 -0
  279. package/@types/cim/components/modals/CimConfiguration/CimIsMissingAlert.d.ts +3 -0
  280. package/@types/cim/components/modals/CimConfiguration/CimIsMissingAlert.d.ts.map +1 -0
  281. package/@types/cim/components/modals/CimConfiguration/CimStorageMissingAlert.d.ts +6 -0
  282. package/@types/cim/components/modals/CimConfiguration/CimStorageMissingAlert.d.ts.map +1 -0
  283. package/@types/cim/components/modals/CimConfiguration/constants.d.ts +5 -0
  284. package/@types/cim/components/modals/CimConfiguration/constants.d.ts.map +1 -0
  285. package/@types/cim/components/modals/CimConfiguration/index.d.ts +7 -0
  286. package/@types/cim/components/modals/CimConfiguration/index.d.ts.map +1 -0
  287. package/@types/cim/components/modals/CimConfiguration/persist.d.ts +24 -0
  288. package/@types/cim/components/modals/CimConfiguration/persist.d.ts.map +1 -0
  289. package/@types/cim/components/modals/CimConfiguration/types.d.ts +44 -0
  290. package/@types/cim/components/modals/CimConfiguration/types.d.ts.map +1 -0
  291. package/@types/cim/components/modals/CimConfiguration/utils.d.ts +16 -0
  292. package/@types/cim/components/modals/CimConfiguration/utils.d.ts.map +1 -0
  293. package/@types/cim/components/modals/EditAgentModal.d.ts +5 -0
  294. package/@types/cim/components/modals/EditAgentModal.d.ts.map +1 -0
  295. package/@types/cim/components/modals/EditBMHModal.d.ts +5 -0
  296. package/@types/cim/components/modals/EditBMHModal.d.ts.map +1 -0
  297. package/@types/cim/components/modals/EditNtpSourcesModal.d.ts +12 -0
  298. package/@types/cim/components/modals/EditNtpSourcesModal.d.ts.map +1 -0
  299. package/@types/cim/components/modals/EditProxyModal.d.ts +5 -0
  300. package/@types/cim/components/modals/EditProxyModal.d.ts.map +1 -0
  301. package/@types/cim/components/modals/EditPullSecretModal.d.ts +20 -0
  302. package/@types/cim/components/modals/EditPullSecretModal.d.ts.map +1 -0
  303. package/@types/cim/components/modals/EditSSHKeyModal.d.ts +14 -0
  304. package/@types/cim/components/modals/EditSSHKeyModal.d.ts.map +1 -0
  305. package/@types/cim/components/modals/MassApproveAction.d.ts +9 -0
  306. package/@types/cim/components/modals/MassApproveAction.d.ts.map +1 -0
  307. package/@types/cim/components/modals/MassApproveAgentModal.d.ts +11 -0
  308. package/@types/cim/components/modals/MassApproveAgentModal.d.ts.map +1 -0
  309. package/@types/cim/components/modals/MassDeleteAgentModal.d.ts +14 -0
  310. package/@types/cim/components/modals/MassDeleteAgentModal.d.ts.map +1 -0
  311. package/@types/cim/components/modals/ScaleUpModal.d.ts +16 -0
  312. package/@types/cim/components/modals/ScaleUpModal.d.ts.map +1 -0
  313. package/@types/cim/components/modals/constants.d.ts +64 -0
  314. package/@types/cim/components/modals/constants.d.ts.map +1 -0
  315. package/@types/cim/components/modals/index.d.ts +12 -0
  316. package/@types/cim/components/modals/index.d.ts.map +1 -0
  317. package/@types/cim/components/modals/types.d.ts +54 -0
  318. package/@types/cim/components/modals/types.d.ts.map +1 -0
  319. package/@types/cim/components/modals/utils.d.ts +29 -0
  320. package/@types/cim/components/modals/utils.d.ts.map +1 -0
  321. package/@types/cim/config/constants.d.ts +15 -0
  322. package/@types/cim/config/constants.d.ts.map +1 -0
  323. package/@types/cim/index.d.ts +14 -0
  324. package/@types/cim/index.d.ts.map +1 -0
  325. package/@types/cim/types/fromOCP/index.d.ts +2 -0
  326. package/@types/cim/types/fromOCP/index.d.ts.map +1 -0
  327. package/@types/cim/types/fromOCP/k8sTypes.d.ts +47 -0
  328. package/@types/cim/types/fromOCP/k8sTypes.d.ts.map +1 -0
  329. package/@types/cim/types/index.d.ts +5 -0
  330. package/@types/cim/types/index.d.ts.map +1 -0
  331. package/@types/cim/types/k8s/agent-cluster-install.d.ts +72 -0
  332. package/@types/cim/types/k8s/agent-cluster-install.d.ts.map +1 -0
  333. package/@types/cim/types/k8s/agent-service-config.d.ts +24 -0
  334. package/@types/cim/types/k8s/agent-service-config.d.ts.map +1 -0
  335. package/@types/cim/types/k8s/agent.d.ts +57 -0
  336. package/@types/cim/types/k8s/agent.d.ts.map +1 -0
  337. package/@types/cim/types/k8s/bare-metal-host.d.ts +32 -0
  338. package/@types/cim/types/k8s/bare-metal-host.d.ts.map +1 -0
  339. package/@types/cim/types/k8s/cluster-deployment.d.ts +42 -0
  340. package/@types/cim/types/k8s/cluster-deployment.d.ts.map +1 -0
  341. package/@types/cim/types/k8s/cluster-image-set.d.ts +7 -0
  342. package/@types/cim/types/k8s/cluster-image-set.d.ts.map +1 -0
  343. package/@types/cim/types/k8s/cluster-version.d.ts +46 -0
  344. package/@types/cim/types/k8s/cluster-version.d.ts.map +1 -0
  345. package/@types/cim/types/k8s/index.d.ts +13 -0
  346. package/@types/cim/types/k8s/index.d.ts.map +1 -0
  347. package/@types/cim/types/k8s/infra-env-k8s-resource.d.ts +40 -0
  348. package/@types/cim/types/k8s/infra-env-k8s-resource.d.ts.map +1 -0
  349. package/@types/cim/types/k8s/infrastructure.d.ts +23 -0
  350. package/@types/cim/types/k8s/infrastructure.d.ts.map +1 -0
  351. package/@types/cim/types/k8s/nm-state.d.ts +11 -0
  352. package/@types/cim/types/k8s/nm-state.d.ts.map +1 -0
  353. package/@types/cim/types/k8s/shared.d.ts +14 -0
  354. package/@types/cim/types/k8s/shared.d.ts.map +1 -0
  355. package/@types/cim/types/k8s/storage-class.d.ts +9 -0
  356. package/@types/cim/types/k8s/storage-class.d.ts.map +1 -0
  357. package/@types/cim/types/metal3.d.ts +87 -0
  358. package/@types/cim/types/metal3.d.ts.map +1 -0
  359. package/@types/cim/types/resources.d.ts +45 -0
  360. package/@types/cim/types/resources.d.ts.map +1 -0
  361. package/@types/cim/utils.d.ts +3 -0
  362. package/@types/cim/utils.d.ts.map +1 -0
  363. package/@types/common/api/index.d.ts +3 -0
  364. package/@types/common/api/index.d.ts.map +1 -0
  365. package/@types/common/api/types.d.ts +2314 -0
  366. package/@types/common/api/types.d.ts.map +1 -0
  367. package/@types/common/api/utils.d.ts +3 -0
  368. package/@types/common/api/utils.d.ts.map +1 -0
  369. package/@types/common/components/AddHosts/AddHostsContext.d.ts +11 -0
  370. package/@types/common/components/AddHosts/AddHostsContext.d.ts.map +1 -0
  371. package/@types/common/components/AddHosts/index.d.ts +2 -0
  372. package/@types/common/components/AddHosts/index.d.ts.map +1 -0
  373. package/@types/common/components/AlertsContextProvider.d.ts +11 -0
  374. package/@types/common/components/AlertsContextProvider.d.ts.map +1 -0
  375. package/@types/common/components/ErrorHandling/ErrorMonitorContext.d.ts +13 -0
  376. package/@types/common/components/ErrorHandling/ErrorMonitorContext.d.ts.map +1 -0
  377. package/@types/common/components/ErrorHandling/WithErrorBoundary.d.ts +8 -0
  378. package/@types/common/components/ErrorHandling/WithErrorBoundary.d.ts.map +1 -0
  379. package/@types/common/components/clusterConfiguration/AdvancedNetworkFields.d.ts +7 -0
  380. package/@types/common/components/clusterConfiguration/AdvancedNetworkFields.d.ts.map +1 -0
  381. package/@types/common/components/clusterConfiguration/CertificateFields.d.ts +8 -0
  382. package/@types/common/components/clusterConfiguration/CertificateFields.d.ts.map +1 -0
  383. package/@types/common/components/clusterConfiguration/DiscoveryImageConfigForm.d.ts +18 -0
  384. package/@types/common/components/clusterConfiguration/DiscoveryImageConfigForm.d.ts.map +1 -0
  385. package/@types/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.d.ts +3 -0
  386. package/@types/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.d.ts.map +1 -0
  387. package/@types/common/components/clusterConfiguration/DiscoveryInstructions.d.ts +7 -0
  388. package/@types/common/components/clusterConfiguration/DiscoveryInstructions.d.ts.map +1 -0
  389. package/@types/common/components/clusterConfiguration/DiscoveryIpxeInstructions.d.ts +3 -0
  390. package/@types/common/components/clusterConfiguration/DiscoveryIpxeInstructions.d.ts.map +1 -0
  391. package/@types/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.d.ts +14 -0
  392. package/@types/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.d.ts.map +1 -0
  393. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.d.ts +9 -0
  394. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.d.ts.map +1 -0
  395. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.d.ts +7 -0
  396. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.d.ts.map +1 -0
  397. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.d.ts +12 -0
  398. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.d.ts.map +1 -0
  399. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.d.ts +4 -0
  400. package/@types/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.d.ts.map +1 -0
  401. package/@types/common/components/clusterConfiguration/DownloadIpxeScript.d.ts +10 -0
  402. package/@types/common/components/clusterConfiguration/DownloadIpxeScript.d.ts.map +1 -0
  403. package/@types/common/components/clusterConfiguration/DownloadIso.d.ts +11 -0
  404. package/@types/common/components/clusterConfiguration/DownloadIso.d.ts.map +1 -0
  405. package/@types/common/components/clusterConfiguration/DownloadIsoModal.d.ts +8 -0
  406. package/@types/common/components/clusterConfiguration/DownloadIsoModal.d.ts.map +1 -0
  407. package/@types/common/components/clusterConfiguration/FormatDiskWarning.d.ts +6 -0
  408. package/@types/common/components/clusterConfiguration/FormatDiskWarning.d.ts.map +1 -0
  409. package/@types/common/components/clusterConfiguration/OpenShiftVersionSelect.d.ts +8 -0
  410. package/@types/common/components/clusterConfiguration/OpenShiftVersionSelect.d.ts.map +1 -0
  411. package/@types/common/components/clusterConfiguration/ProxyFields.d.ts +6 -0
  412. package/@types/common/components/clusterConfiguration/ProxyFields.d.ts.map +1 -0
  413. package/@types/common/components/clusterConfiguration/SNOControlGroup.d.ts +9 -0
  414. package/@types/common/components/clusterConfiguration/SNOControlGroup.d.ts.map +1 -0
  415. package/@types/common/components/clusterConfiguration/SNODisclaimer.d.ts +9 -0
  416. package/@types/common/components/clusterConfiguration/SNODisclaimer.d.ts.map +1 -0
  417. package/@types/common/components/clusterConfiguration/SecurityFields.d.ts +13 -0
  418. package/@types/common/components/clusterConfiguration/SecurityFields.d.ts.map +1 -0
  419. package/@types/common/components/clusterConfiguration/UploadSSH.d.ts +8 -0
  420. package/@types/common/components/clusterConfiguration/UploadSSH.d.ts.map +1 -0
  421. package/@types/common/components/clusterConfiguration/index.d.ts +14 -0
  422. package/@types/common/components/clusterConfiguration/index.d.ts.map +1 -0
  423. package/@types/common/components/clusterConfiguration/utils.d.ts +33 -0
  424. package/@types/common/components/clusterConfiguration/utils.d.ts.map +1 -0
  425. package/@types/common/components/clusterDetail/ClusterCredentials.d.ts +14 -0
  426. package/@types/common/components/clusterDetail/ClusterCredentials.d.ts.map +1 -0
  427. package/@types/common/components/clusterDetail/ClusterProgress.d.ts +10 -0
  428. package/@types/common/components/clusterDetail/ClusterProgress.d.ts.map +1 -0
  429. package/@types/common/components/clusterDetail/ClusterProgressItem.d.ts +7 -0
  430. package/@types/common/components/clusterDetail/ClusterProgressItem.d.ts.map +1 -0
  431. package/@types/common/components/clusterDetail/ClusterProgressItems.d.ts +12 -0
  432. package/@types/common/components/clusterDetail/ClusterProgressItems.d.ts.map +1 -0
  433. package/@types/common/components/clusterDetail/ClusterPropertiesList.d.ts +12 -0
  434. package/@types/common/components/clusterDetail/ClusterPropertiesList.d.ts.map +1 -0
  435. package/@types/common/components/clusterDetail/ConsoleModal.d.ts +21 -0
  436. package/@types/common/components/clusterDetail/ConsoleModal.d.ts.map +1 -0
  437. package/@types/common/components/clusterDetail/FinalizingProgress.d.ts +15 -0
  438. package/@types/common/components/clusterDetail/FinalizingProgress.d.ts.map +1 -0
  439. package/@types/common/components/clusterDetail/KubeconfigDownload.d.ts +12 -0
  440. package/@types/common/components/clusterDetail/KubeconfigDownload.d.ts.map +1 -0
  441. package/@types/common/components/clusterDetail/OperatorsProgressItem.d.ts +15 -0
  442. package/@types/common/components/clusterDetail/OperatorsProgressItem.d.ts.map +1 -0
  443. package/@types/common/components/clusterDetail/ProgressBarTexts.d.ts +8 -0
  444. package/@types/common/components/clusterDetail/ProgressBarTexts.d.ts.map +1 -0
  445. package/@types/common/components/clusterDetail/index.d.ts +5 -0
  446. package/@types/common/components/clusterDetail/index.d.ts.map +1 -0
  447. package/@types/common/components/clusterWizard/ClusterWizardStep.d.ts +9 -0
  448. package/@types/common/components/clusterWizard/ClusterWizardStep.d.ts.map +1 -0
  449. package/@types/common/components/clusterWizard/ClusterWizardStepHeader.d.ts +4 -0
  450. package/@types/common/components/clusterWizard/ClusterWizardStepHeader.d.ts.map +1 -0
  451. package/@types/common/components/clusterWizard/ClusterWizardStepValidationsAlert.d.ts +16 -0
  452. package/@types/common/components/clusterWizard/ClusterWizardStepValidationsAlert.d.ts.map +1 -0
  453. package/@types/common/components/clusterWizard/ReviewHostsInventory.d.ts +6 -0
  454. package/@types/common/components/clusterWizard/ReviewHostsInventory.d.ts.map +1 -0
  455. package/@types/common/components/clusterWizard/ReviewValidations.d.ts +4 -0
  456. package/@types/common/components/clusterWizard/ReviewValidations.d.ts.map +1 -0
  457. package/@types/common/components/clusterWizard/clusterDetailsValidation.d.ts +27 -0
  458. package/@types/common/components/clusterWizard/clusterDetailsValidation.d.ts.map +1 -0
  459. package/@types/common/components/clusterWizard/index.d.ts +9 -0
  460. package/@types/common/components/clusterWizard/index.d.ts.map +1 -0
  461. package/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts +10 -0
  462. package/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts.map +1 -0
  463. package/@types/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.d.ts +7 -0
  464. package/@types/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.d.ts.map +1 -0
  465. package/@types/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.d.ts +6 -0
  466. package/@types/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.d.ts.map +1 -0
  467. package/@types/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.d.ts +6 -0
  468. package/@types/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.d.ts.map +1 -0
  469. package/@types/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.d.ts +9 -0
  470. package/@types/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.d.ts.map +1 -0
  471. package/@types/common/components/clusterWizard/networkingSteps/index.d.ts +9 -0
  472. package/@types/common/components/clusterWizard/networkingSteps/index.d.ts.map +1 -0
  473. package/@types/common/components/clusterWizard/types.d.ts +59 -0
  474. package/@types/common/components/clusterWizard/types.d.ts.map +1 -0
  475. package/@types/common/components/clusterWizard/validationsInfoUtils.d.ts +36 -0
  476. package/@types/common/components/clusterWizard/validationsInfoUtils.d.ts.map +1 -0
  477. package/@types/common/components/clusters/PullSecret.d.ts +8 -0
  478. package/@types/common/components/clusters/PullSecret.d.ts.map +1 -0
  479. package/@types/common/components/clusters/index.d.ts +2 -0
  480. package/@types/common/components/clusters/index.d.ts.map +1 -0
  481. package/@types/common/components/constants.d.ts +3 -0
  482. package/@types/common/components/constants.d.ts.map +1 -0
  483. package/@types/common/components/featureSupportLevels/FeatureSupportLevelBadge.d.ts +9 -0
  484. package/@types/common/components/featureSupportLevels/FeatureSupportLevelBadge.d.ts.map +1 -0
  485. package/@types/common/components/featureSupportLevels/FeatureSupportLevelContext.d.ts +22 -0
  486. package/@types/common/components/featureSupportLevels/FeatureSupportLevelContext.d.ts.map +1 -0
  487. package/@types/common/components/featureSupportLevels/index.d.ts +3 -0
  488. package/@types/common/components/featureSupportLevels/index.d.ts.map +1 -0
  489. package/@types/common/components/fetching/EventListFetch.d.ts +3 -0
  490. package/@types/common/components/fetching/EventListFetch.d.ts.map +1 -0
  491. package/@types/common/components/fetching/index.d.ts +2 -0
  492. package/@types/common/components/fetching/index.d.ts.map +1 -0
  493. package/@types/common/components/hosts/AITable.d.ts +54 -0
  494. package/@types/common/components/hosts/AITable.d.ts.map +1 -0
  495. package/@types/common/components/hosts/AdditionalNTPSourcesDialog.d.ts +13 -0
  496. package/@types/common/components/hosts/AdditionalNTPSourcesDialog.d.ts.map +1 -0
  497. package/@types/common/components/hosts/DiskLimitations.d.ts +8 -0
  498. package/@types/common/components/hosts/DiskLimitations.d.ts.map +1 -0
  499. package/@types/common/components/hosts/DiskRole.d.ts +15 -0
  500. package/@types/common/components/hosts/DiskRole.d.ts.map +1 -0
  501. package/@types/common/components/hosts/EditHostForm.d.ts +14 -0
  502. package/@types/common/components/hosts/EditHostForm.d.ts.map +1 -0
  503. package/@types/common/components/hosts/EditHostModal.d.ts +11 -0
  504. package/@types/common/components/hosts/EditHostModal.d.ts.map +1 -0
  505. package/@types/common/components/hosts/FormatDiskCheckbox.d.ts +17 -0
  506. package/@types/common/components/hosts/FormatDiskCheckbox.d.ts.map +1 -0
  507. package/@types/common/components/hosts/HostProgress.d.ts +6 -0
  508. package/@types/common/components/hosts/HostProgress.d.ts.map +1 -0
  509. package/@types/common/components/hosts/HostPropertyValidationPopover.d.ts +13 -0
  510. package/@types/common/components/hosts/HostPropertyValidationPopover.d.ts.map +1 -0
  511. package/@types/common/components/hosts/HostRequirements.d.ts +16 -0
  512. package/@types/common/components/hosts/HostRequirements.d.ts.map +1 -0
  513. package/@types/common/components/hosts/HostRowDetail.d.ts +14 -0
  514. package/@types/common/components/hosts/HostRowDetail.d.ts.map +1 -0
  515. package/@types/common/components/hosts/HostStatus.d.ts +5 -0
  516. package/@types/common/components/hosts/HostStatus.d.ts.map +1 -0
  517. package/@types/common/components/hosts/HostToolbarActions.d.ts +11 -0
  518. package/@types/common/components/hosts/HostToolbarActions.d.ts.map +1 -0
  519. package/@types/common/components/hosts/HostValidationGroups.d.ts +21 -0
  520. package/@types/common/components/hosts/HostValidationGroups.d.ts.map +1 -0
  521. package/@types/common/components/hosts/Hostname.d.ts +14 -0
  522. package/@types/common/components/hosts/Hostname.d.ts.map +1 -0
  523. package/@types/common/components/hosts/HostsCount.d.ts +10 -0
  524. package/@types/common/components/hosts/HostsCount.d.ts.map +1 -0
  525. package/@types/common/components/hosts/HostsTable.d.ts +20 -0
  526. package/@types/common/components/hosts/HostsTable.d.ts.map +1 -0
  527. package/@types/common/components/hosts/HostsTableDetailContext.d.ts +12 -0
  528. package/@types/common/components/hosts/HostsTableDetailContext.d.ts.map +1 -0
  529. package/@types/common/components/hosts/MassChangeHostnameModal.d.ts +16 -0
  530. package/@types/common/components/hosts/MassChangeHostnameModal.d.ts.map +1 -0
  531. package/@types/common/components/hosts/MassDeleteHostModal.d.ts +13 -0
  532. package/@types/common/components/hosts/MassDeleteHostModal.d.ts.map +1 -0
  533. package/@types/common/components/hosts/NtpValidationStatus.d.ts +10 -0
  534. package/@types/common/components/hosts/NtpValidationStatus.d.ts.map +1 -0
  535. package/@types/common/components/hosts/OcpConsoleNodesSectionLink.d.ts +7 -0
  536. package/@types/common/components/hosts/OcpConsoleNodesSectionLink.d.ts.map +1 -0
  537. package/@types/common/components/hosts/RoleCell.d.ts +12 -0
  538. package/@types/common/components/hosts/RoleCell.d.ts.map +1 -0
  539. package/@types/common/components/hosts/RoleDropdown.d.ts +10 -0
  540. package/@types/common/components/hosts/RoleDropdown.d.ts.map +1 -0
  541. package/@types/common/components/hosts/TableToolbar.d.ts +19 -0
  542. package/@types/common/components/hosts/TableToolbar.d.ts.map +1 -0
  543. package/@types/common/components/hosts/VMRebootConfigurationInfo.d.ts +4 -0
  544. package/@types/common/components/hosts/VMRebootConfigurationInfo.d.ts.map +1 -0
  545. package/@types/common/components/hosts/hardwareInfo.d.ts +20 -0
  546. package/@types/common/components/hosts/hardwareInfo.d.ts.map +1 -0
  547. package/@types/common/components/hosts/index.d.ts +17 -0
  548. package/@types/common/components/hosts/index.d.ts.map +1 -0
  549. package/@types/common/components/hosts/status.d.ts +5 -0
  550. package/@types/common/components/hosts/status.d.ts.map +1 -0
  551. package/@types/common/components/hosts/tableUtils.d.ts +22 -0
  552. package/@types/common/components/hosts/tableUtils.d.ts.map +1 -0
  553. package/@types/common/components/hosts/types.d.ts +73 -0
  554. package/@types/common/components/hosts/types.d.ts.map +1 -0
  555. package/@types/common/components/hosts/usePagination.d.ts +10 -0
  556. package/@types/common/components/hosts/usePagination.d.ts.map +1 -0
  557. package/@types/common/components/hosts/utils.d.ts +39 -0
  558. package/@types/common/components/hosts/utils.d.ts.map +1 -0
  559. package/@types/common/components/index.d.ts +12 -0
  560. package/@types/common/components/index.d.ts.map +1 -0
  561. package/@types/common/components/newFeatureSupportLevels/FeatureSupportLevelBadge.d.ts +9 -0
  562. package/@types/common/components/newFeatureSupportLevels/FeatureSupportLevelBadge.d.ts.map +1 -0
  563. package/@types/common/components/newFeatureSupportLevels/FeatureSupportLevelContext.d.ts +22 -0
  564. package/@types/common/components/newFeatureSupportLevels/FeatureSupportLevelContext.d.ts.map +1 -0
  565. package/@types/common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge.d.ts +10 -0
  566. package/@types/common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge.d.ts.map +1 -0
  567. package/@types/common/components/newFeatureSupportLevels/NewFeatureSupportLevelContext.d.ts +24 -0
  568. package/@types/common/components/newFeatureSupportLevels/NewFeatureSupportLevelContext.d.ts.map +1 -0
  569. package/@types/common/components/newFeatureSupportLevels/index.d.ts +2 -0
  570. package/@types/common/components/newFeatureSupportLevels/index.d.ts.map +1 -0
  571. package/@types/common/components/newFeatureSupportLevels/utils.d.ts +6 -0
  572. package/@types/common/components/newFeatureSupportLevels/utils.d.ts.map +1 -0
  573. package/@types/common/components/storage/DisksTable.d.ts +14 -0
  574. package/@types/common/components/storage/DisksTable.d.ts.map +1 -0
  575. package/@types/common/components/storage/StorageDetail.d.ts +12 -0
  576. package/@types/common/components/storage/StorageDetail.d.ts.map +1 -0
  577. package/@types/common/components/storage/StorageTable.d.ts +12 -0
  578. package/@types/common/components/storage/StorageTable.d.ts.map +1 -0
  579. package/@types/common/components/storage/StorageUtils.d.ts +7 -0
  580. package/@types/common/components/storage/StorageUtils.d.ts.map +1 -0
  581. package/@types/common/components/ui/Alerts.d.ts +6 -0
  582. package/@types/common/components/ui/Alerts.d.ts.map +1 -0
  583. package/@types/common/components/ui/BorderedIcon/BorderedIcon.d.ts +11 -0
  584. package/@types/common/components/ui/BorderedIcon/BorderedIcon.d.ts.map +1 -0
  585. package/@types/common/components/ui/ClusterEventsToolbar.d.ts +18 -0
  586. package/@types/common/components/ui/ClusterEventsToolbar.d.ts.map +1 -0
  587. package/@types/common/components/ui/ConfirmationModal.d.ts +14 -0
  588. package/@types/common/components/ui/ConfirmationModal.d.ts.map +1 -0
  589. package/@types/common/components/ui/DetailList.d.ts +23 -0
  590. package/@types/common/components/ui/DetailList.d.ts.map +1 -0
  591. package/@types/common/components/ui/EventsList.d.ts +9 -0
  592. package/@types/common/components/ui/EventsList.d.ts.map +1 -0
  593. package/@types/common/components/ui/ExternalLink.d.ts +9 -0
  594. package/@types/common/components/ui/ExternalLink.d.ts.map +1 -0
  595. package/@types/common/components/ui/GridGap.d.ts +8 -0
  596. package/@types/common/components/ui/GridGap.d.ts.map +1 -0
  597. package/@types/common/components/ui/ModalProgress.d.ts +11 -0
  598. package/@types/common/components/ui/ModalProgress.d.ts.map +1 -0
  599. package/@types/common/components/ui/OpenShiftVersionDropdown.d.ts +17 -0
  600. package/@types/common/components/ui/OpenShiftVersionDropdown.d.ts.map +1 -0
  601. package/@types/common/components/ui/PopoverIcon.d.ts +16 -0
  602. package/@types/common/components/ui/PopoverIcon.d.ts.map +1 -0
  603. package/@types/common/components/ui/PreviewBadge.d.ts +15 -0
  604. package/@types/common/components/ui/PreviewBadge.d.ts.map +1 -0
  605. package/@types/common/components/ui/PrismCode.d.ts +30 -0
  606. package/@types/common/components/ui/PrismCode.d.ts.map +1 -0
  607. package/@types/common/components/ui/RenderIf.d.ts +7 -0
  608. package/@types/common/components/ui/RenderIf.d.ts.map +1 -0
  609. package/@types/common/components/ui/SectionTitle.d.ts +7 -0
  610. package/@types/common/components/ui/SectionTitle.d.ts.map +1 -0
  611. package/@types/common/components/ui/SimpleDropdown.d.ts +15 -0
  612. package/@types/common/components/ui/SimpleDropdown.d.ts.map +1 -0
  613. package/@types/common/components/ui/StaticTextField.d.ts +24 -0
  614. package/@types/common/components/ui/StaticTextField.d.ts.map +1 -0
  615. package/@types/common/components/ui/Toolbar/ToolbarButton.d.ts +5 -0
  616. package/@types/common/components/ui/Toolbar/ToolbarButton.d.ts.map +1 -0
  617. package/@types/common/components/ui/Toolbar/ToolbarProgress.d.ts +5 -0
  618. package/@types/common/components/ui/Toolbar/ToolbarProgress.d.ts.map +1 -0
  619. package/@types/common/components/ui/Toolbar/ToolbarSecondaryGroup.d.ts +4 -0
  620. package/@types/common/components/ui/Toolbar/ToolbarSecondaryGroup.d.ts.map +1 -0
  621. package/@types/common/components/ui/Toolbar/ToolbarText.d.ts +5 -0
  622. package/@types/common/components/ui/Toolbar/ToolbarText.d.ts.map +1 -0
  623. package/@types/common/components/ui/Toolbar/index.d.ts +5 -0
  624. package/@types/common/components/ui/Toolbar/index.d.ts.map +1 -0
  625. package/@types/common/components/ui/ViewClusterEventsButton.d.ts +9 -0
  626. package/@types/common/components/ui/ViewClusterEventsButton.d.ts.map +1 -0
  627. package/@types/common/components/ui/WizardFooter.d.ts +23 -0
  628. package/@types/common/components/ui/WizardFooter.d.ts.map +1 -0
  629. package/@types/common/components/ui/WizardNavItem.d.ts +8 -0
  630. package/@types/common/components/ui/WizardNavItem.d.ts.map +1 -0
  631. package/@types/common/components/ui/eventsModal.d.ts +30 -0
  632. package/@types/common/components/ui/eventsModal.d.ts.map +1 -0
  633. package/@types/common/components/ui/formik/AddButton.d.ts +8 -0
  634. package/@types/common/components/ui/formik/AddButton.d.ts.map +1 -0
  635. package/@types/common/components/ui/formik/AdditionalNTPSourcesField.d.ts +11 -0
  636. package/@types/common/components/ui/formik/AdditionalNTPSourcesField.d.ts.map +1 -0
  637. package/@types/common/components/ui/formik/AlertFormikError.d.ts +8 -0
  638. package/@types/common/components/ui/formik/AlertFormikError.d.ts.map +1 -0
  639. package/@types/common/components/ui/formik/CertificatesUploadField.d.ts +5 -0
  640. package/@types/common/components/ui/formik/CertificatesUploadField.d.ts.map +1 -0
  641. package/@types/common/components/ui/formik/CheckboxField.d.ts +5 -0
  642. package/@types/common/components/ui/formik/CheckboxField.d.ts.map +1 -0
  643. package/@types/common/components/ui/formik/CodeField.d.ts +4 -0
  644. package/@types/common/components/ui/formik/CodeField.d.ts.map +1 -0
  645. package/@types/common/components/ui/formik/FormikAutoSave.d.ts +8 -0
  646. package/@types/common/components/ui/formik/FormikAutoSave.d.ts.map +1 -0
  647. package/@types/common/components/ui/formik/HelperText.d.ts +12 -0
  648. package/@types/common/components/ui/formik/HelperText.d.ts.map +1 -0
  649. package/@types/common/components/ui/formik/InputField.d.ts +9 -0
  650. package/@types/common/components/ui/formik/InputField.d.ts.map +1 -0
  651. package/@types/common/components/ui/formik/LabelField.d.ts +14 -0
  652. package/@types/common/components/ui/formik/LabelField.d.ts.map +1 -0
  653. package/@types/common/components/ui/formik/MultiSelectField.d.ts +5 -0
  654. package/@types/common/components/ui/formik/MultiSelectField.d.ts.map +1 -0
  655. package/@types/common/components/ui/formik/NumberInputField.d.ts +5 -0
  656. package/@types/common/components/ui/formik/NumberInputField.d.ts.map +1 -0
  657. package/@types/common/components/ui/formik/PencilEditField.d.ts +9 -0
  658. package/@types/common/components/ui/formik/PencilEditField.d.ts.map +1 -0
  659. package/@types/common/components/ui/formik/PullSecretField.d.ts +13 -0
  660. package/@types/common/components/ui/formik/PullSecretField.d.ts.map +1 -0
  661. package/@types/common/components/ui/formik/RadioField.d.ts +4 -0
  662. package/@types/common/components/ui/formik/RadioField.d.ts.map +1 -0
  663. package/@types/common/components/ui/formik/RadioFieldWithTooltip.d.ts +8 -0
  664. package/@types/common/components/ui/formik/RadioFieldWithTooltip.d.ts.map +1 -0
  665. package/@types/common/components/ui/formik/RemovableField.d.ts +11 -0
  666. package/@types/common/components/ui/formik/RemovableField.d.ts.map +1 -0
  667. package/@types/common/components/ui/formik/RichInputField.d.ts +18 -0
  668. package/@types/common/components/ui/formik/RichInputField.d.ts.map +1 -0
  669. package/@types/common/components/ui/formik/SelectField.d.ts +5 -0
  670. package/@types/common/components/ui/formik/SelectField.d.ts.map +1 -0
  671. package/@types/common/components/ui/formik/SingleNodeCheckbox.d.ts +9 -0
  672. package/@types/common/components/ui/formik/SingleNodeCheckbox.d.ts.map +1 -0
  673. package/@types/common/components/ui/formik/SwitchField.d.ts +5 -0
  674. package/@types/common/components/ui/formik/SwitchField.d.ts.map +1 -0
  675. package/@types/common/components/ui/formik/TextAreaField.d.ts +5 -0
  676. package/@types/common/components/ui/formik/TextAreaField.d.ts.map +1 -0
  677. package/@types/common/components/ui/formik/TextAreaSecretField.d.ts +5 -0
  678. package/@types/common/components/ui/formik/TextAreaSecretField.d.ts.map +1 -0
  679. package/@types/common/components/ui/formik/UploadField.d.ts +5 -0
  680. package/@types/common/components/ui/formik/UploadField.d.ts.map +1 -0
  681. package/@types/common/components/ui/formik/constants.d.ts +58 -0
  682. package/@types/common/components/ui/formik/constants.d.ts.map +1 -0
  683. package/@types/common/components/ui/formik/index.d.ts +27 -0
  684. package/@types/common/components/ui/formik/index.d.ts.map +1 -0
  685. package/@types/common/components/ui/formik/types.d.ts +120 -0
  686. package/@types/common/components/ui/formik/types.d.ts.map +1 -0
  687. package/@types/common/components/ui/formik/utils.d.ts +27 -0
  688. package/@types/common/components/ui/formik/utils.d.ts.map +1 -0
  689. package/@types/common/components/ui/formik/validationSchemas.d.ts +40 -0
  690. package/@types/common/components/ui/formik/validationSchemas.d.ts.map +1 -0
  691. package/@types/common/components/ui/index.d.ts +23 -0
  692. package/@types/common/components/ui/index.d.ts.map +1 -0
  693. package/@types/common/components/ui/table/index.d.ts +3 -0
  694. package/@types/common/components/ui/table/index.d.ts.map +1 -0
  695. package/@types/common/components/ui/table/utils.d.ts +25 -0
  696. package/@types/common/components/ui/table/utils.d.ts.map +1 -0
  697. package/@types/common/components/ui/table/wrappable.d.ts +9 -0
  698. package/@types/common/components/ui/table/wrappable.d.ts.map +1 -0
  699. package/@types/common/components/ui/uiState/EmptyState.d.ts +12 -0
  700. package/@types/common/components/ui/uiState/EmptyState.d.ts.map +1 -0
  701. package/@types/common/components/ui/uiState/ErrorState.d.ts +15 -0
  702. package/@types/common/components/ui/uiState/ErrorState.d.ts.map +1 -0
  703. package/@types/common/components/ui/uiState/LoadingState.d.ts +9 -0
  704. package/@types/common/components/ui/uiState/LoadingState.d.ts.map +1 -0
  705. package/@types/common/components/ui/uiState/index.d.ts +4 -0
  706. package/@types/common/components/ui/uiState/index.d.ts.map +1 -0
  707. package/@types/common/components/ui/utils.d.ts +5 -0
  708. package/@types/common/components/ui/utils.d.ts.map +1 -0
  709. package/@types/common/config/constants.d.ts +223 -0
  710. package/@types/common/config/constants.d.ts.map +1 -0
  711. package/@types/common/config/index.d.ts +2 -0
  712. package/@types/common/config/index.d.ts.map +1 -0
  713. package/@types/common/features/featureGate.d.ts +25 -0
  714. package/@types/common/features/featureGate.d.ts.map +1 -0
  715. package/@types/common/features/index.d.ts +2 -0
  716. package/@types/common/features/index.d.ts.map +1 -0
  717. package/@types/common/hooks/index.d.ts +3 -0
  718. package/@types/common/hooks/index.d.ts.map +1 -0
  719. package/@types/common/hooks/use-translation-wrapper.d.ts +2 -0
  720. package/@types/common/hooks/use-translation-wrapper.d.ts.map +1 -0
  721. package/@types/common/hooks/useDeepCompareMemoize.d.ts +3 -0
  722. package/@types/common/hooks/useDeepCompareMemoize.d.ts.map +1 -0
  723. package/@types/common/hooks/useFieldErrorMsg.d.ts +9 -0
  724. package/@types/common/hooks/useFieldErrorMsg.d.ts.map +1 -0
  725. package/@types/common/hooks/useFormikHelpers.d.ts +7 -0
  726. package/@types/common/hooks/useFormikHelpers.d.ts.map +1 -0
  727. package/@types/common/hooks/useStateSafely.d.ts +4 -0
  728. package/@types/common/hooks/useStateSafely.d.ts.map +1 -0
  729. package/@types/common/index.d.ts +10 -0
  730. package/@types/common/index.d.ts.map +1 -0
  731. package/@types/common/reducers/alertsSlice.d.ts +19 -0
  732. package/@types/common/reducers/alertsSlice.d.ts.map +1 -0
  733. package/@types/common/reducers/dialogsSlice.d.ts +10 -0
  734. package/@types/common/reducers/dialogsSlice.d.ts.map +1 -0
  735. package/@types/common/reducers/index.d.ts +3 -0
  736. package/@types/common/reducers/index.d.ts.map +1 -0
  737. package/@types/common/selectors/clusterSelectors.d.ts +21 -0
  738. package/@types/common/selectors/clusterSelectors.d.ts.map +1 -0
  739. package/@types/common/selectors/index.d.ts +2 -0
  740. package/@types/common/selectors/index.d.ts.map +1 -0
  741. package/@types/common/sevices/DateAndTime.d.ts +3 -0
  742. package/@types/common/sevices/DateAndTime.d.ts.map +1 -0
  743. package/@types/common/types/clusters.d.ts +44 -0
  744. package/@types/common/types/clusters.d.ts.map +1 -0
  745. package/@types/common/types/cpuArchitecture.d.ts +24 -0
  746. package/@types/common/types/cpuArchitecture.d.ts.map +1 -0
  747. package/@types/common/types/errortype.d.ts +7 -0
  748. package/@types/common/types/errortype.d.ts.map +1 -0
  749. package/@types/common/types/events.d.ts +20 -0
  750. package/@types/common/types/events.d.ts.map +1 -0
  751. package/@types/common/types/featureSupportLevel.d.ts +23 -0
  752. package/@types/common/types/featureSupportLevel.d.ts.map +1 -0
  753. package/@types/common/types/generateIsoFields.d.ts +12 -0
  754. package/@types/common/types/generateIsoFields.d.ts.map +1 -0
  755. package/@types/common/types/hosts.d.ts +20 -0
  756. package/@types/common/types/hosts.d.ts.map +1 -0
  757. package/@types/common/types/index.d.ts +20 -0
  758. package/@types/common/types/index.d.ts.map +1 -0
  759. package/@types/common/types/typescriptExtensions.d.ts +10 -0
  760. package/@types/common/types/typescriptExtensions.d.ts.map +1 -0
  761. package/@types/common/types/versions.d.ts +11 -0
  762. package/@types/common/types/versions.d.ts.map +1 -0
  763. package/@types/common/utils.d.ts +4 -0
  764. package/@types/common/utils.d.ts.map +1 -0
  765. package/@types/index.d.ts +3 -0
  766. package/@types/index.d.ts.map +1 -0
  767. package/@types/ocm/api/axiosClient.d.ts +8 -0
  768. package/@types/ocm/api/axiosClient.d.ts.map +1 -0
  769. package/@types/ocm/api/axiosExtensions.d.ts +3 -0
  770. package/@types/ocm/api/axiosExtensions.d.ts.map +1 -0
  771. package/@types/ocm/api/index.d.ts +3 -0
  772. package/@types/ocm/api/index.d.ts.map +1 -0
  773. package/@types/ocm/api/types.d.ts +6 -0
  774. package/@types/ocm/api/types.d.ts.map +1 -0
  775. package/@types/ocm/api/utils.d.ts +12 -0
  776. package/@types/ocm/api/utils.d.ts.map +1 -0
  777. package/@types/ocm/components/AddHosts/AddHosts.d.ts +2 -0
  778. package/@types/ocm/components/AddHosts/AddHosts.d.ts.map +1 -0
  779. package/@types/ocm/components/AddHosts/InventoryAddHost.d.ts +7 -0
  780. package/@types/ocm/components/AddHosts/InventoryAddHost.d.ts.map +1 -0
  781. package/@types/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.d.ts +3 -0
  782. package/@types/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.d.ts.map +1 -0
  783. package/@types/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.d.ts +6 -0
  784. package/@types/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.d.ts.map +1 -0
  785. package/@types/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.d.ts +3 -0
  786. package/@types/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.d.ts.map +1 -0
  787. package/@types/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.d.ts +3 -0
  788. package/@types/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.d.ts.map +1 -0
  789. package/@types/ocm/components/AddHosts/day2Wizard/Day2StaticIP.d.ts +3 -0
  790. package/@types/ocm/components/AddHosts/day2Wizard/Day2StaticIP.d.ts.map +1 -0
  791. package/@types/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.d.ts +3 -0
  792. package/@types/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.d.ts.map +1 -0
  793. package/@types/ocm/components/AddHosts/day2Wizard/Day2Wizard.d.ts +3 -0
  794. package/@types/ocm/components/AddHosts/day2Wizard/Day2Wizard.d.ts.map +1 -0
  795. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardContext.d.ts +24 -0
  796. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardContext.d.ts.map +1 -0
  797. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.d.ts +9 -0
  798. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.d.ts.map +1 -0
  799. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardFooter.d.ts +9 -0
  800. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardFooter.d.ts.map +1 -0
  801. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardNav.d.ts +3 -0
  802. package/@types/ocm/components/AddHosts/day2Wizard/Day2WizardNav.d.ts.map +1 -0
  803. package/@types/ocm/components/AddHosts/day2Wizard/constants.d.ts +7 -0
  804. package/@types/ocm/components/AddHosts/day2Wizard/constants.d.ts.map +1 -0
  805. package/@types/ocm/components/AddHosts/index.d.ts +3 -0
  806. package/@types/ocm/components/AddHosts/index.d.ts.map +1 -0
  807. package/@types/ocm/components/AddHosts/types.d.ts +44 -0
  808. package/@types/ocm/components/AddHosts/types.d.ts.map +1 -0
  809. package/@types/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.d.ts +4 -0
  810. package/@types/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.d.ts.map +1 -0
  811. package/@types/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.d.ts +3 -0
  812. package/@types/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.d.ts.map +1 -0
  813. package/@types/ocm/components/HostsClusterDetailTab/index.d.ts +3 -0
  814. package/@types/ocm/components/HostsClusterDetailTab/index.d.ts.map +1 -0
  815. package/@types/ocm/components/HostsClusterDetailTab/types.d.ts +8 -0
  816. package/@types/ocm/components/HostsClusterDetailTab/types.d.ts.map +1 -0
  817. package/@types/ocm/components/HostsClusterDetailTab/utils.d.ts +9 -0
  818. package/@types/ocm/components/HostsClusterDetailTab/utils.d.ts.map +1 -0
  819. package/@types/ocm/components/Router.d.ts +9 -0
  820. package/@types/ocm/components/Router.d.ts.map +1 -0
  821. package/@types/ocm/components/SentryErrorMonitorContextProvider.d.ts +3 -0
  822. package/@types/ocm/components/SentryErrorMonitorContextProvider.d.ts.map +1 -0
  823. package/@types/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.d.ts +9 -0
  824. package/@types/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.d.ts.map +1 -0
  825. package/@types/ocm/components/clusterConfiguration/CpuArchitectureDropdown.d.ts +15 -0
  826. package/@types/ocm/components/clusterConfiguration/CpuArchitectureDropdown.d.ts.map +1 -0
  827. package/@types/ocm/components/clusterConfiguration/CustomManifestCheckbox.d.ts +6 -0
  828. package/@types/ocm/components/clusterConfiguration/CustomManifestCheckbox.d.ts.map +1 -0
  829. package/@types/ocm/components/clusterConfiguration/DiscoveryImageForm.d.ts +12 -0
  830. package/@types/ocm/components/clusterConfiguration/DiscoveryImageForm.d.ts.map +1 -0
  831. package/@types/ocm/components/clusterConfiguration/DiscoveryImageModal.d.ts +12 -0
  832. package/@types/ocm/components/clusterConfiguration/DiscoveryImageModal.d.ts.map +1 -0
  833. package/@types/ocm/components/clusterConfiguration/DiscoveryImageTypeDropdown.d.ts +11 -0
  834. package/@types/ocm/components/clusterConfiguration/DiscoveryImageTypeDropdown.d.ts.map +1 -0
  835. package/@types/ocm/components/clusterConfiguration/HostInventory.d.ts +6 -0
  836. package/@types/ocm/components/clusterConfiguration/HostInventory.d.ts.map +1 -0
  837. package/@types/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.d.ts +5 -0
  838. package/@types/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.d.ts.map +1 -0
  839. package/@types/ocm/components/clusterConfiguration/InformationAndAlerts.d.ts +6 -0
  840. package/@types/ocm/components/clusterConfiguration/InformationAndAlerts.d.ts.map +1 -0
  841. package/@types/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.d.ts +16 -0
  842. package/@types/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.d.ts.map +1 -0
  843. package/@types/ocm/components/clusterConfiguration/OcmClusterProgressItems.d.ts +11 -0
  844. package/@types/ocm/components/clusterConfiguration/OcmClusterProgressItems.d.ts.map +1 -0
  845. package/@types/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.d.ts +28 -0
  846. package/@types/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.d.ts.map +1 -0
  847. package/@types/ocm/components/clusterConfiguration/OcmOpenShiftVersion.d.ts +11 -0
  848. package/@types/ocm/components/clusterConfiguration/OcmOpenShiftVersion.d.ts.map +1 -0
  849. package/@types/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.d.ts +7 -0
  850. package/@types/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.d.ts.map +1 -0
  851. package/@types/ocm/components/clusterConfiguration/OcmOperatorProgressItem.d.ts +15 -0
  852. package/@types/ocm/components/clusterConfiguration/OcmOperatorProgressItem.d.ts.map +1 -0
  853. package/@types/ocm/components/clusterConfiguration/OcmSNOControlGroup.d.ts +9 -0
  854. package/@types/ocm/components/clusterConfiguration/OcmSNOControlGroup.d.ts.map +1 -0
  855. package/@types/ocm/components/clusterConfiguration/OcmSNODisclaimer.d.ts +9 -0
  856. package/@types/ocm/components/clusterConfiguration/OcmSNODisclaimer.d.ts.map +1 -0
  857. package/@types/ocm/components/clusterConfiguration/OcmSingleNodeCheckbox.d.ts +11 -0
  858. package/@types/ocm/components/clusterConfiguration/OcmSingleNodeCheckbox.d.ts.map +1 -0
  859. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.d.ts +7 -0
  860. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.d.ts.map +1 -0
  861. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/DeleteCustomManifestModal.d.ts +7 -0
  862. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/DeleteCustomManifestModal.d.ts.map +1 -0
  863. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CollapsedManifest.d.ts +4 -0
  864. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CollapsedManifest.d.ts.map +1 -0
  865. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifest.d.ts +17 -0
  866. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifest.d.ts.map +1 -0
  867. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.d.ts +7 -0
  868. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.d.ts.map +1 -0
  869. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsArray.d.ts +7 -0
  870. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsArray.d.ts.map +1 -0
  871. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsForm.d.ts +4 -0
  872. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsForm.d.ts.map +1 -0
  873. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/ExpandedManifest.d.ts +4 -0
  874. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/ExpandedManifest.d.ts.map +1 -0
  875. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.d.ts +6 -0
  876. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.d.ts.map +1 -0
  877. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.d.ts +6 -0
  878. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.d.ts.map +1 -0
  879. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/propTypes.d.ts +26 -0
  880. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/propTypes.d.ts.map +1 -0
  881. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/utils.d.ts +9 -0
  882. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/utils.d.ts.map +1 -0
  883. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/data/dataTypes.d.ts +16 -0
  884. package/@types/ocm/components/clusterConfiguration/manifestsConfiguration/data/dataTypes.d.ts.map +1 -0
  885. package/@types/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.d.ts +3 -0
  886. package/@types/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.d.ts.map +1 -0
  887. package/@types/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.d.ts +9 -0
  888. package/@types/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.d.ts.map +1 -0
  889. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.d.ts +10 -0
  890. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.d.ts.map +1 -0
  891. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts +6 -0
  892. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts.map +1 -0
  893. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.d.ts +4 -0
  894. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.d.ts.map +1 -0
  895. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.d.ts +19 -0
  896. package/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.d.ts.map +1 -0
  897. package/@types/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.d.ts +9 -0
  898. package/@types/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.d.ts.map +1 -0
  899. package/@types/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.d.ts +9 -0
  900. package/@types/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.d.ts.map +1 -0
  901. package/@types/ocm/components/clusterConfiguration/networkConfiguration/UserManagedNetworkingTextContent.d.ts +5 -0
  902. package/@types/ocm/components/clusterConfiguration/networkConfiguration/UserManagedNetworkingTextContent.d.ts.map +1 -0
  903. package/@types/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.d.ts +8 -0
  904. package/@types/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.d.ts.map +1 -0
  905. package/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts +5 -0
  906. package/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts.map +1 -0
  907. package/@types/ocm/components/clusterConfiguration/operators/CnvCheckbox.d.ts +4 -0
  908. package/@types/ocm/components/clusterConfiguration/operators/CnvCheckbox.d.ts.map +1 -0
  909. package/@types/ocm/components/clusterConfiguration/operators/CnvHostRequirements.d.ts +6 -0
  910. package/@types/ocm/components/clusterConfiguration/operators/CnvHostRequirements.d.ts.map +1 -0
  911. package/@types/ocm/components/clusterConfiguration/operators/LvmCheckbox.d.ts +4 -0
  912. package/@types/ocm/components/clusterConfiguration/operators/LvmCheckbox.d.ts.map +1 -0
  913. package/@types/ocm/components/clusterConfiguration/operators/LvmHostRequirements.d.ts +6 -0
  914. package/@types/ocm/components/clusterConfiguration/operators/LvmHostRequirements.d.ts.map +1 -0
  915. package/@types/ocm/components/clusterConfiguration/operators/OdfCheckbox.d.ts +3 -0
  916. package/@types/ocm/components/clusterConfiguration/operators/OdfCheckbox.d.ts.map +1 -0
  917. package/@types/ocm/components/clusterConfiguration/operators/utils.d.ts +7 -0
  918. package/@types/ocm/components/clusterConfiguration/operators/utils.d.ts.map +1 -0
  919. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.d.ts +6 -0
  920. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.d.ts.map +1 -0
  921. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.d.ts +6 -0
  922. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.d.ts.map +1 -0
  923. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.d.ts +3 -0
  924. package/@types/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.d.ts.map +1 -0
  925. package/@types/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.d.ts +5 -0
  926. package/@types/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.d.ts.map +1 -0
  927. package/@types/ocm/components/clusterConfiguration/review/ReviewCustomManifestsTable.d.ts +5 -0
  928. package/@types/ocm/components/clusterConfiguration/review/ReviewCustomManifestsTable.d.ts.map +1 -0
  929. package/@types/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.d.ts +5 -0
  930. package/@types/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.d.ts.map +1 -0
  931. package/@types/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.d.ts +5 -0
  932. package/@types/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.d.ts.map +1 -0
  933. package/@types/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.d.ts +6 -0
  934. package/@types/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.d.ts.map +1 -0
  935. package/@types/ocm/components/clusterConfiguration/review/ReviewStep.d.ts +7 -0
  936. package/@types/ocm/components/clusterConfiguration/review/ReviewStep.d.ts.map +1 -0
  937. package/@types/ocm/components/clusterConfiguration/review/ReviewSummary.d.ts +9 -0
  938. package/@types/ocm/components/clusterConfiguration/review/ReviewSummary.d.ts.map +1 -0
  939. package/@types/ocm/components/clusterConfiguration/review/TableSummaryExpandable.d.ts +7 -0
  940. package/@types/ocm/components/clusterConfiguration/review/TableSummaryExpandable.d.ts.map +1 -0
  941. package/@types/ocm/components/clusterConfiguration/review/index.d.ts +5 -0
  942. package/@types/ocm/components/clusterConfiguration/review/index.d.ts.map +1 -0
  943. package/@types/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.d.ts +12 -0
  944. package/@types/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.d.ts.map +1 -0
  945. package/@types/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.d.ts +12 -0
  946. package/@types/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.d.ts.map +1 -0
  947. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.d.ts +4 -0
  948. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.d.ts.map +1 -0
  949. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.d.ts +6 -0
  950. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.d.ts.map +1 -0
  951. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.d.ts +6 -0
  952. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.d.ts.map +1 -0
  953. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.d.ts +4 -0
  954. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.d.ts.map +1 -0
  955. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.d.ts +7 -0
  956. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.d.ts.map +1 -0
  957. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.d.ts +14 -0
  958. package/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.d.ts.map +1 -0
  959. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.d.ts +4 -0
  960. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.d.ts.map +1 -0
  961. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.d.ts +20 -0
  962. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.d.ts.map +1 -0
  963. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.d.ts +5 -0
  964. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.d.ts.map +1 -0
  965. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.d.ts +9 -0
  966. package/@types/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.d.ts.map +1 -0
  967. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.d.ts +7 -0
  968. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.d.ts.map +1 -0
  969. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.d.ts +4 -0
  970. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.d.ts.map +1 -0
  971. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.d.ts +2 -0
  972. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.d.ts.map +1 -0
  973. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.d.ts +4 -0
  974. package/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.d.ts.map +1 -0
  975. package/@types/ocm/components/clusterConfiguration/staticIp/components/propTypes.d.ts +29 -0
  976. package/@types/ocm/components/clusterConfiguration/staticIp/components/propTypes.d.ts.map +1 -0
  977. package/@types/ocm/components/clusterConfiguration/staticIp/data/dataTypes.d.ts +54 -0
  978. package/@types/ocm/components/clusterConfiguration/staticIp/data/dataTypes.d.ts.map +1 -0
  979. package/@types/ocm/components/clusterConfiguration/staticIp/data/dummyData.d.ts +21 -0
  980. package/@types/ocm/components/clusterConfiguration/staticIp/data/dummyData.d.ts.map +1 -0
  981. package/@types/ocm/components/clusterConfiguration/staticIp/data/emptyData.d.ts +10 -0
  982. package/@types/ocm/components/clusterConfiguration/staticIp/data/emptyData.d.ts.map +1 -0
  983. package/@types/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.d.ts +4 -0
  984. package/@types/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.d.ts.map +1 -0
  985. package/@types/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.d.ts +5 -0
  986. package/@types/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.d.ts.map +1 -0
  987. package/@types/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.d.ts +14 -0
  988. package/@types/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.d.ts.map +1 -0
  989. package/@types/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.d.ts +3 -0
  990. package/@types/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.d.ts.map +1 -0
  991. package/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.d.ts +61 -0
  992. package/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.d.ts.map +1 -0
  993. package/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.d.ts +17 -0
  994. package/@types/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.d.ts.map +1 -0
  995. package/@types/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.d.ts +9 -0
  996. package/@types/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.d.ts.map +1 -0
  997. package/@types/ocm/components/clusterDetail/AssistedInstallerDetailCard.d.ts +9 -0
  998. package/@types/ocm/components/clusterDetail/AssistedInstallerDetailCard.d.ts.map +1 -0
  999. package/@types/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.d.ts +8 -0
  1000. package/@types/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.d.ts.map +1 -0
  1001. package/@types/ocm/components/clusterDetail/CancelInstallationModal.d.ts +4 -0
  1002. package/@types/ocm/components/clusterDetail/CancelInstallationModal.d.ts.map +1 -0
  1003. package/@types/ocm/components/clusterDetail/ClusterDetail.d.ts +8 -0
  1004. package/@types/ocm/components/clusterDetail/ClusterDetail.d.ts.map +1 -0
  1005. package/@types/ocm/components/clusterDetail/ClusterDetailStatusMessages.d.ts +8 -0
  1006. package/@types/ocm/components/clusterDetail/ClusterDetailStatusMessages.d.ts.map +1 -0
  1007. package/@types/ocm/components/clusterDetail/ClusterDetailStatusVarieties.d.ts +18 -0
  1008. package/@types/ocm/components/clusterDetail/ClusterDetailStatusVarieties.d.ts.map +1 -0
  1009. package/@types/ocm/components/clusterDetail/ClusterDetailsButtonGroup.d.ts +11 -0
  1010. package/@types/ocm/components/clusterDetail/ClusterDetailsButtonGroup.d.ts.map +1 -0
  1011. package/@types/ocm/components/clusterDetail/ClusterInstallationError.d.ts +9 -0
  1012. package/@types/ocm/components/clusterDetail/ClusterInstallationError.d.ts.map +1 -0
  1013. package/@types/ocm/components/clusterDetail/ClusterInstallationProgressCard.d.ts +7 -0
  1014. package/@types/ocm/components/clusterDetail/ClusterInstallationProgressCard.d.ts.map +1 -0
  1015. package/@types/ocm/components/clusterDetail/ClusterPollingErrorModal.d.ts +6 -0
  1016. package/@types/ocm/components/clusterDetail/ClusterPollingErrorModal.d.ts.map +1 -0
  1017. package/@types/ocm/components/clusterDetail/ClusterProperties.d.ts +12 -0
  1018. package/@types/ocm/components/clusterDetail/ClusterProperties.d.ts.map +1 -0
  1019. package/@types/ocm/components/clusterDetail/ClusterSummaryExpandable.d.ts +8 -0
  1020. package/@types/ocm/components/clusterDetail/ClusterSummaryExpandable.d.ts.map +1 -0
  1021. package/@types/ocm/components/clusterDetail/ClusterUpdateErrorModal.d.ts +3 -0
  1022. package/@types/ocm/components/clusterDetail/ClusterUpdateErrorModal.d.ts.map +1 -0
  1023. package/@types/ocm/components/clusterDetail/HostInventoryExpandable.d.ts +8 -0
  1024. package/@types/ocm/components/clusterDetail/HostInventoryExpandable.d.ts.map +1 -0
  1025. package/@types/ocm/components/clusterDetail/OpenShiftVersionDetail.d.ts +6 -0
  1026. package/@types/ocm/components/clusterDetail/OpenShiftVersionDetail.d.ts.map +1 -0
  1027. package/@types/ocm/components/clusterDetail/ProgressBarAlerts.d.ts +16 -0
  1028. package/@types/ocm/components/clusterDetail/ProgressBarAlerts.d.ts.map +1 -0
  1029. package/@types/ocm/components/clusterDetail/RebootNodeZeroModal.d.ts +7 -0
  1030. package/@types/ocm/components/clusterDetail/RebootNodeZeroModal.d.ts.map +1 -0
  1031. package/@types/ocm/components/clusterDetail/ResetClusterModal.d.ts +4 -0
  1032. package/@types/ocm/components/clusterDetail/ResetClusterModal.d.ts.map +1 -0
  1033. package/@types/ocm/components/clusterDetail/getProgressBarAlerts.d.ts +4 -0
  1034. package/@types/ocm/components/clusterDetail/getProgressBarAlerts.d.ts.map +1 -0
  1035. package/@types/ocm/components/clusterDetail/index.d.ts +6 -0
  1036. package/@types/ocm/components/clusterDetail/index.d.ts.map +1 -0
  1037. package/@types/ocm/components/clusterDetail/utils.d.ts +9 -0
  1038. package/@types/ocm/components/clusterDetail/utils.d.ts.map +1 -0
  1039. package/@types/ocm/components/clusterWizard/ClusterDetails.d.ts +8 -0
  1040. package/@types/ocm/components/clusterWizard/ClusterDetails.d.ts.map +1 -0
  1041. package/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts +20 -0
  1042. package/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts.map +1 -0
  1043. package/@types/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.d.ts +9 -0
  1044. package/@types/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.d.ts.map +1 -0
  1045. package/@types/ocm/components/clusterWizard/ClusterWizard.d.ts +9 -0
  1046. package/@types/ocm/components/clusterWizard/ClusterWizard.d.ts.map +1 -0
  1047. package/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts +19 -0
  1048. package/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts.map +1 -0
  1049. package/@types/ocm/components/clusterWizard/ClusterWizardContextProvider.d.ts +9 -0
  1050. package/@types/ocm/components/clusterWizard/ClusterWizardContextProvider.d.ts.map +1 -0
  1051. package/@types/ocm/components/clusterWizard/ClusterWizardFooter.d.ts +12 -0
  1052. package/@types/ocm/components/clusterWizard/ClusterWizardFooter.d.ts.map +1 -0
  1053. package/@types/ocm/components/clusterWizard/ClusterWizardNavigation.d.ts +6 -0
  1054. package/@types/ocm/components/clusterWizard/ClusterWizardNavigation.d.ts.map +1 -0
  1055. package/@types/ocm/components/clusterWizard/CustomManifestStep.d.ts +6 -0
  1056. package/@types/ocm/components/clusterWizard/CustomManifestStep.d.ts.map +1 -0
  1057. package/@types/ocm/components/clusterWizard/HostDiscovery.d.ts +6 -0
  1058. package/@types/ocm/components/clusterWizard/HostDiscovery.d.ts.map +1 -0
  1059. package/@types/ocm/components/clusterWizard/NewClusterWizard.d.ts +4 -0
  1060. package/@types/ocm/components/clusterWizard/NewClusterWizard.d.ts.map +1 -0
  1061. package/@types/ocm/components/clusterWizard/Operators.d.ts +7 -0
  1062. package/@types/ocm/components/clusterWizard/Operators.d.ts.map +1 -0
  1063. package/@types/ocm/components/clusterWizard/OperatorsStep.d.ts +3 -0
  1064. package/@types/ocm/components/clusterWizard/OperatorsStep.d.ts.map +1 -0
  1065. package/@types/ocm/components/clusterWizard/StaticIp.d.ts +8 -0
  1066. package/@types/ocm/components/clusterWizard/StaticIp.d.ts.map +1 -0
  1067. package/@types/ocm/components/clusterWizard/Storage.d.ts +6 -0
  1068. package/@types/ocm/components/clusterWizard/Storage.d.ts.map +1 -0
  1069. package/@types/ocm/components/clusterWizard/constants.d.ts +7 -0
  1070. package/@types/ocm/components/clusterWizard/constants.d.ts.map +1 -0
  1071. package/@types/ocm/components/clusterWizard/index.d.ts +4 -0
  1072. package/@types/ocm/components/clusterWizard/index.d.ts.map +1 -0
  1073. package/@types/ocm/components/clusterWizard/wizardTransition.d.ts +20 -0
  1074. package/@types/ocm/components/clusterWizard/wizardTransition.d.ts.map +1 -0
  1075. package/@types/ocm/components/clusters/ClusterBreadcrumbs.d.ts +5 -0
  1076. package/@types/ocm/components/clusters/ClusterBreadcrumbs.d.ts.map +1 -0
  1077. package/@types/ocm/components/clusters/ClusterLoading.d.ts +3 -0
  1078. package/@types/ocm/components/clusters/ClusterLoading.d.ts.map +1 -0
  1079. package/@types/ocm/components/clusters/ClusterPage.d.ts +11 -0
  1080. package/@types/ocm/components/clusters/ClusterPage.d.ts.map +1 -0
  1081. package/@types/ocm/components/clusters/ClusterPageErrors.d.ts +2 -0
  1082. package/@types/ocm/components/clusters/ClusterPageErrors.d.ts.map +1 -0
  1083. package/@types/ocm/components/clusters/ClusterStatus.d.ts +16 -0
  1084. package/@types/ocm/components/clusters/ClusterStatus.d.ts.map +1 -0
  1085. package/@types/ocm/components/clusters/ClusterToolbar.d.ts +8 -0
  1086. package/@types/ocm/components/clusters/ClusterToolbar.d.ts.map +1 -0
  1087. package/@types/ocm/components/clusters/Clusters.d.ts +5 -0
  1088. package/@types/ocm/components/clusters/Clusters.d.ts.map +1 -0
  1089. package/@types/ocm/components/clusters/ClustersListToolbar.d.ts +13 -0
  1090. package/@types/ocm/components/clusters/ClustersListToolbar.d.ts.map +1 -0
  1091. package/@types/ocm/components/clusters/ClustersTable.d.ts +9 -0
  1092. package/@types/ocm/components/clusters/ClustersTable.d.ts.map +1 -0
  1093. package/@types/ocm/components/clusters/DeleteClusterModal.d.ts +11 -0
  1094. package/@types/ocm/components/clusters/DeleteClusterModal.d.ts.map +1 -0
  1095. package/@types/ocm/components/clusters/NewClusterPage.d.ts +4 -0
  1096. package/@types/ocm/components/clusters/NewClusterPage.d.ts.map +1 -0
  1097. package/@types/ocm/components/clusters/clusterPolling.d.ts +9 -0
  1098. package/@types/ocm/components/clusters/clusterPolling.d.ts.map +1 -0
  1099. package/@types/ocm/components/clusters/index.d.ts +6 -0
  1100. package/@types/ocm/components/clusters/index.d.ts.map +1 -0
  1101. package/@types/ocm/components/clusters/utils.d.ts +12 -0
  1102. package/@types/ocm/components/clusters/utils.d.ts.map +1 -0
  1103. package/@types/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.d.ts +12 -0
  1104. package/@types/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.d.ts.map +1 -0
  1105. package/@types/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts +26 -0
  1106. package/@types/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts.map +1 -0
  1107. package/@types/ocm/components/featureSupportLevels/featureStateUtils.d.ts +7 -0
  1108. package/@types/ocm/components/featureSupportLevels/featureStateUtils.d.ts.map +1 -0
  1109. package/@types/ocm/components/featureSupportLevels/index.d.ts +3 -0
  1110. package/@types/ocm/components/featureSupportLevels/index.d.ts.map +1 -0
  1111. package/@types/ocm/components/fetching/fetchEvents.d.ts +3 -0
  1112. package/@types/ocm/components/fetching/fetchEvents.d.ts.map +1 -0
  1113. package/@types/ocm/components/hosts/AdditionaNTPSourceDialogToggle.d.ts +2 -0
  1114. package/@types/ocm/components/hosts/AdditionaNTPSourceDialogToggle.d.ts.map +1 -0
  1115. package/@types/ocm/components/hosts/ClusterHostsTable.d.ts +11 -0
  1116. package/@types/ocm/components/hosts/ClusterHostsTable.d.ts.map +1 -0
  1117. package/@types/ocm/components/hosts/DeleteHostModal.d.ts +9 -0
  1118. package/@types/ocm/components/hosts/DeleteHostModal.d.ts.map +1 -0
  1119. package/@types/ocm/components/hosts/HardwareStatus.d.ts +22 -0
  1120. package/@types/ocm/components/hosts/HardwareStatus.d.ts.map +1 -0
  1121. package/@types/ocm/components/hosts/HostRequirementsContent.d.ts +9 -0
  1122. package/@types/ocm/components/hosts/HostRequirementsContent.d.ts.map +1 -0
  1123. package/@types/ocm/components/hosts/HostsDiscoveryTable.d.ts +7 -0
  1124. package/@types/ocm/components/hosts/HostsDiscoveryTable.d.ts.map +1 -0
  1125. package/@types/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.d.ts +7 -0
  1126. package/@types/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.d.ts.map +1 -0
  1127. package/@types/ocm/components/hosts/HostsStorageTable.d.ts +9 -0
  1128. package/@types/ocm/components/hosts/HostsStorageTable.d.ts.map +1 -0
  1129. package/@types/ocm/components/hosts/HostsTableEmptyState.d.ts +6 -0
  1130. package/@types/ocm/components/hosts/HostsTableEmptyState.d.ts.map +1 -0
  1131. package/@types/ocm/components/hosts/ModalDialogsContext.d.ts +56 -0
  1132. package/@types/ocm/components/hosts/ModalDialogsContext.d.ts.map +1 -0
  1133. package/@types/ocm/components/hosts/NetworkingStatus.d.ts +5 -0
  1134. package/@types/ocm/components/hosts/NetworkingStatus.d.ts.map +1 -0
  1135. package/@types/ocm/components/hosts/OdfDisksManualFormattingHint.d.ts +3 -0
  1136. package/@types/ocm/components/hosts/OdfDisksManualFormattingHint.d.ts.map +1 -0
  1137. package/@types/ocm/components/hosts/ResetHostModal.d.ts +10 -0
  1138. package/@types/ocm/components/hosts/ResetHostModal.d.ts.map +1 -0
  1139. package/@types/ocm/components/hosts/StorageAlerts.d.ts +6 -0
  1140. package/@types/ocm/components/hosts/StorageAlerts.d.ts.map +1 -0
  1141. package/@types/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.d.ts +3 -0
  1142. package/@types/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.d.ts.map +1 -0
  1143. package/@types/ocm/components/hosts/UpdateDay2ApiVipForm.d.ts +12 -0
  1144. package/@types/ocm/components/hosts/UpdateDay2ApiVipForm.d.ts.map +1 -0
  1145. package/@types/ocm/components/hosts/UpdateDay2ApiVipModal.d.ts +8 -0
  1146. package/@types/ocm/components/hosts/UpdateDay2ApiVipModal.d.ts.map +1 -0
  1147. package/@types/ocm/components/hosts/VMRebootConfigurationLinkWithModal.d.ts +3 -0
  1148. package/@types/ocm/components/hosts/VMRebootConfigurationLinkWithModal.d.ts.map +1 -0
  1149. package/@types/ocm/components/hosts/use-hosts-table.d.ts +40 -0
  1150. package/@types/ocm/components/hosts/use-hosts-table.d.ts.map +1 -0
  1151. package/@types/ocm/components/hosts/utils.d.ts +5 -0
  1152. package/@types/ocm/components/hosts/utils.d.ts.map +1 -0
  1153. package/@types/ocm/components/index.d.ts +9 -0
  1154. package/@types/ocm/components/index.d.ts.map +1 -0
  1155. package/@types/ocm/components/newFeatureSupportLevels/NewFeatureSupportLevelProvider.d.ts +13 -0
  1156. package/@types/ocm/components/newFeatureSupportLevels/NewFeatureSupportLevelProvider.d.ts.map +1 -0
  1157. package/@types/ocm/components/newFeatureSupportLevels/ReviewClusterNewFeatureSupportLevels.d.ts +26 -0
  1158. package/@types/ocm/components/newFeatureSupportLevels/ReviewClusterNewFeatureSupportLevels.d.ts.map +1 -0
  1159. package/@types/ocm/components/newFeatureSupportLevels/index.d.ts +3 -0
  1160. package/@types/ocm/components/newFeatureSupportLevels/index.d.ts.map +1 -0
  1161. package/@types/ocm/components/newFeatureSupportLevels/newFeatureStateUtils.d.ts +7 -0
  1162. package/@types/ocm/components/newFeatureSupportLevels/newFeatureStateUtils.d.ts.map +1 -0
  1163. package/@types/ocm/components/ui/AssistedUILibVersion.d.ts +3 -0
  1164. package/@types/ocm/components/ui/AssistedUILibVersion.d.ts.map +1 -0
  1165. package/@types/ocm/components/ui/Buttons/BackButton.d.ts +9 -0
  1166. package/@types/ocm/components/ui/Buttons/BackButton.d.ts.map +1 -0
  1167. package/@types/ocm/components/ui/InfoLinkWithModal.d.ts +15 -0
  1168. package/@types/ocm/components/ui/InfoLinkWithModal.d.ts.map +1 -0
  1169. package/@types/ocm/components/ui/OcmFormFields.d.ts +25 -0
  1170. package/@types/ocm/components/ui/OcmFormFields.d.ts.map +1 -0
  1171. package/@types/ocm/components/ui/RedirectToCluster.d.ts +8 -0
  1172. package/@types/ocm/components/ui/RedirectToCluster.d.ts.map +1 -0
  1173. package/@types/ocm/components/ui/index.d.ts +2 -0
  1174. package/@types/ocm/components/ui/index.d.ts.map +1 -0
  1175. package/@types/ocm/config/constants.d.ts +8 -0
  1176. package/@types/ocm/config/constants.d.ts.map +1 -0
  1177. package/@types/ocm/config/index.d.ts +3 -0
  1178. package/@types/ocm/config/index.d.ts.map +1 -0
  1179. package/@types/ocm/config/routeBaseBath.d.ts +3 -0
  1180. package/@types/ocm/config/routeBaseBath.d.ts.map +1 -0
  1181. package/@types/ocm/hooks/index.d.ts +8 -0
  1182. package/@types/ocm/hooks/index.d.ts.map +1 -0
  1183. package/@types/ocm/hooks/useClusterCustomManifests.d.ts +10 -0
  1184. package/@types/ocm/hooks/useClusterCustomManifests.d.ts.map +1 -0
  1185. package/@types/ocm/hooks/useClusterPreflightRequirements.d.ts +8 -0
  1186. package/@types/ocm/hooks/useClusterPreflightRequirements.d.ts.map +1 -0
  1187. package/@types/ocm/hooks/useClusterSupportedPlatforms.d.ts +11 -0
  1188. package/@types/ocm/hooks/useClusterSupportedPlatforms.d.ts.map +1 -0
  1189. package/@types/ocm/hooks/useInfraEnv.d.ts +8 -0
  1190. package/@types/ocm/hooks/useInfraEnv.d.ts.map +1 -0
  1191. package/@types/ocm/hooks/useInfraEnvId.d.ts +6 -0
  1192. package/@types/ocm/hooks/useInfraEnvId.d.ts.map +1 -0
  1193. package/@types/ocm/hooks/useInfraEnvImageUrl.d.ts +10 -0
  1194. package/@types/ocm/hooks/useInfraEnvImageUrl.d.ts.map +1 -0
  1195. package/@types/ocm/hooks/useInfraEnvIpxeImageUrl.d.ts +10 -0
  1196. package/@types/ocm/hooks/useInfraEnvIpxeImageUrl.d.ts.map +1 -0
  1197. package/@types/ocm/hooks/useManagedDomains.d.ts +3 -0
  1198. package/@types/ocm/hooks/useManagedDomains.d.ts.map +1 -0
  1199. package/@types/ocm/hooks/useOpenshiftVersions.d.ts +16 -0
  1200. package/@types/ocm/hooks/useOpenshiftVersions.d.ts.map +1 -0
  1201. package/@types/ocm/hooks/usePullSecret.d.ts +2 -0
  1202. package/@types/ocm/hooks/usePullSecret.d.ts.map +1 -0
  1203. package/@types/ocm/hooks/useSetClusterPermissions.d.ts +3 -0
  1204. package/@types/ocm/hooks/useSetClusterPermissions.d.ts.map +1 -0
  1205. package/@types/ocm/hooks/useSupportLevelsAPI.d.ts +6 -0
  1206. package/@types/ocm/hooks/useSupportLevelsAPI.d.ts.map +1 -0
  1207. package/@types/ocm/hooks/useUsedClusterNames.d.ts +5 -0
  1208. package/@types/ocm/hooks/useUsedClusterNames.d.ts.map +1 -0
  1209. package/@types/ocm/index.d.ts +12 -0
  1210. package/@types/ocm/index.d.ts.map +1 -0
  1211. package/@types/ocm/reducers/clusters/clustersSlice.d.ts +27 -0
  1212. package/@types/ocm/reducers/clusters/clustersSlice.d.ts.map +1 -0
  1213. package/@types/ocm/reducers/clusters/currentClusterSlice.d.ts +139 -0
  1214. package/@types/ocm/reducers/clusters/currentClusterSlice.d.ts.map +1 -0
  1215. package/@types/ocm/reducers/clusters/index.d.ts +3 -0
  1216. package/@types/ocm/reducers/clusters/index.d.ts.map +1 -0
  1217. package/@types/ocm/selectors/clusters.d.ts +64 -0
  1218. package/@types/ocm/selectors/clusters.d.ts.map +1 -0
  1219. package/@types/ocm/selectors/currentCluster.d.ts +14 -0
  1220. package/@types/ocm/selectors/currentCluster.d.ts.map +1 -0
  1221. package/@types/ocm/selectors/index.d.ts +3 -0
  1222. package/@types/ocm/selectors/index.d.ts.map +1 -0
  1223. package/@types/ocm/sentry.d.ts +3 -0
  1224. package/@types/ocm/sentry.d.ts.map +1 -0
  1225. package/@types/ocm/services/ClusterDetailsService.d.ts +16 -0
  1226. package/@types/ocm/services/ClusterDetailsService.d.ts.map +1 -0
  1227. package/@types/ocm/services/ClustersService.d.ts +28 -0
  1228. package/@types/ocm/services/ClustersService.d.ts.map +1 -0
  1229. package/@types/ocm/services/CpuArchitectureService.d.ts +11 -0
  1230. package/@types/ocm/services/CpuArchitectureService.d.ts.map +1 -0
  1231. package/@types/ocm/services/Day2ClusterService.d.ts +21 -0
  1232. package/@types/ocm/services/Day2ClusterService.d.ts.map +1 -0
  1233. package/@types/ocm/services/DiscoveryImageFormService.d.ts +10 -0
  1234. package/@types/ocm/services/DiscoveryImageFormService.d.ts.map +1 -0
  1235. package/@types/ocm/services/DiskEncryptionService.d.ts +7 -0
  1236. package/@types/ocm/services/DiskEncryptionService.d.ts.map +1 -0
  1237. package/@types/ocm/services/HostDiscoveryService.d.ts +7 -0
  1238. package/@types/ocm/services/HostDiscoveryService.d.ts.map +1 -0
  1239. package/@types/ocm/services/HostsService.d.ts +21 -0
  1240. package/@types/ocm/services/HostsService.d.ts.map +1 -0
  1241. package/@types/ocm/services/InfraEnvIdsCacheService.d.ts +10 -0
  1242. package/@types/ocm/services/InfraEnvIdsCacheService.d.ts.map +1 -0
  1243. package/@types/ocm/services/InfraEnvsService.d.ts +15 -0
  1244. package/@types/ocm/services/InfraEnvsService.d.ts.map +1 -0
  1245. package/@types/ocm/services/OperatorsService.d.ts +12 -0
  1246. package/@types/ocm/services/OperatorsService.d.ts.map +1 -0
  1247. package/@types/ocm/services/apis/ClustersAPI.d.ts +41 -0
  1248. package/@types/ocm/services/apis/ClustersAPI.d.ts.map +1 -0
  1249. package/@types/ocm/services/apis/ComponentVersionsAPI.d.ts +7 -0
  1250. package/@types/ocm/services/apis/ComponentVersionsAPI.d.ts.map +1 -0
  1251. package/@types/ocm/services/apis/EventsAPI.d.ts +8 -0
  1252. package/@types/ocm/services/apis/EventsAPI.d.ts.map +1 -0
  1253. package/@types/ocm/services/apis/FeatureSupportLevelsAPI.d.ts +7 -0
  1254. package/@types/ocm/services/apis/FeatureSupportLevelsAPI.d.ts.map +1 -0
  1255. package/@types/ocm/services/apis/HostsAPI.d.ts +15 -0
  1256. package/@types/ocm/services/apis/HostsAPI.d.ts.map +1 -0
  1257. package/@types/ocm/services/apis/InfraEnvsAPI.d.ts +19 -0
  1258. package/@types/ocm/services/apis/InfraEnvsAPI.d.ts.map +1 -0
  1259. package/@types/ocm/services/apis/ManagedDomainsAPI.d.ts +7 -0
  1260. package/@types/ocm/services/apis/ManagedDomainsAPI.d.ts.map +1 -0
  1261. package/@types/ocm/services/apis/NewFeatureSupportLevelsAPI.d.ts +14 -0
  1262. package/@types/ocm/services/apis/NewFeatureSupportLevelsAPI.d.ts.map +1 -0
  1263. package/@types/ocm/services/apis/SupportedOpenshiftVersionsAPI.d.ts +7 -0
  1264. package/@types/ocm/services/apis/SupportedOpenshiftVersionsAPI.d.ts.map +1 -0
  1265. package/@types/ocm/services/apis/index.d.ts +9 -0
  1266. package/@types/ocm/services/apis/index.d.ts.map +1 -0
  1267. package/@types/ocm/services/apis/types.d.ts +14 -0
  1268. package/@types/ocm/services/apis/types.d.ts.map +1 -0
  1269. package/@types/ocm/services/index.d.ts +11 -0
  1270. package/@types/ocm/services/index.d.ts.map +1 -0
  1271. package/@types/ocm/services/types.d.ts +13 -0
  1272. package/@types/ocm/services/types.d.ts.map +1 -0
  1273. package/@types/ocm/store/hooks.d.ts +4 -0
  1274. package/@types/ocm/store/hooks.d.ts.map +1 -0
  1275. package/@types/ocm/store/index.d.ts +37 -0
  1276. package/@types/ocm/store/index.d.ts.map +1 -0
  1277. package/@types/ocm/store/slices/infraEnvs/selectors.d.ts +22 -0
  1278. package/@types/ocm/store/slices/infraEnvs/selectors.d.ts.map +1 -0
  1279. package/@types/ocm/store/slices/infraEnvs/slice.d.ts +4 -0
  1280. package/@types/ocm/store/slices/infraEnvs/slice.d.ts.map +1 -0
  1281. package/@types/ocm/store/slices/infraEnvs/thunks.d.ts +54 -0
  1282. package/@types/ocm/store/slices/infraEnvs/thunks.d.ts.map +1 -0
  1283. package/@types/ocm/types.d.ts +6 -0
  1284. package/@types/ocm/types.d.ts.map +1 -0
  1285. package/README.md +26 -85
  1286. package/build/build.json +3 -0
  1287. package/build/cim/components/Agent/AgentStatus.js +34 -0
  1288. package/build/cim/components/Agent/AgentStatus.js.map +1 -0
  1289. package/build/cim/components/Agent/AgentTable.js +38 -0
  1290. package/build/cim/components/Agent/AgentTable.js.map +1 -0
  1291. package/build/cim/components/Agent/AgentsSelectionHostCountAlerts.js +25 -0
  1292. package/build/cim/components/Agent/AgentsSelectionHostCountAlerts.js.map +1 -0
  1293. package/build/cim/components/Agent/AgentsSelectionHostCountLabelIcon.js +9 -0
  1294. package/build/cim/components/Agent/AgentsSelectionHostCountLabelIcon.js.map +1 -0
  1295. package/build/cim/components/Agent/AgentsSelectionTable.js +71 -0
  1296. package/build/cim/components/Agent/AgentsSelectionTable.js.map +1 -0
  1297. package/build/cim/components/Agent/AgentsSelectionUtils.js +25 -0
  1298. package/build/cim/components/Agent/AgentsSelectionUtils.js.map +1 -0
  1299. package/build/cim/components/Agent/BMCForm.js +168 -0
  1300. package/build/cim/components/Agent/BMCForm.js.map +1 -0
  1301. package/build/cim/components/Agent/BMHStatus.js +6 -0
  1302. package/build/cim/components/Agent/BMHStatus.js.map +1 -0
  1303. package/build/cim/components/Agent/MinimalHWRequirements.js +53 -0
  1304. package/build/cim/components/Agent/MinimalHWRequirements.js.map +1 -0
  1305. package/build/cim/components/Agent/NoAgentsAlert.js +24 -0
  1306. package/build/cim/components/Agent/NoAgentsAlert.js.map +1 -0
  1307. package/build/cim/components/Agent/index.js +4 -0
  1308. package/build/cim/components/Agent/index.js.map +1 -0
  1309. package/build/cim/components/Agent/tableUtils.js +423 -0
  1310. package/build/cim/components/Agent/tableUtils.js.map +1 -0
  1311. package/build/cim/components/Agent/types.js +2 -0
  1312. package/build/cim/components/Agent/types.js.map +1 -0
  1313. package/build/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.js +37 -0
  1314. package/build/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.js.map +1 -0
  1315. package/build/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.js +8 -0
  1316. package/build/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.js.map +1 -0
  1317. package/build/cim/components/ClusterDeployment/ArmCheckbox.js +41 -0
  1318. package/build/cim/components/ClusterDeployment/ArmCheckbox.js.map +1 -0
  1319. package/build/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.js +28 -0
  1320. package/build/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.js.map +1 -0
  1321. package/build/cim/components/ClusterDeployment/ClusterDeploymentCredentials.js +51 -0
  1322. package/build/cim/components/ClusterDeployment/ClusterDeploymentCredentials.js.map +1 -0
  1323. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetails.js +81 -0
  1324. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetails.js.map +1 -0
  1325. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.js +20 -0
  1326. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.js.map +1 -0
  1327. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.js +96 -0
  1328. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.js.map +1 -0
  1329. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.js +35 -0
  1330. package/build/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.js.map +1 -0
  1331. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.js +87 -0
  1332. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.js.map +1 -0
  1333. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.js +210 -0
  1334. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.js.map +1 -0
  1335. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.js +66 -0
  1336. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.js.map +1 -0
  1337. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.js +109 -0
  1338. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.js.map +1 -0
  1339. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.js +75 -0
  1340. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.js.map +1 -0
  1341. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.js +41 -0
  1342. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.js.map +1 -0
  1343. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.js +47 -0
  1344. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.js.map +1 -0
  1345. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.js +36 -0
  1346. package/build/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.js.map +1 -0
  1347. package/build/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.js +45 -0
  1348. package/build/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.js.map +1 -0
  1349. package/build/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.js +69 -0
  1350. package/build/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.js.map +1 -0
  1351. package/build/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.js +120 -0
  1352. package/build/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.js.map +1 -0
  1353. package/build/cim/components/ClusterDeployment/ClusterDeploymentProgress.js +16 -0
  1354. package/build/cim/components/ClusterDeployment/ClusterDeploymentProgress.js.map +1 -0
  1355. package/build/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.js +69 -0
  1356. package/build/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.js.map +1 -0
  1357. package/build/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.js +47 -0
  1358. package/build/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.js.map +1 -0
  1359. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizard.js +78 -0
  1360. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizard.js.map +1 -0
  1361. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.js +9 -0
  1362. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.js.map +1 -0
  1363. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.js +58 -0
  1364. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.js.map +1 -0
  1365. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.js +32 -0
  1366. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.js.map +1 -0
  1367. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.js +6 -0
  1368. package/build/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.js.map +1 -0
  1369. package/build/cim/components/ClusterDeployment/ClusterDetailsFormFields.js +48 -0
  1370. package/build/cim/components/ClusterDeployment/ClusterDetailsFormFields.js.map +1 -0
  1371. package/build/cim/components/ClusterDeployment/ClusterInstallationError.js +21 -0
  1372. package/build/cim/components/ClusterDeployment/ClusterInstallationError.js.map +1 -0
  1373. package/build/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.js +21 -0
  1374. package/build/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.js.map +1 -0
  1375. package/build/cim/components/ClusterDeployment/LabelSelector.css +9 -0
  1376. package/build/cim/components/ClusterDeployment/LabelsSelector.js +49 -0
  1377. package/build/cim/components/ClusterDeployment/LabelsSelector.js.map +1 -0
  1378. package/build/cim/components/ClusterDeployment/LocationsSelector.js +38 -0
  1379. package/build/cim/components/ClusterDeployment/LocationsSelector.js.map +1 -0
  1380. package/build/cim/components/ClusterDeployment/LogsDownloadButton.js +11 -0
  1381. package/build/cim/components/ClusterDeployment/LogsDownloadButton.js.map +1 -0
  1382. package/build/cim/components/ClusterDeployment/NetworkConfiguration.js +92 -0
  1383. package/build/cim/components/ClusterDeployment/NetworkConfiguration.js.map +1 -0
  1384. package/build/cim/components/ClusterDeployment/ScaleUpForm.js +32 -0
  1385. package/build/cim/components/ClusterDeployment/ScaleUpForm.js.map +1 -0
  1386. package/build/cim/components/ClusterDeployment/ShortCapacitySummary.js +27 -0
  1387. package/build/cim/components/ClusterDeployment/ShortCapacitySummary.js.map +1 -0
  1388. package/build/cim/components/ClusterDeployment/constants.js +16 -0
  1389. package/build/cim/components/ClusterDeployment/constants.js.map +1 -0
  1390. package/build/cim/components/ClusterDeployment/helpers.js +139 -0
  1391. package/build/cim/components/ClusterDeployment/helpers.js.map +1 -0
  1392. package/build/cim/components/ClusterDeployment/index.js +18 -0
  1393. package/build/cim/components/ClusterDeployment/index.js.map +1 -0
  1394. package/build/cim/components/ClusterDeployment/networkConfigurationValidation.js +45 -0
  1395. package/build/cim/components/ClusterDeployment/networkConfigurationValidation.js.map +1 -0
  1396. package/build/cim/components/ClusterDeployment/types.js +2 -0
  1397. package/build/cim/components/ClusterDeployment/types.js.map +1 -0
  1398. package/build/cim/components/ClusterDeployment/use-networking-formik.js +106 -0
  1399. package/build/cim/components/ClusterDeployment/use-networking-formik.js.map +1 -0
  1400. package/build/cim/components/ClusterDeployment/validationSchemas.js +12 -0
  1401. package/build/cim/components/ClusterDeployment/validationSchemas.js.map +1 -0
  1402. package/build/cim/components/ClusterDeployment/wizardTransition.js +94 -0
  1403. package/build/cim/components/ClusterDeployment/wizardTransition.js.map +1 -0
  1404. package/build/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.css +7 -0
  1405. package/build/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.js +29 -0
  1406. package/build/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.js.map +1 -0
  1407. package/build/cim/components/Hypershift/DetailsPage/ConditionsTable.css +3 -0
  1408. package/build/cim/components/Hypershift/DetailsPage/ConditionsTable.js +44 -0
  1409. package/build/cim/components/Hypershift/DetailsPage/ConditionsTable.js.map +1 -0
  1410. package/build/cim/components/Hypershift/DetailsPage/HostedClusterProgress.js +33 -0
  1411. package/build/cim/components/Hypershift/DetailsPage/HostedClusterProgress.js.map +1 -0
  1412. package/build/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.js +41 -0
  1413. package/build/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.js.map +1 -0
  1414. package/build/cim/components/Hypershift/DetailsPage/NodePoolStatus.js +30 -0
  1415. package/build/cim/components/Hypershift/DetailsPage/NodePoolStatus.js.map +1 -0
  1416. package/build/cim/components/Hypershift/DetailsPage/NodePoolsProgress.js +64 -0
  1417. package/build/cim/components/Hypershift/DetailsPage/NodePoolsProgress.js.map +1 -0
  1418. package/build/cim/components/Hypershift/DetailsPage/NodePoolsTable.css +3 -0
  1419. package/build/cim/components/Hypershift/DetailsPage/NodePoolsTable.js +144 -0
  1420. package/build/cim/components/Hypershift/DetailsPage/NodePoolsTable.js.map +1 -0
  1421. package/build/cim/components/Hypershift/DetailsPage/index.js +3 -0
  1422. package/build/cim/components/Hypershift/DetailsPage/index.js.map +1 -0
  1423. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.js +25 -0
  1424. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.js.map +1 -0
  1425. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.js +36 -0
  1426. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.js.map +1 -0
  1427. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.js +2 -0
  1428. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.js.map +1 -0
  1429. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.js +2 -0
  1430. package/build/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.js.map +1 -0
  1431. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.js +54 -0
  1432. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.js.map +1 -0
  1433. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.js +57 -0
  1434. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.js.map +1 -0
  1435. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.css +15 -0
  1436. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.js +69 -0
  1437. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.js.map +1 -0
  1438. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.js +2 -0
  1439. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.js.map +1 -0
  1440. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.js +2 -0
  1441. package/build/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.js.map +1 -0
  1442. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.css +7 -0
  1443. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.js +31 -0
  1444. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.js.map +1 -0
  1445. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.js +32 -0
  1446. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.js.map +1 -0
  1447. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.js +3 -0
  1448. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.js.map +1 -0
  1449. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.js +2 -0
  1450. package/build/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.js.map +1 -0
  1451. package/build/cim/components/Hypershift/HostedClusterWizard/index.js +4 -0
  1452. package/build/cim/components/Hypershift/HostedClusterWizard/index.js.map +1 -0
  1453. package/build/cim/components/Hypershift/forms/NodePoolAgentsForm.js +18 -0
  1454. package/build/cim/components/Hypershift/forms/NodePoolAgentsForm.js.map +1 -0
  1455. package/build/cim/components/Hypershift/hooks/useSupportedOCPVersions.js +23 -0
  1456. package/build/cim/components/Hypershift/hooks/useSupportedOCPVersions.js.map +1 -0
  1457. package/build/cim/components/Hypershift/hooks/useTemptiflySync.js +14 -0
  1458. package/build/cim/components/Hypershift/hooks/useTemptiflySync.js.map +1 -0
  1459. package/build/cim/components/Hypershift/index.js +5 -0
  1460. package/build/cim/components/Hypershift/index.js.map +1 -0
  1461. package/build/cim/components/Hypershift/modals/AddNodePoolModal.js +81 -0
  1462. package/build/cim/components/Hypershift/modals/AddNodePoolModal.js.map +1 -0
  1463. package/build/cim/components/Hypershift/modals/ManageHostsModal.js +66 -0
  1464. package/build/cim/components/Hypershift/modals/ManageHostsModal.js.map +1 -0
  1465. package/build/cim/components/Hypershift/modals/NodePoolForm.js +47 -0
  1466. package/build/cim/components/Hypershift/modals/NodePoolForm.js.map +1 -0
  1467. package/build/cim/components/Hypershift/modals/RemoveNodePoolModal.js +46 -0
  1468. package/build/cim/components/Hypershift/modals/RemoveNodePoolModal.js.map +1 -0
  1469. package/build/cim/components/Hypershift/types.js +2 -0
  1470. package/build/cim/components/Hypershift/types.js.map +1 -0
  1471. package/build/cim/components/Hypershift/utils/index.js +4 -0
  1472. package/build/cim/components/Hypershift/utils/index.js.map +1 -0
  1473. package/build/cim/components/Hypershift/utils/labels.js +9 -0
  1474. package/build/cim/components/Hypershift/utils/labels.js.map +1 -0
  1475. package/build/cim/components/Hypershift/utils/nodepool.js +21 -0
  1476. package/build/cim/components/Hypershift/utils/nodepool.js.map +1 -0
  1477. package/build/cim/components/Hypershift/utils/status.js +51 -0
  1478. package/build/cim/components/Hypershift/utils/status.js.map +1 -0
  1479. package/build/cim/components/InfraEnv/AddHostDropdown.css +4 -0
  1480. package/build/cim/components/InfraEnv/AddHostDropdown.js +42 -0
  1481. package/build/cim/components/InfraEnv/AddHostDropdown.js.map +1 -0
  1482. package/build/cim/components/InfraEnv/AgentAlerts.js +17 -0
  1483. package/build/cim/components/InfraEnv/AgentAlerts.js.map +1 -0
  1484. package/build/cim/components/InfraEnv/EnvironmentDetails.js +135 -0
  1485. package/build/cim/components/InfraEnv/EnvironmentDetails.js.map +1 -0
  1486. package/build/cim/components/InfraEnv/EnvironmentErrors.js +18 -0
  1487. package/build/cim/components/InfraEnv/EnvironmentErrors.js.map +1 -0
  1488. package/build/cim/components/InfraEnv/InfraEnvAgentTable.js +119 -0
  1489. package/build/cim/components/InfraEnv/InfraEnvAgentTable.js.map +1 -0
  1490. package/build/cim/components/InfraEnv/InfraEnvFormPage.js +137 -0
  1491. package/build/cim/components/InfraEnv/InfraEnvFormPage.js.map +1 -0
  1492. package/build/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.js +38 -0
  1493. package/build/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.js.map +1 -0
  1494. package/build/cim/components/InfraEnv/InfraTableToolbar.js +72 -0
  1495. package/build/cim/components/InfraEnv/InfraTableToolbar.js.map +1 -0
  1496. package/build/cim/components/InfraEnv/index.js +9 -0
  1497. package/build/cim/components/InfraEnv/index.js.map +1 -0
  1498. package/build/cim/components/InfraEnv/infra-env.css +7 -0
  1499. package/build/cim/components/InfraEnv/types.js +2 -0
  1500. package/build/cim/components/InfraEnv/types.js.map +1 -0
  1501. package/build/cim/components/InfraEnv/utils.js +109 -0
  1502. package/build/cim/components/InfraEnv/utils.js.map +1 -0
  1503. package/build/cim/components/YamlPreview/YamlPreview.js +52 -0
  1504. package/build/cim/components/YamlPreview/YamlPreview.js.map +1 -0
  1505. package/build/cim/components/YamlPreview/index.js +3 -0
  1506. package/build/cim/components/YamlPreview/index.js.map +1 -0
  1507. package/build/cim/components/YamlPreview/useYAMLPreview.js +75 -0
  1508. package/build/cim/components/YamlPreview/useYAMLPreview.js.map +1 -0
  1509. package/build/cim/components/common/InfoAndTroubleshootingNotification.js +18 -0
  1510. package/build/cim/components/common/InfoAndTroubleshootingNotification.js.map +1 -0
  1511. package/build/cim/components/common/ResourceAlerts.css +9 -0
  1512. package/build/cim/components/common/ResourceAlerts.js +18 -0
  1513. package/build/cim/components/common/ResourceAlerts.js.map +1 -0
  1514. package/build/cim/components/common/SpecSyncErrAlert.js +10 -0
  1515. package/build/cim/components/common/SpecSyncErrAlert.js.map +1 -0
  1516. package/build/cim/components/common/ValidationsRunningAlert.js +9 -0
  1517. package/build/cim/components/common/ValidationsRunningAlert.js.map +1 -0
  1518. package/build/cim/components/common/constants.js +11 -0
  1519. package/build/cim/components/common/constants.js.map +1 -0
  1520. package/build/cim/components/common/index.js +3 -0
  1521. package/build/cim/components/common/index.js.map +1 -0
  1522. package/build/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.js +79 -0
  1523. package/build/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.js.map +1 -0
  1524. package/build/cim/components/featureSupportLevels/featureStateUtils.js +40 -0
  1525. package/build/cim/components/featureSupportLevels/featureStateUtils.js.map +1 -0
  1526. package/build/cim/components/featureSupportLevels/index.js +2 -0
  1527. package/build/cim/components/featureSupportLevels/index.js.map +1 -0
  1528. package/build/cim/components/helpers/agentClusterInstall.js +17 -0
  1529. package/build/cim/components/helpers/agentClusterInstall.js.map +1 -0
  1530. package/build/cim/components/helpers/agentStatus.js +55 -0
  1531. package/build/cim/components/helpers/agentStatus.js.map +1 -0
  1532. package/build/cim/components/helpers/agents.js +23 -0
  1533. package/build/cim/components/helpers/agents.js.map +1 -0
  1534. package/build/cim/components/helpers/clusterDeployment.js +161 -0
  1535. package/build/cim/components/helpers/clusterDeployment.js.map +1 -0
  1536. package/build/cim/components/helpers/conditions.js +20 -0
  1537. package/build/cim/components/helpers/conditions.js.map +1 -0
  1538. package/build/cim/components/helpers/index.js +12 -0
  1539. package/build/cim/components/helpers/index.js.map +1 -0
  1540. package/build/cim/components/helpers/labels.js +14 -0
  1541. package/build/cim/components/helpers/labels.js.map +1 -0
  1542. package/build/cim/components/helpers/network.js +28 -0
  1543. package/build/cim/components/helpers/network.js.map +1 -0
  1544. package/build/cim/components/helpers/proxy.js +6 -0
  1545. package/build/cim/components/helpers/proxy.js.map +1 -0
  1546. package/build/cim/components/helpers/status.js +123 -0
  1547. package/build/cim/components/helpers/status.js.map +1 -0
  1548. package/build/cim/components/helpers/storage.js +12 -0
  1549. package/build/cim/components/helpers/storage.js.map +1 -0
  1550. package/build/cim/components/helpers/toAssisted.js +138 -0
  1551. package/build/cim/components/helpers/toAssisted.js.map +1 -0
  1552. package/build/cim/components/helpers/units.js +358 -0
  1553. package/build/cim/components/helpers/units.js.map +1 -0
  1554. package/build/cim/components/helpers/versions.js +56 -0
  1555. package/build/cim/components/helpers/versions.js.map +1 -0
  1556. package/build/cim/components/index.js +9 -0
  1557. package/build/cim/components/index.js.map +1 -0
  1558. package/build/cim/components/modals/AddBmcHostModal.js +15 -0
  1559. package/build/cim/components/modals/AddBmcHostModal.js.map +1 -0
  1560. package/build/cim/components/modals/AddBmcHostYamlForm.css +5 -0
  1561. package/build/cim/components/modals/AddBmcHostYamlForm.js +148 -0
  1562. package/build/cim/components/modals/AddBmcHostYamlForm.js.map +1 -0
  1563. package/build/cim/components/modals/AddBmcHostYamlModal.js +13 -0
  1564. package/build/cim/components/modals/AddBmcHostYamlModal.js.map +1 -0
  1565. package/build/cim/components/modals/AddHostModal.js +59 -0
  1566. package/build/cim/components/modals/AddHostModal.js.map +1 -0
  1567. package/build/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.js +15 -0
  1568. package/build/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.js.map +1 -0
  1569. package/build/cim/components/modals/CimConfiguration/CimConfigProgressAlert.js +56 -0
  1570. package/build/cim/components/modals/CimConfiguration/CimConfigProgressAlert.js.map +1 -0
  1571. package/build/cim/components/modals/CimConfiguration/CimConfigurationForm.css +23 -0
  1572. package/build/cim/components/modals/CimConfiguration/CimConfigurationForm.js +64 -0
  1573. package/build/cim/components/modals/CimConfiguration/CimConfigurationForm.js.map +1 -0
  1574. package/build/cim/components/modals/CimConfiguration/CimConfigurationModal.css +3 -0
  1575. package/build/cim/components/modals/CimConfiguration/CimConfigurationModal.js +150 -0
  1576. package/build/cim/components/modals/CimConfiguration/CimConfigurationModal.js.map +1 -0
  1577. package/build/cim/components/modals/CimConfiguration/CimIsMissingAlert.js +8 -0
  1578. package/build/cim/components/modals/CimConfiguration/CimIsMissingAlert.js.map +1 -0
  1579. package/build/cim/components/modals/CimConfiguration/CimStorageMissingAlert.js +19 -0
  1580. package/build/cim/components/modals/CimConfiguration/CimStorageMissingAlert.js.map +1 -0
  1581. package/build/cim/components/modals/CimConfiguration/constants.js +5 -0
  1582. package/build/cim/components/modals/CimConfiguration/constants.js.map +1 -0
  1583. package/build/cim/components/modals/CimConfiguration/index.js +7 -0
  1584. package/build/cim/components/modals/CimConfiguration/index.js.map +1 -0
  1585. package/build/cim/components/modals/CimConfiguration/persist.js +320 -0
  1586. package/build/cim/components/modals/CimConfiguration/persist.js.map +1 -0
  1587. package/build/cim/components/modals/CimConfiguration/types.js +2 -0
  1588. package/build/cim/components/modals/CimConfiguration/types.js.map +1 -0
  1589. package/build/cim/components/modals/CimConfiguration/utils.js +29 -0
  1590. package/build/cim/components/modals/CimConfiguration/utils.js.map +1 -0
  1591. package/build/cim/components/modals/EditAgentModal.js +31 -0
  1592. package/build/cim/components/modals/EditAgentModal.js.map +1 -0
  1593. package/build/cim/components/modals/EditBMHModal.js +48 -0
  1594. package/build/cim/components/modals/EditBMHModal.js.map +1 -0
  1595. package/build/cim/components/modals/EditNtpSourcesModal.js +52 -0
  1596. package/build/cim/components/modals/EditNtpSourcesModal.js.map +1 -0
  1597. package/build/cim/components/modals/EditProxyModal.js +64 -0
  1598. package/build/cim/components/modals/EditProxyModal.js.map +1 -0
  1599. package/build/cim/components/modals/EditPullSecretModal.js +91 -0
  1600. package/build/cim/components/modals/EditPullSecretModal.js.map +1 -0
  1601. package/build/cim/components/modals/EditSSHKeyModal.js +51 -0
  1602. package/build/cim/components/modals/EditSSHKeyModal.js.map +1 -0
  1603. package/build/cim/components/modals/MassApproveAction.js +12 -0
  1604. package/build/cim/components/modals/MassApproveAction.js.map +1 -0
  1605. package/build/cim/components/modals/MassApproveAgentModal.js +112 -0
  1606. package/build/cim/components/modals/MassApproveAgentModal.js.map +1 -0
  1607. package/build/cim/components/modals/MassDeleteAgentModal.js +107 -0
  1608. package/build/cim/components/modals/MassDeleteAgentModal.js.map +1 -0
  1609. package/build/cim/components/modals/ScaleUpModal.js +91 -0
  1610. package/build/cim/components/modals/ScaleUpModal.js.map +1 -0
  1611. package/build/cim/components/modals/constants.js +64 -0
  1612. package/build/cim/components/modals/constants.js.map +1 -0
  1613. package/build/cim/components/modals/index.js +12 -0
  1614. package/build/cim/components/modals/index.js.map +1 -0
  1615. package/build/cim/components/modals/types.js +2 -0
  1616. package/build/cim/components/modals/types.js.map +1 -0
  1617. package/build/cim/components/modals/utils.js +60 -0
  1618. package/build/cim/components/modals/utils.js.map +1 -0
  1619. package/build/cim/config/constants.js +269 -0
  1620. package/build/cim/config/constants.js.map +1 -0
  1621. package/build/cim/index.js +16 -0
  1622. package/build/cim/index.js.map +1 -0
  1623. package/build/cim/types/fromOCP/index.js +2 -0
  1624. package/build/cim/types/fromOCP/index.js.map +1 -0
  1625. package/build/cim/types/fromOCP/k8sTypes.js +2 -0
  1626. package/build/cim/types/fromOCP/k8sTypes.js.map +1 -0
  1627. package/build/cim/types/index.js +5 -0
  1628. package/build/cim/types/index.js.map +1 -0
  1629. package/build/cim/types/k8s/agent-cluster-install.js +2 -0
  1630. package/build/cim/types/k8s/agent-cluster-install.js.map +1 -0
  1631. package/build/cim/types/k8s/agent-service-config.js +2 -0
  1632. package/build/cim/types/k8s/agent-service-config.js.map +1 -0
  1633. package/build/cim/types/k8s/agent.js +2 -0
  1634. package/build/cim/types/k8s/agent.js.map +1 -0
  1635. package/build/cim/types/k8s/bare-metal-host.js +2 -0
  1636. package/build/cim/types/k8s/bare-metal-host.js.map +1 -0
  1637. package/build/cim/types/k8s/cluster-deployment.js +2 -0
  1638. package/build/cim/types/k8s/cluster-deployment.js.map +1 -0
  1639. package/build/cim/types/k8s/cluster-image-set.js +2 -0
  1640. package/build/cim/types/k8s/cluster-image-set.js.map +1 -0
  1641. package/build/cim/types/k8s/cluster-version.js +10 -0
  1642. package/build/cim/types/k8s/cluster-version.js.map +1 -0
  1643. package/build/cim/types/k8s/index.js +13 -0
  1644. package/build/cim/types/k8s/index.js.map +1 -0
  1645. package/build/cim/types/k8s/infra-env-k8s-resource.js +2 -0
  1646. package/build/cim/types/k8s/infra-env-k8s-resource.js.map +1 -0
  1647. package/build/cim/types/k8s/infrastructure.js +2 -0
  1648. package/build/cim/types/k8s/infrastructure.js.map +1 -0
  1649. package/build/cim/types/k8s/nm-state.js +2 -0
  1650. package/build/cim/types/k8s/nm-state.js.map +1 -0
  1651. package/build/cim/types/k8s/shared.js +2 -0
  1652. package/build/cim/types/k8s/shared.js.map +1 -0
  1653. package/build/cim/types/k8s/storage-class.js +2 -0
  1654. package/build/cim/types/k8s/storage-class.js.map +1 -0
  1655. package/build/cim/types/metal3.js +2 -0
  1656. package/build/cim/types/metal3.js.map +1 -0
  1657. package/build/cim/types/resources.js +6 -0
  1658. package/build/cim/types/resources.js.map +1 -0
  1659. package/build/cim/utils.js +4 -0
  1660. package/build/cim/utils.js.map +1 -0
  1661. package/build/common/api/index.js +3 -0
  1662. package/build/common/api/index.js.map +1 -0
  1663. package/build/common/api/types.js +2 -0
  1664. package/build/common/api/types.js.map +1 -0
  1665. package/build/common/api/utils.js +19 -0
  1666. package/build/common/api/utils.js.map +1 -0
  1667. package/build/common/components/AddHosts/AddHostsContext.js +4 -0
  1668. package/build/common/components/AddHosts/AddHostsContext.js.map +1 -0
  1669. package/build/common/components/AddHosts/index.js +2 -0
  1670. package/build/common/components/AddHosts/index.js.map +1 -0
  1671. package/build/common/components/AlertsContextProvider.js +25 -0
  1672. package/build/common/components/AlertsContextProvider.js.map +1 -0
  1673. package/build/common/components/ErrorHandling/ErrorMonitorContext.js +13 -0
  1674. package/build/common/components/ErrorHandling/ErrorMonitorContext.js.map +1 -0
  1675. package/build/common/components/ErrorHandling/WithErrorBoundary.js +32 -0
  1676. package/build/common/components/ErrorHandling/WithErrorBoundary.js.map +1 -0
  1677. package/build/common/components/clusterConfiguration/AdvancedNetworkFields.js +25 -0
  1678. package/build/common/components/clusterConfiguration/AdvancedNetworkFields.js.map +1 -0
  1679. package/build/common/components/clusterConfiguration/CertificateFields.css +3 -0
  1680. package/build/common/components/clusterConfiguration/CertificateFields.js +37 -0
  1681. package/build/common/components/clusterConfiguration/CertificateFields.js.map +1 -0
  1682. package/build/common/components/clusterConfiguration/DiscoveryImageConfigForm.js +62 -0
  1683. package/build/common/components/clusterConfiguration/DiscoveryImageConfigForm.js.map +1 -0
  1684. package/build/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.js +19 -0
  1685. package/build/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.js.map +1 -0
  1686. package/build/common/components/clusterConfiguration/DiscoveryInstructions.js +18 -0
  1687. package/build/common/components/clusterConfiguration/DiscoveryInstructions.js.map +1 -0
  1688. package/build/common/components/clusterConfiguration/DiscoveryIpxeInstructions.js +15 -0
  1689. package/build/common/components/clusterConfiguration/DiscoveryIpxeInstructions.js.map +1 -0
  1690. package/build/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.js +118 -0
  1691. package/build/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.js.map +1 -0
  1692. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.js +67 -0
  1693. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.js.map +1 -0
  1694. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.js +52 -0
  1695. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.js.map +1 -0
  1696. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.js +2 -0
  1697. package/build/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.js.map +1 -0
  1698. package/build/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.js +21 -0
  1699. package/build/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.js.map +1 -0
  1700. package/build/common/components/clusterConfiguration/DownloadIpxeScript.js +28 -0
  1701. package/build/common/components/clusterConfiguration/DownloadIpxeScript.js.map +1 -0
  1702. package/build/common/components/clusterConfiguration/DownloadIso.js +32 -0
  1703. package/build/common/components/clusterConfiguration/DownloadIso.js.map +1 -0
  1704. package/build/common/components/clusterConfiguration/DownloadIsoModal.js +23 -0
  1705. package/build/common/components/clusterConfiguration/DownloadIsoModal.js.map +1 -0
  1706. package/build/common/components/clusterConfiguration/FormatDiskWarning.js +13 -0
  1707. package/build/common/components/clusterConfiguration/FormatDiskWarning.js.map +1 -0
  1708. package/build/common/components/clusterConfiguration/OpenShiftVersionSelect.js +49 -0
  1709. package/build/common/components/clusterConfiguration/OpenShiftVersionSelect.js.map +1 -0
  1710. package/build/common/components/clusterConfiguration/ProxyFields.css +3 -0
  1711. package/build/common/components/clusterConfiguration/ProxyFields.js +53 -0
  1712. package/build/common/components/clusterConfiguration/ProxyFields.js.map +1 -0
  1713. package/build/common/components/clusterConfiguration/SNOControlGroup.js +17 -0
  1714. package/build/common/components/clusterConfiguration/SNOControlGroup.js.map +1 -0
  1715. package/build/common/components/clusterConfiguration/SNODisclaimer.js +28 -0
  1716. package/build/common/components/clusterConfiguration/SNODisclaimer.js.map +1 -0
  1717. package/build/common/components/clusterConfiguration/SecurityFields.js +42 -0
  1718. package/build/common/components/clusterConfiguration/SecurityFields.js.map +1 -0
  1719. package/build/common/components/clusterConfiguration/UploadSSH.js +20 -0
  1720. package/build/common/components/clusterConfiguration/UploadSSH.js.map +1 -0
  1721. package/build/common/components/clusterConfiguration/index.js +14 -0
  1722. package/build/common/components/clusterConfiguration/index.js.map +1 -0
  1723. package/build/common/components/clusterConfiguration/utils.js +171 -0
  1724. package/build/common/components/clusterConfiguration/utils.js.map +1 -0
  1725. package/build/common/components/clusterDetail/ClusterCredentials.js +42 -0
  1726. package/build/common/components/clusterDetail/ClusterCredentials.js.map +1 -0
  1727. package/build/common/components/clusterDetail/ClusterProgress.css +3 -0
  1728. package/build/common/components/clusterDetail/ClusterProgress.js +53 -0
  1729. package/build/common/components/clusterDetail/ClusterProgress.js.map +1 -0
  1730. package/build/common/components/clusterDetail/ClusterProgressItem.js +10 -0
  1731. package/build/common/components/clusterDetail/ClusterProgressItem.js.map +1 -0
  1732. package/build/common/components/clusterDetail/ClusterProgressItems.js +29 -0
  1733. package/build/common/components/clusterDetail/ClusterProgressItems.js.map +1 -0
  1734. package/build/common/components/clusterDetail/ClusterPropertiesList.js +15 -0
  1735. package/build/common/components/clusterDetail/ClusterPropertiesList.js.map +1 -0
  1736. package/build/common/components/clusterDetail/ConsoleModal.js +77 -0
  1737. package/build/common/components/clusterDetail/ConsoleModal.js.map +1 -0
  1738. package/build/common/components/clusterDetail/FinalizingProgress.js +60 -0
  1739. package/build/common/components/clusterDetail/FinalizingProgress.js.map +1 -0
  1740. package/build/common/components/clusterDetail/KubeconfigDownload.js +54 -0
  1741. package/build/common/components/clusterDetail/KubeconfigDownload.js.map +1 -0
  1742. package/build/common/components/clusterDetail/OperatorsProgressItem.css +4 -0
  1743. package/build/common/components/clusterDetail/OperatorsProgressItem.js +84 -0
  1744. package/build/common/components/clusterDetail/OperatorsProgressItem.js.map +1 -0
  1745. package/build/common/components/clusterDetail/ProgressBarTexts.js +55 -0
  1746. package/build/common/components/clusterDetail/ProgressBarTexts.js.map +1 -0
  1747. package/build/common/components/clusterDetail/index.js +5 -0
  1748. package/build/common/components/clusterDetail/index.js.map +1 -0
  1749. package/build/common/components/clusterWizard/ClusterWizardStep.css +31 -0
  1750. package/build/common/components/clusterWizard/ClusterWizardStep.js +16 -0
  1751. package/build/common/components/clusterWizard/ClusterWizardStep.js.map +1 -0
  1752. package/build/common/components/clusterWizard/ClusterWizardStepHeader.js +6 -0
  1753. package/build/common/components/clusterWizard/ClusterWizardStepHeader.js.map +1 -0
  1754. package/build/common/components/clusterWizard/ClusterWizardStepValidationsAlert.js +39 -0
  1755. package/build/common/components/clusterWizard/ClusterWizardStepValidationsAlert.js.map +1 -0
  1756. package/build/common/components/clusterWizard/ReviewHostsInventory.js +43 -0
  1757. package/build/common/components/clusterWizard/ReviewHostsInventory.js.map +1 -0
  1758. package/build/common/components/clusterWizard/ReviewValidations.js +115 -0
  1759. package/build/common/components/clusterWizard/ReviewValidations.js.map +1 -0
  1760. package/build/common/components/clusterWizard/clusterDetailsValidation.js +90 -0
  1761. package/build/common/components/clusterWizard/clusterDetailsValidation.js.map +1 -0
  1762. package/build/common/components/clusterWizard/index.js +9 -0
  1763. package/build/common/components/clusterWizard/index.js.map +1 -0
  1764. package/build/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js +57 -0
  1765. package/build/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js.map +1 -0
  1766. package/build/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.js +23 -0
  1767. package/build/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.js.map +1 -0
  1768. package/build/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.js +28 -0
  1769. package/build/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.js.map +1 -0
  1770. package/build/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.js +24 -0
  1771. package/build/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.js.map +1 -0
  1772. package/build/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.js +57 -0
  1773. package/build/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.js.map +1 -0
  1774. package/build/common/components/clusterWizard/networkingSteps/index.js +5 -0
  1775. package/build/common/components/clusterWizard/networkingSteps/index.js.map +1 -0
  1776. package/build/common/components/clusterWizard/types.js +2 -0
  1777. package/build/common/components/clusterWizard/types.js.map +1 -0
  1778. package/build/common/components/clusterWizard/validationsInfoUtils.js +150 -0
  1779. package/build/common/components/clusterWizard/validationsInfoUtils.js.map +1 -0
  1780. package/build/common/components/clusters/PullSecret.js +29 -0
  1781. package/build/common/components/clusters/PullSecret.js.map +1 -0
  1782. package/build/common/components/clusters/index.js +2 -0
  1783. package/build/common/components/clusters/index.js.map +1 -0
  1784. package/build/common/components/constants.js +7 -0
  1785. package/build/common/components/constants.js.map +1 -0
  1786. package/build/common/components/featureSupportLevels/FeatureSupportLevelBadge.js +22 -0
  1787. package/build/common/components/featureSupportLevels/FeatureSupportLevelBadge.js.map +1 -0
  1788. package/build/common/components/featureSupportLevels/FeatureSupportLevelContext.js +15 -0
  1789. package/build/common/components/featureSupportLevels/FeatureSupportLevelContext.js.map +1 -0
  1790. package/build/common/components/featureSupportLevels/index.js +3 -0
  1791. package/build/common/components/featureSupportLevels/index.js.map +1 -0
  1792. package/build/common/components/fetching/EventListFetch.js +103 -0
  1793. package/build/common/components/fetching/EventListFetch.js.map +1 -0
  1794. package/build/common/components/fetching/index.js +2 -0
  1795. package/build/common/components/fetching/index.js.map +1 -0
  1796. package/build/common/components/hosts/AITable.js +183 -0
  1797. package/build/common/components/hosts/AITable.js.map +1 -0
  1798. package/build/common/components/hosts/AdditionalNTPSourcesDialog.js +44 -0
  1799. package/build/common/components/hosts/AdditionalNTPSourcesDialog.js.map +1 -0
  1800. package/build/common/components/hosts/DiskLimitations.js +22 -0
  1801. package/build/common/components/hosts/DiskLimitations.js.map +1 -0
  1802. package/build/common/components/hosts/DiskRole.js +49 -0
  1803. package/build/common/components/hosts/DiskRole.js.map +1 -0
  1804. package/build/common/components/hosts/EditHostForm.js +70 -0
  1805. package/build/common/components/hosts/EditHostForm.js.map +1 -0
  1806. package/build/common/components/hosts/EditHostModal.js +7 -0
  1807. package/build/common/components/hosts/EditHostModal.js.map +1 -0
  1808. package/build/common/components/hosts/FormatDiskCheckbox.js +45 -0
  1809. package/build/common/components/hosts/FormatDiskCheckbox.js.map +1 -0
  1810. package/build/common/components/hosts/HostProgress.js +25 -0
  1811. package/build/common/components/hosts/HostProgress.js.map +1 -0
  1812. package/build/common/components/hosts/HostPropertyValidationPopover.js +40 -0
  1813. package/build/common/components/hosts/HostPropertyValidationPopover.js.map +1 -0
  1814. package/build/common/components/hosts/HostRequirements.js +37 -0
  1815. package/build/common/components/hosts/HostRequirements.js.map +1 -0
  1816. package/build/common/components/hosts/HostRowDetail.js +95 -0
  1817. package/build/common/components/hosts/HostRowDetail.js.map +1 -0
  1818. package/build/common/components/hosts/HostStatus.js +149 -0
  1819. package/build/common/components/hosts/HostStatus.js.map +1 -0
  1820. package/build/common/components/hosts/HostToolbarActions.js +5 -0
  1821. package/build/common/components/hosts/HostToolbarActions.js.map +1 -0
  1822. package/build/common/components/hosts/HostValidationGroups.css +4 -0
  1823. package/build/common/components/hosts/HostValidationGroups.js +135 -0
  1824. package/build/common/components/hosts/HostValidationGroups.js.map +1 -0
  1825. package/build/common/components/hosts/Hostname.js +31 -0
  1826. package/build/common/components/hosts/Hostname.js.map +1 -0
  1827. package/build/common/components/hosts/HostsCount.js +25 -0
  1828. package/build/common/components/hosts/HostsCount.js.map +1 -0
  1829. package/build/common/components/hosts/HostsTable.css +15 -0
  1830. package/build/common/components/hosts/HostsTable.js +35 -0
  1831. package/build/common/components/hosts/HostsTable.js.map +1 -0
  1832. package/build/common/components/hosts/HostsTableDetailContext.js +19 -0
  1833. package/build/common/components/hosts/HostsTableDetailContext.js.map +1 -0
  1834. package/build/common/components/hosts/MassChangeHostnameModal.css +16 -0
  1835. package/build/common/components/hosts/MassChangeHostnameModal.js +156 -0
  1836. package/build/common/components/hosts/MassChangeHostnameModal.js.map +1 -0
  1837. package/build/common/components/hosts/MassDeleteHostModal.js +51 -0
  1838. package/build/common/components/hosts/MassDeleteHostModal.js.map +1 -0
  1839. package/build/common/components/hosts/NtpValidationStatus.js +25 -0
  1840. package/build/common/components/hosts/NtpValidationStatus.js.map +1 -0
  1841. package/build/common/components/hosts/OcpConsoleNodesSectionLink.js +17 -0
  1842. package/build/common/components/hosts/OcpConsoleNodesSectionLink.js.map +1 -0
  1843. package/build/common/components/hosts/RoleCell.js +5 -0
  1844. package/build/common/components/hosts/RoleCell.js.map +1 -0
  1845. package/build/common/components/hosts/RoleDropdown.js +32 -0
  1846. package/build/common/components/hosts/RoleDropdown.js.map +1 -0
  1847. package/build/common/components/hosts/TableToolbar.css +11 -0
  1848. package/build/common/components/hosts/TableToolbar.js +60 -0
  1849. package/build/common/components/hosts/TableToolbar.js.map +1 -0
  1850. package/build/common/components/hosts/VMRebootConfigurationInfo.js +31 -0
  1851. package/build/common/components/hosts/VMRebootConfigurationInfo.js.map +1 -0
  1852. package/build/common/components/hosts/hardwareInfo.js +58 -0
  1853. package/build/common/components/hosts/hardwareInfo.js.map +1 -0
  1854. package/build/common/components/hosts/index.js +17 -0
  1855. package/build/common/components/hosts/index.js.map +1 -0
  1856. package/build/common/components/hosts/status.js +235 -0
  1857. package/build/common/components/hosts/status.js.map +1 -0
  1858. package/build/common/components/hosts/tableUtils.js +389 -0
  1859. package/build/common/components/hosts/tableUtils.js.map +1 -0
  1860. package/build/common/components/hosts/types.js +2 -0
  1861. package/build/common/components/hosts/types.js.map +1 -0
  1862. package/build/common/components/hosts/usePagination.js +29 -0
  1863. package/build/common/components/hosts/usePagination.js.map +1 -0
  1864. package/build/common/components/hosts/utils.js +172 -0
  1865. package/build/common/components/hosts/utils.js.map +1 -0
  1866. package/build/common/components/index.js +12 -0
  1867. package/build/common/components/index.js.map +1 -0
  1868. package/build/common/components/newFeatureSupportLevels/FeatureSupportLevelBadge.js +20 -0
  1869. package/build/common/components/newFeatureSupportLevels/FeatureSupportLevelBadge.js.map +1 -0
  1870. package/build/common/components/newFeatureSupportLevels/FeatureSupportLevelContext.js +15 -0
  1871. package/build/common/components/newFeatureSupportLevels/FeatureSupportLevelContext.js.map +1 -0
  1872. package/build/common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge.js +12 -0
  1873. package/build/common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge.js.map +1 -0
  1874. package/build/common/components/newFeatureSupportLevels/NewFeatureSupportLevelContext.js +15 -0
  1875. package/build/common/components/newFeatureSupportLevels/NewFeatureSupportLevelContext.js.map +1 -0
  1876. package/build/common/components/newFeatureSupportLevels/index.js +2 -0
  1877. package/build/common/components/newFeatureSupportLevels/index.js.map +1 -0
  1878. package/build/common/components/newFeatureSupportLevels/utils.js +42 -0
  1879. package/build/common/components/newFeatureSupportLevels/utils.js.map +1 -0
  1880. package/build/common/components/storage/DisksTable.js +65 -0
  1881. package/build/common/components/storage/DisksTable.js.map +1 -0
  1882. package/build/common/components/storage/StorageDetail.js +15 -0
  1883. package/build/common/components/storage/StorageDetail.js.map +1 -0
  1884. package/build/common/components/storage/StorageTable.js +20 -0
  1885. package/build/common/components/storage/StorageTable.js.map +1 -0
  1886. package/build/common/components/storage/StorageUtils.js +71 -0
  1887. package/build/common/components/storage/StorageUtils.js.map +1 -0
  1888. package/build/common/components/ui/Alerts.js +15 -0
  1889. package/build/common/components/ui/Alerts.js.map +1 -0
  1890. package/build/common/components/ui/BorderedIcon/BorderedIcon.js +43 -0
  1891. package/build/common/components/ui/BorderedIcon/BorderedIcon.js.map +1 -0
  1892. package/build/common/components/ui/ClusterEventsToolbar.js +130 -0
  1893. package/build/common/components/ui/ClusterEventsToolbar.js.map +1 -0
  1894. package/build/common/components/ui/ConfirmationModal.js +12 -0
  1895. package/build/common/components/ui/ConfirmationModal.js.map +1 -0
  1896. package/build/common/components/ui/DetailList.css +12 -0
  1897. package/build/common/components/ui/DetailList.js +18 -0
  1898. package/build/common/components/ui/DetailList.js.map +1 -0
  1899. package/build/common/components/ui/EventsList.js +63 -0
  1900. package/build/common/components/ui/EventsList.js.map +1 -0
  1901. package/build/common/components/ui/EventsModal.css +8 -0
  1902. package/build/common/components/ui/ExternalLink.js +9 -0
  1903. package/build/common/components/ui/ExternalLink.js.map +1 -0
  1904. package/build/common/components/ui/GridGap.js +8 -0
  1905. package/build/common/components/ui/GridGap.js.map +1 -0
  1906. package/build/common/components/ui/ModalProgress.js +13 -0
  1907. package/build/common/components/ui/ModalProgress.js.map +1 -0
  1908. package/build/common/components/ui/OpenShiftVersionDropdown.js +54 -0
  1909. package/build/common/components/ui/OpenShiftVersionDropdown.js.map +1 -0
  1910. package/build/common/components/ui/PopoverIcon.js +23 -0
  1911. package/build/common/components/ui/PopoverIcon.js.map +1 -0
  1912. package/build/common/components/ui/PreviewBadge.js +42 -0
  1913. package/build/common/components/ui/PreviewBadge.js.map +1 -0
  1914. package/build/common/components/ui/PrismCode.css +4 -0
  1915. package/build/common/components/ui/PrismCode.js +32 -0
  1916. package/build/common/components/ui/PrismCode.js.map +1 -0
  1917. package/build/common/components/ui/RenderIf.js +3 -0
  1918. package/build/common/components/ui/RenderIf.js.map +1 -0
  1919. package/build/common/components/ui/SectionTitle.js +7 -0
  1920. package/build/common/components/ui/SectionTitle.js.map +1 -0
  1921. package/build/common/components/ui/SimpleDropdown.css +6 -0
  1922. package/build/common/components/ui/SimpleDropdown.js +15 -0
  1923. package/build/common/components/ui/SimpleDropdown.js.map +1 -0
  1924. package/build/common/components/ui/StaticTextField.js +39 -0
  1925. package/build/common/components/ui/StaticTextField.js.map +1 -0
  1926. package/build/common/components/ui/Toolbar/ToolbarButton.js +20 -0
  1927. package/build/common/components/ui/Toolbar/ToolbarButton.js.map +1 -0
  1928. package/build/common/components/ui/Toolbar/ToolbarProgress.js +7 -0
  1929. package/build/common/components/ui/Toolbar/ToolbarProgress.js.map +1 -0
  1930. package/build/common/components/ui/Toolbar/ToolbarSecondaryGroup.js +5 -0
  1931. package/build/common/components/ui/Toolbar/ToolbarSecondaryGroup.js.map +1 -0
  1932. package/build/common/components/ui/Toolbar/ToolbarText.js +6 -0
  1933. package/build/common/components/ui/Toolbar/ToolbarText.js.map +1 -0
  1934. package/build/common/components/ui/Toolbar/index.js +5 -0
  1935. package/build/common/components/ui/Toolbar/index.js.map +1 -0
  1936. package/build/common/components/ui/ViewClusterEventsButton.js +11 -0
  1937. package/build/common/components/ui/ViewClusterEventsButton.js.map +1 -0
  1938. package/build/common/components/ui/WizardFooter.js +29 -0
  1939. package/build/common/components/ui/WizardFooter.js.map +1 -0
  1940. package/build/common/components/ui/WizardNavItem.js +30 -0
  1941. package/build/common/components/ui/WizardNavItem.js.map +1 -0
  1942. package/build/common/components/ui/eventsModal.js +43 -0
  1943. package/build/common/components/ui/eventsModal.js.map +1 -0
  1944. package/build/common/components/ui/formik/AddButton.js +20 -0
  1945. package/build/common/components/ui/formik/AddButton.js.map +1 -0
  1946. package/build/common/components/ui/formik/AdditionalNTPSourcesField.js +16 -0
  1947. package/build/common/components/ui/formik/AdditionalNTPSourcesField.js.map +1 -0
  1948. package/build/common/components/ui/formik/AlertFormikError.js +12 -0
  1949. package/build/common/components/ui/formik/AlertFormikError.js.map +1 -0
  1950. package/build/common/components/ui/formik/CertificatesUploadField.js +65 -0
  1951. package/build/common/components/ui/formik/CertificatesUploadField.js.map +1 -0
  1952. package/build/common/components/ui/formik/CheckboxField.js +34 -0
  1953. package/build/common/components/ui/formik/CheckboxField.js.map +1 -0
  1954. package/build/common/components/ui/formik/CodeField.js +47 -0
  1955. package/build/common/components/ui/formik/CodeField.js.map +1 -0
  1956. package/build/common/components/ui/formik/FormikAutoSave.js +60 -0
  1957. package/build/common/components/ui/formik/FormikAutoSave.js.map +1 -0
  1958. package/build/common/components/ui/formik/HelperText.js +9 -0
  1959. package/build/common/components/ui/formik/HelperText.js.map +1 -0
  1960. package/build/common/components/ui/formik/InputField.js +46 -0
  1961. package/build/common/components/ui/formik/InputField.js.map +1 -0
  1962. package/build/common/components/ui/formik/LabelField.css +38 -0
  1963. package/build/common/components/ui/formik/LabelField.js +58 -0
  1964. package/build/common/components/ui/formik/LabelField.js.map +1 -0
  1965. package/build/common/components/ui/formik/MultiSelectField.js +84 -0
  1966. package/build/common/components/ui/formik/MultiSelectField.js.map +1 -0
  1967. package/build/common/components/ui/formik/NumberInputField.js +55 -0
  1968. package/build/common/components/ui/formik/NumberInputField.js.map +1 -0
  1969. package/build/common/components/ui/formik/PencilEditField.css +3 -0
  1970. package/build/common/components/ui/formik/PencilEditField.js +26 -0
  1971. package/build/common/components/ui/formik/PencilEditField.js.map +1 -0
  1972. package/build/common/components/ui/formik/PullSecretField.js +46 -0
  1973. package/build/common/components/ui/formik/PullSecretField.js.map +1 -0
  1974. package/build/common/components/ui/formik/RadioField.js +30 -0
  1975. package/build/common/components/ui/formik/RadioField.js.map +1 -0
  1976. package/build/common/components/ui/formik/RadioFieldWithTooltip.js +21 -0
  1977. package/build/common/components/ui/formik/RadioFieldWithTooltip.js.map +1 -0
  1978. package/build/common/components/ui/formik/RemovableField.css +9 -0
  1979. package/build/common/components/ui/formik/RemovableField.js +24 -0
  1980. package/build/common/components/ui/formik/RemovableField.js.map +1 -0
  1981. package/build/common/components/ui/formik/RichInputField.css +18 -0
  1982. package/build/common/components/ui/formik/RichInputField.js +60 -0
  1983. package/build/common/components/ui/formik/RichInputField.js.map +1 -0
  1984. package/build/common/components/ui/formik/SelectField.js +39 -0
  1985. package/build/common/components/ui/formik/SelectField.js.map +1 -0
  1986. package/build/common/components/ui/formik/SingleNodeCheckbox.js +53 -0
  1987. package/build/common/components/ui/formik/SingleNodeCheckbox.js.map +1 -0
  1988. package/build/common/components/ui/formik/SwitchField.js +41 -0
  1989. package/build/common/components/ui/formik/SwitchField.js.map +1 -0
  1990. package/build/common/components/ui/formik/TextAreaField.js +39 -0
  1991. package/build/common/components/ui/formik/TextAreaField.js.map +1 -0
  1992. package/build/common/components/ui/formik/TextAreaSecretField.js +27 -0
  1993. package/build/common/components/ui/formik/TextAreaSecretField.js.map +1 -0
  1994. package/build/common/components/ui/formik/UploadField.js +38 -0
  1995. package/build/common/components/ui/formik/UploadField.js.map +1 -0
  1996. package/build/common/components/ui/formik/constants.js +57 -0
  1997. package/build/common/components/ui/formik/constants.js.map +1 -0
  1998. package/build/common/components/ui/formik/index.js +27 -0
  1999. package/build/common/components/ui/formik/index.js.map +1 -0
  2000. package/build/common/components/ui/formik/types.js +2 -0
  2001. package/build/common/components/ui/formik/types.js.map +1 -0
  2002. package/build/common/components/ui/formik/utils.js +107 -0
  2003. package/build/common/components/ui/formik/utils.js.map +1 -0
  2004. package/build/common/components/ui/formik/validationSchemas.js +423 -0
  2005. package/build/common/components/ui/formik/validationSchemas.js.map +1 -0
  2006. package/build/common/components/ui/index.js +23 -0
  2007. package/build/common/components/ui/index.js.map +1 -0
  2008. package/build/common/components/ui/table/index.js +3 -0
  2009. package/build/common/components/ui/table/index.js.map +1 -0
  2010. package/build/common/components/ui/table/utils.js +45 -0
  2011. package/build/common/components/ui/table/utils.js.map +1 -0
  2012. package/build/common/components/ui/table/wrappable.css +3 -0
  2013. package/build/common/components/ui/table/wrappable.js +20 -0
  2014. package/build/common/components/ui/table/wrappable.js.map +1 -0
  2015. package/build/common/components/ui/uiState/EmptyState.js +12 -0
  2016. package/build/common/components/ui/uiState/EmptyState.js.map +1 -0
  2017. package/build/common/components/ui/uiState/ErrorState.js +24 -0
  2018. package/build/common/components/ui/uiState/ErrorState.js.map +1 -0
  2019. package/build/common/components/ui/uiState/LoadingState.js +10 -0
  2020. package/build/common/components/ui/uiState/LoadingState.js.map +1 -0
  2021. package/build/common/components/ui/uiState/index.js +4 -0
  2022. package/build/common/components/ui/uiState/index.js.map +1 -0
  2023. package/build/common/components/ui/utils.js +19 -0
  2024. package/build/common/components/ui/utils.js.map +1 -0
  2025. package/build/common/config/constants.js +280 -0
  2026. package/build/common/config/constants.js.map +1 -0
  2027. package/build/common/config/index.js +2 -0
  2028. package/build/common/config/index.js.map +1 -0
  2029. package/build/common/features/featureGate.js +39 -0
  2030. package/build/common/features/featureGate.js.map +1 -0
  2031. package/build/common/features/index.js +2 -0
  2032. package/build/common/features/index.js.map +1 -0
  2033. package/build/common/hooks/index.js +3 -0
  2034. package/build/common/hooks/index.js.map +1 -0
  2035. package/build/common/hooks/use-translation-wrapper.js +6 -0
  2036. package/build/common/hooks/use-translation-wrapper.js.map +1 -0
  2037. package/build/common/hooks/useDeepCompareMemoize.js +11 -0
  2038. package/build/common/hooks/useDeepCompareMemoize.js.map +1 -0
  2039. package/build/common/hooks/useFieldErrorMsg.js +31 -0
  2040. package/build/common/hooks/useFieldErrorMsg.js.map +1 -0
  2041. package/build/common/hooks/useFormikHelpers.js +21 -0
  2042. package/build/common/hooks/useFormikHelpers.js.map +1 -0
  2043. package/build/common/hooks/useStateSafely.js +19 -0
  2044. package/build/common/hooks/useStateSafely.js.map +1 -0
  2045. package/build/common/index.js +10 -0
  2046. package/build/common/index.js.map +1 -0
  2047. package/build/common/reducers/alertsSlice.js +17 -0
  2048. package/build/common/reducers/alertsSlice.js.map +1 -0
  2049. package/build/common/reducers/dialogsSlice.js +17 -0
  2050. package/build/common/reducers/dialogsSlice.js.map +1 -0
  2051. package/build/common/reducers/index.js +3 -0
  2052. package/build/common/reducers/index.js.map +1 -0
  2053. package/build/common/selectors/clusterSelectors.js +69 -0
  2054. package/build/common/selectors/clusterSelectors.js.map +1 -0
  2055. package/build/common/selectors/index.js +2 -0
  2056. package/build/common/selectors/index.js.map +1 -0
  2057. package/build/common/sevices/DateAndTime.js +15 -0
  2058. package/build/common/sevices/DateAndTime.js.map +1 -0
  2059. package/build/common/styles.css +4 -0
  2060. package/build/common/types/clusters.js +3 -0
  2061. package/build/common/types/clusters.js.map +1 -0
  2062. package/build/common/types/cpuArchitecture.js +67 -0
  2063. package/build/common/types/cpuArchitecture.js.map +1 -0
  2064. package/build/common/types/errortype.js +2 -0
  2065. package/build/common/types/errortype.js.map +1 -0
  2066. package/build/common/types/events.js +2 -0
  2067. package/build/common/types/events.js.map +1 -0
  2068. package/build/common/types/featureSupportLevel.js +4 -0
  2069. package/build/common/types/featureSupportLevel.js.map +1 -0
  2070. package/build/common/types/generateIsoFields.js +2 -0
  2071. package/build/common/types/generateIsoFields.js.map +1 -0
  2072. package/build/common/types/hosts.js +2 -0
  2073. package/build/common/types/hosts.js.map +1 -0
  2074. package/build/common/types/index.js +18 -0
  2075. package/build/common/types/index.js.map +1 -0
  2076. package/build/common/types/typescriptExtensions.js +9 -0
  2077. package/build/common/types/typescriptExtensions.js.map +1 -0
  2078. package/build/common/types/versions.js +2 -0
  2079. package/build/common/types/versions.js.map +1 -0
  2080. package/build/common/utils.js +15 -0
  2081. package/build/common/utils.js.map +1 -0
  2082. package/build/index.js +3 -0
  2083. package/build/index.js.map +1 -0
  2084. package/build/ocm/api/axiosClient.js +37 -0
  2085. package/build/ocm/api/axiosClient.js.map +1 -0
  2086. package/build/ocm/api/axiosExtensions.js +6 -0
  2087. package/build/ocm/api/axiosExtensions.js.map +1 -0
  2088. package/build/ocm/api/index.js +3 -0
  2089. package/build/ocm/api/index.js.map +1 -0
  2090. package/build/ocm/api/types.js +9 -0
  2091. package/build/ocm/api/types.js.map +1 -0
  2092. package/build/ocm/api/utils.js +76 -0
  2093. package/build/ocm/api/utils.js.map +1 -0
  2094. package/build/ocm/components/AddHosts/AddHosts.js +71 -0
  2095. package/build/ocm/components/AddHosts/AddHosts.js.map +1 -0
  2096. package/build/ocm/components/AddHosts/InventoryAddHost.js +29 -0
  2097. package/build/ocm/components/AddHosts/InventoryAddHost.js.map +1 -0
  2098. package/build/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.js +100 -0
  2099. package/build/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.js.map +1 -0
  2100. package/build/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.js +12 -0
  2101. package/build/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.js.map +1 -0
  2102. package/build/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.js +25 -0
  2103. package/build/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.js.map +1 -0
  2104. package/build/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.js +50 -0
  2105. package/build/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.js.map +1 -0
  2106. package/build/ocm/components/AddHosts/day2Wizard/Day2StaticIP.js +125 -0
  2107. package/build/ocm/components/AddHosts/day2Wizard/Day2StaticIP.js.map +1 -0
  2108. package/build/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.js +21 -0
  2109. package/build/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.js.map +1 -0
  2110. package/build/ocm/components/AddHosts/day2Wizard/Day2Wizard.js +41 -0
  2111. package/build/ocm/components/AddHosts/day2Wizard/Day2Wizard.js.map +1 -0
  2112. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardContext.js +11 -0
  2113. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardContext.js.map +1 -0
  2114. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.js +82 -0
  2115. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.js.map +1 -0
  2116. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardFooter.js +19 -0
  2117. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardFooter.js.map +1 -0
  2118. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardNav.js +43 -0
  2119. package/build/ocm/components/AddHosts/day2Wizard/Day2WizardNav.js.map +1 -0
  2120. package/build/ocm/components/AddHosts/day2Wizard/constants.js +18 -0
  2121. package/build/ocm/components/AddHosts/day2Wizard/constants.js.map +1 -0
  2122. package/build/ocm/components/AddHosts/index.js +3 -0
  2123. package/build/ocm/components/AddHosts/index.js.map +1 -0
  2124. package/build/ocm/components/AddHosts/types.js +2 -0
  2125. package/build/ocm/components/AddHosts/types.js.map +1 -0
  2126. package/build/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.js +13 -0
  2127. package/build/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.js.map +1 -0
  2128. package/build/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.js +160 -0
  2129. package/build/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.js.map +1 -0
  2130. package/build/ocm/components/HostsClusterDetailTab/index.js +4 -0
  2131. package/build/ocm/components/HostsClusterDetailTab/index.js.map +1 -0
  2132. package/build/ocm/components/HostsClusterDetailTab/types.js +2 -0
  2133. package/build/ocm/components/HostsClusterDetailTab/types.js.map +1 -0
  2134. package/build/ocm/components/HostsClusterDetailTab/utils.js +41 -0
  2135. package/build/ocm/components/HostsClusterDetailTab/utils.js.map +1 -0
  2136. package/build/ocm/components/Router.js +19 -0
  2137. package/build/ocm/components/Router.js.map +1 -0
  2138. package/build/ocm/components/SentryErrorMonitorContextProvider.js +17 -0
  2139. package/build/ocm/components/SentryErrorMonitorContextProvider.js.map +1 -0
  2140. package/build/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.js +76 -0
  2141. package/build/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.js.map +1 -0
  2142. package/build/ocm/components/clusterConfiguration/CpuArchitectureDropdown.js +75 -0
  2143. package/build/ocm/components/clusterConfiguration/CpuArchitectureDropdown.js.map +1 -0
  2144. package/build/ocm/components/clusterConfiguration/CustomManifestCheckbox.js +83 -0
  2145. package/build/ocm/components/clusterConfiguration/CustomManifestCheckbox.js.map +1 -0
  2146. package/build/ocm/components/clusterConfiguration/DiscoveryImageForm.js +68 -0
  2147. package/build/ocm/components/clusterConfiguration/DiscoveryImageForm.js.map +1 -0
  2148. package/build/ocm/components/clusterConfiguration/DiscoveryImageModal.js +66 -0
  2149. package/build/ocm/components/clusterConfiguration/DiscoveryImageModal.js.map +1 -0
  2150. package/build/ocm/components/clusterConfiguration/DiscoveryImageTypeDropdown.js +39 -0
  2151. package/build/ocm/components/clusterConfiguration/DiscoveryImageTypeDropdown.js.map +1 -0
  2152. package/build/ocm/components/clusterConfiguration/HostInventory.js +49 -0
  2153. package/build/ocm/components/clusterConfiguration/HostInventory.js.map +1 -0
  2154. package/build/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.js +29 -0
  2155. package/build/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.js.map +1 -0
  2156. package/build/ocm/components/clusterConfiguration/InformationAndAlerts.js +20 -0
  2157. package/build/ocm/components/clusterConfiguration/InformationAndAlerts.js.map +1 -0
  2158. package/build/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js +60 -0
  2159. package/build/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js.map +1 -0
  2160. package/build/ocm/components/clusterConfiguration/OcmClusterProgressItems.js +27 -0
  2161. package/build/ocm/components/clusterConfiguration/OcmClusterProgressItems.js.map +1 -0
  2162. package/build/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.js +69 -0
  2163. package/build/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.js.map +1 -0
  2164. package/build/ocm/components/clusterConfiguration/OcmOpenShiftVersion.js +16 -0
  2165. package/build/ocm/components/clusterConfiguration/OcmOpenShiftVersion.js.map +1 -0
  2166. package/build/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.js +51 -0
  2167. package/build/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.js.map +1 -0
  2168. package/build/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js +85 -0
  2169. package/build/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js.map +1 -0
  2170. package/build/ocm/components/clusterConfiguration/OcmOperatorsProgressItem.css +4 -0
  2171. package/build/ocm/components/clusterConfiguration/OcmSNOControlGroup.js +19 -0
  2172. package/build/ocm/components/clusterConfiguration/OcmSNOControlGroup.js.map +1 -0
  2173. package/build/ocm/components/clusterConfiguration/OcmSNODisclaimer.js +28 -0
  2174. package/build/ocm/components/clusterConfiguration/OcmSNODisclaimer.js.map +1 -0
  2175. package/build/ocm/components/clusterConfiguration/OcmSingleNodeCheckbox.js +57 -0
  2176. package/build/ocm/components/clusterConfiguration/OcmSingleNodeCheckbox.js.map +1 -0
  2177. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js +16 -0
  2178. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.js.map +1 -0
  2179. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/DeleteCustomManifestModal.js +10 -0
  2180. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/DeleteCustomManifestModal.js.map +1 -0
  2181. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CollapsedManifest.js +21 -0
  2182. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CollapsedManifest.js.map +1 -0
  2183. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifest.js +32 -0
  2184. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifest.js.map +1 -0
  2185. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.js +24 -0
  2186. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.js.map +1 -0
  2187. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsArray.js +105 -0
  2188. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsArray.js.map +1 -0
  2189. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsForm.js +119 -0
  2190. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsForm.js.map +1 -0
  2191. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/ExpandedManifest.js +27 -0
  2192. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/ExpandedManifest.js.map +1 -0
  2193. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.js +36 -0
  2194. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.js.map +1 -0
  2195. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.js +40 -0
  2196. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.js.map +1 -0
  2197. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/propTypes.js +2 -0
  2198. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/propTypes.js.map +1 -0
  2199. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/utils.js +41 -0
  2200. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/components/utils.js.map +1 -0
  2201. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/data/dataTypes.js +2 -0
  2202. package/build/ocm/components/clusterConfiguration/manifestsConfiguration/data/dataTypes.js.map +1 -0
  2203. package/build/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.js +46 -0
  2204. package/build/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.js.map +1 -0
  2205. package/build/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.js +44 -0
  2206. package/build/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.js.map +1 -0
  2207. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.js +148 -0
  2208. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.js.map +1 -0
  2209. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js +150 -0
  2210. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js.map +1 -0
  2211. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.js +26 -0
  2212. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.js.map +1 -0
  2213. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.js +42 -0
  2214. package/build/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.js.map +1 -0
  2215. package/build/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.js +116 -0
  2216. package/build/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.js.map +1 -0
  2217. package/build/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.js +52 -0
  2218. package/build/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.js.map +1 -0
  2219. package/build/ocm/components/clusterConfiguration/networkConfiguration/UserManagedNetworkingTextContent.js +20 -0
  2220. package/build/ocm/components/clusterConfiguration/networkConfiguration/UserManagedNetworkingTextContent.js.map +1 -0
  2221. package/build/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.js +67 -0
  2222. package/build/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.js.map +1 -0
  2223. package/build/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js +60 -0
  2224. package/build/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js.map +1 -0
  2225. package/build/ocm/components/clusterConfiguration/operators/CnvCheckbox.js +43 -0
  2226. package/build/ocm/components/clusterConfiguration/operators/CnvCheckbox.js.map +1 -0
  2227. package/build/ocm/components/clusterConfiguration/operators/CnvHostRequirements.js +51 -0
  2228. package/build/ocm/components/clusterConfiguration/operators/CnvHostRequirements.js.map +1 -0
  2229. package/build/ocm/components/clusterConfiguration/operators/LvmCheckbox.js +54 -0
  2230. package/build/ocm/components/clusterConfiguration/operators/LvmCheckbox.js.map +1 -0
  2231. package/build/ocm/components/clusterConfiguration/operators/LvmHostRequirements.js +30 -0
  2232. package/build/ocm/components/clusterConfiguration/operators/LvmHostRequirements.js.map +1 -0
  2233. package/build/ocm/components/clusterConfiguration/operators/OdfCheckbox.js +32 -0
  2234. package/build/ocm/components/clusterConfiguration/operators/OdfCheckbox.js.map +1 -0
  2235. package/build/ocm/components/clusterConfiguration/operators/utils.js +9 -0
  2236. package/build/ocm/components/clusterConfiguration/operators/utils.js.map +1 -0
  2237. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.js +34 -0
  2238. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.js.map +1 -0
  2239. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.js +16 -0
  2240. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.js.map +1 -0
  2241. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.js +19 -0
  2242. package/build/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.js.map +1 -0
  2243. package/build/ocm/components/clusterConfiguration/review/ReviewCluster.css +29 -0
  2244. package/build/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.js +76 -0
  2245. package/build/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.js.map +1 -0
  2246. package/build/ocm/components/clusterConfiguration/review/ReviewCustomManifestsTable.js +26 -0
  2247. package/build/ocm/components/clusterConfiguration/review/ReviewCustomManifestsTable.js.map +1 -0
  2248. package/build/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js +131 -0
  2249. package/build/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js.map +1 -0
  2250. package/build/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.js +25 -0
  2251. package/build/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.js.map +1 -0
  2252. package/build/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.js +76 -0
  2253. package/build/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.js.map +1 -0
  2254. package/build/ocm/components/clusterConfiguration/review/ReviewStep.js +58 -0
  2255. package/build/ocm/components/clusterConfiguration/review/ReviewStep.js.map +1 -0
  2256. package/build/ocm/components/clusterConfiguration/review/ReviewSummary.js +35 -0
  2257. package/build/ocm/components/clusterConfiguration/review/ReviewSummary.js.map +1 -0
  2258. package/build/ocm/components/clusterConfiguration/review/TableSummaryExpandable.js +9 -0
  2259. package/build/ocm/components/clusterConfiguration/review/TableSummaryExpandable.js.map +1 -0
  2260. package/build/ocm/components/clusterConfiguration/review/index.js +5 -0
  2261. package/build/ocm/components/clusterConfiguration/review/index.js.map +1 -0
  2262. package/build/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.js +145 -0
  2263. package/build/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.js.map +1 -0
  2264. package/build/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.js +20 -0
  2265. package/build/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.js.map +1 -0
  2266. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.js +39 -0
  2267. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.js.map +1 -0
  2268. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.js +40 -0
  2269. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.js.map +1 -0
  2270. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.js +36 -0
  2271. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.js.map +1 -0
  2272. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.js +40 -0
  2273. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.js.map +1 -0
  2274. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.js +103 -0
  2275. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.js.map +1 -0
  2276. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.js +78 -0
  2277. package/build/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.js.map +1 -0
  2278. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.js +82 -0
  2279. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.js.map +1 -0
  2280. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.js +118 -0
  2281. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.js.map +1 -0
  2282. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.js +61 -0
  2283. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.js.map +1 -0
  2284. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.js +43 -0
  2285. package/build/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.js.map +1 -0
  2286. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.js +28 -0
  2287. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.js.map +1 -0
  2288. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.js +26 -0
  2289. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.js.map +1 -0
  2290. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.js +57 -0
  2291. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.js.map +1 -0
  2292. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.js +47 -0
  2293. package/build/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.js.map +1 -0
  2294. package/build/ocm/components/clusterConfiguration/staticIp/components/propTypes.js +2 -0
  2295. package/build/ocm/components/clusterConfiguration/staticIp/components/propTypes.js.map +1 -0
  2296. package/build/ocm/components/clusterConfiguration/staticIp/components/staticIp.css +29 -0
  2297. package/build/ocm/components/clusterConfiguration/staticIp/data/dataTypes.js +11 -0
  2298. package/build/ocm/components/clusterConfiguration/staticIp/data/dataTypes.js.map +1 -0
  2299. package/build/ocm/components/clusterConfiguration/staticIp/data/dummyData.js +50 -0
  2300. package/build/ocm/components/clusterConfiguration/staticIp/data/dummyData.js.map +1 -0
  2301. package/build/ocm/components/clusterConfiguration/staticIp/data/emptyData.js +46 -0
  2302. package/build/ocm/components/clusterConfiguration/staticIp/data/emptyData.js.map +1 -0
  2303. package/build/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.js +134 -0
  2304. package/build/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.js.map +1 -0
  2305. package/build/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.js +125 -0
  2306. package/build/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.js.map +1 -0
  2307. package/build/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.js +71 -0
  2308. package/build/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.js.map +1 -0
  2309. package/build/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.js +4 -0
  2310. package/build/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.js.map +1 -0
  2311. package/build/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.js +12 -0
  2312. package/build/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.js.map +1 -0
  2313. package/build/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.js +83 -0
  2314. package/build/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.js.map +1 -0
  2315. package/build/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.js +32 -0
  2316. package/build/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.js.map +1 -0
  2317. package/build/ocm/components/clusterDetail/AssistedInstallerDetailCard.js +69 -0
  2318. package/build/ocm/components/clusterDetail/AssistedInstallerDetailCard.js.map +1 -0
  2319. package/build/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.js +26 -0
  2320. package/build/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.js.map +1 -0
  2321. package/build/ocm/components/clusterDetail/CancelInstallationModal.js +61 -0
  2322. package/build/ocm/components/clusterDetail/CancelInstallationModal.js.map +1 -0
  2323. package/build/ocm/components/clusterDetail/ClusterDetail.js +73 -0
  2324. package/build/ocm/components/clusterDetail/ClusterDetail.js.map +1 -0
  2325. package/build/ocm/components/clusterDetail/ClusterDetailStatusMessages.js +47 -0
  2326. package/build/ocm/components/clusterDetail/ClusterDetailStatusMessages.js.map +1 -0
  2327. package/build/ocm/components/clusterDetail/ClusterDetailStatusVarieties.js +66 -0
  2328. package/build/ocm/components/clusterDetail/ClusterDetailStatusVarieties.js.map +1 -0
  2329. package/build/ocm/components/clusterDetail/ClusterDetailsButtonGroup.js +33 -0
  2330. package/build/ocm/components/clusterDetail/ClusterDetailsButtonGroup.js.map +1 -0
  2331. package/build/ocm/components/clusterDetail/ClusterInstallationError.js +24 -0
  2332. package/build/ocm/components/clusterDetail/ClusterInstallationError.js.map +1 -0
  2333. package/build/ocm/components/clusterDetail/ClusterInstallationProgressCard.js +33 -0
  2334. package/build/ocm/components/clusterDetail/ClusterInstallationProgressCard.js.map +1 -0
  2335. package/build/ocm/components/clusterDetail/ClusterPollingErrorModal.js +11 -0
  2336. package/build/ocm/components/clusterDetail/ClusterPollingErrorModal.js.map +1 -0
  2337. package/build/ocm/components/clusterDetail/ClusterProperties.js +74 -0
  2338. package/build/ocm/components/clusterDetail/ClusterProperties.js.map +1 -0
  2339. package/build/ocm/components/clusterDetail/ClusterSummaryExpandable.css +4 -0
  2340. package/build/ocm/components/clusterDetail/ClusterSummaryExpandable.js +14 -0
  2341. package/build/ocm/components/clusterDetail/ClusterSummaryExpandable.js.map +1 -0
  2342. package/build/ocm/components/clusterDetail/ClusterUpdateErrorModal.js +7 -0
  2343. package/build/ocm/components/clusterDetail/ClusterUpdateErrorModal.js.map +1 -0
  2344. package/build/ocm/components/clusterDetail/HostInventoryExpandable.css +4 -0
  2345. package/build/ocm/components/clusterDetail/HostInventoryExpandable.js +20 -0
  2346. package/build/ocm/components/clusterDetail/HostInventoryExpandable.js.map +1 -0
  2347. package/build/ocm/components/clusterDetail/OpenShiftVersionDetail.js +34 -0
  2348. package/build/ocm/components/clusterDetail/OpenShiftVersionDetail.js.map +1 -0
  2349. package/build/ocm/components/clusterDetail/ProgressBarAlerts.js +100 -0
  2350. package/build/ocm/components/clusterDetail/ProgressBarAlerts.js.map +1 -0
  2351. package/build/ocm/components/clusterDetail/RebootNodeZeroModal.css +7 -0
  2352. package/build/ocm/components/clusterDetail/RebootNodeZeroModal.js +30 -0
  2353. package/build/ocm/components/clusterDetail/RebootNodeZeroModal.js.map +1 -0
  2354. package/build/ocm/components/clusterDetail/ResetClusterModal.js +88 -0
  2355. package/build/ocm/components/clusterDetail/ResetClusterModal.js.map +1 -0
  2356. package/build/ocm/components/clusterDetail/getProgressBarAlerts.js +42 -0
  2357. package/build/ocm/components/clusterDetail/getProgressBarAlerts.js.map +1 -0
  2358. package/build/ocm/components/clusterDetail/index.js +6 -0
  2359. package/build/ocm/components/clusterDetail/index.js.map +1 -0
  2360. package/build/ocm/components/clusterDetail/utils.js +81 -0
  2361. package/build/ocm/components/clusterDetail/utils.js.map +1 -0
  2362. package/build/ocm/components/clusterWizard/ClusterDetails.js +87 -0
  2363. package/build/ocm/components/clusterWizard/ClusterDetails.js.map +1 -0
  2364. package/build/ocm/components/clusterWizard/ClusterDetailsForm.js +89 -0
  2365. package/build/ocm/components/clusterWizard/ClusterDetailsForm.js.map +1 -0
  2366. package/build/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.js +31 -0
  2367. package/build/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.js.map +1 -0
  2368. package/build/ocm/components/clusterWizard/ClusterWizard.js +46 -0
  2369. package/build/ocm/components/clusterWizard/ClusterWizard.js.map +1 -0
  2370. package/build/ocm/components/clusterWizard/ClusterWizardContext.js +11 -0
  2371. package/build/ocm/components/clusterWizard/ClusterWizardContext.js.map +1 -0
  2372. package/build/ocm/components/clusterWizard/ClusterWizardContextProvider.js +148 -0
  2373. package/build/ocm/components/clusterWizard/ClusterWizardContextProvider.js.map +1 -0
  2374. package/build/ocm/components/clusterWizard/ClusterWizardFooter.js +49 -0
  2375. package/build/ocm/components/clusterWizard/ClusterWizardFooter.js.map +1 -0
  2376. package/build/ocm/components/clusterWizard/ClusterWizardNavigation.js +67 -0
  2377. package/build/ocm/components/clusterWizard/ClusterWizardNavigation.js.map +1 -0
  2378. package/build/ocm/components/clusterWizard/CustomManifestStep.js +38 -0
  2379. package/build/ocm/components/clusterWizard/CustomManifestStep.js.map +1 -0
  2380. package/build/ocm/components/clusterWizard/HostDiscovery.js +73 -0
  2381. package/build/ocm/components/clusterWizard/HostDiscovery.js.map +1 -0
  2382. package/build/ocm/components/clusterWizard/NewClusterWizard.js +9 -0
  2383. package/build/ocm/components/clusterWizard/NewClusterWizard.js.map +1 -0
  2384. package/build/ocm/components/clusterWizard/Operators.js +81 -0
  2385. package/build/ocm/components/clusterWizard/Operators.js.map +1 -0
  2386. package/build/ocm/components/clusterWizard/OperatorsStep.js +23 -0
  2387. package/build/ocm/components/clusterWizard/OperatorsStep.js.map +1 -0
  2388. package/build/ocm/components/clusterWizard/StaticIp.js +38 -0
  2389. package/build/ocm/components/clusterWizard/StaticIp.js.map +1 -0
  2390. package/build/ocm/components/clusterWizard/Storage.js +35 -0
  2391. package/build/ocm/components/clusterWizard/Storage.js.map +1 -0
  2392. package/build/ocm/components/clusterWizard/constants.js +25 -0
  2393. package/build/ocm/components/clusterWizard/constants.js.map +1 -0
  2394. package/build/ocm/components/clusterWizard/index.js +4 -0
  2395. package/build/ocm/components/clusterWizard/index.js.map +1 -0
  2396. package/build/ocm/components/clusterWizard/wizardTransition.js +184 -0
  2397. package/build/ocm/components/clusterWizard/wizardTransition.js.map +1 -0
  2398. package/build/ocm/components/clusters/ClusterBreadcrumbs.js +13 -0
  2399. package/build/ocm/components/clusters/ClusterBreadcrumbs.js.map +1 -0
  2400. package/build/ocm/components/clusters/ClusterLoading.js +7 -0
  2401. package/build/ocm/components/clusters/ClusterLoading.js.map +1 -0
  2402. package/build/ocm/components/clusters/ClusterPage.js +112 -0
  2403. package/build/ocm/components/clusters/ClusterPage.js.map +1 -0
  2404. package/build/ocm/components/clusters/ClusterPageErrors.js +8 -0
  2405. package/build/ocm/components/clusters/ClusterPageErrors.js.map +1 -0
  2406. package/build/ocm/components/clusters/ClusterStatus.js +53 -0
  2407. package/build/ocm/components/clusters/ClusterStatus.js.map +1 -0
  2408. package/build/ocm/components/clusters/ClusterToolbar.css +6 -0
  2409. package/build/ocm/components/clusters/ClusterToolbar.js +10 -0
  2410. package/build/ocm/components/clusters/ClusterToolbar.js.map +1 -0
  2411. package/build/ocm/components/clusters/Clusters.js +79 -0
  2412. package/build/ocm/components/clusters/Clusters.js.map +1 -0
  2413. package/build/ocm/components/clusters/ClustersListToolbar.js +66 -0
  2414. package/build/ocm/components/clusters/ClustersListToolbar.js.map +1 -0
  2415. package/build/ocm/components/clusters/ClustersTable.js +129 -0
  2416. package/build/ocm/components/clusters/ClustersTable.js.map +1 -0
  2417. package/build/ocm/components/clusters/DeleteClusterModal.js +11 -0
  2418. package/build/ocm/components/clusters/DeleteClusterModal.js.map +1 -0
  2419. package/build/ocm/components/clusters/NewClusterPage.js +29 -0
  2420. package/build/ocm/components/clusters/NewClusterPage.js.map +1 -0
  2421. package/build/ocm/components/clusters/clusterPolling.js +46 -0
  2422. package/build/ocm/components/clusters/clusterPolling.js.map +1 -0
  2423. package/build/ocm/components/clusters/index.js +6 -0
  2424. package/build/ocm/components/clusters/index.js.map +1 -0
  2425. package/build/ocm/components/clusters/utils.js +35 -0
  2426. package/build/ocm/components/clusters/utils.js.map +1 -0
  2427. package/build/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.js +111 -0
  2428. package/build/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.js.map +1 -0
  2429. package/build/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js +113 -0
  2430. package/build/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js.map +1 -0
  2431. package/build/ocm/components/featureSupportLevels/featureStateUtils.js +136 -0
  2432. package/build/ocm/components/featureSupportLevels/featureStateUtils.js.map +1 -0
  2433. package/build/ocm/components/featureSupportLevels/index.js +3 -0
  2434. package/build/ocm/components/featureSupportLevels/index.js.map +1 -0
  2435. package/build/ocm/components/fetching/fetchEvents.js +23 -0
  2436. package/build/ocm/components/fetching/fetchEvents.js.map +1 -0
  2437. package/build/ocm/components/hosts/AdditionaNTPSourceDialogToggle.js +8 -0
  2438. package/build/ocm/components/hosts/AdditionaNTPSourceDialogToggle.js.map +1 -0
  2439. package/build/ocm/components/hosts/ClusterHostsTable.js +50 -0
  2440. package/build/ocm/components/hosts/ClusterHostsTable.js.map +1 -0
  2441. package/build/ocm/components/hosts/DeleteHostModal.js +11 -0
  2442. package/build/ocm/components/hosts/DeleteHostModal.js.map +1 -0
  2443. package/build/ocm/components/hosts/HardwareStatus.js +37 -0
  2444. package/build/ocm/components/hosts/HardwareStatus.js.map +1 -0
  2445. package/build/ocm/components/hosts/HostRequirementsContent.js +49 -0
  2446. package/build/ocm/components/hosts/HostRequirementsContent.js.map +1 -0
  2447. package/build/ocm/components/hosts/HostsDiscoveryTable.js +59 -0
  2448. package/build/ocm/components/hosts/HostsDiscoveryTable.js.map +1 -0
  2449. package/build/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.js +10 -0
  2450. package/build/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.js.map +1 -0
  2451. package/build/ocm/components/hosts/HostsStorageTable.js +59 -0
  2452. package/build/ocm/components/hosts/HostsStorageTable.js.map +1 -0
  2453. package/build/ocm/components/hosts/HostsTableEmptyState.js +12 -0
  2454. package/build/ocm/components/hosts/HostsTableEmptyState.js.map +1 -0
  2455. package/build/ocm/components/hosts/ModalDialogsContext.js +46 -0
  2456. package/build/ocm/components/hosts/ModalDialogsContext.js.map +1 -0
  2457. package/build/ocm/components/hosts/NetworkingStatus.js +15 -0
  2458. package/build/ocm/components/hosts/NetworkingStatus.js.map +1 -0
  2459. package/build/ocm/components/hosts/OdfDisksManualFormattingHint.js +10 -0
  2460. package/build/ocm/components/hosts/OdfDisksManualFormattingHint.js.map +1 -0
  2461. package/build/ocm/components/hosts/ResetHostModal.js +11 -0
  2462. package/build/ocm/components/hosts/ResetHostModal.js.map +1 -0
  2463. package/build/ocm/components/hosts/StorageAlerts.js +17 -0
  2464. package/build/ocm/components/hosts/StorageAlerts.js.map +1 -0
  2465. package/build/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.js +13 -0
  2466. package/build/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.js.map +1 -0
  2467. package/build/ocm/components/hosts/UpdateDay2ApiVipForm.js +57 -0
  2468. package/build/ocm/components/hosts/UpdateDay2ApiVipForm.js.map +1 -0
  2469. package/build/ocm/components/hosts/UpdateDay2ApiVipModal.js +21 -0
  2470. package/build/ocm/components/hosts/UpdateDay2ApiVipModal.js.map +1 -0
  2471. package/build/ocm/components/hosts/VMRebootConfigurationLinkWithModal.js +12 -0
  2472. package/build/ocm/components/hosts/VMRebootConfigurationLinkWithModal.js.map +1 -0
  2473. package/build/ocm/components/hosts/use-hosts-table.js +350 -0
  2474. package/build/ocm/components/hosts/use-hosts-table.js.map +1 -0
  2475. package/build/ocm/components/hosts/utils.js +60 -0
  2476. package/build/ocm/components/hosts/utils.js.map +1 -0
  2477. package/build/ocm/components/index.js +9 -0
  2478. package/build/ocm/components/index.js.map +1 -0
  2479. package/build/ocm/components/newFeatureSupportLevels/NewFeatureSupportLevelProvider.js +75 -0
  2480. package/build/ocm/components/newFeatureSupportLevels/NewFeatureSupportLevelProvider.js.map +1 -0
  2481. package/build/ocm/components/newFeatureSupportLevels/ReviewClusterNewFeatureSupportLevels.js +113 -0
  2482. package/build/ocm/components/newFeatureSupportLevels/ReviewClusterNewFeatureSupportLevels.js.map +1 -0
  2483. package/build/ocm/components/newFeatureSupportLevels/index.js +3 -0
  2484. package/build/ocm/components/newFeatureSupportLevels/index.js.map +1 -0
  2485. package/build/ocm/components/newFeatureSupportLevels/newFeatureStateUtils.js +129 -0
  2486. package/build/ocm/components/newFeatureSupportLevels/newFeatureStateUtils.js.map +1 -0
  2487. package/build/ocm/components/ui/AssistedUILibVersion.js +6 -0
  2488. package/build/ocm/components/ui/AssistedUILibVersion.js.map +1 -0
  2489. package/build/ocm/components/ui/Buttons/BackButton.js +5 -0
  2490. package/build/ocm/components/ui/Buttons/BackButton.js.map +1 -0
  2491. package/build/ocm/components/ui/InfoLinkWithModal.js +20 -0
  2492. package/build/ocm/components/ui/InfoLinkWithModal.js.map +1 -0
  2493. package/build/ocm/components/ui/OcmFormFields.js +33 -0
  2494. package/build/ocm/components/ui/OcmFormFields.js.map +1 -0
  2495. package/build/ocm/components/ui/RedirectToCluster.js +9 -0
  2496. package/build/ocm/components/ui/RedirectToCluster.js.map +1 -0
  2497. package/build/ocm/components/ui/index.js +2 -0
  2498. package/build/ocm/components/ui/index.js.map +1 -0
  2499. package/build/ocm/config/constants.js +20 -0
  2500. package/build/ocm/config/constants.js.map +1 -0
  2501. package/build/ocm/config/index.js +3 -0
  2502. package/build/ocm/config/index.js.map +1 -0
  2503. package/build/ocm/config/routeBaseBath.js +5 -0
  2504. package/build/ocm/config/routeBaseBath.js.map +1 -0
  2505. package/build/ocm/hooks/index.js +8 -0
  2506. package/build/ocm/hooks/index.js.map +1 -0
  2507. package/build/ocm/hooks/useClusterCustomManifests.js +92 -0
  2508. package/build/ocm/hooks/useClusterCustomManifests.js.map +1 -0
  2509. package/build/ocm/hooks/useClusterPreflightRequirements.js +43 -0
  2510. package/build/ocm/hooks/useClusterPreflightRequirements.js.map +1 -0
  2511. package/build/ocm/hooks/useClusterSupportedPlatforms.js +49 -0
  2512. package/build/ocm/hooks/useClusterSupportedPlatforms.js.map +1 -0
  2513. package/build/ocm/hooks/useInfraEnv.js +54 -0
  2514. package/build/ocm/hooks/useInfraEnv.js.map +1 -0
  2515. package/build/ocm/hooks/useInfraEnvId.js +35 -0
  2516. package/build/ocm/hooks/useInfraEnvId.js.map +1 -0
  2517. package/build/ocm/hooks/useInfraEnvImageUrl.js +33 -0
  2518. package/build/ocm/hooks/useInfraEnvImageUrl.js.map +1 -0
  2519. package/build/ocm/hooks/useInfraEnvIpxeImageUrl.js +35 -0
  2520. package/build/ocm/hooks/useInfraEnvIpxeImageUrl.js.map +1 -0
  2521. package/build/ocm/hooks/useManagedDomains.js +34 -0
  2522. package/build/ocm/hooks/useManagedDomains.js.map +1 -0
  2523. package/build/ocm/hooks/useOpenshiftVersions.js +86 -0
  2524. package/build/ocm/hooks/useOpenshiftVersions.js.map +1 -0
  2525. package/build/ocm/hooks/usePullSecret.js +42 -0
  2526. package/build/ocm/hooks/usePullSecret.js.map +1 -0
  2527. package/build/ocm/hooks/useSetClusterPermissions.js +18 -0
  2528. package/build/ocm/hooks/useSetClusterPermissions.js.map +1 -0
  2529. package/build/ocm/hooks/useSupportLevelsAPI.js +67 -0
  2530. package/build/ocm/hooks/useSupportLevelsAPI.js.map +1 -0
  2531. package/build/ocm/hooks/useUsedClusterNames.js +39 -0
  2532. package/build/ocm/hooks/useUsedClusterNames.js.map +1 -0
  2533. package/build/ocm/index.js +14 -0
  2534. package/build/ocm/index.js.map +1 -0
  2535. package/build/ocm/reducers/clusters/clustersSlice.js +44 -0
  2536. package/build/ocm/reducers/clusters/clustersSlice.js.map +1 -0
  2537. package/build/ocm/reducers/clusters/currentClusterSlice.js +89 -0
  2538. package/build/ocm/reducers/clusters/currentClusterSlice.js.map +1 -0
  2539. package/build/ocm/reducers/clusters/index.js +3 -0
  2540. package/build/ocm/reducers/clusters/index.js.map +1 -0
  2541. package/build/ocm/selectors/clusters.js +67 -0
  2542. package/build/ocm/selectors/clusters.js.map +1 -0
  2543. package/build/ocm/selectors/currentCluster.js +12 -0
  2544. package/build/ocm/selectors/currentCluster.js.map +1 -0
  2545. package/build/ocm/selectors/index.js +3 -0
  2546. package/build/ocm/selectors/index.js.map +1 -0
  2547. package/build/ocm/sentry.js +16 -0
  2548. package/build/ocm/sentry.js.map +1 -0
  2549. package/build/ocm/services/ClusterDetailsService.js +71 -0
  2550. package/build/ocm/services/ClusterDetailsService.js.map +1 -0
  2551. package/build/ocm/services/ClustersService.js +131 -0
  2552. package/build/ocm/services/ClustersService.js.map +1 -0
  2553. package/build/ocm/services/CpuArchitectureService.js +46 -0
  2554. package/build/ocm/services/CpuArchitectureService.js.map +1 -0
  2555. package/build/ocm/services/Day2ClusterService.js +119 -0
  2556. package/build/ocm/services/Day2ClusterService.js.map +1 -0
  2557. package/build/ocm/services/DiscoveryImageFormService.js +43 -0
  2558. package/build/ocm/services/DiscoveryImageFormService.js.map +1 -0
  2559. package/build/ocm/services/DiskEncryptionService.js +29 -0
  2560. package/build/ocm/services/DiskEncryptionService.js.map +1 -0
  2561. package/build/ocm/services/HostDiscoveryService.js +20 -0
  2562. package/build/ocm/services/HostDiscoveryService.js.map +1 -0
  2563. package/build/ocm/services/HostsService.js +73 -0
  2564. package/build/ocm/services/HostsService.js.map +1 -0
  2565. package/build/ocm/services/InfraEnvIdsCacheService.js +87 -0
  2566. package/build/ocm/services/InfraEnvIdsCacheService.js.map +1 -0
  2567. package/build/ocm/services/InfraEnvsService.js +118 -0
  2568. package/build/ocm/services/InfraEnvsService.js.map +1 -0
  2569. package/build/ocm/services/OperatorsService.js +45 -0
  2570. package/build/ocm/services/OperatorsService.js.map +1 -0
  2571. package/build/ocm/services/apis/ClustersAPI.js +136 -0
  2572. package/build/ocm/services/apis/ClustersAPI.js.map +1 -0
  2573. package/build/ocm/services/apis/ComponentVersionsAPI.js +11 -0
  2574. package/build/ocm/services/apis/ComponentVersionsAPI.js.map +1 -0
  2575. package/build/ocm/services/apis/EventsAPI.js +25 -0
  2576. package/build/ocm/services/apis/EventsAPI.js.map +1 -0
  2577. package/build/ocm/services/apis/FeatureSupportLevelsAPI.js +11 -0
  2578. package/build/ocm/services/apis/FeatureSupportLevelsAPI.js.map +1 -0
  2579. package/build/ocm/services/apis/HostsAPI.js +44 -0
  2580. package/build/ocm/services/apis/HostsAPI.js.map +1 -0
  2581. package/build/ocm/services/apis/InfraEnvsAPI.js +48 -0
  2582. package/build/ocm/services/apis/InfraEnvsAPI.js.map +1 -0
  2583. package/build/ocm/services/apis/ManagedDomainsAPI.js +11 -0
  2584. package/build/ocm/services/apis/ManagedDomainsAPI.js.map +1 -0
  2585. package/build/ocm/services/apis/NewFeatureSupportLevelsAPI.js +19 -0
  2586. package/build/ocm/services/apis/NewFeatureSupportLevelsAPI.js.map +1 -0
  2587. package/build/ocm/services/apis/SupportedOpenshiftVersionsAPI.js +11 -0
  2588. package/build/ocm/services/apis/SupportedOpenshiftVersionsAPI.js.map +1 -0
  2589. package/build/ocm/services/apis/index.js +9 -0
  2590. package/build/ocm/services/apis/index.js.map +1 -0
  2591. package/build/ocm/services/apis/types.js +2 -0
  2592. package/build/ocm/services/apis/types.js.map +1 -0
  2593. package/build/ocm/services/index.js +11 -0
  2594. package/build/ocm/services/index.js.map +1 -0
  2595. package/build/ocm/services/types.js +6 -0
  2596. package/build/ocm/services/types.js.map +1 -0
  2597. package/build/ocm/store/hooks.js +4 -0
  2598. package/build/ocm/store/hooks.js.map +1 -0
  2599. package/build/ocm/store/index.js +18 -0
  2600. package/build/ocm/store/index.js.map +1 -0
  2601. package/build/ocm/store/slices/infraEnvs/selectors.js +4 -0
  2602. package/build/ocm/store/slices/infraEnvs/selectors.js.map +1 -0
  2603. package/build/ocm/store/slices/infraEnvs/slice.js +12 -0
  2604. package/build/ocm/store/slices/infraEnvs/slice.js.map +1 -0
  2605. package/build/ocm/store/slices/infraEnvs/thunks.js +57 -0
  2606. package/build/ocm/store/slices/infraEnvs/thunks.js.map +1 -0
  2607. package/build/ocm/types.js +2 -0
  2608. package/build/ocm/types.js.map +1 -0
  2609. package/lib/@types/assets.d.ts +5 -0
  2610. package/lib/@types/i18next.d.ts +13 -0
  2611. package/lib/cim/components/Agent/AgentStatus.tsx +101 -0
  2612. package/lib/cim/components/Agent/AgentTable.tsx +84 -0
  2613. package/lib/cim/components/Agent/AgentsSelectionHostCountAlerts.tsx +60 -0
  2614. package/lib/cim/components/Agent/AgentsSelectionHostCountLabelIcon.tsx +15 -0
  2615. package/lib/cim/components/Agent/AgentsSelectionTable.tsx +148 -0
  2616. package/lib/cim/components/Agent/AgentsSelectionUtils.ts +37 -0
  2617. package/lib/cim/components/Agent/BMCForm.tsx +337 -0
  2618. package/lib/cim/components/Agent/BMHStatus.tsx +27 -0
  2619. package/lib/cim/components/Agent/MinimalHWRequirements.tsx +117 -0
  2620. package/lib/cim/components/Agent/NoAgentsAlert.tsx +38 -0
  2621. package/lib/cim/components/Agent/tableUtils.tsx +576 -0
  2622. package/lib/cim/components/Agent/types.ts +37 -0
  2623. package/lib/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.tsx +61 -0
  2624. package/lib/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.tsx +14 -0
  2625. package/lib/cim/components/ClusterDeployment/ArmCheckbox.tsx +101 -0
  2626. package/lib/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.tsx +79 -0
  2627. package/lib/cim/components/ClusterDeployment/ClusterDeploymentCredentials.tsx +69 -0
  2628. package/lib/cim/components/ClusterDeployment/ClusterDeploymentDetails.tsx +179 -0
  2629. package/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx +54 -0
  2630. package/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.tsx +178 -0
  2631. package/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.tsx +72 -0
  2632. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx +184 -0
  2633. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.tsx +344 -0
  2634. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx +157 -0
  2635. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.tsx +151 -0
  2636. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.tsx +144 -0
  2637. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.tsx +102 -0
  2638. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.tsx +107 -0
  2639. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.tsx +79 -0
  2640. package/lib/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.tsx +53 -0
  2641. package/lib/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.tsx +185 -0
  2642. package/lib/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.tsx +213 -0
  2643. package/lib/cim/components/ClusterDeployment/ClusterDeploymentProgress.tsx +46 -0
  2644. package/lib/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.tsx +175 -0
  2645. package/lib/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.tsx +107 -0
  2646. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx +179 -0
  2647. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.tsx +20 -0
  2648. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.tsx +128 -0
  2649. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.tsx +76 -0
  2650. package/lib/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.tsx +13 -0
  2651. package/lib/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx +140 -0
  2652. package/lib/cim/components/ClusterDeployment/ClusterInstallationError.tsx +54 -0
  2653. package/lib/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.tsx +49 -0
  2654. package/lib/cim/components/ClusterDeployment/LabelSelector.css +9 -0
  2655. package/lib/cim/components/ClusterDeployment/LabelsSelector.tsx +153 -0
  2656. package/lib/cim/components/ClusterDeployment/LocationsSelector.tsx +76 -0
  2657. package/lib/cim/components/ClusterDeployment/LogsDownloadButton.tsx +32 -0
  2658. package/lib/cim/components/ClusterDeployment/NetworkConfiguration.tsx +163 -0
  2659. package/lib/cim/components/ClusterDeployment/ScaleUpForm.tsx +71 -0
  2660. package/lib/cim/components/ClusterDeployment/ShortCapacitySummary.tsx +39 -0
  2661. package/lib/cim/components/ClusterDeployment/constants.ts +24 -0
  2662. package/lib/cim/components/ClusterDeployment/helpers.ts +179 -0
  2663. package/lib/cim/components/ClusterDeployment/index.ts +20 -0
  2664. package/lib/cim/components/ClusterDeployment/networkConfigurationValidation.ts +82 -0
  2665. package/lib/cim/components/ClusterDeployment/types.ts +235 -0
  2666. package/lib/cim/components/ClusterDeployment/use-networking-formik.ts +148 -0
  2667. package/lib/cim/components/ClusterDeployment/validationSchemas.ts +19 -0
  2668. package/lib/cim/components/ClusterDeployment/wizardTransition.ts +142 -0
  2669. package/lib/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.css +7 -0
  2670. package/lib/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.tsx +50 -0
  2671. package/lib/cim/components/Hypershift/DetailsPage/ConditionsTable.css +3 -0
  2672. package/lib/cim/components/Hypershift/DetailsPage/ConditionsTable.tsx +89 -0
  2673. package/lib/cim/components/Hypershift/DetailsPage/HostedClusterProgress.tsx +85 -0
  2674. package/lib/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.tsx +51 -0
  2675. package/lib/cim/components/Hypershift/DetailsPage/NodePoolStatus.tsx +72 -0
  2676. package/lib/cim/components/Hypershift/DetailsPage/NodePoolsProgress.tsx +118 -0
  2677. package/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.css +3 -0
  2678. package/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx +276 -0
  2679. package/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.tsx +47 -0
  2680. package/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.tsx +79 -0
  2681. package/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.ts +38 -0
  2682. package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx +111 -0
  2683. package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.tsx +104 -0
  2684. package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.css +15 -0
  2685. package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.tsx +146 -0
  2686. package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.ts +36 -0
  2687. package/lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.css +7 -0
  2688. package/lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.tsx +104 -0
  2689. package/lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.tsx +56 -0
  2690. package/lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.ts +25 -0
  2691. package/lib/cim/components/Hypershift/forms/NodePoolAgentsForm.tsx +55 -0
  2692. package/lib/cim/components/Hypershift/hooks/useSupportedOCPVersions.ts +29 -0
  2693. package/lib/cim/components/Hypershift/hooks/useTemptiflySync.ts +19 -0
  2694. package/lib/cim/components/Hypershift/index.ts +5 -0
  2695. package/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx +131 -0
  2696. package/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx +132 -0
  2697. package/lib/cim/components/Hypershift/modals/NodePoolForm.tsx +113 -0
  2698. package/lib/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx +83 -0
  2699. package/lib/cim/components/Hypershift/types.ts +190 -0
  2700. package/lib/cim/components/Hypershift/utils/labels.ts +11 -0
  2701. package/lib/cim/components/Hypershift/utils/nodepool.ts +31 -0
  2702. package/lib/cim/components/Hypershift/utils/status.tsx +75 -0
  2703. package/lib/cim/components/InfraEnv/AddHostDropdown.css +4 -0
  2704. package/lib/cim/components/InfraEnv/AddHostDropdown.tsx +163 -0
  2705. package/lib/cim/components/InfraEnv/AgentAlerts.tsx +46 -0
  2706. package/lib/cim/components/InfraEnv/EnvironmentDetails.tsx +269 -0
  2707. package/lib/cim/components/InfraEnv/EnvironmentErrors.tsx +56 -0
  2708. package/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx +280 -0
  2709. package/lib/cim/components/InfraEnv/InfraEnvFormPage.tsx +358 -0
  2710. package/lib/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.tsx +61 -0
  2711. package/lib/cim/components/InfraEnv/InfraTableToolbar.tsx +159 -0
  2712. package/lib/cim/components/InfraEnv/index.ts +9 -0
  2713. package/lib/cim/components/InfraEnv/infra-env.css +7 -0
  2714. package/lib/cim/components/InfraEnv/types.ts +13 -0
  2715. package/lib/cim/components/InfraEnv/utils.ts +146 -0
  2716. package/lib/cim/components/YamlPreview/YamlPreview.tsx +101 -0
  2717. package/lib/cim/components/YamlPreview/useYAMLPreview.ts +106 -0
  2718. package/lib/cim/components/common/InfoAndTroubleshootingNotification.tsx +56 -0
  2719. package/lib/cim/components/common/ResourceAlerts.css +9 -0
  2720. package/lib/cim/components/common/ResourceAlerts.tsx +51 -0
  2721. package/lib/cim/components/common/SpecSyncErrAlert.tsx +15 -0
  2722. package/lib/cim/components/common/ValidationsRunningAlert.tsx +18 -0
  2723. package/lib/cim/components/common/constants.ts +21 -0
  2724. package/lib/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.tsx +138 -0
  2725. package/lib/cim/components/featureSupportLevels/featureStateUtils.tsx +61 -0
  2726. package/lib/cim/components/helpers/agentClusterInstall.ts +26 -0
  2727. package/lib/cim/components/helpers/agentStatus.tsx +62 -0
  2728. package/lib/cim/components/helpers/agents.ts +36 -0
  2729. package/lib/cim/components/helpers/clusterDeployment.ts +238 -0
  2730. package/lib/cim/components/helpers/conditions.ts +33 -0
  2731. package/lib/cim/components/helpers/labels.ts +19 -0
  2732. package/lib/cim/components/helpers/network.ts +41 -0
  2733. package/lib/cim/components/helpers/proxy.ts +6 -0
  2734. package/lib/cim/components/helpers/status.ts +204 -0
  2735. package/lib/cim/components/helpers/storage.ts +14 -0
  2736. package/lib/cim/components/helpers/toAssisted.ts +170 -0
  2737. package/lib/cim/components/helpers/units.ts +461 -0
  2738. package/lib/cim/components/helpers/versions.ts +82 -0
  2739. package/lib/cim/components/modals/AddBmcHostModal.tsx +41 -0
  2740. package/lib/cim/components/modals/AddBmcHostYamlForm.css +5 -0
  2741. package/lib/cim/components/modals/AddBmcHostYamlForm.tsx +233 -0
  2742. package/lib/cim/components/modals/AddBmcHostYamlModal.tsx +32 -0
  2743. package/lib/cim/components/modals/AddHostModal.tsx +152 -0
  2744. package/lib/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.tsx +27 -0
  2745. package/lib/cim/components/modals/CimConfiguration/CimConfigProgressAlert.tsx +118 -0
  2746. package/lib/cim/components/modals/CimConfiguration/CimConfigurationForm.css +23 -0
  2747. package/lib/cim/components/modals/CimConfiguration/CimConfigurationForm.tsx +252 -0
  2748. package/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.css +3 -0
  2749. package/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx +241 -0
  2750. package/lib/cim/components/modals/CimConfiguration/CimIsMissingAlert.tsx +15 -0
  2751. package/lib/cim/components/modals/CimConfiguration/CimStorageMissingAlert.tsx +46 -0
  2752. package/lib/cim/components/modals/CimConfiguration/constants.ts +5 -0
  2753. package/lib/cim/components/modals/CimConfiguration/persist.ts +448 -0
  2754. package/lib/cim/components/modals/CimConfiguration/types.ts +54 -0
  2755. package/lib/cim/components/modals/CimConfiguration/utils.ts +64 -0
  2756. package/lib/cim/components/modals/EditAgentModal.tsx +18 -0
  2757. package/lib/cim/components/modals/EditBMHModal.tsx +81 -0
  2758. package/lib/cim/components/modals/EditNtpSourcesModal.tsx +132 -0
  2759. package/lib/cim/components/modals/EditProxyModal.tsx +117 -0
  2760. package/lib/cim/components/modals/EditPullSecretModal.tsx +155 -0
  2761. package/lib/cim/components/modals/EditSSHKeyModal.tsx +109 -0
  2762. package/lib/cim/components/modals/MassApproveAction.tsx +27 -0
  2763. package/lib/cim/components/modals/MassApproveAgentModal.tsx +175 -0
  2764. package/lib/cim/components/modals/MassDeleteAgentModal.tsx +178 -0
  2765. package/lib/cim/components/modals/ScaleUpModal.tsx +186 -0
  2766. package/lib/cim/components/modals/constants.ts +69 -0
  2767. package/lib/cim/components/modals/index.ts +11 -0
  2768. package/lib/cim/components/modals/types.ts +73 -0
  2769. package/lib/cim/components/modals/utils.ts +82 -0
  2770. package/lib/cim/config/constants.ts +284 -0
  2771. package/lib/cim/index.ts +17 -0
  2772. package/lib/cim/types/fromOCP/k8sTypes.ts +45 -0
  2773. package/lib/cim/types/k8s/agent-cluster-install.ts +84 -0
  2774. package/lib/cim/types/k8s/agent-service-config.ts +25 -0
  2775. package/lib/cim/types/k8s/agent.ts +68 -0
  2776. package/lib/cim/types/k8s/bare-metal-host.ts +32 -0
  2777. package/lib/cim/types/k8s/cluster-deployment.ts +66 -0
  2778. package/lib/cim/types/k8s/cluster-image-set.ts +5 -0
  2779. package/lib/cim/types/k8s/cluster-version.ts +48 -0
  2780. package/lib/cim/types/k8s/infra-env-k8s-resource.ts +40 -0
  2781. package/lib/cim/types/k8s/infrastructure.ts +23 -0
  2782. package/lib/cim/types/k8s/nm-state.ts +12 -0
  2783. package/lib/cim/types/k8s/shared.ts +14 -0
  2784. package/lib/cim/types/k8s/storage-class.ts +9 -0
  2785. package/lib/cim/types/metal3.ts +92 -0
  2786. package/lib/cim/types/resources.ts +50 -0
  2787. package/lib/cim/utils.ts +8 -0
  2788. package/lib/common/api/swagger.yaml +7105 -0
  2789. package/lib/common/api/types.ts +2553 -0
  2790. package/lib/common/api/utils.ts +22 -0
  2791. package/lib/common/components/AddHosts/AddHostsContext.tsx +23 -0
  2792. package/lib/common/components/AlertsContextProvider.tsx +39 -0
  2793. package/lib/common/components/ErrorHandling/ErrorMonitorContext.tsx +32 -0
  2794. package/lib/common/components/ErrorHandling/WithErrorBoundary.tsx +47 -0
  2795. package/lib/common/components/clusterConfiguration/AdvancedNetworkFields.tsx +63 -0
  2796. package/lib/common/components/clusterConfiguration/CertificateFields.css +3 -0
  2797. package/lib/common/components/clusterConfiguration/CertificateFields.tsx +80 -0
  2798. package/lib/common/components/clusterConfiguration/DiscoveryImageConfigForm.tsx +158 -0
  2799. package/lib/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.tsx +58 -0
  2800. package/lib/common/components/clusterConfiguration/DiscoveryInstructions.tsx +49 -0
  2801. package/lib/common/components/clusterConfiguration/DiscoveryIpxeInstructions.tsx +26 -0
  2802. package/lib/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.tsx +244 -0
  2803. package/lib/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.tsx +137 -0
  2804. package/lib/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.tsx +109 -0
  2805. package/lib/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.ts +13 -0
  2806. package/lib/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.tsx +55 -0
  2807. package/lib/common/components/clusterConfiguration/DownloadIpxeScript.tsx +100 -0
  2808. package/lib/common/components/clusterConfiguration/DownloadIso.tsx +116 -0
  2809. package/lib/common/components/clusterConfiguration/DownloadIsoModal.tsx +27 -0
  2810. package/lib/common/components/clusterConfiguration/FormatDiskWarning.tsx +33 -0
  2811. package/lib/common/components/clusterConfiguration/OpenShiftVersionSelect.tsx +82 -0
  2812. package/lib/common/components/clusterConfiguration/ProxyFields.css +3 -0
  2813. package/lib/common/components/clusterConfiguration/ProxyFields.tsx +130 -0
  2814. package/lib/common/components/clusterConfiguration/SNOControlGroup.tsx +41 -0
  2815. package/lib/common/components/clusterConfiguration/SNODisclaimer.tsx +79 -0
  2816. package/lib/common/components/clusterConfiguration/SecurityFields.tsx +91 -0
  2817. package/lib/common/components/clusterConfiguration/UploadSSH.tsx +44 -0
  2818. package/lib/common/components/clusterConfiguration/index.ts +14 -0
  2819. package/lib/common/components/clusterConfiguration/utils.ts +280 -0
  2820. package/lib/common/components/clusterDetail/ClusterCredentials.tsx +109 -0
  2821. package/lib/common/components/clusterDetail/ClusterProgress.css +3 -0
  2822. package/lib/common/components/clusterDetail/ClusterProgress.tsx +105 -0
  2823. package/lib/common/components/clusterDetail/ClusterProgressItem.tsx +22 -0
  2824. package/lib/common/components/clusterDetail/ClusterProgressItems.tsx +65 -0
  2825. package/lib/common/components/clusterDetail/ClusterPropertiesList.tsx +52 -0
  2826. package/lib/common/components/clusterDetail/ConsoleModal.tsx +191 -0
  2827. package/lib/common/components/clusterDetail/FinalizingProgress.tsx +118 -0
  2828. package/lib/common/components/clusterDetail/KubeconfigDownload.tsx +84 -0
  2829. package/lib/common/components/clusterDetail/OperatorsProgressItem.css +4 -0
  2830. package/lib/common/components/clusterDetail/OperatorsProgressItem.tsx +135 -0
  2831. package/lib/common/components/clusterDetail/ProgressBarTexts.tsx +86 -0
  2832. package/lib/common/components/clusterWizard/ClusterWizardStep.css +31 -0
  2833. package/lib/common/components/clusterWizard/ClusterWizardStep.tsx +29 -0
  2834. package/lib/common/components/clusterWizard/ClusterWizardStepHeader.tsx +10 -0
  2835. package/lib/common/components/clusterWizard/ClusterWizardStepValidationsAlert.tsx +123 -0
  2836. package/lib/common/components/clusterWizard/ReviewHostsInventory.tsx +60 -0
  2837. package/lib/common/components/clusterWizard/ReviewValidations.tsx +217 -0
  2838. package/lib/common/components/clusterWizard/clusterDetailsValidation.ts +155 -0
  2839. package/lib/common/components/clusterWizard/index.ts +9 -0
  2840. package/lib/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.tsx +126 -0
  2841. package/lib/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.tsx +54 -0
  2842. package/lib/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.tsx +74 -0
  2843. package/lib/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.tsx +39 -0
  2844. package/lib/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.tsx +171 -0
  2845. package/lib/common/components/clusterWizard/types.ts +61 -0
  2846. package/lib/common/components/clusterWizard/validationsInfoUtils.ts +289 -0
  2847. package/lib/common/components/clusters/PullSecret.tsx +49 -0
  2848. package/lib/common/components/constants.ts +7 -0
  2849. package/lib/common/components/featureSupportLevels/FeatureSupportLevelBadge.tsx +36 -0
  2850. package/lib/common/components/featureSupportLevels/FeatureSupportLevelContext.tsx +49 -0
  2851. package/lib/common/components/fetching/EventListFetch.tsx +159 -0
  2852. package/lib/common/components/hosts/AITable.tsx +353 -0
  2853. package/lib/common/components/hosts/AdditionalNTPSourcesDialog.tsx +138 -0
  2854. package/lib/common/components/hosts/DiskLimitations.tsx +68 -0
  2855. package/lib/common/components/hosts/DiskRole.tsx +122 -0
  2856. package/lib/common/components/hosts/EditHostForm.tsx +155 -0
  2857. package/lib/common/components/hosts/EditHostModal.tsx +47 -0
  2858. package/lib/common/components/hosts/FormatDiskCheckbox.tsx +109 -0
  2859. package/lib/common/components/hosts/HostProgress.tsx +48 -0
  2860. package/lib/common/components/hosts/HostPropertyValidationPopover.tsx +85 -0
  2861. package/lib/common/components/hosts/HostRequirements.tsx +92 -0
  2862. package/lib/common/components/hosts/HostRowDetail.tsx +224 -0
  2863. package/lib/common/components/hosts/HostStatus.tsx +279 -0
  2864. package/lib/common/components/hosts/HostToolbarActions.tsx +18 -0
  2865. package/lib/common/components/hosts/HostValidationGroups.css +4 -0
  2866. package/lib/common/components/hosts/HostValidationGroups.tsx +303 -0
  2867. package/lib/common/components/hosts/Hostname.tsx +95 -0
  2868. package/lib/common/components/hosts/HostsCount.tsx +53 -0
  2869. package/lib/common/components/hosts/HostsTable.css +15 -0
  2870. package/lib/common/components/hosts/HostsTable.tsx +79 -0
  2871. package/lib/common/components/hosts/HostsTableDetailContext.tsx +44 -0
  2872. package/lib/common/components/hosts/MassChangeHostnameModal.css +16 -0
  2873. package/lib/common/components/hosts/MassChangeHostnameModal.tsx +344 -0
  2874. package/lib/common/components/hosts/MassDeleteHostModal.tsx +98 -0
  2875. package/lib/common/components/hosts/NtpValidationStatus.tsx +46 -0
  2876. package/lib/common/components/hosts/OcpConsoleNodesSectionLink.tsx +28 -0
  2877. package/lib/common/components/hosts/RoleCell.tsx +21 -0
  2878. package/lib/common/components/hosts/RoleDropdown.tsx +40 -0
  2879. package/lib/common/components/hosts/TableToolbar.css +11 -0
  2880. package/lib/common/components/hosts/TableToolbar.tsx +144 -0
  2881. package/lib/common/components/hosts/VMRebootConfigurationInfo.tsx +63 -0
  2882. package/lib/common/components/hosts/hardwareInfo.ts +82 -0
  2883. package/lib/common/components/hosts/index.ts +17 -0
  2884. package/lib/common/components/hosts/status.tsx +266 -0
  2885. package/lib/common/components/hosts/tableUtils.tsx +506 -0
  2886. package/lib/common/components/hosts/types.ts +89 -0
  2887. package/lib/common/components/hosts/usePagination.ts +42 -0
  2888. package/lib/common/components/hosts/utils.ts +240 -0
  2889. package/lib/common/components/newFeatureSupportLevels/FeatureSupportLevelBadge.tsx +34 -0
  2890. package/lib/common/components/newFeatureSupportLevels/FeatureSupportLevelContext.tsx +44 -0
  2891. package/lib/common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge.tsx +26 -0
  2892. package/lib/common/components/newFeatureSupportLevels/NewFeatureSupportLevelContext.tsx +54 -0
  2893. package/lib/common/components/newFeatureSupportLevels/index.ts +1 -0
  2894. package/lib/common/components/newFeatureSupportLevels/utils.ts +53 -0
  2895. package/lib/common/components/storage/DisksTable.tsx +136 -0
  2896. package/lib/common/components/storage/StorageDetail.tsx +46 -0
  2897. package/lib/common/components/storage/StorageTable.tsx +23 -0
  2898. package/lib/common/components/storage/StorageUtils.tsx +89 -0
  2899. package/lib/common/components/ui/Alerts.tsx +29 -0
  2900. package/lib/common/components/ui/BorderedIcon/BorderedIcon.tsx +51 -0
  2901. package/lib/common/components/ui/ClusterEventsToolbar.tsx +312 -0
  2902. package/lib/common/components/ui/ConfirmationModal.tsx +51 -0
  2903. package/lib/common/components/ui/DetailList.css +12 -0
  2904. package/lib/common/components/ui/DetailList.tsx +101 -0
  2905. package/lib/common/components/ui/EventsList.tsx +117 -0
  2906. package/lib/common/components/ui/EventsModal.css +8 -0
  2907. package/lib/common/components/ui/ExternalLink.tsx +15 -0
  2908. package/lib/common/components/ui/GridGap.tsx +9 -0
  2909. package/lib/common/components/ui/ModalProgress.tsx +44 -0
  2910. package/lib/common/components/ui/OpenShiftVersionDropdown.tsx +134 -0
  2911. package/lib/common/components/ui/PopoverIcon.tsx +42 -0
  2912. package/lib/common/components/ui/PreviewBadge.tsx +100 -0
  2913. package/lib/common/components/ui/PrismCode.css +4 -0
  2914. package/lib/common/components/ui/PrismCode.tsx +69 -0
  2915. package/lib/common/components/ui/RenderIf.tsx +8 -0
  2916. package/lib/common/components/ui/SectionTitle.tsx +19 -0
  2917. package/lib/common/components/ui/SimpleDropdown.css +6 -0
  2918. package/lib/common/components/ui/SimpleDropdown.tsx +67 -0
  2919. package/lib/common/components/ui/StaticTextField.tsx +79 -0
  2920. package/lib/common/components/ui/Toolbar/ToolbarButton.tsx +10 -0
  2921. package/lib/common/components/ui/Toolbar/ToolbarProgress.tsx +16 -0
  2922. package/lib/common/components/ui/Toolbar/ToolbarSecondaryGroup.tsx +8 -0
  2923. package/lib/common/components/ui/Toolbar/ToolbarText.tsx +11 -0
  2924. package/lib/common/components/ui/ViewClusterEventsButton.tsx +31 -0
  2925. package/lib/common/components/ui/WizardFooter.tsx +113 -0
  2926. package/lib/common/components/ui/WizardNavItem.tsx +38 -0
  2927. package/lib/common/components/ui/eventsModal.tsx +125 -0
  2928. package/lib/common/components/ui/formik/AddButton.tsx +22 -0
  2929. package/lib/common/components/ui/formik/AdditionalNTPSourcesField.tsx +41 -0
  2930. package/lib/common/components/ui/formik/AlertFormikError.tsx +30 -0
  2931. package/lib/common/components/ui/formik/CertificatesUploadField.tsx +140 -0
  2932. package/lib/common/components/ui/formik/CheckboxField.tsx +57 -0
  2933. package/lib/common/components/ui/formik/CodeField.tsx +98 -0
  2934. package/lib/common/components/ui/formik/FormikAutoSave.tsx +63 -0
  2935. package/lib/common/components/ui/formik/HelperText.tsx +23 -0
  2936. package/lib/common/components/ui/formik/InputField.tsx +104 -0
  2937. package/lib/common/components/ui/formik/LabelField.css +38 -0
  2938. package/lib/common/components/ui/formik/LabelField.tsx +107 -0
  2939. package/lib/common/components/ui/formik/MultiSelectField.tsx +149 -0
  2940. package/lib/common/components/ui/formik/NumberInputField.tsx +111 -0
  2941. package/lib/common/components/ui/formik/PencilEditField.css +3 -0
  2942. package/lib/common/components/ui/formik/PencilEditField.tsx +65 -0
  2943. package/lib/common/components/ui/formik/PullSecretField.tsx +83 -0
  2944. package/lib/common/components/ui/formik/RadioField.tsx +35 -0
  2945. package/lib/common/components/ui/formik/RadioFieldWithTooltip.tsx +19 -0
  2946. package/lib/common/components/ui/formik/RemovableField.css +9 -0
  2947. package/lib/common/components/ui/formik/RemovableField.tsx +47 -0
  2948. package/lib/common/components/ui/formik/RichInputField.css +18 -0
  2949. package/lib/common/components/ui/formik/RichInputField.tsx +167 -0
  2950. package/lib/common/components/ui/formik/SelectField.tsx +72 -0
  2951. package/lib/common/components/ui/formik/SingleNodeCheckbox.tsx +88 -0
  2952. package/lib/common/components/ui/formik/SwitchField.tsx +78 -0
  2953. package/lib/common/components/ui/formik/TextAreaField.tsx +72 -0
  2954. package/lib/common/components/ui/formik/TextAreaSecretField.tsx +44 -0
  2955. package/lib/common/components/ui/formik/UploadField.tsx +101 -0
  2956. package/lib/common/components/ui/formik/constants.tsx +73 -0
  2957. package/lib/common/components/ui/formik/index.tsx +27 -0
  2958. package/lib/common/components/ui/formik/types.ts +139 -0
  2959. package/lib/common/components/ui/formik/utils.ts +140 -0
  2960. package/lib/common/components/ui/formik/validationSchemas.ts +672 -0
  2961. package/lib/common/components/ui/index.ts +24 -0
  2962. package/lib/common/components/ui/table/utils.ts +69 -0
  2963. package/lib/common/components/ui/table/wrappable.css +3 -0
  2964. package/lib/common/components/ui/table/wrappable.ts +29 -0
  2965. package/lib/common/components/ui/uiState/EmptyState.tsx +41 -0
  2966. package/lib/common/components/ui/uiState/ErrorState.tsx +69 -0
  2967. package/lib/common/components/ui/uiState/LoadingState.tsx +30 -0
  2968. package/lib/common/components/ui/utils.ts +20 -0
  2969. package/lib/common/config/constants.ts +368 -0
  2970. package/lib/common/features/featureGate.tsx +84 -0
  2971. package/lib/common/hooks/use-translation-wrapper.ts +6 -0
  2972. package/lib/common/hooks/useDeepCompareMemoize.ts +14 -0
  2973. package/lib/common/hooks/useFieldErrorMsg.tsx +39 -0
  2974. package/lib/common/hooks/useFormikHelpers.ts +30 -0
  2975. package/lib/common/hooks/useStateSafely.ts +22 -0
  2976. package/lib/common/index.ts +10 -0
  2977. package/lib/common/reducers/alertsSlice.ts +32 -0
  2978. package/lib/common/reducers/dialogsSlice.ts +23 -0
  2979. package/lib/common/selectors/clusterSelectors.ts +128 -0
  2980. package/lib/common/sevices/DateAndTime.tsx +15 -0
  2981. package/lib/common/styles.css +4 -0
  2982. package/lib/common/types/clusters.ts +70 -0
  2983. package/lib/common/types/cpuArchitecture.ts +91 -0
  2984. package/lib/common/types/errortype.ts +1 -0
  2985. package/lib/common/types/events.ts +27 -0
  2986. package/lib/common/types/featureSupportLevel.ts +29 -0
  2987. package/lib/common/types/generateIsoFields.ts +13 -0
  2988. package/lib/common/types/hosts.ts +25 -0
  2989. package/lib/common/types/index.ts +21 -0
  2990. package/lib/common/types/typescriptExtensions.ts +23 -0
  2991. package/lib/common/types/versions.ts +12 -0
  2992. package/lib/common/utils.ts +18 -0
  2993. package/lib/ocm/api/axiosClient.ts +52 -0
  2994. package/lib/ocm/api/axiosExtensions.ts +11 -0
  2995. package/lib/ocm/api/types.ts +13 -0
  2996. package/lib/ocm/api/utils.ts +86 -0
  2997. package/lib/ocm/components/AddHosts/AddHosts.tsx +117 -0
  2998. package/lib/ocm/components/AddHosts/InventoryAddHost.tsx +54 -0
  2999. package/lib/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.tsx +151 -0
  3000. package/lib/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.tsx +23 -0
  3001. package/lib/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.tsx +48 -0
  3002. package/lib/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.tsx +58 -0
  3003. package/lib/ocm/components/AddHosts/day2Wizard/Day2StaticIP.tsx +184 -0
  3004. package/lib/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.tsx +48 -0
  3005. package/lib/ocm/components/AddHosts/day2Wizard/Day2Wizard.tsx +57 -0
  3006. package/lib/ocm/components/AddHosts/day2Wizard/Day2WizardContext.tsx +33 -0
  3007. package/lib/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.tsx +106 -0
  3008. package/lib/ocm/components/AddHosts/day2Wizard/Day2WizardFooter.tsx +48 -0
  3009. package/lib/ocm/components/AddHosts/day2Wizard/Day2WizardNav.tsx +70 -0
  3010. package/lib/ocm/components/AddHosts/day2Wizard/constants.tsx +27 -0
  3011. package/lib/ocm/components/AddHosts/types.ts +62 -0
  3012. package/lib/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.tsx +20 -0
  3013. package/lib/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.tsx +221 -0
  3014. package/lib/ocm/components/HostsClusterDetailTab/index.ts +3 -0
  3015. package/lib/ocm/components/HostsClusterDetailTab/types.ts +8 -0
  3016. package/lib/ocm/components/HostsClusterDetailTab/utils.ts +55 -0
  3017. package/lib/ocm/components/Router.tsx +29 -0
  3018. package/lib/ocm/components/SentryErrorMonitorContextProvider.tsx +27 -0
  3019. package/lib/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.tsx +92 -0
  3020. package/lib/ocm/components/clusterConfiguration/CpuArchitectureDropdown.tsx +153 -0
  3021. package/lib/ocm/components/clusterConfiguration/CustomManifestCheckbox.tsx +128 -0
  3022. package/lib/ocm/components/clusterConfiguration/DiscoveryImageForm.tsx +108 -0
  3023. package/lib/ocm/components/clusterConfiguration/DiscoveryImageModal.tsx +126 -0
  3024. package/lib/ocm/components/clusterConfiguration/DiscoveryImageTypeDropdown.tsx +120 -0
  3025. package/lib/ocm/components/clusterConfiguration/HostInventory.tsx +108 -0
  3026. package/lib/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.tsx +56 -0
  3027. package/lib/ocm/components/clusterConfiguration/InformationAndAlerts.tsx +43 -0
  3028. package/lib/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.tsx +194 -0
  3029. package/lib/ocm/components/clusterConfiguration/OcmClusterProgressItems.tsx +67 -0
  3030. package/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx +182 -0
  3031. package/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersion.tsx +38 -0
  3032. package/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.tsx +89 -0
  3033. package/lib/ocm/components/clusterConfiguration/OcmOperatorProgressItem.tsx +140 -0
  3034. package/lib/ocm/components/clusterConfiguration/OcmOperatorsProgressItem.css +4 -0
  3035. package/lib/ocm/components/clusterConfiguration/OcmSNOControlGroup.tsx +65 -0
  3036. package/lib/ocm/components/clusterConfiguration/OcmSNODisclaimer.tsx +78 -0
  3037. package/lib/ocm/components/clusterConfiguration/OcmSingleNodeCheckbox.tsx +97 -0
  3038. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/CustomManifestsPage.tsx +39 -0
  3039. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/DeleteCustomManifestModal.tsx +38 -0
  3040. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CollapsedManifest.tsx +47 -0
  3041. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifest.tsx +98 -0
  3042. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.tsx +37 -0
  3043. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsArray.tsx +157 -0
  3044. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifestsForm.tsx +191 -0
  3045. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/ExpandedManifest.tsx +59 -0
  3046. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.tsx +93 -0
  3047. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.tsx +60 -0
  3048. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/propTypes.ts +28 -0
  3049. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/utils.tsx +49 -0
  3050. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/data/dataTypes.ts +20 -0
  3051. package/lib/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.tsx +136 -0
  3052. package/lib/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.tsx +105 -0
  3053. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.tsx +320 -0
  3054. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx +246 -0
  3055. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.tsx +27 -0
  3056. package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.tsx +120 -0
  3057. package/lib/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.tsx +227 -0
  3058. package/lib/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.tsx +100 -0
  3059. package/lib/ocm/components/clusterConfiguration/networkConfiguration/UserManagedNetworkingTextContent.tsx +30 -0
  3060. package/lib/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.tsx +201 -0
  3061. package/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts +99 -0
  3062. package/lib/ocm/components/clusterConfiguration/operators/CnvCheckbox.tsx +79 -0
  3063. package/lib/ocm/components/clusterConfiguration/operators/CnvHostRequirements.tsx +61 -0
  3064. package/lib/ocm/components/clusterConfiguration/operators/LvmCheckbox.tsx +105 -0
  3065. package/lib/ocm/components/clusterConfiguration/operators/LvmHostRequirements.tsx +45 -0
  3066. package/lib/ocm/components/clusterConfiguration/operators/OdfCheckbox.tsx +54 -0
  3067. package/lib/ocm/components/clusterConfiguration/operators/utils.tsx +26 -0
  3068. package/lib/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.tsx +72 -0
  3069. package/lib/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationNote.tsx +26 -0
  3070. package/lib/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.tsx +24 -0
  3071. package/lib/ocm/components/clusterConfiguration/review/ReviewCluster.css +29 -0
  3072. package/lib/ocm/components/clusterConfiguration/review/ReviewClusterDetailTable.tsx +93 -0
  3073. package/lib/ocm/components/clusterConfiguration/review/ReviewCustomManifestsTable.tsx +48 -0
  3074. package/lib/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.tsx +171 -0
  3075. package/lib/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.tsx +45 -0
  3076. package/lib/ocm/components/clusterConfiguration/review/ReviewPreflightChecks.tsx +207 -0
  3077. package/lib/ocm/components/clusterConfiguration/review/ReviewStep.tsx +78 -0
  3078. package/lib/ocm/components/clusterConfiguration/review/ReviewSummary.tsx +90 -0
  3079. package/lib/ocm/components/clusterConfiguration/review/TableSummaryExpandable.tsx +26 -0
  3080. package/lib/ocm/components/clusterConfiguration/review/index.tsx +4 -0
  3081. package/lib/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.tsx +193 -0
  3082. package/lib/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.tsx +72 -0
  3083. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.tsx +43 -0
  3084. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.tsx +82 -0
  3085. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.tsx +74 -0
  3086. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.tsx +43 -0
  3087. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx +302 -0
  3088. package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx +118 -0
  3089. package/lib/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.tsx +105 -0
  3090. package/lib/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.tsx +291 -0
  3091. package/lib/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.tsx +97 -0
  3092. package/lib/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.tsx +105 -0
  3093. package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.tsx +104 -0
  3094. package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.tsx +26 -0
  3095. package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.tsx +106 -0
  3096. package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.tsx +73 -0
  3097. package/lib/ocm/components/clusterConfiguration/staticIp/components/propTypes.ts +33 -0
  3098. package/lib/ocm/components/clusterConfiguration/staticIp/components/staticIp.css +29 -0
  3099. package/lib/ocm/components/clusterConfiguration/staticIp/data/dataTypes.ts +61 -0
  3100. package/lib/ocm/components/clusterConfiguration/staticIp/data/dummyData.ts +62 -0
  3101. package/lib/ocm/components/clusterConfiguration/staticIp/data/emptyData.ts +61 -0
  3102. package/lib/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.ts +192 -0
  3103. package/lib/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.ts +191 -0
  3104. package/lib/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.ts +89 -0
  3105. package/lib/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.ts +5 -0
  3106. package/lib/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.ts +81 -0
  3107. package/lib/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.ts +132 -0
  3108. package/lib/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.ts +44 -0
  3109. package/lib/ocm/components/clusterDetail/AssistedInstallerDetailCard.tsx +158 -0
  3110. package/lib/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.tsx +59 -0
  3111. package/lib/ocm/components/clusterDetail/CancelInstallationModal.tsx +92 -0
  3112. package/lib/ocm/components/clusterDetail/ClusterDetail.tsx +135 -0
  3113. package/lib/ocm/components/clusterDetail/ClusterDetailStatusMessages.tsx +100 -0
  3114. package/lib/ocm/components/clusterDetail/ClusterDetailStatusVarieties.tsx +109 -0
  3115. package/lib/ocm/components/clusterDetail/ClusterDetailsButtonGroup.tsx +103 -0
  3116. package/lib/ocm/components/clusterDetail/ClusterInstallationError.tsx +79 -0
  3117. package/lib/ocm/components/clusterDetail/ClusterInstallationProgressCard.tsx +74 -0
  3118. package/lib/ocm/components/clusterDetail/ClusterPollingErrorModal.tsx +38 -0
  3119. package/lib/ocm/components/clusterDetail/ClusterProperties.tsx +174 -0
  3120. package/lib/ocm/components/clusterDetail/ClusterSummaryExpandable.css +4 -0
  3121. package/lib/ocm/components/clusterDetail/ClusterSummaryExpandable.tsx +30 -0
  3122. package/lib/ocm/components/clusterDetail/ClusterUpdateErrorModal.tsx +25 -0
  3123. package/lib/ocm/components/clusterDetail/HostInventoryExpandable.css +4 -0
  3124. package/lib/ocm/components/clusterDetail/HostInventoryExpandable.tsx +46 -0
  3125. package/lib/ocm/components/clusterDetail/OpenShiftVersionDetail.tsx +47 -0
  3126. package/lib/ocm/components/clusterDetail/ProgressBarAlerts.tsx +218 -0
  3127. package/lib/ocm/components/clusterDetail/RebootNodeZeroModal.css +7 -0
  3128. package/lib/ocm/components/clusterDetail/RebootNodeZeroModal.tsx +68 -0
  3129. package/lib/ocm/components/clusterDetail/ResetClusterModal.tsx +132 -0
  3130. package/lib/ocm/components/clusterDetail/getProgressBarAlerts.tsx +102 -0
  3131. package/lib/ocm/components/clusterDetail/utils.tsx +101 -0
  3132. package/lib/ocm/components/clusterWizard/ClusterDetails.tsx +127 -0
  3133. package/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +185 -0
  3134. package/lib/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.tsx +63 -0
  3135. package/lib/ocm/components/clusterWizard/ClusterWizard.tsx +57 -0
  3136. package/lib/ocm/components/clusterWizard/ClusterWizardContext.tsx +28 -0
  3137. package/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx +227 -0
  3138. package/lib/ocm/components/clusterWizard/ClusterWizardFooter.tsx +120 -0
  3139. package/lib/ocm/components/clusterWizard/ClusterWizardNavigation.tsx +105 -0
  3140. package/lib/ocm/components/clusterWizard/CustomManifestStep.tsx +63 -0
  3141. package/lib/ocm/components/clusterWizard/HostDiscovery.tsx +109 -0
  3142. package/lib/ocm/components/clusterWizard/NewClusterWizard.tsx +13 -0
  3143. package/lib/ocm/components/clusterWizard/Operators.tsx +130 -0
  3144. package/lib/ocm/components/clusterWizard/OperatorsStep.tsx +37 -0
  3145. package/lib/ocm/components/clusterWizard/StaticIp.tsx +69 -0
  3146. package/lib/ocm/components/clusterWizard/Storage.tsx +71 -0
  3147. package/lib/ocm/components/clusterWizard/constants.ts +28 -0
  3148. package/lib/ocm/components/clusterWizard/index.ts +3 -0
  3149. package/lib/ocm/components/clusterWizard/wizardTransition.ts +256 -0
  3150. package/lib/ocm/components/clusters/ClusterBreadcrumbs.tsx +32 -0
  3151. package/lib/ocm/components/clusters/ClusterLoading.tsx +11 -0
  3152. package/lib/ocm/components/clusters/ClusterPage.tsx +195 -0
  3153. package/lib/ocm/components/clusters/ClusterPageErrors.tsx +14 -0
  3154. package/lib/ocm/components/clusters/ClusterStatus.tsx +72 -0
  3155. package/lib/ocm/components/clusters/ClusterToolbar.css +6 -0
  3156. package/lib/ocm/components/clusters/ClusterToolbar.tsx +20 -0
  3157. package/lib/ocm/components/clusters/Clusters.tsx +140 -0
  3158. package/lib/ocm/components/clusters/ClustersListToolbar.tsx +177 -0
  3159. package/lib/ocm/components/clusters/ClustersTable.tsx +225 -0
  3160. package/lib/ocm/components/clusters/DeleteClusterModal.tsx +45 -0
  3161. package/lib/ocm/components/clusters/NewClusterPage.tsx +53 -0
  3162. package/lib/ocm/components/clusters/clusterPolling.ts +64 -0
  3163. package/lib/ocm/components/clusters/index.ts +6 -0
  3164. package/lib/ocm/components/clusters/utils.ts +58 -0
  3165. package/lib/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.tsx +196 -0
  3166. package/lib/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.tsx +192 -0
  3167. package/lib/ocm/components/featureSupportLevels/featureStateUtils.ts +185 -0
  3168. package/lib/ocm/components/fetching/fetchEvents.ts +18 -0
  3169. package/lib/ocm/components/hosts/AdditionaNTPSourceDialogToggle.tsx +11 -0
  3170. package/lib/ocm/components/hosts/ClusterHostsTable.tsx +109 -0
  3171. package/lib/ocm/components/hosts/DeleteHostModal.tsx +35 -0
  3172. package/lib/ocm/components/hosts/HardwareStatus.tsx +92 -0
  3173. package/lib/ocm/components/hosts/HostRequirementsContent.tsx +77 -0
  3174. package/lib/ocm/components/hosts/HostsDiscoveryTable.tsx +125 -0
  3175. package/lib/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.tsx +29 -0
  3176. package/lib/ocm/components/hosts/HostsStorageTable.tsx +105 -0
  3177. package/lib/ocm/components/hosts/HostsTableEmptyState.tsx +24 -0
  3178. package/lib/ocm/components/hosts/ModalDialogsContext.tsx +139 -0
  3179. package/lib/ocm/components/hosts/NetworkingStatus.tsx +43 -0
  3180. package/lib/ocm/components/hosts/OdfDisksManualFormattingHint.tsx +26 -0
  3181. package/lib/ocm/components/hosts/ResetHostModal.tsx +35 -0
  3182. package/lib/ocm/components/hosts/StorageAlerts.tsx +32 -0
  3183. package/lib/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.tsx +24 -0
  3184. package/lib/ocm/components/hosts/UpdateDay2ApiVipForm.tsx +112 -0
  3185. package/lib/ocm/components/hosts/UpdateDay2ApiVipModal.tsx +26 -0
  3186. package/lib/ocm/components/hosts/VMRebootConfigurationLinkWithModal.tsx +23 -0
  3187. package/lib/ocm/components/hosts/use-hosts-table.tsx +588 -0
  3188. package/lib/ocm/components/hosts/utils.ts +68 -0
  3189. package/lib/ocm/components/index.ts +8 -0
  3190. package/lib/ocm/components/newFeatureSupportLevels/NewFeatureSupportLevelProvider.tsx +147 -0
  3191. package/lib/ocm/components/newFeatureSupportLevels/ReviewClusterNewFeatureSupportLevels.tsx +186 -0
  3192. package/lib/ocm/components/newFeatureSupportLevels/index.ts +2 -0
  3193. package/lib/ocm/components/newFeatureSupportLevels/newFeatureStateUtils.ts +174 -0
  3194. package/lib/ocm/components/ui/AssistedUILibVersion.tsx +11 -0
  3195. package/lib/ocm/components/ui/Buttons/BackButton.tsx +16 -0
  3196. package/lib/ocm/components/ui/InfoLinkWithModal.tsx +66 -0
  3197. package/lib/ocm/components/ui/OcmFormFields.tsx +72 -0
  3198. package/lib/ocm/components/ui/RedirectToCluster.tsx +14 -0
  3199. package/lib/ocm/config/constants.ts +43 -0
  3200. package/lib/ocm/config/routeBaseBath.ts +5 -0
  3201. package/lib/ocm/hooks/useClusterCustomManifests.ts +94 -0
  3202. package/lib/ocm/hooks/useClusterPreflightRequirements.ts +41 -0
  3203. package/lib/ocm/hooks/useClusterSupportedPlatforms.ts +70 -0
  3204. package/lib/ocm/hooks/useInfraEnv.ts +58 -0
  3205. package/lib/ocm/hooks/useInfraEnvId.ts +28 -0
  3206. package/lib/ocm/hooks/useInfraEnvImageUrl.ts +36 -0
  3207. package/lib/ocm/hooks/useInfraEnvIpxeImageUrl.ts +38 -0
  3208. package/lib/ocm/hooks/useManagedDomains.ts +29 -0
  3209. package/lib/ocm/hooks/useOpenshiftVersions.tsx +117 -0
  3210. package/lib/ocm/hooks/usePullSecret.ts +36 -0
  3211. package/lib/ocm/hooks/useSetClusterPermissions.ts +23 -0
  3212. package/lib/ocm/hooks/useSupportLevelsAPI.ts +89 -0
  3213. package/lib/ocm/hooks/useUsedClusterNames.ts +34 -0
  3214. package/lib/ocm/index.ts +16 -0
  3215. package/lib/ocm/reducers/clusters/clustersSlice.ts +64 -0
  3216. package/lib/ocm/reducers/clusters/currentClusterSlice.ts +157 -0
  3217. package/lib/ocm/selectors/clusters.tsx +108 -0
  3218. package/lib/ocm/selectors/currentCluster.ts +17 -0
  3219. package/lib/ocm/sentry.ts +18 -0
  3220. package/lib/ocm/services/ClusterDetailsService.ts +94 -0
  3221. package/lib/ocm/services/ClustersService.ts +155 -0
  3222. package/lib/ocm/services/CpuArchitectureService.ts +62 -0
  3223. package/lib/ocm/services/Day2ClusterService.ts +155 -0
  3224. package/lib/ocm/services/DiscoveryImageFormService.ts +55 -0
  3225. package/lib/ocm/services/DiskEncryptionService.ts +36 -0
  3226. package/lib/ocm/services/HostDiscoveryService.ts +36 -0
  3227. package/lib/ocm/services/HostsService.ts +92 -0
  3228. package/lib/ocm/services/InfraEnvIdsCacheService.ts +114 -0
  3229. package/lib/ocm/services/InfraEnvsService.ts +131 -0
  3230. package/lib/ocm/services/OperatorsService.tsx +63 -0
  3231. package/lib/ocm/services/apis/ClustersAPI.ts +245 -0
  3232. package/lib/ocm/services/apis/ComponentVersionsAPI.ts +14 -0
  3233. package/lib/ocm/services/apis/EventsAPI.ts +43 -0
  3234. package/lib/ocm/services/apis/FeatureSupportLevelsAPI.ts +14 -0
  3235. package/lib/ocm/services/apis/HostsAPI.ts +63 -0
  3236. package/lib/ocm/services/apis/InfraEnvsAPI.ts +72 -0
  3237. package/lib/ocm/services/apis/ManagedDomainsAPI.tsx +14 -0
  3238. package/lib/ocm/services/apis/NewFeatureSupportLevelsAPI.ts +38 -0
  3239. package/lib/ocm/services/apis/SupportedOpenshiftVersionsAPI.ts +14 -0
  3240. package/lib/ocm/services/apis/types.ts +15 -0
  3241. package/lib/ocm/services/types.ts +24 -0
  3242. package/lib/ocm/store/hooks.ts +5 -0
  3243. package/lib/ocm/store/index.ts +23 -0
  3244. package/lib/ocm/store/slices/infraEnvs/selectors.ts +10 -0
  3245. package/lib/ocm/store/slices/infraEnvs/slice.ts +14 -0
  3246. package/lib/ocm/store/slices/infraEnvs/thunks.ts +61 -0
  3247. package/lib/ocm/types.ts +3 -0
  3248. package/package.json +98 -112
  3249. package/LICENSE +0 -202
  3250. package/dist/cim/index.css +0 -2
  3251. package/dist/cim/index.css.map +0 -7
  3252. package/dist/cim/index.js +0 -25
  3253. package/dist/cim/index.js.map +0 -7
  3254. package/dist/index.css +0 -2
  3255. package/dist/index.css.map +0 -7
  3256. package/dist/index.js +0 -37
  3257. package/dist/index.js.map +0 -7
  3258. package/dist/locales/en/translation.json +0 -763
  3259. package/dist/locales/ja/translation.json +0 -763
  3260. package/dist/locales/ko/translation.json +0 -763
  3261. package/dist/locales/zh/translation.json +0 -763
  3262. package/dist/ocm/index.css +0 -2
  3263. package/dist/ocm/index.css.map +0 -7
  3264. package/dist/ocm/index.js +0 -34
  3265. package/dist/ocm/index.js.map +0 -7
  3266. package/dist/src/cim/components/Agent/AgentStatus.d.ts +0 -14
  3267. package/dist/src/cim/components/Agent/AgentTable.d.ts +0 -12
  3268. package/dist/src/cim/components/Agent/AgentsSelectionHostCountAlerts.d.ts +0 -8
  3269. package/dist/src/cim/components/Agent/AgentsSelectionHostCountLabelIcon.d.ts +0 -2
  3270. package/dist/src/cim/components/Agent/AgentsSelectionTable.d.ts +0 -16
  3271. package/dist/src/cim/components/Agent/AgentsSelectionUtils.d.ts +0 -7
  3272. package/dist/src/cim/components/Agent/BMCForm.d.ts +0 -4
  3273. package/dist/src/cim/components/Agent/BMHStatus.d.ts +0 -7
  3274. package/dist/src/cim/components/Agent/MinimalHWRequirements.d.ts +0 -15
  3275. package/dist/src/cim/components/Agent/NoAgentsAlert.d.ts +0 -5
  3276. package/dist/src/cim/components/Agent/tableUtils.d.ts +0 -51
  3277. package/dist/src/cim/components/Agent/types.d.ts +0 -36
  3278. package/dist/src/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.d.ts +0 -23
  3279. package/dist/src/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.d.ts +0 -2
  3280. package/dist/src/cim/components/ClusterDeployment/ArmCheckbox.d.ts +0 -7
  3281. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.d.ts +0 -9
  3282. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentCredentials.d.ts +0 -13
  3283. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentDetails.d.ts +0 -13
  3284. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.d.ts +0 -13
  3285. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.d.ts +0 -19
  3286. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.d.ts +0 -10
  3287. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.d.ts +0 -4
  3288. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.d.ts +0 -14
  3289. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.d.ts +0 -4
  3290. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.d.ts +0 -4
  3291. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.d.ts +0 -10
  3292. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.d.ts +0 -4
  3293. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.d.ts +0 -15
  3294. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.d.ts +0 -8
  3295. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.d.ts +0 -10
  3296. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.d.ts +0 -20
  3297. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.d.ts +0 -4
  3298. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentProgress.d.ts +0 -13
  3299. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.d.ts +0 -13
  3300. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.d.ts +0 -9
  3301. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentWizard.d.ts +0 -4
  3302. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.d.ts +0 -10
  3303. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.d.ts +0 -12
  3304. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.d.ts +0 -3
  3305. package/dist/src/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.d.ts +0 -6
  3306. package/dist/src/cim/components/ClusterDeployment/ClusterDetailsFormFields.d.ts +0 -16
  3307. package/dist/src/cim/components/ClusterDeployment/ClusterInstallationError.d.ts +0 -7
  3308. package/dist/src/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.d.ts +0 -7
  3309. package/dist/src/cim/components/ClusterDeployment/LabelsSelector.d.ts +0 -13
  3310. package/dist/src/cim/components/ClusterDeployment/LocationsSelector.d.ts +0 -6
  3311. package/dist/src/cim/components/ClusterDeployment/LogsDownloadButton.d.ts +0 -11
  3312. package/dist/src/cim/components/ClusterDeployment/NetworkConfiguration.d.ts +0 -9
  3313. package/dist/src/cim/components/ClusterDeployment/ScaleUpForm.d.ts +0 -9
  3314. package/dist/src/cim/components/ClusterDeployment/ShortCapacitySummary.d.ts +0 -9
  3315. package/dist/src/cim/components/ClusterDeployment/constants.d.ts +0 -14
  3316. package/dist/src/cim/components/ClusterDeployment/helpers.d.ts +0 -23
  3317. package/dist/src/cim/components/ClusterDeployment/index.d.ts +0 -17
  3318. package/dist/src/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts +0 -5
  3319. package/dist/src/cim/components/ClusterDeployment/types.d.ts +0 -174
  3320. package/dist/src/cim/components/ClusterDeployment/use-networking-formik.d.ts +0 -39
  3321. package/dist/src/cim/components/ClusterDeployment/validationSchemas.d.ts +0 -3
  3322. package/dist/src/cim/components/ClusterDeployment/wizardTransition.d.ts +0 -10
  3323. package/dist/src/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.d.ts +0 -21
  3324. package/dist/src/cim/components/Hypershift/DetailsPage/ConditionsTable.d.ts +0 -11
  3325. package/dist/src/cim/components/Hypershift/DetailsPage/HostedClusterProgress.d.ts +0 -7
  3326. package/dist/src/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.d.ts +0 -8
  3327. package/dist/src/cim/components/Hypershift/DetailsPage/NodePoolStatus.d.ts +0 -8
  3328. package/dist/src/cim/components/Hypershift/DetailsPage/NodePoolsProgress.d.ts +0 -18
  3329. package/dist/src/cim/components/Hypershift/DetailsPage/NodePoolsTable.d.ts +0 -25
  3330. package/dist/src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.d.ts +0 -4
  3331. package/dist/src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.d.ts +0 -4
  3332. package/dist/src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/types.d.ts +0 -35
  3333. package/dist/src/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.d.ts +0 -4
  3334. package/dist/src/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.d.ts +0 -4
  3335. package/dist/src/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.d.ts +0 -11
  3336. package/dist/src/cim/components/Hypershift/HostedClusterWizard/HostsStep/types.d.ts +0 -30
  3337. package/dist/src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.d.ts +0 -5
  3338. package/dist/src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.d.ts +0 -4
  3339. package/dist/src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/types.d.ts +0 -22
  3340. package/dist/src/cim/components/Hypershift/forms/NodePoolAgentsForm.d.ts +0 -10
  3341. package/dist/src/cim/components/Hypershift/hooks/useSupportedOCPVersions.d.ts +0 -3
  3342. package/dist/src/cim/components/Hypershift/hooks/useTemptiflySync.d.ts +0 -6
  3343. package/dist/src/cim/components/Hypershift/index.d.ts +0 -4
  3344. package/dist/src/cim/components/Hypershift/modals/AddNodePoolModal.d.ts +0 -12
  3345. package/dist/src/cim/components/Hypershift/modals/ManageHostsModal.d.ts +0 -16
  3346. package/dist/src/cim/components/Hypershift/modals/NodePoolForm.d.ts +0 -18
  3347. package/dist/src/cim/components/Hypershift/modals/RemoveNodePoolModal.d.ts +0 -8
  3348. package/dist/src/cim/components/Hypershift/types.d.ts +0 -195
  3349. package/dist/src/cim/components/Hypershift/utils/labels.d.ts +0 -10
  3350. package/dist/src/cim/components/Hypershift/utils/nodepool.d.ts +0 -3
  3351. package/dist/src/cim/components/Hypershift/utils/status.d.ts +0 -10
  3352. package/dist/src/cim/components/InfraEnv/AddHostDropdown.d.ts +0 -4
  3353. package/dist/src/cim/components/InfraEnv/AgentAlerts.d.ts +0 -9
  3354. package/dist/src/cim/components/InfraEnv/EnvironmentDetails.d.ts +0 -16
  3355. package/dist/src/cim/components/InfraEnv/EnvironmentErrors.d.ts +0 -9
  3356. package/dist/src/cim/components/InfraEnv/InfraEnvAgentTable.d.ts +0 -4
  3357. package/dist/src/cim/components/InfraEnv/InfraEnvFormPage.d.ts +0 -31
  3358. package/dist/src/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.d.ts +0 -8
  3359. package/dist/src/cim/components/InfraEnv/InfraTableToolbar.d.ts +0 -16
  3360. package/dist/src/cim/components/InfraEnv/index.d.ts +0 -8
  3361. package/dist/src/cim/components/InfraEnv/types.d.ts +0 -12
  3362. package/dist/src/cim/components/InfraEnv/utils.d.ts +0 -13
  3363. package/dist/src/cim/components/YamlPreview/YamlPreview.d.ts +0 -8
  3364. package/dist/src/cim/components/YamlPreview/useYAMLPreview.d.ts +0 -14
  3365. package/dist/src/cim/components/common/InfoAndTroubleshootingNotification.d.ts +0 -7
  3366. package/dist/src/cim/components/common/ResourceAlerts.d.ts +0 -7
  3367. package/dist/src/cim/components/common/SpecSyncErrAlert.d.ts +0 -5
  3368. package/dist/src/cim/components/common/ValidationsRunningAlert.d.ts +0 -2
  3369. package/dist/src/cim/components/common/constants.d.ts +0 -10
  3370. package/dist/src/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.d.ts +0 -8
  3371. package/dist/src/cim/components/featureSupportLevels/featureStateUtils.d.ts +0 -4
  3372. package/dist/src/cim/components/helpers/agentClusterInstall.d.ts +0 -3
  3373. package/dist/src/cim/components/helpers/agentStatus.d.ts +0 -3
  3374. package/dist/src/cim/components/helpers/agents.d.ts +0 -15
  3375. package/dist/src/cim/components/helpers/clusterDeployment.d.ts +0 -38
  3376. package/dist/src/cim/components/helpers/conditions.d.ts +0 -9
  3377. package/dist/src/cim/components/helpers/labels.d.ts +0 -3
  3378. package/dist/src/cim/components/helpers/network.d.ts +0 -6
  3379. package/dist/src/cim/components/helpers/proxy.d.ts +0 -1
  3380. package/dist/src/cim/components/helpers/status.d.ts +0 -26
  3381. package/dist/src/cim/components/helpers/storage.d.ts +0 -1
  3382. package/dist/src/cim/components/helpers/toAssisted.d.ts +0 -12
  3383. package/dist/src/cim/components/helpers/units.d.ts +0 -50
  3384. package/dist/src/cim/components/helpers/versions.d.ts +0 -7
  3385. package/dist/src/cim/components/modals/AddBmcHostModal.d.ts +0 -4
  3386. package/dist/src/cim/components/modals/AddBmcHostYamlForm.d.ts +0 -5
  3387. package/dist/src/cim/components/modals/AddBmcHostYamlModal.d.ts +0 -4
  3388. package/dist/src/cim/components/modals/AddHostModal.d.ts +0 -4
  3389. package/dist/src/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.d.ts +0 -4
  3390. package/dist/src/cim/components/modals/CimConfiguration/CimConfigProgressAlert.d.ts +0 -4
  3391. package/dist/src/cim/components/modals/CimConfiguration/CimConfigurationForm.d.ts +0 -4
  3392. package/dist/src/cim/components/modals/CimConfiguration/CimConfigurationModal.d.ts +0 -4
  3393. package/dist/src/cim/components/modals/CimConfiguration/CimIsMissingAlert.d.ts +0 -2
  3394. package/dist/src/cim/components/modals/CimConfiguration/CimStorageMissingAlert.d.ts +0 -5
  3395. package/dist/src/cim/components/modals/CimConfiguration/constants.d.ts +0 -4
  3396. package/dist/src/cim/components/modals/CimConfiguration/persist.d.ts +0 -23
  3397. package/dist/src/cim/components/modals/CimConfiguration/types.d.ts +0 -43
  3398. package/dist/src/cim/components/modals/CimConfiguration/utils.d.ts +0 -15
  3399. package/dist/src/cim/components/modals/EditAgentModal.d.ts +0 -4
  3400. package/dist/src/cim/components/modals/EditBMHModal.d.ts +0 -4
  3401. package/dist/src/cim/components/modals/EditNtpSourcesModal.d.ts +0 -11
  3402. package/dist/src/cim/components/modals/EditPullSecretModal.d.ts +0 -19
  3403. package/dist/src/cim/components/modals/EditSSHKeyModal.d.ts +0 -13
  3404. package/dist/src/cim/components/modals/MassApproveAction.d.ts +0 -8
  3405. package/dist/src/cim/components/modals/MassApproveAgentModal.d.ts +0 -10
  3406. package/dist/src/cim/components/modals/MassDeleteAgentModal.d.ts +0 -13
  3407. package/dist/src/cim/components/modals/ScaleUpModal.d.ts +0 -13
  3408. package/dist/src/cim/components/modals/constants.d.ts +0 -63
  3409. package/dist/src/cim/components/modals/index.d.ts +0 -10
  3410. package/dist/src/cim/components/modals/types.d.ts +0 -45
  3411. package/dist/src/cim/components/modals/utils.d.ts +0 -28
  3412. package/dist/src/cim/config/constants.d.ts +0 -9
  3413. package/dist/src/cim/index.d.ts +0 -13
  3414. package/dist/src/cim/types/fromOCP/k8sTypes.d.ts +0 -46
  3415. package/dist/src/cim/types/k8s/agent-cluster-install.d.ts +0 -68
  3416. package/dist/src/cim/types/k8s/agent-service-config.d.ts +0 -23
  3417. package/dist/src/cim/types/k8s/agent.d.ts +0 -48
  3418. package/dist/src/cim/types/k8s/bare-metal-host.d.ts +0 -31
  3419. package/dist/src/cim/types/k8s/cluster-deployment.d.ts +0 -41
  3420. package/dist/src/cim/types/k8s/cluster-image-set.d.ts +0 -6
  3421. package/dist/src/cim/types/k8s/cluster-version.d.ts +0 -45
  3422. package/dist/src/cim/types/k8s/infra-env-k8s-resource.d.ts +0 -36
  3423. package/dist/src/cim/types/k8s/infrastructure.d.ts +0 -22
  3424. package/dist/src/cim/types/k8s/nm-state.d.ts +0 -10
  3425. package/dist/src/cim/types/k8s/shared.d.ts +0 -13
  3426. package/dist/src/cim/types/k8s/storage-class.d.ts +0 -8
  3427. package/dist/src/cim/types/metal3.d.ts +0 -86
  3428. package/dist/src/cim/types/resources.d.ts +0 -44
  3429. package/dist/src/cim/utils.d.ts +0 -2
  3430. package/dist/src/common/api/types.d.ts +0 -2241
  3431. package/dist/src/common/api/utils.d.ts +0 -2
  3432. package/dist/src/common/components/AddHosts/AddHostsContext.d.ts +0 -9
  3433. package/dist/src/common/components/AlertsContextProvider.d.ts +0 -10
  3434. package/dist/src/common/components/ErrorHandling/ErrorMonitorContext.d.ts +0 -12
  3435. package/dist/src/common/components/ErrorHandling/WithErrorBoundary.d.ts +0 -5
  3436. package/dist/src/common/components/clusterConfiguration/AdvancedNetworkFields.d.ts +0 -7
  3437. package/dist/src/common/components/clusterConfiguration/DiscoveryImageConfigForm.d.ts +0 -16
  3438. package/dist/src/common/components/clusterConfiguration/DiscoveryImageCpuArchitectureControlGroup.d.ts +0 -8
  3439. package/dist/src/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.d.ts +0 -2
  3440. package/dist/src/common/components/clusterConfiguration/DiscoveryInstructions.d.ts +0 -6
  3441. package/dist/src/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.d.ts +0 -13
  3442. package/dist/src/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.d.ts +0 -8
  3443. package/dist/src/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.d.ts +0 -6
  3444. package/dist/src/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues.d.ts +0 -11
  3445. package/dist/src/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.d.ts +0 -3
  3446. package/dist/src/common/components/clusterConfiguration/DownloadIso.d.ts +0 -10
  3447. package/dist/src/common/components/clusterConfiguration/DownloadIsoModal.d.ts +0 -7
  3448. package/dist/src/common/components/clusterConfiguration/FormatDiskWarning.d.ts +0 -5
  3449. package/dist/src/common/components/clusterConfiguration/OpenShiftVersionSelect.d.ts +0 -7
  3450. package/dist/src/common/components/clusterConfiguration/ProxyFields.d.ts +0 -5
  3451. package/dist/src/common/components/clusterConfiguration/SNOControlGroup.d.ts +0 -8
  3452. package/dist/src/common/components/clusterConfiguration/SNODisclaimer.d.ts +0 -8
  3453. package/dist/src/common/components/clusterConfiguration/SecurityFields.d.ts +0 -12
  3454. package/dist/src/common/components/clusterConfiguration/UploadSSH.d.ts +0 -6
  3455. package/dist/src/common/components/clusterConfiguration/index.d.ts +0 -13
  3456. package/dist/src/common/components/clusterConfiguration/utils.d.ts +0 -20
  3457. package/dist/src/common/components/clusterDetail/ClusterCredentials.d.ts +0 -12
  3458. package/dist/src/common/components/clusterDetail/ClusterProgress.d.ts +0 -9
  3459. package/dist/src/common/components/clusterDetail/ClusterProgressItem.d.ts +0 -6
  3460. package/dist/src/common/components/clusterDetail/ClusterProgressItems.d.ts +0 -11
  3461. package/dist/src/common/components/clusterDetail/ClusterPropertiesList.d.ts +0 -11
  3462. package/dist/src/common/components/clusterDetail/ConsoleModal.d.ts +0 -20
  3463. package/dist/src/common/components/clusterDetail/FinalizingProgress.d.ts +0 -14
  3464. package/dist/src/common/components/clusterDetail/KubeconfigDownload.d.ts +0 -10
  3465. package/dist/src/common/components/clusterDetail/OperatorsProgressItem.d.ts +0 -13
  3466. package/dist/src/common/components/clusterDetail/ProgressBarTexts.d.ts +0 -7
  3467. package/dist/src/common/components/clusterWizard/ClusterWizardStep.d.ts +0 -8
  3468. package/dist/src/common/components/clusterWizard/ClusterWizardStepHeader.d.ts +0 -3
  3469. package/dist/src/common/components/clusterWizard/ClusterWizardStepValidationsAlert.d.ts +0 -15
  3470. package/dist/src/common/components/clusterWizard/ReviewHostsInventory.d.ts +0 -6
  3471. package/dist/src/common/components/clusterWizard/ReviewValidations.d.ts +0 -3
  3472. package/dist/src/common/components/clusterWizard/clusterDetailsValidation.d.ts +0 -24
  3473. package/dist/src/common/components/clusterWizard/index.d.ts +0 -8
  3474. package/dist/src/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts +0 -9
  3475. package/dist/src/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.d.ts +0 -5
  3476. package/dist/src/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.d.ts +0 -5
  3477. package/dist/src/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.d.ts +0 -4
  3478. package/dist/src/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.d.ts +0 -8
  3479. package/dist/src/common/components/clusterWizard/types.d.ts +0 -62
  3480. package/dist/src/common/components/clusterWizard/validationsInfoUtils.d.ts +0 -35
  3481. package/dist/src/common/components/clusters/PullSecret.d.ts +0 -7
  3482. package/dist/src/common/components/constants.d.ts +0 -2
  3483. package/dist/src/common/components/featureSupportLevels/FeatureSupportLevelBadge.d.ts +0 -8
  3484. package/dist/src/common/components/featureSupportLevels/FeatureSupportLevelContext.d.ts +0 -15
  3485. package/dist/src/common/components/featureSupportLevels/utils.d.ts +0 -5
  3486. package/dist/src/common/components/fetching/EventListFetch.d.ts +0 -3
  3487. package/dist/src/common/components/hosts/AITable.d.ts +0 -51
  3488. package/dist/src/common/components/hosts/AdditionalNTPSourcesDialog.d.ts +0 -12
  3489. package/dist/src/common/components/hosts/DiskLimitations.d.ts +0 -7
  3490. package/dist/src/common/components/hosts/DiskRole.d.ts +0 -14
  3491. package/dist/src/common/components/hosts/EditHostForm.d.ts +0 -13
  3492. package/dist/src/common/components/hosts/EditHostModal.d.ts +0 -15
  3493. package/dist/src/common/components/hosts/FormatDiskCheckbox.d.ts +0 -16
  3494. package/dist/src/common/components/hosts/HostProgress.d.ts +0 -5
  3495. package/dist/src/common/components/hosts/HostPropertyValidationPopover.d.ts +0 -12
  3496. package/dist/src/common/components/hosts/HostRequirements.d.ts +0 -15
  3497. package/dist/src/common/components/hosts/HostRowDetail.d.ts +0 -13
  3498. package/dist/src/common/components/hosts/HostStatus.d.ts +0 -4
  3499. package/dist/src/common/components/hosts/HostToolbarActions.d.ts +0 -10
  3500. package/dist/src/common/components/hosts/HostValidationGroups.d.ts +0 -20
  3501. package/dist/src/common/components/hosts/Hostname.d.ts +0 -13
  3502. package/dist/src/common/components/hosts/HostsCount.d.ts +0 -9
  3503. package/dist/src/common/components/hosts/HostsTable.d.ts +0 -19
  3504. package/dist/src/common/components/hosts/HostsTableDetailContext.d.ts +0 -11
  3505. package/dist/src/common/components/hosts/MassChangeHostnameModal.d.ts +0 -14
  3506. package/dist/src/common/components/hosts/MassDeleteHostModal.d.ts +0 -10
  3507. package/dist/src/common/components/hosts/NtpValidationStatus.d.ts +0 -9
  3508. package/dist/src/common/components/hosts/OcpConsoleNodesSectionLink.d.ts +0 -6
  3509. package/dist/src/common/components/hosts/RoleCell.d.ts +0 -13
  3510. package/dist/src/common/components/hosts/RoleDropdown.d.ts +0 -11
  3511. package/dist/src/common/components/hosts/TableToolbar.d.ts +0 -18
  3512. package/dist/src/common/components/hosts/VMRebootConfigurationInfo.d.ts +0 -3
  3513. package/dist/src/common/components/hosts/hardwareInfo.d.ts +0 -19
  3514. package/dist/src/common/components/hosts/index.d.ts +0 -16
  3515. package/dist/src/common/components/hosts/status.d.ts +0 -3
  3516. package/dist/src/common/components/hosts/tableUtils.d.ts +0 -22
  3517. package/dist/src/common/components/hosts/types.d.ts +0 -72
  3518. package/dist/src/common/components/hosts/usePagination.d.ts +0 -9
  3519. package/dist/src/common/components/hosts/utils.d.ts +0 -36
  3520. package/dist/src/common/components/storage/DisksTable.d.ts +0 -13
  3521. package/dist/src/common/components/storage/StorageDetail.d.ts +0 -11
  3522. package/dist/src/common/components/storage/StorageTable.d.ts +0 -11
  3523. package/dist/src/common/components/storage/StorageUtils.d.ts +0 -6
  3524. package/dist/src/common/components/ui/Alerts.d.ts +0 -5
  3525. package/dist/src/common/components/ui/BorderedIcon/BorderedIcon.d.ts +0 -10
  3526. package/dist/src/common/components/ui/ClusterEventsList.d.ts +0 -9
  3527. package/dist/src/common/components/ui/ClusterEventsToolbar.d.ts +0 -12
  3528. package/dist/src/common/components/ui/ConfirmationModal.d.ts +0 -13
  3529. package/dist/src/common/components/ui/DetailList.d.ts +0 -21
  3530. package/dist/src/common/components/ui/EventsList.d.ts +0 -8
  3531. package/dist/src/common/components/ui/ExternalLink.d.ts +0 -8
  3532. package/dist/src/common/components/ui/GridGap.d.ts +0 -7
  3533. package/dist/src/common/components/ui/ModalProgress.d.ts +0 -10
  3534. package/dist/src/common/components/ui/OpenShiftVersionDropown.d.ts +0 -17
  3535. package/dist/src/common/components/ui/PopoverIcon.d.ts +0 -14
  3536. package/dist/src/common/components/ui/PreviewBadge.d.ts +0 -14
  3537. package/dist/src/common/components/ui/PrismCode.d.ts +0 -11
  3538. package/dist/src/common/components/ui/RenderIf.d.ts +0 -6
  3539. package/dist/src/common/components/ui/SectionTitle.d.ts +0 -6
  3540. package/dist/src/common/components/ui/SimpleDropdown.d.ts +0 -15
  3541. package/dist/src/common/components/ui/StaticTextField.d.ts +0 -23
  3542. package/dist/src/common/components/ui/Toolbar/ToolbarButton.d.ts +0 -4
  3543. package/dist/src/common/components/ui/Toolbar/ToolbarProgress.d.ts +0 -4
  3544. package/dist/src/common/components/ui/Toolbar/ToolbarSecondaryGroup.d.ts +0 -3
  3545. package/dist/src/common/components/ui/Toolbar/ToolbarText.d.ts +0 -4
  3546. package/dist/src/common/components/ui/ViewClusterEventsButton.d.ts +0 -8
  3547. package/dist/src/common/components/ui/WizardFooter.d.ts +0 -22
  3548. package/dist/src/common/components/ui/WizardNavItem.d.ts +0 -7
  3549. package/dist/src/common/components/ui/eventsModal.d.ts +0 -29
  3550. package/dist/src/common/components/ui/formik/AddButton.d.ts +0 -7
  3551. package/dist/src/common/components/ui/formik/AdditionalNTPSourcesField.d.ts +0 -10
  3552. package/dist/src/common/components/ui/formik/CheckboxField.d.ts +0 -4
  3553. package/dist/src/common/components/ui/formik/CodeField.d.ts +0 -3
  3554. package/dist/src/common/components/ui/formik/FormikAutoSave.d.ts +0 -7
  3555. package/dist/src/common/components/ui/formik/HelperText.d.ts +0 -11
  3556. package/dist/src/common/components/ui/formik/InputField.d.ts +0 -8
  3557. package/dist/src/common/components/ui/formik/LabelField.d.ts +0 -13
  3558. package/dist/src/common/components/ui/formik/MultiSelectField.d.ts +0 -4
  3559. package/dist/src/common/components/ui/formik/NumberInputField.d.ts +0 -4
  3560. package/dist/src/common/components/ui/formik/PencilEditField.d.ts +0 -8
  3561. package/dist/src/common/components/ui/formik/PullSecretField.d.ts +0 -12
  3562. package/dist/src/common/components/ui/formik/RadioField.d.ts +0 -3
  3563. package/dist/src/common/components/ui/formik/RadioFieldWithTooltip.d.ts +0 -7
  3564. package/dist/src/common/components/ui/formik/RemovableField.d.ts +0 -10
  3565. package/dist/src/common/components/ui/formik/RichInputField.d.ts +0 -17
  3566. package/dist/src/common/components/ui/formik/SelectField.d.ts +0 -4
  3567. package/dist/src/common/components/ui/formik/SingleNodeCheckbox.d.ts +0 -8
  3568. package/dist/src/common/components/ui/formik/SwitchField.d.ts +0 -4
  3569. package/dist/src/common/components/ui/formik/TextAreaField.d.ts +0 -4
  3570. package/dist/src/common/components/ui/formik/TextAreaSecretField.d.ts +0 -4
  3571. package/dist/src/common/components/ui/formik/UploadField.d.ts +0 -4
  3572. package/dist/src/common/components/ui/formik/constants.d.ts +0 -50
  3573. package/dist/src/common/components/ui/formik/index.d.ts +0 -25
  3574. package/dist/src/common/components/ui/formik/types.d.ts +0 -117
  3575. package/dist/src/common/components/ui/formik/utils.d.ts +0 -24
  3576. package/dist/src/common/components/ui/formik/validationSchemas.d.ts +0 -33
  3577. package/dist/src/common/components/ui/index.d.ts +0 -23
  3578. package/dist/src/common/components/ui/table/utils.d.ts +0 -17
  3579. package/dist/src/common/components/ui/table/wrappable.d.ts +0 -8
  3580. package/dist/src/common/components/ui/uiState/EmptyState.d.ts +0 -11
  3581. package/dist/src/common/components/ui/uiState/ErrorState.d.ts +0 -14
  3582. package/dist/src/common/components/ui/uiState/LoadingState.d.ts +0 -8
  3583. package/dist/src/common/components/ui/utils.d.ts +0 -2
  3584. package/dist/src/common/config/constants.d.ts +0 -204
  3585. package/dist/src/common/features/featureGate.d.ts +0 -25
  3586. package/dist/src/common/hacks.d.ts +0 -1
  3587. package/dist/src/common/hooks/use-translation-wrapper.d.ts +0 -1
  3588. package/dist/src/common/hooks/useDeepCompareMemoize.d.ts +0 -2
  3589. package/dist/src/common/hooks/useFieldErrorMsg.d.ts +0 -8
  3590. package/dist/src/common/hooks/useFormikHelpers.d.ts +0 -6
  3591. package/dist/src/common/hooks/useStateSafely.d.ts +0 -3
  3592. package/dist/src/common/index.d.ts +0 -10
  3593. package/dist/src/common/reducers/alertsSlice.d.ts +0 -18
  3594. package/dist/src/common/reducers/dialogsSlice.d.ts +0 -9
  3595. package/dist/src/common/selectors/clusterSelectors.d.ts +0 -28
  3596. package/dist/src/common/sevices/DateAndTime.d.ts +0 -2
  3597. package/dist/src/common/types/clusters.d.ts +0 -53
  3598. package/dist/src/common/types/events.d.ts +0 -22
  3599. package/dist/src/common/types/featureSupportLevel.d.ts +0 -23
  3600. package/dist/src/common/types/hosts.d.ts +0 -19
  3601. package/dist/src/common/types/index.d.ts +0 -16
  3602. package/dist/src/common/types/proxyFields.d.ts +0 -7
  3603. package/dist/src/common/types/typescriptExtensions.d.ts +0 -9
  3604. package/dist/src/common/types/versions.d.ts +0 -10
  3605. package/dist/src/common/utils.d.ts +0 -2
  3606. package/dist/src/ocm/api/axiosClient.d.ts +0 -6
  3607. package/dist/src/ocm/api/axiosExtensions.d.ts +0 -2
  3608. package/dist/src/ocm/api/types.d.ts +0 -5
  3609. package/dist/src/ocm/api/utils.d.ts +0 -8
  3610. package/dist/src/ocm/components/AddHosts/AddHosts.d.ts +0 -1
  3611. package/dist/src/ocm/components/AddHosts/InventoryAddHost.d.ts +0 -5
  3612. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.d.ts +0 -2
  3613. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.d.ts +0 -5
  3614. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.d.ts +0 -2
  3615. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.d.ts +0 -2
  3616. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2StaticIP.d.ts +0 -2
  3617. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.d.ts +0 -2
  3618. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2Wizard.d.ts +0 -2
  3619. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2WizardContext.d.ts +0 -21
  3620. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.d.ts +0 -8
  3621. package/dist/src/ocm/components/AddHosts/day2Wizard/Day2WizardNav.d.ts +0 -2
  3622. package/dist/src/ocm/components/AddHosts/day2Wizard/constants.d.ts +0 -6
  3623. package/dist/src/ocm/components/AddHosts/types.d.ts +0 -46
  3624. package/dist/src/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.d.ts +0 -3
  3625. package/dist/src/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.d.ts +0 -2
  3626. package/dist/src/ocm/components/HostsClusterDetailTab/index.d.ts +0 -2
  3627. package/dist/src/ocm/components/HostsClusterDetailTab/types.d.ts +0 -6
  3628. package/dist/src/ocm/components/HostsClusterDetailTab/utils.d.ts +0 -4
  3629. package/dist/src/ocm/components/Router.d.ts +0 -8
  3630. package/dist/src/ocm/components/SentryErrorMonitorContextProvider.d.ts +0 -2
  3631. package/dist/src/ocm/components/SingleCluster.d.ts +0 -2
  3632. package/dist/src/ocm/components/clusterConfiguration/ArmCheckbox.d.ts +0 -7
  3633. package/dist/src/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.d.ts +0 -8
  3634. package/dist/src/ocm/components/clusterConfiguration/DiscoveryImageForm.d.ts +0 -9
  3635. package/dist/src/ocm/components/clusterConfiguration/DiscoveryImageModal.d.ts +0 -11
  3636. package/dist/src/ocm/components/clusterConfiguration/DiscoveryImageSummary.d.ts +0 -11
  3637. package/dist/src/ocm/components/clusterConfiguration/HostInventory.d.ts +0 -5
  3638. package/dist/src/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.d.ts +0 -4
  3639. package/dist/src/ocm/components/clusterConfiguration/InformationAndAlerts.d.ts +0 -5
  3640. package/dist/src/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.d.ts +0 -13
  3641. package/dist/src/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.d.ts +0 -7
  3642. package/dist/src/ocm/components/clusterConfiguration/ReviewCluster.d.ts +0 -6
  3643. package/dist/src/ocm/components/clusterConfiguration/ReviewStep.d.ts +0 -6
  3644. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.d.ts +0 -2
  3645. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.d.ts +0 -8
  3646. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.d.ts +0 -9
  3647. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts +0 -5
  3648. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.d.ts +0 -3
  3649. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.d.ts +0 -18
  3650. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.d.ts +0 -8
  3651. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.d.ts +0 -6
  3652. package/dist/src/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts +0 -4
  3653. package/dist/src/ocm/components/clusterConfiguration/operators/CnvCheckbox.d.ts +0 -3
  3654. package/dist/src/ocm/components/clusterConfiguration/operators/CnvHostRequirements.d.ts +0 -5
  3655. package/dist/src/ocm/components/clusterConfiguration/operators/LvmCheckbox.d.ts +0 -3
  3656. package/dist/src/ocm/components/clusterConfiguration/operators/LvmHostRequirements.d.ts +0 -5
  3657. package/dist/src/ocm/components/clusterConfiguration/operators/OdfCheckbox.d.ts +0 -4
  3658. package/dist/src/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.d.ts +0 -5
  3659. package/dist/src/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.d.ts +0 -2
  3660. package/dist/src/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.d.ts +0 -11
  3661. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.d.ts +0 -11
  3662. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.d.ts +0 -3
  3663. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.d.ts +0 -5
  3664. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.d.ts +0 -5
  3665. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.d.ts +0 -3
  3666. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.d.ts +0 -6
  3667. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.d.ts +0 -13
  3668. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.d.ts +0 -3
  3669. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.d.ts +0 -19
  3670. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.d.ts +0 -4
  3671. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.d.ts +0 -8
  3672. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.d.ts +0 -6
  3673. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.d.ts +0 -3
  3674. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.d.ts +0 -1
  3675. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.d.ts +0 -3
  3676. package/dist/src/ocm/components/clusterConfiguration/staticIp/components/propTypes.d.ts +0 -28
  3677. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/dataTypes.d.ts +0 -53
  3678. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/dummyData.d.ts +0 -20
  3679. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/emptyData.d.ts +0 -9
  3680. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.d.ts +0 -3
  3681. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.d.ts +0 -4
  3682. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.d.ts +0 -13
  3683. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.d.ts +0 -2
  3684. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.d.ts +0 -60
  3685. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.d.ts +0 -16
  3686. package/dist/src/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.d.ts +0 -8
  3687. package/dist/src/ocm/components/clusterDetail/AssistedInstallerDetailCard.d.ts +0 -8
  3688. package/dist/src/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.d.ts +0 -7
  3689. package/dist/src/ocm/components/clusterDetail/CancelInstallationModal.d.ts +0 -3
  3690. package/dist/src/ocm/components/clusterDetail/ClusterDetail.d.ts +0 -7
  3691. package/dist/src/ocm/components/clusterDetail/ClusterDetailStatusMessages.d.ts +0 -8
  3692. package/dist/src/ocm/components/clusterDetail/ClusterDetailStatusVarieties.d.ts +0 -18
  3693. package/dist/src/ocm/components/clusterDetail/ClusterDetailsButtonGroup.d.ts +0 -7
  3694. package/dist/src/ocm/components/clusterDetail/ClusterInstallationProgressCard.d.ts +0 -6
  3695. package/dist/src/ocm/components/clusterDetail/ClusterPollingErrorModal.d.ts +0 -2
  3696. package/dist/src/ocm/components/clusterDetail/ClusterProperties.d.ts +0 -7
  3697. package/dist/src/ocm/components/clusterDetail/OpenShiftVersionDetail.d.ts +0 -5
  3698. package/dist/src/ocm/components/clusterDetail/ProgressBarAlerts.d.ts +0 -15
  3699. package/dist/src/ocm/components/clusterDetail/ResetClusterModal.d.ts +0 -3
  3700. package/dist/src/ocm/components/clusterDetail/getProgressBarAlerts.d.ts +0 -3
  3701. package/dist/src/ocm/components/clusterDetail/utils.d.ts +0 -7
  3702. package/dist/src/ocm/components/clusterWizard/ClusterDetails.d.ts +0 -8
  3703. package/dist/src/ocm/components/clusterWizard/ClusterDetailsForm.d.ts +0 -17
  3704. package/dist/src/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.d.ts +0 -8
  3705. package/dist/src/ocm/components/clusterWizard/ClusterWizard.d.ts +0 -8
  3706. package/dist/src/ocm/components/clusterWizard/ClusterWizardContext.d.ts +0 -16
  3707. package/dist/src/ocm/components/clusterWizard/ClusterWizardContextProvider.d.ts +0 -8
  3708. package/dist/src/ocm/components/clusterWizard/ClusterWizardFooter.d.ts +0 -11
  3709. package/dist/src/ocm/components/clusterWizard/ClusterWizardNavigation.d.ts +0 -5
  3710. package/dist/src/ocm/components/clusterWizard/HostDiscovery.d.ts +0 -5
  3711. package/dist/src/ocm/components/clusterWizard/NewClusterWizard.d.ts +0 -3
  3712. package/dist/src/ocm/components/clusterWizard/Operators.d.ts +0 -6
  3713. package/dist/src/ocm/components/clusterWizard/OperatorsStep.d.ts +0 -2
  3714. package/dist/src/ocm/components/clusterWizard/StaticIp.d.ts +0 -7
  3715. package/dist/src/ocm/components/clusterWizard/Storage.d.ts +0 -5
  3716. package/dist/src/ocm/components/clusterWizard/constants.d.ts +0 -6
  3717. package/dist/src/ocm/components/clusterWizard/index.d.ts +0 -1
  3718. package/dist/src/ocm/components/clusterWizard/wizardTransition.d.ts +0 -19
  3719. package/dist/src/ocm/components/clusters/ClusterBreadcrumbs.d.ts +0 -7
  3720. package/dist/src/ocm/components/clusters/ClusterLoading.d.ts +0 -2
  3721. package/dist/src/ocm/components/clusters/ClusterPage.d.ts +0 -7
  3722. package/dist/src/ocm/components/clusters/ClusterPageErrors.d.ts +0 -2
  3723. package/dist/src/ocm/components/clusters/ClusterStatus.d.ts +0 -15
  3724. package/dist/src/ocm/components/clusters/ClusterToolbar.d.ts +0 -7
  3725. package/dist/src/ocm/components/clusters/Clusters.d.ts +0 -4
  3726. package/dist/src/ocm/components/clusters/ClustersListToolbar.d.ts +0 -12
  3727. package/dist/src/ocm/components/clusters/ClustersTable.d.ts +0 -8
  3728. package/dist/src/ocm/components/clusters/DeleteClusterModal.d.ts +0 -8
  3729. package/dist/src/ocm/components/clusters/NewClusterPage.d.ts +0 -2
  3730. package/dist/src/ocm/components/clusters/clusterPolling.d.ts +0 -17
  3731. package/dist/src/ocm/components/clusters/index.d.ts +0 -5
  3732. package/dist/src/ocm/components/clusters/utils.d.ts +0 -11
  3733. package/dist/src/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.d.ts +0 -11
  3734. package/dist/src/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts +0 -13
  3735. package/dist/src/ocm/components/featureSupportLevels/featureStateUtils.d.ts +0 -6
  3736. package/dist/src/ocm/components/fetching/fetchEvents.d.ts +0 -2
  3737. package/dist/src/ocm/components/hosts/AdditionaNTPSourceDialogToggle.d.ts +0 -1
  3738. package/dist/src/ocm/components/hosts/ClusterHostsTable.d.ts +0 -9
  3739. package/dist/src/ocm/components/hosts/DeleteHostModal.d.ts +0 -8
  3740. package/dist/src/ocm/components/hosts/HardwareStatus.d.ts +0 -21
  3741. package/dist/src/ocm/components/hosts/HostRequirementsContent.d.ts +0 -8
  3742. package/dist/src/ocm/components/hosts/HostsDiscoveryTable.d.ts +0 -6
  3743. package/dist/src/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.d.ts +0 -5
  3744. package/dist/src/ocm/components/hosts/HostsStorageTable.d.ts +0 -7
  3745. package/dist/src/ocm/components/hosts/HostsTableEmptyState.d.ts +0 -5
  3746. package/dist/src/ocm/components/hosts/ModalDialogsContext.d.ts +0 -53
  3747. package/dist/src/ocm/components/hosts/NetworkingStatus.d.ts +0 -4
  3748. package/dist/src/ocm/components/hosts/OdfDisksManualFormattingHint.d.ts +0 -2
  3749. package/dist/src/ocm/components/hosts/ResetHostModal.d.ts +0 -9
  3750. package/dist/src/ocm/components/hosts/StorageAlerts.d.ts +0 -5
  3751. package/dist/src/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.d.ts +0 -2
  3752. package/dist/src/ocm/components/hosts/UpdateDay2ApiVipForm.d.ts +0 -11
  3753. package/dist/src/ocm/components/hosts/UpdateDay2ApiVipModal.d.ts +0 -7
  3754. package/dist/src/ocm/components/hosts/use-hosts-table.d.ts +0 -39
  3755. package/dist/src/ocm/components/hosts/utils.d.ts +0 -4
  3756. package/dist/src/ocm/components/index.d.ts +0 -7
  3757. package/dist/src/ocm/components/ui/AssistedUILibVersion.d.ts +0 -2
  3758. package/dist/src/ocm/components/ui/InfoLinkWithModal.d.ts +0 -11
  3759. package/dist/src/ocm/components/ui/OcmFormFields.d.ts +0 -22
  3760. package/dist/src/ocm/config/constants.d.ts +0 -8
  3761. package/dist/src/ocm/config/routeBaseBath.d.ts +0 -2
  3762. package/dist/src/ocm/hooks/useClusterPreflightRequirements.d.ts +0 -7
  3763. package/dist/src/ocm/hooks/useClusterSupportedPlatforms.d.ts +0 -10
  3764. package/dist/src/ocm/hooks/useInfraEnv.d.ts +0 -7
  3765. package/dist/src/ocm/hooks/useInfraEnvId.d.ts +0 -5
  3766. package/dist/src/ocm/hooks/useInfraEnvImageUrl.d.ts +0 -9
  3767. package/dist/src/ocm/hooks/useManagedDomains.d.ts +0 -2
  3768. package/dist/src/ocm/hooks/useOpenshiftVersions.d.ts +0 -15
  3769. package/dist/src/ocm/hooks/usePullSecret.d.ts +0 -1
  3770. package/dist/src/ocm/hooks/useSetClusterPermissions.d.ts +0 -2
  3771. package/dist/src/ocm/hooks/useUsedClusterNames.d.ts +0 -4
  3772. package/dist/src/ocm/index.d.ts +0 -11
  3773. package/dist/src/ocm/reducers/clusters/clustersSlice.d.ts +0 -25
  3774. package/dist/src/ocm/reducers/clusters/currentClusterSlice.d.ts +0 -130
  3775. package/dist/src/ocm/selectors/clusters.d.ts +0 -61
  3776. package/dist/src/ocm/selectors/currentCluster.d.ts +0 -13
  3777. package/dist/src/ocm/sentry.d.ts +0 -2
  3778. package/dist/src/ocm/services/ClusterDetailsService.d.ts +0 -14
  3779. package/dist/src/ocm/services/ClustersService.d.ts +0 -16
  3780. package/dist/src/ocm/services/CpuArchitectureService.d.ts +0 -14
  3781. package/dist/src/ocm/services/Day2ClusterService.d.ts +0 -87
  3782. package/dist/src/ocm/services/DiscoveryImageFormService.d.ts +0 -9
  3783. package/dist/src/ocm/services/DiskEncryptionService.d.ts +0 -6
  3784. package/dist/src/ocm/services/HostDiscoveryService.d.ts +0 -6
  3785. package/dist/src/ocm/services/HostsService.d.ts +0 -20
  3786. package/dist/src/ocm/services/InfraEnvIdsCacheService.d.ts +0 -9
  3787. package/dist/src/ocm/services/InfraEnvsService.d.ts +0 -13
  3788. package/dist/src/ocm/services/OperatorsService.d.ts +0 -11
  3789. package/dist/src/ocm/services/apis/ClustersAPI.d.ts +0 -35
  3790. package/dist/src/ocm/services/apis/ComponentVersionsAPI.d.ts +0 -6
  3791. package/dist/src/ocm/services/apis/EventsAPI.d.ts +0 -7
  3792. package/dist/src/ocm/services/apis/FeatureSupportLevelsAPI.d.ts +0 -6
  3793. package/dist/src/ocm/services/apis/HostsAPI.d.ts +0 -14
  3794. package/dist/src/ocm/services/apis/InfraEnvsAPI.d.ts +0 -17
  3795. package/dist/src/ocm/services/apis/ManagedDomainsAPI.d.ts +0 -6
  3796. package/dist/src/ocm/services/apis/SupportedOpenshiftVersionsAPI.d.ts +0 -6
  3797. package/dist/src/ocm/services/apis/types.d.ts +0 -13
  3798. package/dist/src/ocm/services/types.d.ts +0 -11
  3799. package/dist/src/ocm/store/index.d.ts +0 -36
  3800. package/dist/src/ocm/store/slices/infraEnvs/slice.d.ts +0 -3
  3801. package/dist/src/ocm/types.d.ts +0 -5
  3802. /package/{dist/src/cim/components/Agent/index.d.ts → lib/cim/components/Agent/index.ts} +0 -0
  3803. /package/{dist/src/cim/components/Hypershift/DetailsPage/index.d.ts → lib/cim/components/Hypershift/DetailsPage/index.ts} +0 -0
  3804. /package/{dist/src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.d.ts → lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/index.ts} +0 -0
  3805. /package/{dist/src/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.d.ts → lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/index.ts} +0 -0
  3806. /package/{dist/src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.d.ts → lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/index.ts} +0 -0
  3807. /package/{dist/src/cim/components/Hypershift/HostedClusterWizard/index.d.ts → lib/cim/components/Hypershift/HostedClusterWizard/index.ts} +0 -0
  3808. /package/{dist/src/cim/components/Hypershift/utils/index.d.ts → lib/cim/components/Hypershift/utils/index.ts} +0 -0
  3809. /package/{dist/src/cim/components/YamlPreview/index.d.ts → lib/cim/components/YamlPreview/index.ts} +0 -0
  3810. /package/{dist/src/cim/components/common/index.d.ts → lib/cim/components/common/index.ts} +0 -0
  3811. /package/{dist/src/cim/components/featureSupportLevels/index.d.ts → lib/cim/components/featureSupportLevels/index.ts} +0 -0
  3812. /package/{dist/src/cim/components/helpers/index.d.ts → lib/cim/components/helpers/index.ts} +0 -0
  3813. /package/{dist/src/cim/components/index.d.ts → lib/cim/components/index.ts} +0 -0
  3814. /package/{dist/src/cim/components/modals/CimConfiguration/index.d.ts → lib/cim/components/modals/CimConfiguration/index.ts} +0 -0
  3815. /package/{dist/src/cim/types/fromOCP/index.d.ts → lib/cim/types/fromOCP/index.ts} +0 -0
  3816. /package/{dist/src/cim/types/index.d.ts → lib/cim/types/index.ts} +0 -0
  3817. /package/{dist/src/cim/types/k8s/index.d.ts → lib/cim/types/k8s/index.ts} +0 -0
  3818. /package/{dist/src/common/api/index.d.ts → lib/common/api/index.ts} +0 -0
  3819. /package/{dist/src/common/components/AddHosts/index.d.ts → lib/common/components/AddHosts/index.ts} +0 -0
  3820. /package/{dist/src/common/components/clusterDetail/index.d.ts → lib/common/components/clusterDetail/index.ts} +0 -0
  3821. /package/{dist/src/common/components/clusterWizard/networkingSteps/index.d.ts → lib/common/components/clusterWizard/networkingSteps/index.ts} +0 -0
  3822. /package/{dist/src/common/components/clusters/index.d.ts → lib/common/components/clusters/index.ts} +0 -0
  3823. /package/{dist/src/common/components/featureSupportLevels/index.d.ts → lib/common/components/featureSupportLevels/index.ts} +0 -0
  3824. /package/{dist/src/common/components/fetching/index.d.ts → lib/common/components/fetching/index.ts} +0 -0
  3825. /package/{dist/src/common/components/index.d.ts → lib/common/components/index.ts} +0 -0
  3826. /package/{dist/src/common/components/ui/Toolbar/index.d.ts → lib/common/components/ui/Toolbar/index.tsx} +0 -0
  3827. /package/{dist/src/common/components/ui/table/index.d.ts → lib/common/components/ui/table/index.ts} +0 -0
  3828. /package/{dist/src/common/components/ui/uiState/index.d.ts → lib/common/components/ui/uiState/index.ts} +0 -0
  3829. /package/{dist/src/common/config/index.d.ts → lib/common/config/index.ts} +0 -0
  3830. /package/{dist/src/common/features/index.d.ts → lib/common/features/index.ts} +0 -0
  3831. /package/{dist/src/common/hooks/index.d.ts → lib/common/hooks/index.ts} +0 -0
  3832. /package/{dist/src/common/reducers/index.d.ts → lib/common/reducers/index.ts} +0 -0
  3833. /package/{dist/src/common/selectors/index.d.ts → lib/common/selectors/index.ts} +0 -0
  3834. /package/{dist/src/index.d.ts → lib/index.ts} +0 -0
  3835. /package/{dist/src/ocm/api/index.d.ts → lib/ocm/api/index.ts} +0 -0
  3836. /package/{dist/src/ocm/components/AddHosts/index.d.ts → lib/ocm/components/AddHosts/index.ts} +0 -0
  3837. /package/{dist/src/ocm/components/clusterDetail/index.d.ts → lib/ocm/components/clusterDetail/index.ts} +0 -0
  3838. /package/{dist/src/ocm/components/featureSupportLevels/index.d.ts → lib/ocm/components/featureSupportLevels/index.ts} +0 -0
  3839. /package/{dist/src/ocm/components/ui/index.d.ts → lib/ocm/components/ui/index.ts} +0 -0
  3840. /package/{dist/src/ocm/config/index.d.ts → lib/ocm/config/index.ts} +0 -0
  3841. /package/{dist/src/ocm/hooks/index.d.ts → lib/ocm/hooks/index.ts} +0 -0
  3842. /package/{dist/src/ocm/reducers/clusters/index.d.ts → lib/ocm/reducers/clusters/index.ts} +0 -0
  3843. /package/{dist/src/ocm/selectors/index.d.ts → lib/ocm/selectors/index.ts} +0 -0
  3844. /package/{dist/src/ocm/services/apis/index.d.ts → lib/ocm/services/apis/index.ts} +0 -0
  3845. /package/{dist/src/ocm/services/index.d.ts → lib/ocm/services/index.ts} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../node_modules/tslib/tslib.js", "../../src/ocm/api/index.ts", "../../src/ocm/api/axiosClient.ts", "../../node_modules/tslib/modules/index.js", "../../node_modules/lower-case/src/index.ts", "../../node_modules/no-case/src/index.ts", "../../node_modules/pascal-case/src/index.ts", "../../node_modules/camel-case/src/index.ts", "../../src/ocm/api/utils.ts", "../../src/ocm/sentry.ts", "../../src/common/types/clusters.ts", "../../src/common/types/featureSupportLevel.ts", "../../src/common/types/typescriptExtensions.ts", "../../src/common/types/index.ts", "../../src/ocm/api/axiosExtensions.ts", "../../src/ocm/api/types.ts", "../../src/common/utils.ts", "../../src/ocm/store/index.ts", "../../src/ocm/reducers/clusters/clustersSlice.ts", "../../src/common/hacks.ts", "../../src/common/components/ui/formik/InputField.tsx", "../../src/common/components/ui/formik/utils.ts", "../../src/common/components/ui/formik/HelperText.tsx", "../../src/common/hooks/useFieldErrorMsg.tsx", "../../src/common/components/ui/formik/CheckboxField.tsx", "../../src/common/components/ui/formik/TextAreaField.tsx", "../../src/common/components/ui/formik/SelectField.tsx", "../../src/common/components/ui/formik/MultiSelectField.tsx", "../../src/common/hooks/use-translation-wrapper.ts", "../../src/common/components/ui/formik/TextAreaSecretField.tsx", "../../src/common/components/ui/formik/UploadField.tsx", "../../src/common/components/ui/formik/SwitchField.tsx", "../../src/common/components/ui/formik/FormikAutoSave.tsx", "../../src/common/components/ui/formik/PullSecretField.tsx", "../../src/common/config/index.ts", "../../src/common/config/constants.ts", "../../src/common/components/ui/PopoverIcon.tsx", "../../src/common/components/ui/formik/RadioField.tsx", "../../src/common/components/ui/formik/SingleNodeCheckbox.tsx", "../../src/common/features/index.ts", "../../src/common/features/featureGate.tsx", "../../src/common/components/featureSupportLevels/FeatureSupportLevelBadge.tsx", "../../src/common/components/ui/PreviewBadge.tsx", "../../src/common/components/ui/ExternalLink.tsx", "../../src/common/components/featureSupportLevels/FeatureSupportLevelContext.tsx", "../../src/common/components/ui/formik/NumberInputField.tsx", "../../src/common/components/ui/formik/CodeField.tsx", "../../src/common/components/ui/formik/RichInputField.tsx", "../../src/common/components/ui/formik/AdditionalNTPSourcesField.tsx", "../../src/common/components/ui/formik/RemovableField.tsx", "../../src/common/components/ui/formik/AddButton.tsx", "../../src/common/components/ui/formik/PencilEditField.tsx", "../../src/common/components/ui/formik/validationSchemas.ts", "../../src/common/components/clusterConfiguration/utils.ts", "../../src/common/api/utils.ts", "../../src/common/selectors/clusterSelectors.ts", "../../src/common/components/hosts/utils.ts", "../../src/common/components/constants.ts", "../../src/common/components/ui/formik/constants.tsx", "../../src/common/components/ui/formik/LabelField.tsx", "../../src/common/components/ui/uiState/EmptyState.tsx", "../../src/common/components/ui/uiState/ErrorState.tsx", "../../src/common/components/ui/uiState/LoadingState.tsx", "../../src/common/components/ui/Toolbar/ToolbarButton.tsx", "../../src/common/components/ui/Toolbar/ToolbarText.tsx", "../../src/common/components/ui/Toolbar/ToolbarProgress.tsx", "../../src/common/components/ui/Toolbar/ToolbarSecondaryGroup.tsx", "../../src/common/components/ui/StaticTextField.tsx", "../../src/common/components/ui/WizardFooter.tsx", "../../src/common/components/ui/ViewClusterEventsButton.tsx", "../../src/common/components/ui/eventsModal.tsx", "../../src/common/components/fetching/EventListFetch.tsx", "../../src/common/components/ui/EventsList.tsx", "../../src/common/components/ui/utils.ts", "../../src/common/components/ui/table/utils.ts", "../../src/common/components/ui/table/wrappable.ts", "../../src/common/components/ui/ClusterEventsList.tsx", "../../src/common/components/ui/ClusterEventsToolbar.tsx", "../../src/common/components/ui/RenderIf.tsx", "../../src/common/components/ui/SimpleDropdown.tsx", "../../src/common/components/ui/DetailList.tsx", "../../src/common/components/ui/WizardNavItem.tsx", "../../src/common/components/ui/Alerts.tsx", "../../src/common/components/AlertsContextProvider.tsx", "../../src/common/reducers/index.ts", "../../src/common/reducers/alertsSlice.ts", "../../src/common/reducers/dialogsSlice.ts", "../../src/common/components/ui/PrismCode.tsx", "../../src/common/components/ui/GridGap.tsx", "../../src/common/components/ui/ModalProgress.tsx", "../../src/common/components/ui/ConfirmationModal.tsx", "../../src/common/components/clusterWizard/ClusterWizardStepHeader.tsx", "../../src/common/components/clusterWizard/ClusterWizardStep.tsx", "../../src/common/components/clusterWizard/ClusterWizardStepValidationsAlert.tsx", "../../src/common/components/clusterWizard/validationsInfoUtils.ts", "../../src/common/components/clusterWizard/ReviewHostsInventory.tsx", "../../src/common/components/hosts/HostValidationGroups.tsx", "../../src/common/components/hosts/Hostname.tsx", "../../src/common/components/hosts/RoleCell.tsx", "../../src/common/components/hosts/RoleDropdown.tsx", "../../src/common/hooks/useStateSafely.ts", "../../src/common/hooks/useDeepCompareMemoize.ts", "../../src/common/components/hosts/HostsCount.tsx", "../../src/common/components/hosts/HostStatus.tsx", "../../src/common/components/hosts/HostProgress.tsx", "../../src/common/components/hosts/OcpConsoleNodesSectionLink.tsx", "../../src/common/components/AddHosts/AddHostsContext.tsx", "../../src/common/components/hosts/EditHostModal.tsx", "../../src/common/components/hosts/EditHostForm.tsx", "../../src/common/components/hosts/HostRequirements.tsx", "../../src/common/components/hosts/VMRebootConfigurationInfo.tsx", "../../src/common/components/hosts/TableToolbar.tsx", "../../src/common/components/hosts/HostToolbarActions.tsx", "../../src/common/components/hosts/MassChangeHostnameModal.tsx", "../../src/common/components/hosts/MassDeleteHostModal.tsx", "../../src/common/components/hosts/status.tsx", "../../src/common/components/hosts/hardwareInfo.ts", "../../src/common/components/clusterWizard/ReviewValidations.tsx", "../../src/common/components/clusterWizard/clusterDetailsValidation.ts", "../../src/common/components/clusterDetail/ClusterPropertiesList.tsx", "../../src/common/components/clusterDetail/ClusterProgress.tsx", "../../src/common/components/clusterDetail/ClusterCredentials.tsx", "../../src/common/components/clusterDetail/ConsoleModal.tsx", "../../src/common/components/clusterDetail/KubeconfigDownload.tsx", "../../src/ocm/services/apis/ClustersAPI.ts", "../../src/common/components/clusterConfiguration/SNOControlGroup.tsx", "../../src/common/components/clusterConfiguration/SNODisclaimer.tsx", "../../src/common/components/clusterConfiguration/OpenShiftVersionSelect.tsx", "../../src/common/sevices/DateAndTime.tsx", "../../src/common/components/clusterConfiguration/UploadSSH.tsx", "../../src/common/components/clusterConfiguration/SecurityFields.tsx", "../../src/common/components/clusterConfiguration/ProxyFields.tsx", "../../src/common/components/clusterConfiguration/DownloadIsoModal.tsx", "../../src/common/components/clusterConfiguration/DownloadIso.tsx", "../../src/common/components/clusterConfiguration/DiscoveryInstructions.tsx", "../../src/common/components/clusterConfiguration/DiscoveryImageConfigForm.tsx", "../../src/common/components/clusterConfiguration/DiscoveryImageTypeControlGroup.tsx", "../../src/common/components/clusterConfiguration/FormatDiskWarning.tsx", "../../src/common/components/clusterConfiguration/DiscoveryTroubleshootingModal.tsx", "../../src/common/components/clusters/PullSecret.tsx", "../../src/ocm/services/apis/index.ts", "../../src/ocm/services/apis/ManagedDomainsAPI.tsx", "../../src/ocm/services/apis/SupportedOpenshiftVersionsAPI.ts", "../../src/ocm/services/apis/ComponentVersionsAPI.ts", "../../src/ocm/services/apis/InfraEnvsAPI.ts", "../../src/ocm/services/apis/HostsAPI.ts", "../../src/ocm/services/apis/EventsAPI.ts", "../../src/ocm/services/apis/FeatureSupportLevelsAPI.ts", "../../src/ocm/reducers/clusters/currentClusterSlice.ts", "../../src/ocm/services/index.ts", "../../src/ocm/services/HostsService.ts", "../../src/ocm/services/InfraEnvIdsCacheService.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/dataTypes.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/nmstateTypes.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/nmstateYaml.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/dummyData.ts", "../../src/ocm/services/InfraEnvsService.ts", "../../src/ocm/services/ClustersService.ts", "../../src/ocm/services/ClusterDetailsService.ts", "../../src/ocm/services/DiskEncryptionService.ts", "../../src/ocm/services/types.ts", "../../src/ocm/services/HostDiscoveryService.ts", "../../src/ocm/services/DiscoveryImageFormService.ts", "../../src/ocm/components/clusters/utils.ts", "../../src/ocm/services/OperatorsService.tsx", "../../src/ocm/store/slices/infraEnvs/slice.ts", "../../src/ocm/selectors/index.ts", "../../src/ocm/selectors/currentCluster.ts", "../../src/ocm/selectors/clusters.tsx", "../../src/ocm/components/clusters/ClusterStatus.tsx", "../../src/ocm/config/routeBaseBath.ts", "../../src/ocm/config/index.ts", "../../src/ocm/config/constants.ts", "../../src/ocm/components/clusterDetail/utils.tsx", "../../src/ocm/components/clusterDetail/ClusterDetail.tsx", "../../src/ocm/components/hosts/ClusterHostsTable.tsx", "../../src/ocm/components/hosts/AdditionaNTPSourceDialogToggle.tsx", "../../src/ocm/components/hosts/ModalDialogsContext.tsx", "../../src/common/components/hosts/tableUtils.tsx", "../../src/common/components/hosts/HostPropertyValidationPopover.tsx", "../../src/common/components/hosts/usePagination.ts", "../../src/ocm/components/hosts/use-hosts-table.tsx", "../../src/common/components/hosts/AdditionalNTPSourcesDialog.tsx", "../../src/ocm/components/hosts/utils.ts", "../../src/common/components/hosts/HostsTable.tsx", "../../src/common/components/hosts/AITable.tsx", "../../src/common/components/hosts/HostRowDetail.tsx", "../../src/common/components/hosts/NtpValidationStatus.tsx", "../../src/common/components/storage/StorageDetail.tsx", "../../src/common/components/storage/DisksTable.tsx", "../../src/common/components/hosts/DiskRole.tsx", "../../src/common/components/hosts/DiskLimitations.tsx", "../../src/common/components/hosts/FormatDiskCheckbox.tsx", "../../src/common/components/ui/SectionTitle.tsx", "../../src/ocm/components/hosts/ResetHostModal.tsx", "../../src/ocm/components/hosts/DeleteHostModal.tsx", "../../src/ocm/components/fetching/fetchEvents.ts", "../../src/ocm/components/hosts/UpdateDay2ApiVipModal.tsx", "../../src/ocm/components/hosts/UpdateDay2ApiVipForm.tsx", "../../src/ocm/components/hosts/HardwareStatus.tsx", "../../src/ocm/components/clusterWizard/wizardTransition.ts", "../../src/ocm/components/hosts/HostsTableEmptyState.tsx", "../../src/ocm/components/hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal.tsx", "../../src/ocm/components/ui/InfoLinkWithModal.tsx", "../../src/ocm/components/hosts/UpdateDay2ApiVipDialogToggle.tsx", "../../src/common/components/hosts/HostsTableDetailContext.tsx", "../../src/ocm/components/clusters/ClusterToolbar.tsx", "../../src/ocm/components/clusterDetail/ClusterProperties.tsx", "../../src/ocm/components/featureSupportLevels/FeatureSupportLevelProvider.tsx", "../../src/ocm/hooks/useOpenshiftVersions.tsx", "../../src/ocm/hooks/useClusterSupportedPlatforms.ts", "../../src/ocm/hooks/useManagedDomains.ts", "../../src/ocm/hooks/useUsedClusterNames.ts", "../../src/ocm/hooks/useInfraEnvId.ts", "../../src/ocm/hooks/usePullSecret.ts", "../../src/ocm/hooks/useClusterPreflightRequirements.ts", "../../src/ocm/components/featureSupportLevels/featureStateUtils.ts", "../../src/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.tsx", "../../src/common/components/featureSupportLevels/utils.ts", "../../src/common/components/ErrorHandling/WithErrorBoundary.tsx", "../../src/common/components/ErrorHandling/ErrorMonitorContext.tsx", "../../src/ocm/components/clusterDetail/OpenShiftVersionDetail.tsx", "../../src/ocm/components/clusterDetail/ClusterDetailStatusVarieties.tsx", "../../src/ocm/components/clusterDetail/ClusterDetailStatusMessages.tsx", "../../src/ocm/components/clusterConfiguration/ClusterDefaultConfigurationContext.tsx", "../../src/common/components/clusterDetail/ClusterProgressItems.tsx", "../../src/common/components/clusterDetail/ProgressBarTexts.tsx", "../../src/common/components/clusterDetail/ClusterProgressItem.tsx", "../../src/common/components/ui/BorderedIcon/BorderedIcon.tsx", "../../src/common/components/clusterDetail/FinalizingProgress.tsx", "../../src/common/components/clusterDetail/OperatorsProgressItem.tsx", "../../src/ocm/components/clusterDetail/getProgressBarAlerts.tsx", "../../src/ocm/components/clusterDetail/ProgressBarAlerts.tsx", "../../src/ocm/components/clusterDetail/ClusterInstallationProgressCard.tsx", "../../src/ocm/components/clusterDetail/ClusterDetailsButtonGroup.tsx", "../../src/ocm/components/clusterDetail/AssistedInstallerDetailCard.tsx", "../../src/ocm/components/clusters/clusterPolling.ts", "../../src/ocm/components/clusterWizard/ClusterWizard.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx", "../../src/ocm/components/clusterWizard/ClusterWizardContext.tsx", "../../src/ocm/components/clusterWizard/ClusterWizardFooter.tsx", "../../src/ocm/components/clusterWizard/ClusterPlatformIntegrationHint.tsx", "../../src/ocm/components/clusterWizard/ClusterWizardNavigation.tsx", "../../src/ocm/components/clusterWizard/constants.ts", "../../src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTable.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationTableBase.tsx", "../../src/ocm/components/hosts/NetworkingStatus.tsx", "../../src/ocm/hooks/useInfraEnv.ts", "../../src/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts", "../../src/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfiguration.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.tsx", "../../src/ocm/components/ui/OcmFormFields.tsx", "../../src/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.tsx", "../../src/common/components/clusterWizard/networkingSteps/UserManagedNetworkingTextContent.tsx", "../../src/common/components/clusterWizard/networkingSteps/ManagedNetworkingControlGroup.tsx", "../../src/common/components/ui/formik/RadioFieldWithTooltip.tsx", "../../src/common/components/clusterWizard/networkingSteps/VirtualIPControlGroup.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.tsx", "../../src/ocm/components/clusterConfiguration/networkConfiguration/AdvancedNetworkFields.tsx", "../../src/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.tsx", "../../src/ocm/components/clusterConfiguration/ReviewStep.tsx", "../../src/ocm/components/clusterConfiguration/ReviewCluster.tsx", "../../src/ocm/components/clusterWizard/ClusterDetails.tsx", "../../src/ocm/components/clusterWizard/ClusterDetailsForm.tsx", "../../src/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.tsx", "../../src/ocm/components/clusterConfiguration/ArmCheckbox.tsx", "../../src/ocm/components/clusterConfiguration/HostsNetworkConfigurationControlGroup.tsx", "../../src/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup.tsx", "../../src/common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionMode.tsx", "../../src/common/components/clusterConfiguration/DiskEncryptionFields/TangServers.tsx", "../../src/ocm/components/clusterConfiguration/OcmOpenShiftVersionSelect.tsx", "../../src/common/components/ui/OpenShiftVersionDropown.tsx", "../../src/ocm/components/clusterWizard/HostDiscovery.tsx", "../../src/ocm/components/clusterConfiguration/HostInventory.tsx", "../../src/ocm/components/hosts/HostsDiscoveryTable.tsx", "../../src/ocm/components/clusterConfiguration/DiscoveryImageModal.tsx", "../../src/ocm/components/clusterConfiguration/DiscoveryImageForm.tsx", "../../src/ocm/components/clusterConfiguration/DiscoveryImageSummary.tsx", "../../src/ocm/hooks/useInfraEnvImageUrl.ts", "../../src/ocm/components/clusterConfiguration/InformationAndAlerts.tsx", "../../src/ocm/components/hosts/HostRequirementsContent.tsx", "../../src/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegration.tsx", "../../src/ocm/components/clusterConfiguration/platformIntegration/PlatformIntegrationVsphere.tsx", "../../src/ocm/components/clusterWizard/Storage.tsx", "../../src/ocm/components/hosts/HostsStorageTable.tsx", "../../src/common/components/storage/StorageUtils.tsx", "../../src/common/components/storage/StorageTable.tsx", "../../src/ocm/components/hosts/StorageAlerts.tsx", "../../src/ocm/components/hosts/OdfDisksManualFormattingHint.tsx", "../../src/ocm/components/clusterWizard/StaticIp.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/StaticIpPage.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/StaticIpViewRadioGroup.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/data/formDataFromInfraEnvField.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/protocolVersion.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/emptyData.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/fromInfraEnv.ts", "../../src/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/StaticIpForm.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/commonValidationSchemas.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlViewFields.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/StaticIpHostsArray.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/CollapsedHost.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/YamlView/MacIpMapping.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHostsFields.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/data/machineNetwork.ts", "../../src/ocm/components/clusterConfiguration/staticIp/data/formDataToInfraEnvField.ts", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide.tsx", "../../src/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx", "../../src/ocm/components/clusterWizard/Operators.tsx", "../../src/ocm/components/clusterWizard/OperatorsStep.tsx", "../../src/ocm/components/clusterConfiguration/operators/CnvCheckbox.tsx", "../../src/ocm/components/clusterConfiguration/operators/CnvHostRequirements.tsx", "../../src/ocm/components/clusterConfiguration/operators/OdfCheckbox.tsx", "../../src/ocm/components/clusterConfiguration/operators/LvmCheckbox.tsx", "../../src/ocm/components/clusterConfiguration/operators/LvmHostRequirements.tsx", "../../src/ocm/components/clusterDetail/CancelInstallationModal.tsx", "../../src/ocm/components/clusterDetail/ResetClusterModal.tsx", "../../src/ocm/components/clusterDetail/ClusterPollingErrorModal.tsx", "../../src/ocm/components/SentryErrorMonitorContextProvider.tsx", "../../src/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx", "../../src/ocm/hooks/useSetClusterPermissions.ts", "../../src/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.tsx", "../../src/ocm/components/clusters/Clusters.tsx", "../../src/ocm/components/clusters/ClustersTable.tsx", "../../src/ocm/components/clusters/DeleteClusterModal.tsx", "../../src/ocm/components/clusters/ClustersListToolbar.tsx", "../../src/ocm/components/clusters/ClusterBreadcrumbs.tsx", "../../src/ocm/components/clusters/NewClusterPage.tsx", "../../src/ocm/components/clusterWizard/NewClusterWizard.tsx", "../../src/ocm/components/clusters/ClusterLoading.tsx", "../../src/ocm/components/clusters/ClusterPageErrors.tsx", "../../src/ocm/components/clusters/ClusterPage.tsx", "../../src/ocm/components/AddHosts/AddHosts.tsx", "../../src/ocm/components/AddHosts/InventoryAddHost.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2WizardContextProvider.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2WizardContext.tsx", "../../src/ocm/components/AddHosts/day2Wizard/constants.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2DiscoveryImageModalButton.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2Wizard.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2ClusterDetails.tsx", "../../src/common/components/clusterConfiguration/DiscoveryImageCpuArchitectureControlGroup.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2WizardNav.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.tsx", "../../src/ocm/services/CpuArchitectureService.ts", "../../src/ocm/components/AddHosts/day2Wizard/Day2DownloadISO.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2GenerateISO.tsx", "../../src/ocm/components/AddHosts/day2Wizard/Day2StaticIP.tsx", "../../src/ocm/components/ui/AssistedUILibVersion.tsx", "../../src/ocm/components/Router.tsx", "../../src/ocm/components/SingleCluster.tsx", "../../src/ocm/services/Day2ClusterService.ts", "../../src/ocm/components/HostsClusterDetailTab/utils.ts", "../../src/ocm/components/HostsClusterDetailTab/HostsClusterDetailTab.tsx", "../../src/ocm/components/HostsClusterDetailTab/HostsClusterDetailTabContent.tsx"],
4
- "sourcesContent": ["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __classPrivateFieldIn;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n __classPrivateFieldIn = function (state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n exporter(\"__classPrivateFieldIn\", __classPrivateFieldIn);\r\n});\r\n", "export * from './axiosClient';\nexport * from './utils';\n", "import axios, { AxiosInstance } from 'axios';\nimport applyCaseMiddleware from 'axios-case-converter';\nimport { camelCase } from 'camel-case';\n\n// conforms basePath in swagger.json\nexport const BASE_PATH = '/api/assisted-install';\n\n// Prevent axios converter to change object keys from '4.7-fc2' to '4_7Fc2'\nconst axiosCaseConverterOptions = {\n caseFunctions: {\n camel: (input: string) =>\n camelCase(input, {\n stripRegexp: /[^A-Z0-9.-]+/gi,\n }),\n },\n};\n\nconst getDefaultClient = () => {\n const client = axios.create();\n client.interceptors.request.use((cfg) => ({\n ...cfg,\n url: `${process.env.REACT_APP_API_ROOT}${cfg.url}`,\n }));\n return applyCaseMiddleware(client, axiosCaseConverterOptions);\n};\n\nlet client: AxiosInstance = getDefaultClient();\nlet ocmClient: AxiosInstance | null;\n\nconst aiInterceptor = (client: AxiosInstance) => {\n client.interceptors.request.use((cfg) => ({\n ...cfg,\n url: `${BASE_PATH}${cfg.url}`,\n }));\n return client;\n};\n\nexport const setAuthInterceptor = (authInterceptor: (client: AxiosInstance) => AxiosInstance) => {\n ocmClient = authInterceptor(axios.create());\n client = applyCaseMiddleware(\n aiInterceptor(authInterceptor(axios.create())),\n axiosCaseConverterOptions,\n );\n};\n\nexport { client, ocmClient };\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n};\r\n", "/**\n * Locale character mapping rules.\n */\ninterface Locale {\n regexp: RegExp;\n map: Record<string, string>;\n}\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\nconst SUPPORTED_LOCALE: Record<string, Locale> = {\n tr: {\n regexp: /\\u0130|\\u0049|\\u0049\\u0307/g,\n map: {\n \u0130: \"\\u0069\",\n I: \"\\u0131\",\n I\u0307: \"\\u0069\",\n },\n },\n az: {\n regexp: /\\u0130/g,\n map: {\n \u0130: \"\\u0069\",\n I: \"\\u0131\",\n I\u0307: \"\\u0069\",\n },\n },\n lt: {\n regexp: /\\u0049|\\u004A|\\u012E|\\u00CC|\\u00CD|\\u0128/g,\n map: {\n I: \"\\u0069\\u0307\",\n J: \"\\u006A\\u0307\",\n \u012E: \"\\u012F\\u0307\",\n \u00CC: \"\\u0069\\u0307\\u0300\",\n \u00CD: \"\\u0069\\u0307\\u0301\",\n \u0128: \"\\u0069\\u0307\\u0303\",\n },\n },\n};\n\n/**\n * Localized lower case.\n */\nexport function localeLowerCase(str: string, locale: string) {\n const lang = SUPPORTED_LOCALE[locale.toLowerCase()];\n if (lang) return lowerCase(str.replace(lang.regexp, (m) => lang.map[m]));\n return lowerCase(str);\n}\n\n/**\n * Lower case as a function.\n */\nexport function lowerCase(str: string) {\n return str.toLowerCase();\n}\n", "import { lowerCase } from \"lower-case\";\n\nexport interface Options {\n splitRegexp?: RegExp | RegExp[];\n stripRegexp?: RegExp | RegExp[];\n delimiter?: string;\n transform?: (part: string, index: number, parts: string[]) => string;\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nconst DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n\n// Remove all non-word characters.\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nexport function noCase(input: string, options: Options = {}) {\n const {\n splitRegexp = DEFAULT_SPLIT_REGEXP,\n stripRegexp = DEFAULT_STRIP_REGEXP,\n transform = lowerCase,\n delimiter = \" \",\n } = options;\n\n let result = replace(\n replace(input, splitRegexp, \"$1\\0$2\"),\n stripRegexp,\n \"\\0\"\n );\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\") start++;\n while (result.charAt(end - 1) === \"\\0\") end--;\n\n // Transform each token independently.\n return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input: string, re: RegExp | RegExp[], value: string) {\n if (re instanceof RegExp) return input.replace(re, value);\n return re.reduce((input, re) => input.replace(re, value), input);\n}\n", "import { noCase, Options } from \"no-case\";\n\nexport { Options };\n\nexport function pascalCaseTransform(input: string, index: number) {\n const firstChar = input.charAt(0);\n const lowerChars = input.substr(1).toLowerCase();\n if (index > 0 && firstChar >= \"0\" && firstChar <= \"9\") {\n return `_${firstChar}${lowerChars}`;\n }\n return `${firstChar.toUpperCase()}${lowerChars}`;\n}\n\nexport function pascalCaseTransformMerge(input: string) {\n return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase();\n}\n\nexport function pascalCase(input: string, options: Options = {}) {\n return noCase(input, {\n delimiter: \"\",\n transform: pascalCaseTransform,\n ...options,\n });\n}\n", "import {\n pascalCase,\n pascalCaseTransform,\n pascalCaseTransformMerge,\n Options,\n} from \"pascal-case\";\n\nexport { Options };\n\nexport function camelCaseTransform(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\n\nexport function camelCaseTransformMerge(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransformMerge(input);\n}\n\nexport function camelCase(input: string, options: Options = {}) {\n return pascalCase(input, {\n transform: camelCaseTransform,\n ...options,\n });\n}\n", "import Axios, { AxiosError } from 'axios';\nimport { Severity } from '@sentry/browser';\nimport pick from 'lodash/pick';\nimport { captureException } from '../sentry';\nimport { isApiError } from './types';\nimport { getErrorMessage } from '../../common/utils';\nimport { isAxiosError } from './axiosExtensions';\n\nexport const FETCH_ABORTED_ERROR_CODE = 'ERR_CANCELED';\nexport const FETCH_CONNECTIVITY_ERROR_CODE = 'CONNECTIVITY_ERROR';\n\ntype OnError = (arg0: unknown) => void;\n\nexport const handleApiError = (error: unknown, onError?: OnError): void => {\n if (Axios.isCancel(error)) {\n captureException(error, 'Request canceled', Severity.Info);\n } else if (isApiError(error)) {\n let message = `URL: ${JSON.stringify(error.config.url, null, 1)}\\n`;\n message += `Method: ${JSON.stringify(error.config.method, null, 1)}\\n`;\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n message += `Status: ${error.response.status}\\n`;\n message += `Response: ${JSON.stringify(\n pick(error.response.data, ['code', 'message', 'reason']),\n null,\n 1,\n )}\\n`;\n } else if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n message += `Status Code: ${JSON.stringify(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n error.request.__sentry_xhr__.status_code,\n null,\n 1,\n )}`;\n }\n captureException(error, message);\n } else {\n captureException(error);\n }\n if (onError) return onError(error);\n};\n\nexport const getApiErrorMessage = (error: unknown): string => {\n if (isApiError(error)) {\n return error.response?.data?.message || error.response?.data.reason || error.message;\n }\n return getErrorMessage(error);\n};\n\nexport const getApiErrorCode = (error: Error | AxiosError): string | number => {\n if (!isAxiosError(error)) {\n return FETCH_CONNECTIVITY_ERROR_CODE;\n }\n const responseStatus = error.response?.status || 0;\n // Error status\n if (responseStatus >= 400 && responseStatus < 500) {\n return responseStatus;\n }\n // Aborted request\n if (error.code === FETCH_ABORTED_ERROR_CODE) {\n return FETCH_ABORTED_ERROR_CODE;\n }\n // A generic connectivity issue\n return FETCH_CONNECTIVITY_ERROR_CODE;\n};\n", "import * as Sentry from '@sentry/browser';\nimport { ocmClient } from './api/axiosClient';\n\nexport const captureException = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: any,\n message?: string,\n severity: Sentry.Severity = Sentry.Severity.Error,\n) => {\n if (ocmClient) {\n message && Sentry.captureMessage(message, severity);\n Sentry.captureException(error);\n } else {\n severity === Sentry.Severity.Error\n ? console.error(message, error)\n : console.warn(message, error);\n }\n};\n", "import { IRow } from '@patternfly/react-table';\nimport { Cluster, V2ClusterUpdateParams, ClusterValidationId, PlatformType } from '../api';\nimport { Validation as HostValidation } from './hosts';\nexport type Validation = Omit<HostValidation, 'id'> & {\n id: ClusterValidationId;\n};\nexport type ValidationGroup =\n | 'configuration'\n | 'hostsData'\n | 'hosts-data'\n | 'network'\n | 'operators';\nexport type ValidationsInfo = {\n [key in ValidationGroup]?: Validation[];\n};\nexport type ClusterWizardStepStatusDeterminationObject = {\n status: Cluster['status'];\n validationsInfo?: Cluster['validationsInfo'] | ValidationsInfo;\n};\nexport type ClusterTableRows = IRow[];\nexport type HostSubnet = {\n subnet: string;\n hostIDs: string[];\n humanized: string;\n};\nexport type HostSubnets = HostSubnet[];\nexport type NetworkConfigurationValues = Pick<\n V2ClusterUpdateParams,\n | 'clusterNetworkCidr'\n | 'clusterNetworkHostPrefix'\n | 'serviceNetworkCidr'\n | 'apiVip'\n | 'ingressVip'\n | 'sshPublicKey'\n | 'vipDhcpAllocation'\n | 'networkType'\n | 'machineNetworks'\n | 'clusterNetworks'\n | 'serviceNetworks'\n> & {\n hostSubnet?: string;\n managedNetworkingType: 'userManaged' | 'clusterManaged';\n stackType?: 'singleStack' | 'dualStack';\n};\nexport type HostDiscoveryValues = V2ClusterUpdateParams & {\n usePlatformIntegration: boolean;\n schedulableMasters: boolean;\n};\nexport type StorageValues = V2ClusterUpdateParams & {\n nodeLabeling: string;\n};\nexport type OperatorsValues = V2ClusterUpdateParams & {\n useOpenShiftDataFoundation: boolean;\n useOdfLogicalVolumeManager: boolean;\n useContainerNativeVirtualization: boolean;\n};\nexport enum CpuArchitecture {\n x86 = 'x86_64',\n ARM = 'arm64',\n DAY1_CLUSTER_USES_MULTI = 'multi',\n // This value refers to use whichever CPU architecture was selected for the cluster\n // It's not a value that can be returned from the Backend.\n USE_DAY1_ARCHITECTURE = 'cluster-day1-cpu-architecture',\n}\nexport enum OcmCpuArchitecture {\n x86 = 'amd64',\n ARM = 'arm64',\n MULTI = 'multi',\n}\n\nexport const SupportedCpuArchitectures: CpuArchitecture[] = [\n CpuArchitecture.x86,\n CpuArchitecture.ARM,\n];\n\nexport type SupportedPlatformType = Extract<PlatformType, 'vsphere' | 'nutanix'>;\n\nexport const SupportedPlatformIntegrations: SupportedPlatformType[] = ['vsphere', 'nutanix'];\nexport const NonPlatformIntegrations: PlatformType[] = ['baremetal', 'none'];\n", "import { FeatureSupportLevel } from '../api/types';\nimport { ArrayElementType } from './typescriptExtensions';\n\ntype Features = Required<ArrayElementType<FeatureSupportLevel['features']>>;\nexport type FeatureId = Features['featureId'] | 'ODF' | 'CNV' | 'NETWORK_TYPE_SELECTION';\nexport type SupportLevel = Features['supportLevel'];\n\nexport type FeatureIdToSupportLevel = {\n [id in FeatureId]?: SupportLevel;\n};\n\nexport type FeatureSupportLevelsMap = {\n [id in string /* means OCP normalized version */]: FeatureIdToSupportLevel;\n};\n\nexport type ClusterFeatureUsage = {\n [key: string]: {\n id: FeatureId;\n name: string;\n data?: { [key: string]: unknown };\n };\n};\n\nexport type PreviewSupportLevel = 'tech-preview' | 'dev-preview';\n\nexport const isPreviewSupportLevel = (\n supportLevel: SupportLevel | undefined,\n): supportLevel is PreviewSupportLevel => {\n return supportLevel === 'dev-preview' || supportLevel === 'tech-preview';\n};\n", "//extract array element type\nexport type ArrayElementType<TWhere> = TWhere extends (infer U)[]\n ? U extends object\n ? U\n : never\n : never;\n\nexport type Optional<T, K extends keyof T> = Omit<T, K> & { [K in keyof T]?: T[K] };\n\nexport function isNonNullObject(val: unknown): val is object {\n return typeof val === 'object' && val !== null;\n}\n\n// Still, as of June 18, 2022, Typescript cannot use the 'in' keyword or 'hasOwnProperty' method as a type guard\n// See: https://github.com/microsoft/TypeScript/issues/21732\nexport function hasProp<T extends object, K extends PropertyKey>(\n obj: T,\n prop: K,\n): obj is T & Record<K, unknown> {\n return prop in obj;\n}\n\nexport type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };\n", "export enum ResourceUIState {\n LOADING = 'LOADING',\n RELOADING = 'RELOADING',\n ERROR = 'ERROR',\n EMPTY = 'EMPTY',\n LOADED = 'LOADED',\n}\n\nexport type WithTestID = {\n testId?: string;\n};\n\nexport * from './versions';\nexport * from './proxyFields';\nexport * from './events';\nexport * from './clusters';\nexport * from './featureSupportLevel';\nexport * from './typescriptExtensions';\n", "import { AxiosError } from 'axios';\nimport { hasProp, isNonNullObject } from '../../common/types';\n\n// Implementation from Axios.isAxiosError v0.29.2, which is not available in OCM's version 0.17.x\nexport function isAxiosError<T = unknown, D = unknown>(\n payload: unknown,\n): payload is AxiosError<T, D> {\n return (\n isNonNullObject(payload) && hasProp(payload, 'isAxiosError') && payload.isAxiosError === true\n );\n}\n", "import { AxiosError } from 'axios';\nimport { isAxiosError } from './axiosExtensions';\nimport { Error as APIError, InfraError } from '../../common/api/types';\n\nexport type APIErrorMixin = InfraError & APIError;\nexport type AIAxiosErrorType = AxiosError<APIErrorMixin, APIErrorMixin>;\n\nexport const isApiError = (error: unknown): error is AIAxiosErrorType => {\n if (!isAxiosError<AIAxiosErrorType, AIAxiosErrorType>(error)) {\n return false;\n }\n return typeof error.response?.data === 'object';\n};\n", "import isString from 'lodash/isString';\n\nexport const getErrorMessage = (error: unknown) => {\n if (error instanceof Error) {\n return error.message;\n }\n if (isString(error)) {\n return error;\n }\n return 'Unexpected error';\n};\n\nexport const getRandomString = (length: number) =>\n Array(length + 1)\n .join((Math.random().toString(36) + '00000000000000000').slice(2, 18))\n .slice(0, length);\n", "import { configureStore } from '@reduxjs/toolkit';\nimport clustersReducer from '../reducers/clusters/clustersSlice';\nimport currentClusterReducer from '../reducers/clusters/currentClusterSlice';\nimport { infraEnvsReducer } from './slices/infraEnvs/slice';\n\nexport const store = configureStore({\n reducer: {\n clusters: clustersReducer,\n currentCluster: currentClusterReducer,\n infraEnvs: infraEnvsReducer,\n },\n preloadedState: {},\n});\nexport type RootState = ReturnType<typeof store.getState>;\nexport type DispatchDay1 = typeof store.dispatch;\n\nexport const storeDay2 = configureStore({\n reducer: {\n infraEnvs: infraEnvsReducer,\n },\n});\nexport type RootStateDay2 = ReturnType<typeof storeDay2.getState>;\nexport type DispatchDay2 = typeof storeDay2.dispatch;\n", "import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';\nimport { Cluster, ResourceUIState } from '../../../common';\nimport { ClustersAPI } from '../../services/apis';\nimport { handleApiError, ocmClient } from '../../api';\n\nexport const fetchClustersAsync = createAsyncThunk<Cluster[] | void>(\n 'clusters/fetchClustersAsync',\n async () => {\n try {\n const { data } = await ClustersAPI.list();\n const isOcm = !!ocmClient;\n return data.filter((cluster) => (isOcm ? cluster.kind === 'Cluster' : true));\n } catch (e) {\n handleApiError(e, () => {\n void Promise.reject('Failed to fetch clusters.');\n });\n }\n },\n);\n\ntype ClustersStateSlice = {\n data: Cluster[];\n uiState: ResourceUIState;\n};\n\nconst initialState: ClustersStateSlice = { data: [], uiState: ResourceUIState.LOADING };\n\nexport const clustersSlice = createSlice({\n initialState,\n name: 'clusters',\n reducers: {\n deleteCluster: (state, action: PayloadAction<Cluster['id']>) => ({\n ...state,\n data: state.data.filter((item: Cluster) => item.id !== action.payload),\n }),\n },\n extraReducers: (builder) => {\n const { LOADED, LOADING, RELOADING, ERROR } = ResourceUIState;\n builder\n .addCase(fetchClustersAsync.pending, (state) => {\n const uiState = state.uiState === LOADED ? RELOADING : LOADING;\n return { ...state, uiState };\n })\n .addCase(fetchClustersAsync.fulfilled, (state, action) => ({\n ...state,\n data: [...(action.payload as Cluster[])],\n uiState: LOADED,\n }))\n .addCase(fetchClustersAsync.rejected, (state) => ({\n ...state,\n uiState: ERROR,\n }));\n },\n});\n\nexport const { deleteCluster } = clustersSlice.actions;\nexport default clustersSlice.reducer;\n", "import React from 'react';\n\n// TODO(jtomasek): Stop using this once https://github.com/developit/microbundle/issues/564#issuecomment-593146626\n// is fixed, use `microbundle --jsxFragment React.Fragment` instead.\n// Workaround for TS17016\nwindow['Fragment'] = React.Fragment;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, HelperTextItem, Split, SplitItem, TextInput } from '@patternfly/react-core';\nimport { InputFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\nimport useFieldErrorMsg from '../../../hooks/useFieldErrorMsg';\n\nconst InputField: React.FC<\n InputFieldProps & { inputError?: string; description?: React.ReactNode; labelInfo?: string }\n // eslint-disable-next-line react/display-name\n> = React.forwardRef(\n (\n {\n label,\n labelIcon,\n helperText,\n isRequired,\n onChange,\n validate,\n idPostfix,\n children,\n noDefaultOnChange,\n inputError,\n description,\n labelInfo,\n showErrorMessage = true,\n ...props\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const [field] = useField({\n name: props.name,\n validate,\n });\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const errorMessage = useFieldErrorMsg({ name: props.name, inputError, validate });\n const isValid = !errorMessage;\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={showErrorMessage ? errorMessage : undefined}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n labelInfo={labelInfo}\n >\n {description && (\n <HelperText fieldId={fieldId}>\n <HelperTextItem variant=\"indeterminate\">{description}</HelperTextItem>\n </HelperText>\n )}\n <Split>\n <SplitItem isFilled>\n <TextInput\n {...field}\n {...props}\n ref={ref}\n id={fieldId}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n aria-describedby={`${fieldId}-helper`}\n onChange={(value, event) => {\n if (!props.isDisabled) {\n !noDefaultOnChange && field.onChange(event);\n onChange && onChange(event);\n }\n }}\n />\n </SplitItem>\n <SplitItem>{children}</SplitItem>\n </Split>\n </FormGroup>\n );\n },\n);\n\nexport default InputField;\n", "import { FormikErrors, FormikTouched } from 'formik';\nimport * as Yup from 'yup';\nimport { Address4 } from 'ip-address';\nimport set from 'lodash/set';\nimport groupBy from 'lodash/groupBy';\nimport pickBy from 'lodash/pickBy';\nimport { OpenshiftVersionOptionType } from '../../../types';\nimport { ClusterNetwork, MachineNetwork, ServiceNetwork } from '../../../api';\n\nexport const getFieldId = (fieldName: string, fieldType: string, unique?: string) => {\n unique = unique ? `${unique}-` : '';\n return `form-${fieldType}-${fieldName.replace(/\\./g, '-')}-${unique}field`;\n};\n\nexport const trimSshPublicKey = (key: string) =>\n key\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .join('\\n');\n\nexport const trimCommaSeparatedList = (list: string) =>\n list\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n .join(',');\n\nexport const getFormikErrorFields = <FormikValues>(\n errors: FormikErrors<FormikValues>,\n touched: FormikTouched<FormikValues>,\n) => Object.keys(errors).filter((field) => touched[field]);\n\nexport const getDefaultOpenShiftVersion = (versions: OpenshiftVersionOptionType[]) =>\n versions.find((v) => v.default)?.value || versions[0]?.value || '';\n\n// strValues: array of 'key=value' items\nexport const parseStringLabels = (\n strValues: string[],\n): {\n [key in string]: string;\n} => {\n const labels = strValues.reduce((acc, curr) => {\n const label = curr.split('=');\n acc[label[0]] = label[1];\n return acc;\n }, {});\n return labels;\n};\n\ntype InnerError = { path: string; message: string };\ntype InnerErrors = { inner: InnerError[] };\ntype FieldErrors = { [key: string]: string[] };\n\nconst fieldErrorReducer = (errors: InnerError[]): FieldErrors => {\n return errors.reduce<FieldErrors>(\n (memo, { path, message }) => ({\n ...memo,\n [path]: (memo[path] || []).concat(message),\n }),\n {},\n );\n};\n\nexport const getDuplicates = (list: string[]): string[] => {\n const duplicateKeys = pickBy(groupBy(list), (x) => x.length > 1);\n return Object.keys(duplicateKeys);\n};\n\nexport const getRichTextValidation =\n <T extends object>(schema: Yup.ObjectSchema<T> | Yup.Lazy) =>\n async (values: T): Promise<FieldErrors | undefined> => {\n try {\n await schema.validate(values, {\n abortEarly: false,\n });\n } catch (e) {\n const { inner } = e as InnerErrors;\n if (!inner || inner.length === 0) {\n return {};\n }\n\n const baseFields: InnerError[] = [];\n const arraySubfields: InnerError[] = [];\n\n inner.forEach((item) => {\n const isArraySubfield = /\\.|\\[/.test(item.path);\n if (isArraySubfield) {\n arraySubfields.push(item);\n } else {\n baseFields.push(item);\n }\n });\n\n const fieldErrors = fieldErrorReducer(baseFields);\n if (arraySubfields.length === 0) {\n return fieldErrors;\n }\n\n // Now we need to convert the fieldArray errors to the parent object\n // eg. items[0].thumbprint --> { items: [{ thumbprint: ['subField error'] }]}\n const arrayErrors = {};\n arraySubfields.forEach((field) => {\n set(arrayErrors, field.path, [field.message]);\n });\n return { ...fieldErrors, ...arrayErrors };\n }\n };\n\nexport const getFormikArrayItemFieldName = (arrayFieldName: string, idx: number) => {\n return `${arrayFieldName}[${idx}]`;\n};\n\nexport const getFormikObjectItemFieldName = (objectFieldName: string, idx: number) => {\n return `${objectFieldName}.${idx}`;\n};\n\nexport const allSubnetsIPv4 = (\n networks: (MachineNetwork | ClusterNetwork | ServiceNetwork)[] | undefined,\n) => {\n return !!networks?.every((network) => network.cidr && Address4.isValid(network.cidr));\n};\n\nexport const labelsToArray = (labels: { [key in string]: string } = {}): string[] => {\n const result: string[] = [];\n for (const key in labels) {\n result.push(`${key}=${labels[key]}`);\n }\n return result;\n};\n", "import React from 'react';\nimport { css } from '@patternfly/react-styles';\n\ntype HelperTextProps = {\n fieldId: string;\n isError?: boolean;\n};\n\n/**\n * HelperText component standardizes the format of non string helperText prop on FormGroup\n * which is otherwise rendered 'as is' in FormGroup\n */\nconst HelperText: React.FC<HelperTextProps> = ({ fieldId, children, isError = false }) => (\n <div\n className={css('pf-c-form__helper-text', { 'pf-m-error': isError })}\n id={`${fieldId}-helper`}\n aria-live=\"polite\"\n >\n {children}\n </div>\n);\n\nexport default HelperText;\n", "import * as React from 'react';\nimport { FieldValidator, useField } from 'formik';\n\ntype Props = {\n name: string;\n inputError?: string;\n validate?: FieldValidator;\n};\n\n// With getRichTextValidation we can receive an array of strings so it needs to be converted to string\nconst adaptErrorInvalidFormat = (error?: string | string[]): string | undefined => {\n if (Array.isArray(error)) {\n return error.join('. ');\n }\n return error;\n};\n\nexport const useFieldErrorMsg = ({ name, inputError, validate }: Props): string | undefined => {\n /*\n for empty values - show an error only if at a certain point it was none empty, to avoid new items in a field array shown as invalid right away\n for none empty values - always show the error if there is one\n */\n const [field, { error }] = useField({\n name,\n validate,\n });\n const [hadValue, setHadValue] = React.useState<boolean>(false);\n React.useEffect(() => {\n if (field.value) {\n setHadValue(field.value);\n }\n }, [field.value, setHadValue]);\n const showError = field.value || (!field.value && hadValue);\n const errorMessage = adaptErrorInvalidFormat((showError ? error : '') || inputError);\n return errorMessage;\n};\n\nexport default useFieldErrorMsg;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { Checkbox, FormGroup } from '@patternfly/react-core';\nimport { CheckboxFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\n\nconst CheckboxField: React.FC<CheckboxFieldProps> = ({\n label,\n helperText,\n onChange,\n validate,\n idPostfix,\n ...props\n}) => {\n const [field, { touched, error }] = useField({ name: props.name, validate });\n const fieldId = getFieldId(props.name, 'checkbox', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n return (\n <FormGroup\n fieldId={fieldId}\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n >\n <Checkbox\n {...field}\n {...props}\n id={fieldId}\n label={label}\n aria-describedby={`${fieldId}-helper`}\n description={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n isValid={isValid}\n isChecked={field.value}\n onChange={(value, event) => {\n field.onChange(event);\n onChange && onChange(value, event);\n }}\n />\n </FormGroup>\n );\n};\n\nexport default CheckboxField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, TextArea } from '@patternfly/react-core';\nimport { TextAreaFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\n\nconst TextAreaField: React.FC<TextAreaFieldProps> = ({\n label,\n helperText,\n getErrorText,\n isRequired,\n children,\n idPostfix,\n labelIcon,\n groupClassName,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const isValid = !(touched && error);\n\n const getErrorMessage = () => {\n if (!isValid && error) {\n return getErrorText ? getErrorText(error) : error;\n }\n return '';\n };\n const errorMessage = getErrorMessage();\n const { isDisabled, ...restProps } = props;\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={\n typeof errorMessage === 'string' ? (\n errorMessage\n ) : (\n <HelperText fieldId={fieldId} isError>\n {errorMessage}\n </HelperText>\n )\n }\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n className={groupClassName}\n >\n {children}\n <TextArea\n {...field}\n {...restProps}\n id={fieldId}\n style={{ resize: 'vertical' }}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n aria-describedby={`${fieldId}-helper`}\n onChange={(value, event) => field.onChange(event)}\n disabled={isDisabled}\n />\n </FormGroup>\n );\n};\n\nexport default TextAreaField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, FormSelect, FormSelectOption } from '@patternfly/react-core';\nimport { getFieldId } from './utils';\nimport { SelectFieldProps } from './types';\nimport HelperText from './HelperText';\n\n// Reimplement this component to use custom Select in case of using it along the MultiSelectField component due to visual differences.\n// Idea: use Formik's field.multiple to switch among single and multi-selection.\n// See: https://www.patternfly.org/v4/components/form-select/design-guidelines#usage\nconst SelectField: React.FC<SelectFieldProps> = ({\n label,\n options,\n helperText,\n isRequired,\n onChange,\n getHelperText,\n idPostfix,\n labelIcon,\n callFormikOnChange = true,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n const hText = getHelperText ? getHelperText(field.value) : helperText;\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof hText === 'string' ? hText : <HelperText fieldId={fieldId}>{hText}</HelperText>\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n <FormSelect\n {...field}\n {...props}\n id={fieldId}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n aria-describedby={`${fieldId}-helper`}\n onChange={(value, event) => {\n //customHandleChange enables calling formik change handler explicitly, useful for example to have the previous value\n callFormikOnChange && field.onChange(event);\n onChange && onChange(event);\n }}\n >\n {options.map((option, index) => (\n <FormSelectOption key={option.id || index} {...option} />\n ))}\n </FormSelect>\n </FormGroup>\n );\n};\n\nexport default SelectField;\n", "import React from 'react';\nimport { useField } from 'formik';\nimport Fuse from 'fuse.js';\nimport {\n FormGroup,\n Select,\n SelectOption,\n SelectOptionObject,\n SelectOptionProps,\n SelectProps,\n SelectVariant,\n} from '@patternfly/react-core';\nimport { MultiSelectFieldProps, MultiSelectOption } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\n// Field value is a string[]\nconst MultiSelectField: React.FC<MultiSelectFieldProps> = ({\n label,\n options,\n helperText,\n placeholderText,\n isRequired,\n onChange,\n getHelperText,\n idPostfix,\n labelIcon,\n ...props\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n const [field, { touched, error }, { setValue }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'multiinput', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n const hText = getHelperText ? getHelperText(field.value) : helperText;\n\n const onToggle = (isOpen: boolean) => setOpen(isOpen);\n const onClearSelection = () => {\n // onChange && onChange(event);\n setValue([]);\n onChange && onChange([]);\n setOpen(false);\n };\n\n const onSelect: SelectProps['onSelect'] = (event, selection) => {\n // already selected\n const selected = field.value;\n\n // selected just now\n const selectionValue =\n (\n selection as {\n /* TypeScript hack, debug hint: created as part of \"selections\" array below */ value?: string;\n }\n ).value || selection;\n\n let newValue;\n if (selected.includes(selectionValue)) {\n newValue = selected.filter((sel: string) => sel !== selectionValue);\n } else {\n newValue = [...field.value, selectionValue];\n }\n setValue(newValue);\n onChange && onChange(newValue);\n };\n\n // list of already selected options\n const selections: (SelectOptionObject | string)[] = field.value.map((value: string) => {\n const option = options.find((opt) => opt.value === value);\n return option\n ? {\n value: option.value,\n toString: () => option.displayName,\n compareTo: (selectOption: { value: string }) => selectOption.value === value,\n }\n : value;\n });\n\n const children = options\n .filter((option) => !(field.value || []).includes(option.value))\n .map((option) => (\n <SelectOption key={option.id} id={option.id} value={option.value}>\n {option.displayName}\n </SelectOption>\n ));\n\n const fuse = new Fuse(options, {\n ignoreLocation: true,\n keys: ['displayName'],\n });\n const { t } = useTranslation();\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof hText === 'string' ? hText : <HelperText fieldId={fieldId}>{hText}</HelperText>\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n <Select\n {...field}\n {...props}\n id={fieldId}\n variant={SelectVariant.typeaheadMulti}\n typeAheadAriaLabel={t('ai:Select a state')}\n validated={isValid ? 'default' : 'error'}\n aria-describedby={`${fieldId}-helper`}\n isCreatable={false}\n placeholderText={placeholderText}\n isOpen={isOpen}\n onToggle={onToggle}\n onSelect={onSelect}\n onClear={onClearSelection}\n selections={selections}\n onFilter={(e, val) => {\n if (!val || val === '') {\n return children;\n }\n const results = fuse.search<MultiSelectOption>(val).map((result) => result.item.id);\n return (\n React.Children.toArray(children) as React.ReactElement<SelectOptionProps>[]\n ).filter(({ props }) => results.includes(props.id as string));\n }}\n >\n {children}\n </Select>\n </FormGroup>\n );\n};\n\nexport default MultiSelectField;\n", "// eslint-disable-next-line no-restricted-imports\nimport { useTranslation as useReactI18NextTranslation } from 'react-i18next';\n\nexport function useTranslation() {\n return useReactI18NextTranslation(process.env.TRANSLATION_NAMESPACE);\n}\n", "import * as React from 'react';\nimport { FormGroup, Button } from '@patternfly/react-core';\nimport { TextAreaSecretProps } from './types';\nimport { getFieldId } from './utils';\nimport TextAreaField from './TextAreaField';\n\nconst TextAreaSecretField: React.FC<TextAreaSecretProps> = ({\n isSet,\n isEdit,\n helperTextHidden,\n onToggle,\n idPostfix,\n ...props\n}) => {\n const { label, name } = props;\n const fieldId = getFieldId(name, 'input', idPostfix);\n\n if (isEdit) {\n return (\n <TextAreaField {...props}>\n {isSet && (\n <Button onClick={() => onToggle(true)} variant=\"link\">\n Keep existing value\n </Button>\n )}\n </TextAreaField>\n );\n }\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={helperTextHidden}\n isRequired={props.isRequired}\n >\n <Button onClick={() => onToggle(false)} variant=\"link\">\n Change\n </Button>\n </FormGroup>\n );\n};\n\nexport default TextAreaSecretField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, FileUpload } from '@patternfly/react-core';\nimport { UploadFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nconst UploadField: React.FC<UploadFieldProps> = ({\n label,\n labelIcon,\n helperText,\n getErrorText,\n isRequired,\n children,\n idPostfix,\n isDisabled,\n name,\n onBlur,\n allowEdittingUploadedText = true,\n dropzoneProps,\n transformValue,\n}) => {\n const { t } = useTranslation();\n\n const [filename, setFilename] = React.useState<string>();\n const [isFileUploading, setIsFileUploading] = React.useState(false);\n\n const [field, { touched, error }, helpers] = useField(name);\n const fieldId = getFieldId(name, 'input', idPostfix);\n const isValid = !((touched || filename) && error);\n\n const getErrorMessage = () => {\n if (!isValid && error) {\n return getErrorText ? getErrorText(error) : error;\n }\n return '';\n };\n const errorMessage = getErrorMessage();\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={\n typeof errorMessage === 'string' ? (\n errorMessage\n ) : (\n <HelperText fieldId={fieldId} isError>\n {errorMessage}\n </HelperText>\n )\n }\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n {children}\n <FileUpload\n filenamePlaceholder={t('ai:Drag a file here or browse to upload')}\n browseButtonText={t('ai:Browse...')}\n clearButtonText={t('ai:Clear')}\n id={field.name}\n style={{ resize: 'vertical' }}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n aria-describedby={`${fieldId}-helper`}\n type=\"text\"\n value={field.value}\n filename={filename}\n onChange={(value, filename) => {\n setFilename(filename);\n helpers.setTouched(true);\n transformValue && typeof value === 'string'\n ? helpers.setValue(transformValue(value))\n : helpers.setValue(value);\n }}\n onBlur={(e) => {\n field.onBlur(e);\n onBlur && onBlur(e);\n }}\n onReadStarted={() => setIsFileUploading(true)}\n onReadFinished={() => setIsFileUploading(false)}\n isLoading={isFileUploading}\n disabled={isDisabled}\n dropzoneProps={{\n ...dropzoneProps,\n onDropRejected: dropzoneProps?.onDropRejected && dropzoneProps?.onDropRejected(helpers),\n }}\n allowEditingUploadedText={allowEdittingUploadedText}\n />\n </FormGroup>\n );\n};\n\nexport default UploadField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, Switch, Tooltip } from '@patternfly/react-core';\nimport { getFieldId } from './utils';\nimport { SwitchFieldProps } from './types';\nimport HelperText from './HelperText';\n\nconst SwitchField: React.FC<SwitchFieldProps> = ({\n label,\n helperText,\n isRequired,\n onChange,\n onChangeCustomOverride,\n getHelperText,\n idPostfix,\n labelIcon,\n tooltipProps,\n switchOuiaId,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n const hText = getHelperText ? getHelperText(field.value) : helperText;\n\n const switchFields = {\n ...field,\n id: fieldId,\n label: label,\n isDisabled: props.isDisabled,\n isChecked: Boolean(field.value),\n hasCheckIcon: Boolean(field.value),\n ouiaId: switchOuiaId,\n onChange: (checked: boolean, event: React.FormEvent<HTMLInputElement>) => {\n if (onChangeCustomOverride) {\n onChangeCustomOverride(checked, event);\n } else {\n field.onChange(event);\n onChange && onChange(checked, event);\n }\n },\n };\n return (\n <FormGroup\n fieldId={fieldId}\n helperText={\n typeof hText === 'string' ? hText : <HelperText fieldId={fieldId}>{hText}</HelperText>\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n {tooltipProps ? (\n <Tooltip {...tooltipProps}>\n <Switch {...switchFields} />\n </Tooltip>\n ) : (\n <Switch {...switchFields} />\n )}\n </FormGroup>\n );\n};\n\nexport default SwitchField;\n", "import React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport debouncer from 'lodash/debounce';\nimport { useFormikContext } from 'formik';\n\ntype UseFormikAutoSave = (debounce?: number) => boolean;\n\nexport const useFormikAutoSave: UseFormikAutoSave = (debounce = 1000) => {\n const [autoSaveIDs, setAutoSaveIDs] = React.useState<number[]>([]);\n const { values, isSubmitting, submitForm } = useFormikContext();\n const prevValuesRef = React.useRef(values);\n const commitRef = React.useRef(\n debouncer(async (autoSaveID: number) => {\n await submitForm();\n setAutoSaveIDs((ids) => ids.filter((id) => id > autoSaveID));\n }, debounce),\n );\n\n React.useEffect(() => {\n if (!shallowEqual(prevValuesRef.current, values) && !isSubmitting) {\n const autoSaveID = Date.now();\n setAutoSaveIDs((ids) => {\n ids.push(autoSaveID);\n return ids;\n });\n void commitRef.current(autoSaveID);\n }\n if (!isSubmitting) {\n prevValuesRef.current = values;\n }\n }, [values, isSubmitting, setAutoSaveIDs]);\n\n React.useEffect(() => {\n const commit = commitRef.current;\n return () => commit.cancel();\n }, []);\n\n return !!autoSaveIDs.length;\n};\n\nconst FormikAutoSave: React.FC<{ debounce?: number }> = ({ debounce = 1000 }) => {\n const { values, dirty, isSubmitting, submitForm } = useFormikContext();\n const prevValuesRef = React.useRef(values);\n const commitRef = React.useRef(debouncer(submitForm, debounce));\n\n React.useEffect(() => {\n if (!shallowEqual(prevValuesRef.current, values) && dirty && !isSubmitting) {\n void commitRef.current();\n }\n if (!isSubmitting) {\n prevValuesRef.current = values;\n }\n }, [values, dirty, isSubmitting]);\n\n React.useEffect(() => {\n const commit = commitRef.current;\n return () => commit.cancel();\n }, []);\n\n return null;\n};\n\nexport default FormikAutoSave;\n", "import React from 'react';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { CLUSTER_MANAGER_SITE_LINK, PULL_SECRET_INFO_LINK } from '../../../config';\nimport PopoverIcon from '../PopoverIcon';\nimport TextAreaField from './TextAreaField';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\nexport type PullSecretFieldProps = {\n pullSecret?: string;\n LabelIcon: React.ComponentType;\n};\n\nexport const PullSecretInfo: React.FC<{ isOcm: boolean }> = ({ isOcm }) => {\n const { t } = useTranslation();\n return (\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <>\n <Trans t={t}>\n ai:Pull secrets are used to download OpenShift Container Platform components and connect\n clusters to a Red Hat account.{' '}\n </Trans>\n {isOcm ? (\n <PullSecretInfoLink />\n ) : (\n <>\n <Trans t={t}>ai:Pull secrets can be found in</Trans> <ClusterManagerSiteLink />\n </>\n )}\n </>\n }\n />\n );\n};\n\nconst ClusterManagerSiteLink = () => {\n const { t } = useTranslation();\n return (\n <a href={CLUSTER_MANAGER_SITE_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:OpenShift Cluster Manager')} <ExternalLinkAltIcon />\n </a>\n );\n};\n\nconst PullSecretInfoLink = () => {\n const { t } = useTranslation();\n return (\n <a href={PULL_SECRET_INFO_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Learn more about pull secrets and view examples')} <ExternalLinkAltIcon />.\n </a>\n );\n};\n\nconst GetPullSecretHelperText: React.FC<{ isOcm: boolean }> = ({ isOcm }) => {\n const { t } = useTranslation();\n return isOcm ? (\n <PullSecretInfoLink />\n ) : (\n <>\n {t(\"ai:A Red Hat account's pull secret can be found in \")}&nbsp;\n <ClusterManagerSiteLink />\n </>\n );\n};\n\nconst PullSecretField: React.FC<{ isOcm: boolean }> = ({ isOcm }) => {\n const { t } = useTranslation();\n return (\n <TextAreaField\n name=\"pullSecret\"\n label={t('ai:Pull secret')}\n labelIcon={isOcm ? undefined : <PullSecretInfo isOcm={isOcm} />}\n getErrorText={(error) => (\n <>\n {error} <GetPullSecretHelperText isOcm={isOcm} />\n </>\n )}\n helperText={<GetPullSecretHelperText isOcm={isOcm} />}\n rows={10}\n isRequired\n />\n );\n};\n\nexport default PullSecretField;\n", "export * from './constants';\n", "import { TFunction } from 'i18next';\nimport * as packageJson from '../../../package.json';\nimport { ValidationsInfo, HostRole } from '../types/hosts';\nimport { Cluster, ClusterValidationId, DiskRole, Event, HostValidationId } from '../api';\nimport { ValidationGroup as ClusterValidationGroup } from '../types/clusters';\n\nexport const OPENSHIFT_LIFE_CYCLE_DATES_LINK =\n 'https://access.redhat.com/support/policy/updates/openshift#dates';\nexport const OPENSHIFT_NETWORKING_DOCS_LINK =\n 'https://docs.openshift.com/container-platform/4.7/installing/installing_bare_metal/installing-bare-metal.html#installation-network-user-infra_installing-bare-metal';\nexport const CLUSTER_MANAGER_SITE_LINK = 'https://console.redhat.com/openshift/install/pull-secret';\nexport const PULL_SECRET_INFO_LINK = CLUSTER_MANAGER_SITE_LINK;\nexport const ODF_REQUIREMENTS_LINK =\n 'https://access.redhat.com/documentation/en-us/red_hat_openshift_data_foundation/4.9/html/planning_your_deployment/infrastructure-requirements_rhodf#resource-requirements_rhodf';\nexport const VSPHERE_CONFIG_LINK = 'https://access.redhat.com/solutions/6677901';\n\nexport const getReportIssueLink = () =>\n 'https://issues.redhat.com/secure/CreateIssue!default.jspa?pid=12332330&issuetype=1&components=12370775';\n\nexport const FEEDBACK_FORM_LINK =\n 'https://docs.google.com/forms/d/e/1FAIpQLSfg9M8wRW4m_HkWeAl6KpB5dTcMu8iI3iJ29GlLfZpF2hnjng/viewform';\n\nexport const TECH_SUPPORT_LEVEL_LINK = 'https://access.redhat.com/support/offerings/techpreview';\n\nexport const ENCRYPTING_DISK_DURING_INSTALLATION =\n 'https://docs.openshift.com/container-platform/4.7/installing/install_config/installing-customizing.html#installation-special-config-encrypt-disk_installing-customizing';\n\nexport const getOcpConsoleNodesPage = (ocpConsoleUrl: string) =>\n `${ocpConsoleUrl}/k8s/cluster/nodes`;\n\nexport const REDHAT_CONSOLE_OPENSHIFT = 'https://console.redhat.com/openshift';\n\nexport const SSH_GENERATION_DOC_LINK = 'https://www.redhat.com/sysadmin/configure-ssh-keygen';\n\nexport const CNV_LINK = 'https://cloud.redhat.com/learn/topics/virtualization/';\n\nexport const ODF_LINK = 'https://www.redhat.com/en/resources/openshift-data-foundation-datasheet';\n\nexport const NMSTATE_EXAMPLES_LINK = 'https://nmstate.io/examples.html';\n\nexport const APPROVE_NODES_IN_CL_LINK =\n 'https://docs.openshift.com/container-platform/4.11/installing/installing_platform_agnostic/installing-platform-agnostic.html#installation-approve-csrs_installing-platform-agnostic';\n\n// TODO(mlibra): Retrieve branding dynamically, if needed, i.e. via injecting to the \"window\" object\nexport const getProductBrandingCode = () => 'redhat';\n\nexport const POLLING_INTERVAL = 10 * 1000;\nexport const EVENTS_POLLING_INTERVAL = 10 * 1000;\n\nexport const hostRoles = (t: TFunction): HostRole[] => [\n {\n value: 'auto-assign',\n label: t('ai:Auto-assign'),\n description: t(\n 'ai:A role will be chosen automatically based on detected hardware and network latency.',\n ),\n },\n {\n value: 'master',\n label: t('ai:Control plane node'),\n description: t('ai:Runs the control plane components of OpenShift, including the API server.'),\n },\n {\n value: 'worker',\n label: t('ai:Worker'),\n description: t(\n 'ai:Runs application workloads. Connect at least 5 hosts to enable dedicated workers.',\n ),\n },\n];\n\nexport const clusterStatusLabels = (t: TFunction): { [key in Cluster['status']]: string } => ({\n 'pending-for-input': t('ai:Draft'),\n insufficient: t('ai:Draft'),\n ready: t('ai:Draft'),\n 'preparing-for-installation': t('ai:Preparing for installation'),\n installing: t('ai:Installing'),\n 'installing-pending-user-action': t('ai:Installing (pending action)'),\n finalizing: t('ai:Finalizing'),\n cancelled: t('ai:Installation cancelled'),\n error: t('ai:Error'),\n installed: t('ai:Installed'),\n 'adding-hosts': t('ai:Adding hosts'),\n});\n\nexport const clusterFieldLabels = (t: TFunction): { [key in string]: string } => ({\n name: t('ai:Cluster name'),\n baseDnsDomain: t('ai:Base domain'),\n clusterNetworkCidr: t('ai:Cluster network CIDR'),\n clusterNetworkHostPrefix: t('ai:Cluster network host prefix'),\n serviceNetworkCidr: t('ai:Service network CIDR'),\n apiVip: t('ai:API IP'),\n ingressVip: t('ai:Ingress IP'),\n pullSecret: t('ai:Pull secret'),\n sshPublicKey: t('ai:SSH public key'),\n SNODisclaimer: t('ai:Single Node OpenShift disclaimer'),\n diskEncryptionTangServers: t(\"ai:Tang servers' URLs or thumbprints\"),\n selectedHostIds: t('ai:Hosts selection'),\n httpProxy: t('ai:HTTP proxy'),\n httpsProxy: t('ai:HTTPS proxy'),\n noProxy: t('ai:No proxy'),\n machineNetworks: t('ai:Machine networks'),\n clusterNetworks: t('ai:Cluster networks'),\n serviceNetworks: t('ai:Service networks'),\n});\n\nexport const hostValidationGroupLabels = (\n t: TFunction,\n): { [key in keyof ValidationsInfo]: string } => ({\n hardware: t('ai:Hardware'),\n network: t('ai:Network'),\n operators: t('ai:Operators'),\n infrastructure: t('ai:Infrastructure'),\n});\n\nexport const hostValidationLabels = (t: TFunction): { [key in HostValidationId]: string } => ({\n 'compatible-with-cluster-platform': t('ai:Compatible with cluster platform'),\n 'has-default-route': t('ai:Default route to host'),\n 'sufficient-network-latency-requirement-for-role': t('ai:Network latency'),\n 'sufficient-packet-loss-requirement-for-role': t('ai:Packet loss'),\n 'has-inventory': t('ai:Hardware information'),\n 'has-min-cpu-cores': t('ai:Minimum CPU cores'),\n 'has-min-memory': t('ai:Minimum Memory'),\n 'has-min-valid-disks': t('ai:Minimum disks of required size'),\n 'has-cpu-cores-for-role': t('ai:Minimum CPU cores for selected role'),\n 'has-memory-for-role': t('ai:Minimum memory for selected role'),\n 'hostname-unique': t('ai:Unique hostname'),\n 'hostname-valid': t('ai:Valid hostname'),\n connected: t('ai:Connected'),\n 'media-connected': t('ai:Media Connected'),\n 'machine-cidr-defined': t('ai:Machine CIDR'),\n 'belongs-to-machine-cidr': t('ai:Belongs to machine CIDR'),\n 'ignition-downloadable': t('ai:Ignition file downloadable'),\n 'belongs-to-majority-group': t('ai:Belongs to majority connected group'),\n 'valid-platform-network-settings': t('ai:Platform network settings'),\n 'ntp-synced': t('ai:NTP synchronization'),\n 'container-images-available': t('ai:Container images availability'),\n 'lso-requirements-satisfied': t('ai:LSO requirements'),\n 'ocs-requirements-satisfied': t('ai:OCS requirements'),\n 'odf-requirements-satisfied': t('ai:ODF requirements'),\n 'lvm-requirements-satisfied': t('ai:LVM requirements'),\n 'cnv-requirements-satisfied': t('ai:CNV requirements'),\n 'disk-encryption-requirements-satisfied': t('ai:Disk encryption requirements'),\n 'sufficient-installation-disk-speed': t('ai:Installation disk speed'),\n 'api-domain-name-resolved-correctly': t('ai:API domain name resolution'),\n 'api-int-domain-name-resolved-correctly': t('ai:API internal domain name resolution'),\n 'apps-domain-name-resolved-correctly': t('ai:Application ingress domain name resolution'),\n 'dns-wildcard-not-configured': t('ai:DNS wildcard not configured'),\n 'non-overlapping-subnets': t('ai:Non overlapping subnets'),\n 'vsphere-disk-uuid-enabled': t('ai:Vsphere disk uuid enabled'),\n 'compatible-agent': t('ai:Agent compatibility'),\n 'no-skip-installation-disk': t('ai:No skip installation disk'),\n 'no-skip-missing-disk': t('ai:No skip missing disk'),\n 'service-has-sufficient-spoke-kube-api-access': t(\n 'ai:Service has sufficient spoke kube api access',\n ),\n});\n\nexport const hostValidationFailureHints = (\n t: TFunction,\n): { [key in HostValidationId]: string } => ({\n 'compatible-with-cluster-platform': '',\n 'has-default-route': '',\n 'sufficient-network-latency-requirement-for-role': '',\n 'sufficient-packet-loss-requirement-for-role': '',\n 'has-inventory': '',\n 'has-min-cpu-cores': '',\n 'has-min-memory': '',\n 'has-min-valid-disks': '',\n 'has-cpu-cores-for-role': '',\n 'has-memory-for-role': '',\n 'hostname-unique': '',\n 'hostname-valid': '',\n connected: '',\n 'media-connected': '',\n 'machine-cidr-defined': '',\n 'belongs-to-machine-cidr': '',\n 'ignition-downloadable': '',\n 'belongs-to-majority-group': '',\n 'valid-platform-network-settings': '',\n 'ntp-synced': t(\n \"ai:Please manually fix host's NTP configuration or provide additional NTP sources.\",\n ),\n 'container-images-available': '',\n 'lso-requirements-satisfied': '',\n 'ocs-requirements-satisfied': '',\n 'odf-requirements-satisfied': '',\n 'lvm-requirements-satisfied': '',\n 'cnv-requirements-satisfied': '',\n 'disk-encryption-requirements-satisfied': '',\n 'sufficient-installation-disk-speed': '',\n 'api-domain-name-resolved-correctly': '',\n 'api-int-domain-name-resolved-correctly': '',\n 'apps-domain-name-resolved-correctly': '',\n 'dns-wildcard-not-configured': '',\n 'non-overlapping-subnets': '',\n 'vsphere-disk-uuid-enabled': '',\n 'compatible-agent': '',\n 'no-skip-installation-disk': '',\n 'no-skip-missing-disk': '',\n 'service-has-sufficient-spoke-kube-api-access': '',\n});\n\nexport const clusterValidationLabels = (\n t: TFunction,\n): { [key in ClusterValidationId]: string } => ({\n 'network-type-valid': t('ai:Valid network type'),\n 'machine-cidr-defined': t('ai:Machine CIDR'),\n 'cluster-cidr-defined': t('ai:Cluster CIDR'),\n 'service-cidr-defined': t('ai:Service CIDR'),\n 'no-cidrs-overlapping': t('ai:No overlapping CIDR'),\n 'networks-same-address-families': t('ai:Networks same address families'),\n 'network-prefix-valid': t('ai:Valid network prefix'),\n 'machine-cidr-equals-to-calculated-cidr': t('ai:Machine CIDR conforms expected'),\n 'api-vip-defined': t('ai:API IP'),\n 'api-vip-valid': t('ai:API IP validity'),\n 'ingress-vip-defined': t('ai:Ingress IP'),\n 'ingress-vip-valid': t('ai:Ingress IP validity'),\n 'all-hosts-are-ready-to-install': t('ai:All hosts are ready to install'),\n 'sufficient-masters-count': t('ai:Control plane nodes count'),\n 'dns-domain-defined': t('ai:DNS domain'),\n 'pull-secret-set': t('ai:Pull secret'),\n 'ntp-server-configured': t('ai:NTP server'),\n 'lso-requirements-satisfied': t('ai:LSO requirements'),\n 'ocs-requirements-satisfied': t('ai:OCS requirements'),\n 'odf-requirements-satisfied': t('ai:ODF requirements'),\n 'lvm-requirements-satisfied': t('ai:LVM requirements'),\n 'cnv-requirements-satisfied': t('ai:CNV requirements'),\n});\n\nexport const clusterValidationGroupLabels = (\n t: TFunction,\n): { [key in ClusterValidationGroup]: string } => ({\n configuration: t('ai:General configuration'),\n hostsData: t('ai:Hosts'),\n 'hosts-data': t('ai:Hosts'),\n network: t('ai:Networking'),\n operators: t('ai:Operators'),\n});\n\nexport const CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4 = {\n clusterNetworkCidr: '10.128.0.0/14',\n clusterNetworkHostPrefix: 23,\n serviceNetworkCidr: '172.30.0.0/16',\n};\n\nexport const CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6 = {\n clusterNetworkCidr: '2002:db8::/53',\n clusterNetworkHostPrefix: 64,\n serviceNetworkCidr: '2003:db8::/112',\n};\n\nexport const getAssistedUiLibVersion = () => packageJson.version;\n\nexport const EVENT_SEVERITIES: Event['severity'][] = ['info', 'warning', 'error', 'critical'];\n\nexport const TIME_ZERO = '0001-01-01T00:00:00.000Z';\n\nexport const MS_PER_DAY = 1000 * 60 * 60 * 24;\n\nexport const NO_SUBNET_SET = 'NO_SUBNET_SET';\n\nexport const NETWORK_TYPE_OVN = 'OVNKubernetes';\nexport const NETWORK_TYPE_SDN = 'OpenShiftSDN';\n\nexport const IPV4_STACK = 'singleStack';\nexport const DUAL_STACK = 'dualStack';\n\nexport const PREFIX_MAX_RESTRICTION = {\n IPv6: 128,\n IPv4: 25,\n};\n\nexport const diskRoleLabels = (t: TFunction): { [key in DiskRole]: string } => ({\n none: t('ai:None'),\n install: t('ai:Installation disk'),\n});\n\n// The API uses free-form string for operator names, so let's guard at least using constants\nexport const OPERATOR_NAME_CNV = 'cnv';\nexport const OPERATOR_NAME_LSO = 'lso';\nexport const OPERATOR_NAME_ODF = 'odf';\nexport const OPERATOR_NAME_LVM = 'lvm';\nexport const OPERATOR_NAME_CVO = 'cvo';\nexport const OPERATOR_NAME_CONSOLE = 'console';\n\nexport type OperatorName =\n | typeof OPERATOR_NAME_CNV\n | typeof OPERATOR_NAME_LSO\n | typeof OPERATOR_NAME_ODF\n | typeof OPERATOR_NAME_LVM\n | typeof OPERATOR_NAME_CVO\n | typeof OPERATOR_NAME_CONSOLE;\n\nexport const operatorLabels = (t: TFunction): { [key in OperatorName]: string } => ({\n [OPERATOR_NAME_CONSOLE]: t('ai:OpenShift Console'),\n [OPERATOR_NAME_CVO]: t('ai:OpenShift Cluster Version Operator'),\n [OPERATOR_NAME_LSO]: t('ai:OpenShift Local Storage'),\n [OPERATOR_NAME_ODF]: t('ai:OpenShift Data Foundation'),\n [OPERATOR_NAME_LVM]: t('ai:OpenShift Data Foundation Logical Volume Manager'),\n [OPERATOR_NAME_CNV]: t('ai:OpenShift Virtualization'),\n});\n\nexport const OCP_STATIC_IP_DOC =\n 'https://docs.openshift.com/container-platform/latest/scalability_and_performance/ztp-deploying-disconnected.html#ztp-configuring-a-static-ip_ztp-deploying-disconnected';\n\nexport const AI_UI_TAG = 'ui_ocm';\n\nexport const OCP_RELEASES_PAGE = 'openshift/releases';\n\nexport const NUTANIX_CONFIG_LINK = 'https://access.redhat.com/solutions/6983944';\n", "import React from 'react';\nimport classNames from 'classnames';\nimport { Button, ButtonProps, Popover } from '@patternfly/react-core';\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';\nimport { PopoverProps } from '@patternfly/react-core/dist/js/components/Popover/Popover';\nimport { SVGIconProps } from '@patternfly/react-icons/dist/js/createIcon';\n\ntype PopoverIconProps = PopoverProps & {\n variant?: ButtonProps['variant'];\n component?: ButtonProps['component'];\n IconComponent?: React.ComponentClass<SVGIconProps>;\n noVerticalAlign?: boolean;\n buttonClassName?: string;\n buttonOuiaId?: string;\n};\n\nconst PopoverIcon: React.FC<PopoverIconProps> = ({\n component,\n variant = 'plain',\n IconComponent = OutlinedQuestionCircleIcon,\n noVerticalAlign = false,\n buttonClassName,\n buttonOuiaId,\n ...props\n}) => (\n <Popover {...props}>\n <Button\n component={component}\n variant={variant}\n onClick={(e) => e.preventDefault()}\n className={classNames('pf-c-form__group-label-help', 'pf-u-p-0', buttonClassName)}\n ouiaId={buttonOuiaId}\n >\n <IconComponent noVerticalAlign={noVerticalAlign} />\n </Button>\n </Popover>\n);\n\nexport default PopoverIcon;\n", "import React from 'react';\nimport { useField } from 'formik';\nimport { Radio } from '@patternfly/react-core';\nimport { getFieldId } from './utils';\nimport { RadioFieldProps } from './types';\n\nconst RadioField = ({\n callFormikOnChange = true,\n name,\n value,\n onChange,\n ...rest\n}: RadioFieldProps) => {\n const [field] = useField({\n name,\n value,\n type: 'radio',\n });\n const fieldId = getFieldId(name, 'radio', field.value);\n\n return (\n <Radio\n {...field}\n {...rest}\n id={fieldId}\n isChecked={!!field.checked}\n onChange={(checked, e) => {\n onChange?.(checked, e);\n callFormikOnChange && field.onChange(e);\n }}\n />\n );\n};\n\nexport default RadioField;\n", "import * as React from 'react';\nimport { useField, useFormikContext } from 'formik';\nimport { Checkbox, FormGroup, Tooltip } from '@patternfly/react-core';\nimport { useFeature } from '../../../features';\nimport { OpenshiftVersionOptionType } from '../../../types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\nimport { CheckboxFieldProps } from './types';\nimport { FeatureSupportLevelBadge, useFeatureSupportLevel } from '../../featureSupportLevels';\nimport { ClusterCreateParams } from '../../../api/types';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\ntype SingleNodeCheckboxProps = CheckboxFieldProps & { versions: OpenshiftVersionOptionType[] };\n\nconst SingleNodeCheckbox: React.FC<SingleNodeCheckboxProps> = ({\n versions,\n validate,\n idPostfix,\n ...props\n}) => {\n const {\n values: { openshiftVersion },\n } = useFormikContext<ClusterCreateParams>();\n const isSingleNodeOpenshiftEnabled = useFeature('ASSISTED_INSTALLER_SNO_FEATURE');\n const [field, meta, helpers] = useField<'None' | 'Full'>({ name: props.name, validate });\n const featureSupportLevelContext = useFeatureSupportLevel();\n const prevVersionRef = React.useRef(openshiftVersion);\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const { t } = useTranslation();\n const { value } = meta;\n const { setValue } = helpers;\n const isSupportedVersionAvailable = !!versions.find((version) =>\n featureSupportLevelContext.isFeatureSupported(version.value, 'SNO'),\n );\n const onChanged = React.useCallback(\n (checked: boolean) => setValue(checked ? 'None' : 'Full'),\n [setValue],\n );\n\n const disabledReason = featureSupportLevelContext.getFeatureDisabledReason(\n openshiftVersion,\n 'SNO',\n t,\n );\n\n React.useEffect(() => {\n if (\n prevVersionRef.current !== openshiftVersion &&\n !featureSupportLevelContext.isFeatureSupported(openshiftVersion, 'SNO')\n ) {\n //invoke updating SNO value only if the version changed to not be in danger of touching existing clusters\n onChanged(false);\n }\n prevVersionRef.current = openshiftVersion;\n }, [openshiftVersion, onChanged, featureSupportLevelContext]);\n\n if (isSingleNodeOpenshiftEnabled && isSupportedVersionAvailable) {\n return (\n <FormGroup isInline fieldId={fieldId}>\n <Tooltip hidden={!disabledReason} content={disabledReason}>\n <Checkbox\n {...field}\n {...props}\n id={fieldId}\n label={\n <>\n {t('ai:Install single node OpenShift (SNO)')}&nbsp;\n <FeatureSupportLevelBadge featureId=\"SNO\" openshiftVersion={openshiftVersion} />\n </>\n }\n aria-describedby={`${fieldId}-helper`}\n description={\n <HelperText fieldId={fieldId}>\n {t('ai:SNO enables you to install OpenShift using only one host.')}\n </HelperText>\n }\n isChecked={value === 'None'}\n onChange={onChanged}\n className=\"with-tooltip\"\n />\n </Tooltip>\n </FormGroup>\n );\n }\n return null;\n};\n\nexport default SingleNodeCheckbox;\n", "export * from './featureGate';\n", "import React from 'react';\n\n// Must conform Unleash constants\ntype AssistedInstallerFeatureType =\n | 'ASSISTED_INSTALLER_SNO_FEATURE'\n | 'ASSISTED_INSTALLER_OCS_FEATURE'\n | 'ASSISTED_INSTALLER_ODF_FEATURE'\n | 'ASSISTED_INSTALLER_CNV_FEATURE'\n | 'ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE'\n | 'ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE';\nexport type FeatureListType = {\n [key in AssistedInstallerFeatureType]?: boolean;\n};\n\nexport type AssistedInstallerOCMPermissionTypes = 'canEdit';\nexport type AssistedInstallerOCMPermissionTypesListType = {\n [key in AssistedInstallerOCMPermissionTypes]: boolean;\n};\nexport type AssistedInstallerPermissionTypes = 'isViewerMode';\nexport type AssistedInstallerPermissionTypesListType = {\n [key in AssistedInstallerPermissionTypes]: boolean;\n};\n\n// Hardcoded for ACM\nexport const ACM_ENABLED_FEATURES: FeatureListType = {\n ASSISTED_INSTALLER_SNO_FEATURE: true,\n ASSISTED_INSTALLER_OCS_FEATURE: false,\n ASSISTED_INSTALLER_ODF_FEATURE: false,\n ASSISTED_INSTALLER_CNV_FEATURE: false,\n ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE: false,\n ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE: false,\n};\n\n// Hardcoded outside OCM\nexport const SINGLE_CLUSTER_ENABLED_FEATURES: FeatureListType = {\n ASSISTED_INSTALLER_SNO_FEATURE: false,\n ASSISTED_INSTALLER_OCS_FEATURE: false,\n ASSISTED_INSTALLER_ODF_FEATURE: false,\n ASSISTED_INSTALLER_CNV_FEATURE: false,\n ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE: false,\n ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE: false,\n};\n\n// Hardcoded outside OCM\nexport const STANDALONE_DEPLOYMENT_ENABLED_FEATURES: FeatureListType = {\n ASSISTED_INSTALLER_SNO_FEATURE: true,\n ASSISTED_INSTALLER_OCS_FEATURE: true,\n ASSISTED_INSTALLER_ODF_FEATURE: true,\n ASSISTED_INSTALLER_CNV_FEATURE: true,\n ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE: true,\n ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE: true,\n};\n\nexport type FeatureGateContextType = {\n isFeatureEnabled: (feature: AssistedInstallerFeatureType) => boolean;\n};\n\nexport const FeatureGateContext = React.createContext<FeatureGateContextType>({\n isFeatureEnabled: () => false,\n});\n\nexport const FeatureGateContextProvider: React.FC<{\n features: FeatureListType;\n}> = ({ features, children }) => {\n // hardcoded defaults\n const featuresWithDefaults: FeatureListType = {\n ASSISTED_INSTALLER_OCS_FEATURE: false,\n ASSISTED_INSTALLER_ODF_FEATURE: false,\n ASSISTED_INSTALLER_CNV_FEATURE: false,\n ...features,\n };\n\n const isFeatureEnabled = (feature: AssistedInstallerFeatureType) => {\n // Configured via Unleash in the OCM\n return !!featuresWithDefaults[feature];\n };\n\n return (\n <FeatureGateContext.Provider value={{ isFeatureEnabled }}>\n {children}\n </FeatureGateContext.Provider>\n );\n};\n\nexport const useFeature = (feature: AssistedInstallerFeatureType): boolean => {\n const { isFeatureEnabled } = React.useContext(FeatureGateContext);\n return isFeatureEnabled(feature);\n};\n", "import React from 'react';\nimport { FeatureId, SupportLevel, isPreviewSupportLevel } from '../../types';\nimport { TechnologyPreview, DeveloperPreview } from '../ui/PreviewBadge';\nimport { useFeatureSupportLevel } from './FeatureSupportLevelContext';\n\nexport type SupportLevelBadgeProps = {\n featureId: FeatureId;\n openshiftVersion: string | undefined;\n};\n\nconst FeatureSupportLevelBadge: React.FC<SupportLevelBadgeProps> = ({\n featureId,\n openshiftVersion,\n}) => {\n const featureSupportLevelData = useFeatureSupportLevel();\n const supportLevel: SupportLevel | undefined = React.useMemo(() => {\n if (!openshiftVersion) {\n return undefined;\n }\n return featureSupportLevelData.getFeatureSupportLevel(openshiftVersion, featureId);\n }, [openshiftVersion, featureId, featureSupportLevelData]);\n if (!isPreviewSupportLevel(supportLevel)) {\n return null;\n }\n const testId = `${featureId}-support-level`;\n return supportLevel === 'tech-preview' ? (\n <TechnologyPreview testId={testId} />\n ) : (\n <DeveloperPreview testId={testId} />\n );\n};\n\nexport default FeatureSupportLevelBadge;\n", "import React from 'react';\nimport { Label, Popover } from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { TECH_SUPPORT_LEVEL_LINK } from '../../config/constants';\nimport ExternalLink from './ExternalLink';\nimport { WithTestID } from '../../types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type DeveloperPreviewProps = {\n position?: PreviewBadgePosition;\n className?: string;\n} & WithTestID;\n\nexport type TechnologyPreviewProps = DeveloperPreviewProps;\n\nexport enum PreviewBadgePosition {\n default,\n inline,\n inlineRight,\n}\n\ntype PreviewBadgeProps = DeveloperPreviewProps & {\n text: string;\n externalLink?: string;\n popoverText: string;\n};\n\nconst PreviewBadge: React.FC<PreviewBadgeProps> = ({\n position = PreviewBadgePosition.inline,\n className = 'pf-u-ml-md',\n text,\n popoverText,\n externalLink,\n testId,\n}) => {\n let clsName = className;\n const { t } = useTranslation();\n switch (position) {\n case PreviewBadgePosition.inlineRight:\n clsName += ' pf-u-float-right';\n break;\n case PreviewBadgePosition.inline:\n clsName += ' pf-u-display-inline';\n break;\n }\n const bodyContent = (\n <>\n <div style={{ marginBottom: 'var(--pf-global--spacer--sm)' }}>{popoverText}</div>\n {externalLink && (\n <>\n <ExternalLink href={externalLink}>{t('ai:Learn more')}</ExternalLink>\n </>\n )}\n </>\n );\n\n return (\n <Popover bodyContent={bodyContent} position=\"top\">\n <Label\n style={{ cursor: 'pointer' }}\n color=\"orange\"\n onClick={(e) => e.preventDefault()}\n icon={<InfoCircleIcon color=\"var(--pf-c-label__content--Color)\" />}\n className={clsName}\n data-testid={`${testId}`}\n >\n {text}\n </Label>\n </Popover>\n );\n};\n\nexport const DeveloperPreview: React.FC<DeveloperPreviewProps> = (props) => {\n const { t } = useTranslation();\n return (\n <PreviewBadge\n text={t('ai:Developer Preview')}\n popoverText={t(\n 'ai:Developer preview features are not intended to be used in production environments. The clusters deployed with the developer preview features are considered to be development clusters and are not supported through the Red Hat Customer Portal case management system.',\n )}\n {...props}\n />\n );\n};\nDeveloperPreview.displayName = 'DeveloperPreview';\n\nexport const TechnologyPreview: React.FC<TechnologyPreviewProps> = (props) => {\n const { t } = useTranslation();\n return (\n <PreviewBadge\n text={t('ai:Technology Preview')}\n popoverText={t(\n 'ai:Technology preview features provide early access to upcoming product innovations, enabling you to test functionality and provide feedback during the development process.',\n )}\n externalLink={TECH_SUPPORT_LEVEL_LINK}\n {...props}\n />\n );\n};\nTechnologyPreview.displayName = 'TechnologyPreview';\n", "import React, { ReactNode } from 'react';\nimport { Text } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\n\ninterface ExternalLinkProps {\n href?: string;\n onClick?: VoidFunction;\n children?: ReactNode;\n}\nconst ExternalLink: React.FC<ExternalLinkProps> = ({ href, children, onClick }) => (\n <Text component=\"a\" href={href} onClick={onClick} target=\"_blank\" rel=\"noopener noreferrer\">\n {children ? children : href} <ExternalLinkAltIcon color=\"rgb(0, 123, 186)\" />\n </Text>\n);\nexport default ExternalLink;\n", "import React from 'react';\nimport { FeatureId, FeatureIdToSupportLevel, SupportLevel } from '../../types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nexport type FeatureSupportLevelData = {\n getVersionSupportLevelsMap(version: string): FeatureIdToSupportLevel | undefined;\n getFeatureSupportLevel(version: string, featureId: FeatureId): SupportLevel | undefined;\n isFeatureDisabled(version: string, featureId: FeatureId): boolean;\n getFeatureDisabledReason(\n version: string,\n featureId: FeatureId,\n t?: TFunction,\n ): string | undefined;\n isFeatureSupported(version: string, featureId: FeatureId): boolean;\n};\n\nconst FeatureSupportLevelContext = React.createContext<FeatureSupportLevelData | null>(null);\n\nexport const FeatureSupportLevelContextProvider: React.FC<{\n children: React.ReactNode;\n value: FeatureSupportLevelData;\n}> = ({ value, children }) => {\n return (\n <FeatureSupportLevelContext.Provider value={value}>\n {children}\n </FeatureSupportLevelContext.Provider>\n );\n};\n\nexport const useFeatureSupportLevel = () => {\n const context = React.useContext(FeatureSupportLevelContext);\n\n const { t } = useTranslation();\n if (!context) {\n throw new Error(\n t('ai:useFeatureSupportLevel must be used within FeatureSupportLevelContextProvider.'),\n );\n }\n return context;\n};\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, NumberInput, NumberInputProps, Split, SplitItem } from '@patternfly/react-core';\nimport { NumberInputFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\n\n// eslint-disable-next-line react/display-name\nconst NumberInputField: React.FC<NumberInputFieldProps> = React.forwardRef(\n (\n {\n label,\n labelIcon,\n helperText,\n isRequired,\n validate,\n idPostfix,\n minValue = 0,\n maxValue,\n children,\n formatValue,\n onChange,\n ...props\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const [field, { touched, error }, { setValue }] = useField<number>({\n name: props.name,\n validate,\n });\n const fieldId = getFieldId(props.name, 'numberinput', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n const doChange = (value: number) => {\n let newValue = value < minValue ? minValue : value;\n newValue = maxValue && newValue > maxValue ? maxValue : newValue;\n newValue = formatValue ? formatValue(newValue) : newValue;\n setValue(newValue);\n onChange?.(newValue);\n };\n\n const onPlus: NumberInputProps['onPlus'] = () => {\n doChange(field.value + 1);\n };\n\n const onMinus: NumberInputProps['onMinus'] = () => {\n doChange(field.value - 1);\n };\n\n const handleChange: NumberInputProps['onChange'] = (event) => {\n const targetValue = event.target['value'] as number;\n doChange(isNaN(targetValue) ? 0 : Number(targetValue));\n };\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n <Split>\n <SplitItem isFilled>\n <NumberInput\n {...props}\n value={field.value}\n onMinus={onMinus}\n onChange={handleChange}\n onPlus={onPlus}\n min={minValue}\n max={maxValue}\n ref={ref}\n id={fieldId}\n aria-describedby={`${fieldId}-helper`}\n />\n </SplitItem>\n <SplitItem>{children}</SplitItem>\n </Split>\n </FormGroup>\n );\n },\n);\n\nexport default NumberInputField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, HelperTextItem } from '@patternfly/react-core';\nimport { CodeFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\nimport { CodeEditor } from '@patternfly/react-code-editor';\nimport useFieldErrorMsg from '../../../hooks/useFieldErrorMsg';\nimport { monaco } from 'react-monaco-editor';\n\nconst CodeField = ({\n label,\n labelIcon,\n helperText,\n isRequired,\n validate,\n idPostfix,\n language,\n name,\n description,\n isDisabled,\n}: CodeFieldProps) => {\n const [field, , { setValue, setTouched }] = useField({ name, validate });\n const fieldId = getFieldId(name, 'input', idPostfix);\n const [monacoSubscription, setMonacoSubscription] = React.useState<monaco.IDisposable>();\n const [monacoEditor, setMonacoEditor] = React.useState<monaco.editor.IStandaloneCodeEditor>();\n const errorMessage = useFieldErrorMsg({ name, validate });\n\n React.useEffect(() => {\n //Work around for Patternfly CodeEditor not calling onChange after upload or drag/drop files\n //The temporary solution is to handle the changes by registering to the change events of the internal editor in CodeEditor\n //Once issue https://github.com/patternfly/patternfly-react/issues/7341 will be resolved this code can be replaced with a simple onChange\n if (!monacoEditor) {\n return;\n }\n if (monacoSubscription) {\n monacoSubscription.dispose();\n }\n setMonacoSubscription(\n monacoEditor.onDidChangeModelContent(() => {\n setTouched(true);\n setValue(monacoEditor.getModel()?.getValue(), true);\n }),\n );\n return () => {\n if (monacoSubscription) {\n monacoSubscription.dispose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [monacoEditor]);\n\n const isValid = !errorMessage;\n return (\n <>\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n {description && (\n <HelperText fieldId={fieldId}>\n <HelperTextItem variant=\"indeterminate\">{description}</HelperTextItem>\n </HelperText>\n )}\n <CodeEditor\n code={field.value}\n isUploadEnabled={!isDisabled}\n isDownloadEnabled\n isCopyEnabled\n isLanguageLabelVisible\n height=\"400px\"\n language={language}\n onEditorDidMount={(editor) => setMonacoEditor(editor)}\n />\n </FormGroup>\n </>\n );\n};\n\nexport default CodeField;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport classNames from 'classnames';\nimport {\n FormGroup,\n HelperTextItem,\n TextInput,\n HelperText as PFHelperText,\n HelperTextItemProps,\n Popover,\n PopoverPosition,\n InputGroup,\n Button,\n} from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n CheckIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\nimport { global_palette_green_500 as okColor } from '@patternfly/react-tokens/dist/js/global_palette_green_500';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens/dist/js/global_danger_color_100';\nimport { global_palette_blue_300 as blueInfoColor } from '@patternfly/react-tokens/dist/js/global_palette_blue_300';\n\nimport { InputFieldProps as BaseInputProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\n\nimport './RichInputField.css';\n\nconst getHelperTextVariant = (\n validationMessage: string,\n value: RichValidationProps['value'],\n errors: RichValidationProps['error'],\n): {\n variant: HelperTextItemProps['variant'];\n icon?: HelperTextItemProps['icon'];\n} => {\n if (!value) {\n return { variant: 'indeterminate' };\n } else if (errors?.includes(validationMessage)) {\n return { variant: 'error', icon: <TimesIcon /> };\n }\n return { variant: 'success', icon: <CheckIcon /> };\n};\n\ntype RichValidationProps = {\n // eslint-disable-next-line\n value: any;\n error: string | undefined;\n richValidationMessages: { [key: string]: string };\n};\n\nexport const RichValidation: React.FC<RichValidationProps> = ({\n value,\n error,\n richValidationMessages,\n}) => {\n return (\n <PFHelperText component=\"ul\" className=\"rich-input__rules\">\n {Object.keys(richValidationMessages).map((key) => {\n const variant = getHelperTextVariant(richValidationMessages[key], value, error);\n return (\n <HelperTextItem key={key} isDynamic component=\"li\" {...variant}>\n {richValidationMessages[key]}\n </HelperTextItem>\n );\n })}\n </PFHelperText>\n );\n};\n\nexport type RichInputFieldPropsProps = BaseInputProps & {\n richValidationMessages: RichValidationProps['richValidationMessages'];\n placeholder?: string;\n};\n\n// eslint-disable-next-line react/display-name\nconst RichInputField: React.FC<RichInputFieldPropsProps> = React.forwardRef(\n (\n {\n label,\n labelIcon,\n helperText,\n isRequired,\n onChange,\n validate,\n idPostfix,\n noDefaultOnChange,\n richValidationMessages,\n ...props\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const [popoverOpen, setPopoverOpen] = React.useState(false);\n const [field, { error, value, touched }, { setTouched }] = useField({\n name: props.name,\n validate,\n });\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const isValid = !touched || !error?.length;\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n <InputGroup\n className={classNames('rich-input__group', { 'rich_input__group--invalid': !isValid })}\n >\n <TextInput\n {...field}\n {...props}\n ref={ref}\n id={fieldId}\n isRequired={isRequired}\n aria-describedby={`${fieldId}-helper`}\n onChange={(value, event) => {\n !popoverOpen && setPopoverOpen(true);\n !noDefaultOnChange && field.onChange(event);\n setTouched(true, false);\n onChange && onChange(event);\n }}\n className=\"rich-input__text\"\n onBlur={() => setPopoverOpen(false)}\n />\n <Popover\n isVisible={popoverOpen}\n shouldClose={() => setPopoverOpen(false)}\n shouldOpen={() => setPopoverOpen(true)}\n aria-label=\"validation popover\"\n position={PopoverPosition.top}\n bodyContent={\n <RichValidation\n value={value}\n error={error}\n richValidationMessages={richValidationMessages as Record<string, string>}\n />\n }\n >\n <Button variant=\"plain\" aria-label=\"Validation\">\n {!isValid ? (\n <ExclamationCircleIcon color={dangerColor.value} />\n ) : value ? (\n <CheckCircleIcon color={okColor.value} />\n ) : (\n <InfoCircleIcon color={blueInfoColor.value} />\n )}\n </Button>\n </Popover>\n </InputGroup>\n </FormGroup>\n );\n },\n);\n\nexport default RichInputField;\n", "import { useField } from 'formik';\nimport * as React from 'react';\nimport TextAreaField from './TextAreaField';\nimport { trimCommaSeparatedList } from './utils';\n\ntype AdditionalNTPSourcesFieldProps = {\n name: string;\n label?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n helperText?: string;\n};\n\nconst AdditionalNTPSourcesField: React.FC<AdditionalNTPSourcesFieldProps> = ({\n name,\n label,\n isRequired,\n isDisabled,\n helperText,\n}) => {\n const [field, , { setValue, setTouched }] = useField(name);\n const formatAdditionalNtpSources = () => {\n if (field.value) {\n setValue(trimCommaSeparatedList(field.value));\n setTouched(true);\n }\n };\n return (\n <TextAreaField\n name={name}\n label={label}\n helperText={helperText}\n onBlur={formatAdditionalNtpSources}\n spellCheck={false}\n isRequired={isRequired}\n isDisabled={isDisabled}\n />\n );\n};\n\nexport default AdditionalNTPSourcesField;\n", "import React from 'react';\nimport { Button, ButtonVariant, Tooltip, TooltipProps } from '@patternfly/react-core';\nimport { MinusCircleIcon } from '@patternfly/react-icons';\nimport './RemovableField.css';\nimport classnames from 'classnames';\n\ninterface RemovableFieldProps {\n onRemove: VoidFunction;\n hideRemoveButton?: boolean;\n removeButtonDataTestId?: string;\n}\n\nconst REMOVE_BUTTON_EXIT_DELAY = 1500;\n\nconst RemovableField: React.FC<RemovableFieldProps & Omit<TooltipProps, 'content'>> = ({\n onRemove,\n hideRemoveButton = true,\n children,\n className,\n removeButtonDataTestId,\n ...props\n}) => {\n return (\n <Tooltip\n hidden={hideRemoveButton}\n exitDelay={REMOVE_BUTTON_EXIT_DELAY}\n flipBehavior={['right', 'bottom']}\n position=\"right-start\"\n distance={0}\n content={\n <Button\n variant={ButtonVariant.plain}\n onClick={onRemove}\n data-testid={removeButtonDataTestId}\n >\n <MinusCircleIcon size=\"sm\" />\n </Button>\n }\n className={classnames('ai-remove-button__tooltip ', className)}\n {...props}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default RemovableField;\n", "import { Button, ButtonProps, ButtonVariant } from '@patternfly/react-core';\nimport { PlusCircleIcon } from '@patternfly/react-icons';\nimport React from 'react';\n\ninterface AddButtonProps {\n onAdd: VoidFunction;\n}\n\nconst AddButton: React.FC<AddButtonProps & ButtonProps> = ({\n onAdd,\n variant = ButtonVariant.link,\n children,\n ...props\n}) => {\n return (\n <Button icon={<PlusCircleIcon />} onClick={onAdd} variant={variant} {...props}>\n {children}\n </Button>\n );\n};\n\nexport default AddButton;\n", "import { useField } from 'formik';\nimport * as React from 'react';\nimport { PencilAltIcon } from '@patternfly/react-icons';\nimport InputField from './InputField';\nimport { Split, SplitItem } from '@patternfly/react-core';\n\nimport './PencilEditField.css';\nimport useFieldErrorMsg from '../../../hooks/useFieldErrorMsg';\n\nconst InputFieldFocus = ({\n name,\n isRequired,\n onBlur,\n showErrorMessage,\n}: PencilEditFieldProps & { onBlur: VoidFunction; showErrorMessage?: boolean }) => {\n const textInputRef = React.useRef<HTMLDivElement>();\n React.useEffect(() => textInputRef?.current?.focus(), []);\n return (\n <InputField\n name={name}\n isRequired={isRequired}\n onBlur={onBlur}\n ref={textInputRef}\n showErrorMessage={showErrorMessage}\n />\n );\n};\n\ntype PencilEditFieldProps = {\n name: string;\n isRequired: boolean;\n showErrorMessage?: boolean;\n};\n\nconst PencilEditField = ({ name, isRequired, showErrorMessage }: PencilEditFieldProps) => {\n const [edit, setEdit] = React.useState(false);\n const [field] = useField({ name });\n\n const errrMsg = useFieldErrorMsg({ name });\n\n return (\n <>\n {edit ? (\n <InputFieldFocus\n name={name}\n isRequired={isRequired}\n onBlur={() => setEdit(false)}\n showErrorMessage={showErrorMessage}\n />\n ) : (\n <>\n <Split>\n <SplitItem className=\"ai-pencil-field__text\">{field.value}</SplitItem>\n <SplitItem>\n <PencilAltIcon onClick={() => setEdit(true)} />\n </SplitItem>\n </Split>\n </>\n )}\n <div className=\"pf-c-form__helper-text pf-m-error\">{errrMsg}</div>\n </>\n );\n};\n\nexport default PencilEditField;\n", "import { overlap } from 'cidr-tools';\nimport { Address4, Address6 } from 'ip-address';\nimport isCIDR from 'is-cidr';\nimport { isInSubnet } from 'is-in-subnet';\nimport * as Yup from 'yup';\n\nimport { TFunction } from 'i18next';\nimport { ClusterNetwork, MachineNetwork, ServiceNetwork } from '../../../api/types';\nimport { NO_SUBNET_SET } from '../../../config/constants';\nimport { ProxyFieldsType } from '../../../types';\nimport { HostSubnets, NetworkConfigurationValues } from '../../../types/clusters';\nimport { getErrorMessage } from '../../../utils';\nimport { getSubnet } from '../../clusterConfiguration/utils';\nimport {\n bmcAddressValidationMessages,\n clusterNameValidationMessages,\n FORBIDDEN_HOSTNAMES,\n hostnameValidationMessages,\n locationValidationMessages,\n nameValidationMessages,\n} from './constants';\nimport { allSubnetsIPv4, trimCommaSeparatedList, trimSshPublicKey } from './utils';\n\nconst ALPHANUMERIC_REGEX = /^[a-zA-Z0-9]+$/;\nconst NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;\nconst NAME_CHARS_REGEX = /^[a-z0-9-.]*$/;\nconst CLUSTER_NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;\n// NOTE: based on https://github.com/openshift/assisted-service/blob/master/internal/cluster/validations/validations.go#L32\nconst CLUSTER_NAME_REGEX =\n /^[.-a-z0-9]?(([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)*)[.-a-z0-9]?$/;\nconst CLUSTER_NAME_NO_DOT_REGEX = /^[a-z0-9-]*$/;\nconst SSH_PUBLIC_KEY_REGEX =\n /^(ssh-rsa|ssh-ed25519|ecdsa-[-a-z0-9]*) AAAA[0-9A-Za-z+/]+[=]{0,3}( .+)?$/;\nconst DNS_NAME_REGEX = /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/;\nconst PROXY_DNS_REGEX =\n /^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[._]?$/;\nconst IP_V4_ZERO = '0.0.0.0';\nconst IP_V6_ZERO = '0000:0000:0000:0000:0000:0000:0000:0000';\nconst MAC_REGEX = /^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/;\nconst HOST_NAME_REGEX = /^[^.]{1,63}(?:[.][^.]{1,63})*$/;\n\n// Source of information: https://github.com/metal3-io/baremetal-operator/blob/main/docs/api.md#baremetalhost-spec\nconst BMC_REGEX =\n /^((redfish-virtualmedia|idrac-virtualmedia)(\\+https?)?:(\\/\\/([a-z0-9\\-._~%!$&'()*+,;=]+@)?([a-z0-9\\-._~%]+|\\[[a-f0-9:.]+\\]|\\[v[a-f0-9][a-z0-9\\-._~%!$&'()*+,;=:]+\\])(:[0-9]+)?(\\/[a-z0-9\\-._~%!$&'()*+,;=:@]+)*\\/?|(\\/?[a-z0-9\\-._~%!$&'()*+,;=:@]+(\\/[a-z0-9\\-._~%!$&'()*+,;=:@]+)*\\/?)?)|([a-z0-9\\-._~%!$&'()*+,;=@]+(\\/[a-z0-9\\-._~%!$&'()*+,;=:@]+)*\\/?|(\\/[a-z0-9\\-._~%!$&'()*+,;=:@]+)+\\/?))(\\?[a-z0-9\\-._~%!$&'()*+,;=:@/?]*)?(#[a-z0-9\\-._~%!$&'()*+,;=:@/?]*)?$/i;\nconst LOCATION_CHARS_REGEX = /^[a-zA-Z0-9-._]*$/;\n\nexport const nameValidationSchema = (\n t: TFunction,\n usedClusterNames: string[],\n baseDnsDomain = '',\n validateUniqueName?: boolean,\n isOcm = false,\n) => {\n const clusterNameValidationMessagesList = clusterNameValidationMessages(t);\n return Yup.string()\n .required('Required')\n .matches(isOcm ? CLUSTER_NAME_REGEX : CLUSTER_NAME_NO_DOT_REGEX, {\n message: isOcm\n ? clusterNameValidationMessagesList.INVALID_VALUE_OCM\n : clusterNameValidationMessagesList.INVALID_VALUE_ACM,\n excludeEmptyString: true,\n })\n .matches(CLUSTER_NAME_START_END_REGEX, {\n message: clusterNameValidationMessagesList.INVALID_START_END,\n excludeEmptyString: true,\n })\n .min(\n isOcm ? 1 : 2,\n isOcm\n ? clusterNameValidationMessagesList.INVALID_LENGTH_OCM\n : clusterNameValidationMessagesList.INVALID_LENGTH_ACM,\n )\n .max(\n 54,\n isOcm\n ? clusterNameValidationMessagesList.INVALID_LENGTH_OCM\n : clusterNameValidationMessagesList.INVALID_LENGTH_ACM,\n )\n .when('useRedHatDnsService', {\n is: true,\n then: Yup.string().test(\n 'is-name-unique',\n clusterNameValidationMessagesList.NOT_UNIQUE,\n (value: string) => {\n const clusterFullName = `${value}.${baseDnsDomain}`;\n return !value || !usedClusterNames.includes(clusterFullName);\n },\n ),\n otherwise: Yup.string().test(\n 'is-name-unique',\n clusterNameValidationMessagesList.NOT_UNIQUE,\n (value: string) => {\n // in CIM cluster name is ClusterDeployment CR name which must be unique\n return validateUniqueName ? !value || !usedClusterNames.includes(value) : true;\n },\n ),\n });\n};\n\nexport const sshPublicKeyValidationSchema = Yup.string().test(\n 'ssh-public-key',\n 'SSH public key must consist of \"[TYPE] key [[EMAIL]]\", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT]. A single key can be provided only.',\n (value) => {\n if (!value) {\n return true;\n }\n\n return !!trimSshPublicKey(value).match(SSH_PUBLIC_KEY_REGEX);\n /* TODO(mlibra): disabled till muliple ssh-keys are supported: https://issues.redhat.com/browse/MGMT-3560\n return (\n trimSshPublicKey(value)\n .split('\\n')\n .find((line: string) => !line.match(SSH_PUBLIC_KEY_REGEX)) === undefined\n );\n */\n },\n);\n\nexport const pullSecretValidationSchema = Yup.string().test(\n 'is-well-formed-json',\n \"Invalid pull secret format. You must use your Red Hat account's pull secret.\",\n (value) => {\n const isValid = true;\n if (!value) return isValid;\n try {\n const pullSecret = JSON.parse(value);\n return (\n pullSecret.constructor.name === 'Object' &&\n !!pullSecret?.auths &&\n pullSecret.auths.constructor.name === 'Object'\n );\n } catch {\n return !isValid;\n }\n },\n);\n\nexport const ipValidationSchema = Yup.string().test(\n 'ip-validation',\n 'Not a valid IP address',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n (value) => Address4.isValid(value) || Address6.isValid(value),\n);\n\nexport const macAddressValidationSchema = Yup.string().matches(MAC_REGEX, {\n message: 'Value \"${value}\" is not valid MAC address.', // eslint-disable-line no-template-curly-in-string\n excludeEmptyString: true,\n});\n\nexport const vipRangeValidationSchema = (\n hostSubnets: HostSubnets,\n { machineNetworks, hostSubnet }: NetworkConfigurationValues,\n) =>\n Yup.string().test('vip-validation', 'IP Address is outside of selected subnet', function (value) {\n if (!value) {\n return true;\n }\n try {\n ipValidationSchema.validateSync(value);\n } catch (err) {\n return this.createError({ message: getErrorMessage(err) });\n }\n\n const foundHostSubnets = [];\n if (machineNetworks) {\n const cidrs = machineNetworks?.map((network) => network.cidr);\n foundHostSubnets.push(...hostSubnets.filter((hn) => cidrs?.includes(hn.subnet)));\n } else {\n const subnet = hostSubnets.find((hn) => hn.subnet === hostSubnet);\n if (subnet) {\n foundHostSubnets.push(subnet);\n }\n }\n for (const hostSubnet of foundHostSubnets) {\n if (hostSubnet?.subnet) {\n // Workaround for bug in CIM backend. hostIDs are empty\n if (!hostSubnet.hostIDs.length) {\n return true;\n } else if (isInSubnet(value, hostSubnet.subnet)) {\n return true;\n }\n }\n }\n return false;\n });\n\nconst vipUniqueValidationSchema = ({ ingressVip, apiVip }: NetworkConfigurationValues) =>\n Yup.string().test(\n 'vip-uniqueness-validation',\n 'The Ingress and API IP addresses cannot be the same.',\n (value) => {\n if (!value) {\n return true;\n }\n return ingressVip !== apiVip;\n },\n );\n\n// like .required() but passes for initially empty field\nconst requiredOnceSet = (initialValue?: string, message?: string) =>\n Yup.string().test(\n 'required-once-set',\n message || 'The value is required.',\n (value) => value || !initialValue,\n );\n\nexport const hostSubnetValidationSchema = Yup.string().when(['managedNetworkingType'], {\n is: 'clusterManaged',\n then: Yup.string().notOneOf([NO_SUBNET_SET], 'Host subnet must be selected.'),\n});\n\nexport const vipValidationSchema = (\n hostSubnets: HostSubnets,\n values: NetworkConfigurationValues,\n initialValue?: string,\n) =>\n Yup.mixed().when(['vipDhcpAllocation', 'managedNetworkingType'], {\n is: (vipDhcpAllocation, managedNetworkingType) =>\n !vipDhcpAllocation && managedNetworkingType !== 'userManaged',\n then: requiredOnceSet(initialValue, 'Required. Please provide an IP address')\n .concat(vipRangeValidationSchema(hostSubnets, values))\n .concat(vipUniqueValidationSchema(values))\n .when('hostSubnet', {\n is: (hostSubnet) => hostSubnet !== NO_SUBNET_SET,\n then: Yup.string().required('Required. Please provide an IP address'),\n }),\n });\n\nexport const ipBlockValidationSchema = (reservedCidrs: string | string[] | undefined) =>\n Yup.string()\n .required('A value is required.')\n .test(\n 'valid-ip-address',\n 'Invalid IP address block. Expected value is a network expressed in CIDR notation (IP/netmask). For example: 123.123.123.0/24, 2055:d7a::/116',\n (value = '') => isCIDR.v4(value) || isCIDR.v6(value),\n )\n .test(\n 'valid-netmask',\n 'IPv4 netmask must be between 1-25 and include at least 128 addresses.\\nIPv6 netmask must be between 8-128 and include at least 256 addresses.',\n (value = '') => {\n const suffix = parseInt(value.split('/')[1]);\n\n return (\n (isCIDR.v4(value) && 0 < suffix && suffix < 26) ||\n (isCIDR.v6(value) && 7 < suffix && suffix < 129)\n );\n },\n )\n .test(\n 'cidr-is-not-unspecified',\n 'The specified CIDR is invalid because its resulting routing prefix matches the unspecified address.',\n (cidr = '') => {\n const ip = getSubnet(cidr);\n if (ip === null) {\n return false;\n }\n\n // The first address is used to represent the network\n const startAddress = ip.startAddress().address;\n\n return startAddress !== IP_V4_ZERO && startAddress !== IP_V6_ZERO;\n },\n )\n .test(\n 'valid-cidr-base-address',\n ({ value }) => `${value as string} is not a valid CIDR`,\n (cidr = '') => {\n const ip = getSubnet(cidr);\n if (ip === null) {\n return false;\n }\n\n const networkAddress = ip.startAddress().parsedAddress;\n const ipAddress = ip.parsedAddress;\n const result = ipAddress.every((part, idx) => part === networkAddress[idx]);\n\n return result;\n },\n )\n .test('cidrs-can-not-overlap', 'Provided CIDRs can not overlap.', (cidr: string) => {\n try {\n if (cidr && reservedCidrs && reservedCidrs.length > 0) {\n return !overlap(cidr, reservedCidrs);\n }\n } catch {\n return false;\n }\n // passing by default\n return true;\n });\n\nexport const dnsNameValidationSchema = Yup.string()\n .test(\n 'dns-name-label-length',\n 'Single label of the DNS name can not be longer than 63 characters.',\n (value = '') => value.split('.').every((label: string) => label.length <= 63),\n )\n .matches(DNS_NAME_REGEX, {\n message: 'Value \"${value}\" is not valid DNS name. Example: basedomain.example.com', // eslint-disable-line no-template-curly-in-string\n excludeEmptyString: true,\n });\n\nexport const hostPrefixValidationSchema = (\n clusterNetworkCidr: NetworkConfigurationValues['clusterNetworkCidr'],\n) => {\n const requiredText = 'The host prefix is required.';\n const minMaxText =\n 'The host prefix is a number between 1 and 32 for IPv4 and between 8 and 128 for IPv6.';\n const netBlock = (clusterNetworkCidr || '').split('/')[1];\n if (!netBlock) {\n return Yup.number().required(requiredText).min(1, minMaxText).max(32, minMaxText);\n }\n\n let netBlockNumber = parseInt(netBlock);\n if (isNaN(netBlockNumber)) {\n netBlockNumber = 1;\n }\n\n const errorMsgPrefix =\n 'The host prefix is a number between size of the cluster network CIDR range';\n const errorMsgIPv4 = `${errorMsgPrefix} (${netBlockNumber}) and 25.`;\n const errorMsgIPv6 = `${errorMsgPrefix} (8) and 128.`;\n\n if (Address6.isValid(clusterNetworkCidr || '')) {\n return Yup.number().required(requiredText).min(8, errorMsgIPv6).max(128, errorMsgIPv6);\n }\n\n if (Address4.isValid(clusterNetworkCidr || '')) {\n return Yup.number()\n .required(requiredText)\n .min(netBlockNumber, errorMsgIPv4)\n .max(25, errorMsgIPv4);\n }\n\n return Yup.number().required(requiredText);\n};\n\nexport const richNameValidationSchema = (t: TFunction, usedNames: string[], origName?: string) => {\n const nameValidationMessagesList = nameValidationMessages(t);\n return Yup.string()\n .min(1, nameValidationMessagesList.INVALID_LENGTH)\n .max(253, nameValidationMessagesList.INVALID_LENGTH)\n .test(\n nameValidationMessagesList.INVALID_START_END,\n nameValidationMessagesList.INVALID_START_END,\n (value: string) => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return true;\n }\n return (\n !!trimmed[0].match(NAME_START_END_REGEX) &&\n (trimmed[trimmed.length - 1]\n ? !!trimmed[trimmed.length - 1].match(NAME_START_END_REGEX)\n : true)\n );\n },\n )\n .matches(HOST_NAME_REGEX, nameValidationMessagesList.INVALID_FORMAT)\n .matches(NAME_CHARS_REGEX, {\n message: nameValidationMessagesList.INVALID_VALUE,\n excludeEmptyString: true,\n })\n .test(nameValidationMessagesList.NOT_UNIQUE, nameValidationMessagesList.NOT_UNIQUE, (value) => {\n if (!value || value === origName) {\n return true;\n }\n return !usedNames.find((n) => n === value);\n })\n .notOneOf(FORBIDDEN_HOSTNAMES, hostnameValidationMessages(t).LOCALHOST_ERR);\n};\n\nconst httpProxyValidationMessage = 'Provide a valid HTTP URL.';\nexport const httpProxyValidationSchema = (\n values: ProxyFieldsType,\n pairValueName: 'httpProxy' | 'httpsProxy',\n) =>\n Yup.string()\n .test(\n 'http-proxy-no-empty-validation',\n 'At least one of the HTTP or HTTPS proxy URLs is required.',\n (value) => !values.enableProxy || value || values[pairValueName],\n )\n .test('http-proxy-validation', httpProxyValidationMessage, (value) => {\n if (!value) {\n return true;\n }\n\n try {\n const url = new URL(value);\n return url.protocol === 'http:';\n } catch {\n return false;\n }\n });\n\nconst isNotEmpty = (value: string) => {\n if (!value) {\n return true;\n }\n if (value !== '') {\n return true;\n }\n return false;\n};\n\nconst isIPorDN = (value: string, dnsRegex = DNS_NAME_REGEX) => {\n if (!value) {\n return true;\n }\n if (value.match(dnsRegex)) {\n return true;\n }\n try {\n ipValidationSchema.validateSync(value);\n } catch (err) {\n return false;\n }\n return true;\n};\n\nexport const noProxyValidationSchema = Yup.string().test(\n 'no-proxy-validation',\n 'Provide a comma separated list of valid DNS names or IP addresses.',\n (value: string) => {\n if (!value || value === '*') {\n return true;\n }\n\n // https://docs.openshift.com/container-platform/4.5/installing/installing_bare_metal/installing-restricted-networks-bare-metal.html#installation-configure-proxy_installing-restricted-networks-bare-metal\n // A comma-separated list of destination domain names, domains, IP addresses or other network CIDRs\n // to exclude proxying. Preface a domain with . to include all subdomains of that domain.\n // Use * to bypass proxy for all destinations.\"\n const noProxyList = trimCommaSeparatedList(value)\n .split(',')\n .map((p) => (p.charAt(0) === '.' ? p.substring(1) : p));\n return noProxyList.every(isNotEmpty) && noProxyList.every((p) => isIPorDN(p, PROXY_DNS_REGEX));\n },\n);\n\nexport const ntpSourceValidationSchema = Yup.string().test(\n 'ntp-source-validation',\n 'Provide a comma separated list of valid DNS names or IP addresses.',\n (value: string) => {\n if (!value) {\n return true;\n }\n return trimCommaSeparatedList(value)\n .split(',')\n .every((v) => isIPorDN(v));\n },\n);\n\nexport const day2ApiVipValidationSchema = Yup.string().test(\n 'day2-api-vip',\n 'Provide a valid DNS name or IP Address',\n (value: string) => {\n if (!value) {\n return true;\n }\n return isIPorDN(value);\n },\n);\n\nexport const bmcAddressValidationSchema = (t: TFunction) => {\n const bmcAddressValidationMessagesList = bmcAddressValidationMessages(t);\n\n return Yup.string().matches(BMC_REGEX, {\n message: bmcAddressValidationMessagesList.INVALID_VALUE,\n excludeEmptyString: true,\n });\n};\nexport const locationValidationSchema = (t: TFunction) => {\n const locationValidationMessagesList = locationValidationMessages(t);\n return Yup.string()\n .min(1, locationValidationMessagesList.INVALID_LENGTH)\n .max(63, locationValidationMessagesList.INVALID_LENGTH)\n .test(\n locationValidationMessagesList.INVALID_START_END,\n locationValidationMessagesList.INVALID_START_END,\n (value) => {\n const trimmed: string = value?.trim();\n if (!trimmed) {\n return true;\n }\n return (\n !!trimmed[0].match(ALPHANUMERIC_REGEX) &&\n (trimmed[trimmed.length - 1]\n ? !!trimmed[trimmed.length - 1].match(ALPHANUMERIC_REGEX)\n : true)\n );\n },\n )\n .matches(LOCATION_CHARS_REGEX, {\n message: locationValidationMessagesList.INVALID_VALUE,\n excludeEmptyString: true,\n });\n};\n\nexport const machineNetworksValidationSchema = Yup.array().of(\n Yup.object({ cidr: hostSubnetValidationSchema, clusterId: Yup.string() }),\n);\n\nexport const clusterNetworksValidationSchema = Yup.array().of(\n Yup.lazy((values: ClusterNetwork) =>\n Yup.object({\n cidr: ipBlockValidationSchema(\n undefined /* So far used in OCM only and so validated by backend */,\n ),\n hostPrefix: hostPrefixValidationSchema(values.cidr),\n clusterId: Yup.string(),\n }),\n ),\n);\n\nexport const serviceNetworkValidationSchema = Yup.array().of(\n Yup.object({\n cidr: ipBlockValidationSchema(\n undefined /* So far used in OCM only and so validated by backend */,\n ),\n clusterId: Yup.string(),\n }),\n);\n\nexport const dualStackValidationSchema = (field: string) =>\n Yup.array()\n .max(2, `Maximum number of ${field} subnets in dual stack is 2.`)\n .test(\n 'dual-stack-ipv4',\n 'First network has to be IPv4 subnet.',\n (values) => values[0].cidr && Address4.isValid(values[0].cidr),\n )\n .test(\n 'dual-stack-ipv6',\n 'Second network has to be IPv6 subnet.',\n (values) => values[1].cidr && Address6.isValid(values[1].cidr),\n );\n\nexport const IPv4ValidationSchema = Yup.array().test(\n 'single-stack',\n `All network subnets must be IPv4.`,\n (values: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv4(values),\n);\n", "import { Address4, Address6 } from 'ip-address';\nimport {\n Cluster,\n ClusterDefaultConfig,\n ClusterNetwork,\n Inventory,\n MachineNetwork,\n ServiceNetwork,\n stringToJSON,\n} from '../../api';\nimport { NETWORK_TYPE_OVN, NETWORK_TYPE_SDN, NO_SUBNET_SET } from '../../config';\nimport {\n selectClusterNetworkCIDR,\n selectClusterNetworkHostPrefix,\n selectServiceNetworkCIDR,\n selectSchedulableMasters,\n isClusterPlatformTypeVM,\n} from '../../selectors';\nimport {\n HostDiscoveryValues,\n HostSubnets,\n StorageValues,\n Validation,\n ValidationGroup,\n ValidationsInfo,\n} from '../../types/clusters';\nimport { getHostname } from '../hosts/utils';\n\nexport const getSubnet = (cidr: string): Address6 | Address4 | null => {\n if (Address4.isValid(cidr)) {\n return new Address4(cidr);\n } else if (Address6.isValid(cidr)) {\n return new Address6(cidr);\n } else {\n return null;\n }\n};\n\nexport const getHumanizedSubnetRange = (subnet: Address6 | Address4 | null) => {\n if (subnet) {\n const subnetStart = subnet.startAddress().correctForm();\n const subnetEnd = subnet.endAddress().correctForm();\n return `(${subnetStart} - ${subnetEnd})`;\n }\n\n return '';\n};\n\nexport const getHumanizedSubnet = (subnet: Address6 | Address4 | null) => {\n if (subnet) {\n return `${subnet.address} ${getHumanizedSubnetRange(subnet)}`;\n }\n return '';\n};\n\nexport const getHostSubnets = (cluster: Cluster): HostSubnets => {\n const hostnameMap: { [id: string]: string } =\n cluster.hosts?.reduce((acc, host) => {\n const inventory = stringToJSON<Inventory>(host.inventory) || {};\n acc = {\n ...acc,\n [host.id]: getHostname(host, inventory),\n };\n return acc;\n }, {}) || {};\n\n return (\n cluster.hostNetworks?.map((hn) => {\n return {\n subnet: hn.cidr || '',\n hostIDs: hn.hostIds?.map((id) => hostnameMap[id] || id) || [],\n humanized: getHumanizedSubnet(getSubnet(hn.cidr as string)),\n };\n }) || []\n );\n};\n\nexport const getSubnetFromMachineNetworkCidr = (machineNetworkCidr?: string) => {\n if (!machineNetworkCidr) {\n return NO_SUBNET_SET;\n }\n\n const subnet = getSubnet(machineNetworkCidr);\n return subnet?.address;\n};\n\nexport const serviceNetworksEqual = (array1: ServiceNetwork[], array2: ServiceNetwork[]) => {\n const cidrs = array2.map((elem) => elem.cidr);\n return array1.length === array2.length && array1.every((network) => cidrs.includes(network.cidr));\n};\n\nexport const clusterNetworksEqual = (array1: ClusterNetwork[], array2: ClusterNetwork[]) =>\n array1.length === array2.length &&\n array1.every((clusterNetwork) =>\n array2.find(\n (network) =>\n network.cidr === clusterNetwork.cidr && network.hostPrefix === clusterNetwork.hostPrefix,\n ),\n );\n\nexport const isAdvNetworkConf = (\n cluster: Cluster,\n defaultNetworkSettings: ClusterDefaultConfig,\n defaultNetworkType: string,\n) =>\n selectClusterNetworkCIDR(cluster) !== defaultNetworkSettings.clusterNetworkCidr ||\n selectClusterNetworkHostPrefix(cluster) !== defaultNetworkSettings.clusterNetworkHostPrefix ||\n selectServiceNetworkCIDR(cluster) !== defaultNetworkSettings.serviceNetworkCidr ||\n (Boolean(cluster.networkType) && cluster.networkType !== defaultNetworkType);\n\nexport const canSelectNetworkTypeSDN = (isSNO: boolean, isIPv6 = false) => {\n return !(isSNO || isIPv6);\n};\n\nexport const getDefaultNetworkType = (isSNO: boolean, isIPv6 = false) => {\n return isSNO || isIPv6 ? NETWORK_TYPE_OVN : NETWORK_TYPE_SDN;\n};\n\nexport const canBeDualStack = (subnets: HostSubnets) =>\n subnets.some((subnet) => Address4.isValid(subnet.subnet)) &&\n subnets.some((subnet) => Address6.isValid(subnet.subnet));\n\nconst areNetworksDualStack = (\n networks: (MachineNetwork | ClusterNetwork | ServiceNetwork)[] | undefined,\n) =>\n networks &&\n networks.length > 1 &&\n Address4.isValid(networks[0].cidr || '') &&\n Address6.isValid(networks[1].cidr || '');\n\nexport const isDualStack = ({\n machineNetworks,\n clusterNetworks,\n serviceNetworks,\n}: Pick<Cluster, 'machineNetworks' | 'clusterNetworks' | 'serviceNetworks'>) =>\n areNetworksDualStack(machineNetworks) &&\n areNetworksDualStack(clusterNetworks) &&\n areNetworksDualStack(serviceNetworks);\n\nexport const isSubnetInIPv6 = ({\n clusterNetworkCidr,\n machineNetworkCidr,\n serviceNetworkCidr,\n}: Pick<Cluster, 'clusterNetworkCidr' | 'machineNetworkCidr' | 'serviceNetworkCidr'>) =>\n Address6.isValid(clusterNetworkCidr || '') ||\n Address6.isValid(machineNetworkCidr || '') ||\n Address6.isValid(serviceNetworkCidr || '');\n\nexport const getHostDiscoveryInitialValues = (cluster: Cluster): HostDiscoveryValues => {\n return {\n usePlatformIntegration: isClusterPlatformTypeVM(cluster),\n schedulableMasters: selectSchedulableMasters(cluster),\n };\n};\n\nexport const getStorageInitialValues = (): StorageValues => {\n // TODO (dchason): add initial values to node labeling\n return {\n nodeLabeling: '',\n };\n};\n\nexport function filterValidationsInfoByGroup(\n validationsInfo: ValidationsInfo,\n selectedGroups: ValidationGroup[] = ['configuration', 'hosts-data', 'network', 'operators'],\n): ValidationsInfo {\n const result = {};\n (Object.keys(validationsInfo) as ValidationGroup[]).forEach((groupKey) => {\n if (selectedGroups.includes(groupKey)) result[groupKey] = validationsInfo[groupKey];\n });\n return result;\n}\n\nexport function filterValidationsInfoByStatus(\n validationsInfo: ValidationsInfo,\n selectedStatuses: Validation['status'][] = ['failure', 'pending', 'error'],\n): ValidationsInfo {\n const result = {};\n Object.entries(validationsInfo).forEach(([group, validations = []]) => {\n const filteredValidations = validations.filter((validation) =>\n selectedStatuses.includes(validation.status),\n );\n if (filteredValidations.length) result[group] = filteredValidations;\n });\n return result;\n}\n", "import camelCase from 'lodash/camelCase';\n\nexport const stringToJSON = <T>(jsonString: string | undefined): T | undefined => {\n let jsObject: T | undefined;\n if (jsonString) {\n try {\n const camelCased = jsonString.replace(\n /\"([\\w-]+)\":/g,\n (_match, offset: string) => `\"${camelCase(offset)}\":`,\n );\n jsObject = JSON.parse(camelCased) as T;\n } catch (e) {\n console.error('Failed to parse api string', e, jsonString);\n }\n } else {\n console.info('Empty api string received.');\n }\n\n return jsObject;\n};\n\nexport const removeProtocolFromURL = (url = '') => url.replace(/^(http|https):\\/\\//, '');\n", "import head from 'lodash/fp/head';\nimport { CpuArchitecture, SupportedPlatformIntegrations, ValidationsInfo } from '../types';\nimport { Cluster, stringToJSON } from '../api';\nimport { OperatorName } from '../config';\n\nexport const selectMachineNetworkCIDR = ({\n machineNetworks,\n machineNetworkCidr,\n}: Pick<Cluster, 'machineNetworks' | 'machineNetworkCidr'>) =>\n head(machineNetworks)?.cidr ?? machineNetworkCidr;\n\nexport const selectClusterNetworkCIDR = ({\n clusterNetworks,\n clusterNetworkCidr,\n}: Pick<Cluster, 'clusterNetworks' | 'clusterNetworkCidr'>) =>\n head(clusterNetworks)?.cidr ?? clusterNetworkCidr;\n\nexport const selectClusterNetworkHostPrefix = ({\n clusterNetworks,\n clusterNetworkHostPrefix,\n}: Pick<Cluster, 'clusterNetworks' | 'clusterNetworkHostPrefix'>) =>\n head(clusterNetworks)?.hostPrefix ?? clusterNetworkHostPrefix;\n\nexport const selectServiceNetworkCIDR = ({\n serviceNetworks,\n serviceNetworkCidr,\n}: Pick<Cluster, 'serviceNetworks' | 'serviceNetworkCidr'>) =>\n head(serviceNetworks)?.cidr ?? serviceNetworkCidr;\n\nexport const selectMonitoredOperators = (monitoredOperators: Cluster['monitoredOperators']) => {\n // monitoredOperators can sometimes be either undefined or also null, we must use the fallback\n return monitoredOperators || [];\n};\n\nexport const selectOlmOperators = (cluster?: Pick<Cluster, 'monitoredOperators'>) => {\n return selectMonitoredOperators(cluster?.monitoredOperators).filter(\n (operator) => operator.operatorType === 'olm',\n );\n};\n\nexport const hasEnabledOperators = (\n monitoredOperators: Cluster['monitoredOperators'],\n searchOperator: OperatorName,\n) => {\n return selectMonitoredOperators(monitoredOperators).some(\n (operator) => operator.name && operator.name === searchOperator,\n );\n};\n\nexport const isCompact = (cluster: Pick<Cluster, 'hosts'>) => {\n return !cluster.hosts || cluster.hosts.length <= 3;\n};\n\nexport const isSNO = ({ highAvailabilityMode }: Partial<Cluster>) =>\n highAvailabilityMode === 'None';\n\nexport const selectClusterValidationsInfo = ({\n validationsInfo,\n}: Pick<Cluster, 'validationsInfo'>) => {\n return stringToJSON<ValidationsInfo>(validationsInfo);\n};\n\nexport const selectIpv4Cidr = (\n {\n machineNetworks,\n serviceNetworks,\n clusterNetworks,\n }: Pick<Cluster, 'machineNetworks' | 'clusterNetworks' | 'serviceNetworks'>,\n key: 'machineNetworks' | 'serviceNetworks' | 'clusterNetworks',\n) => {\n switch (key) {\n case 'machineNetworks':\n return head(machineNetworks)?.cidr;\n case 'clusterNetworks':\n return head(clusterNetworks)?.cidr;\n case 'serviceNetworks':\n return head(serviceNetworks)?.cidr;\n }\n};\n\nexport const selectIpv6Cidr = (\n {\n machineNetworks,\n serviceNetworks,\n clusterNetworks,\n }: Pick<Cluster, 'machineNetworks' | 'clusterNetworks' | 'serviceNetworks'>,\n key: 'machineNetworks' | 'serviceNetworks' | 'clusterNetworks',\n) => {\n switch (key) {\n case 'machineNetworks':\n return machineNetworks && machineNetworks[1].cidr;\n case 'clusterNetworks':\n return clusterNetworks && clusterNetworks[1].cidr;\n case 'serviceNetworks':\n return serviceNetworks && serviceNetworks[1].cidr;\n }\n};\n\nexport const selectIpv4HostPrefix = ({ clusterNetworks }: Pick<Cluster, 'clusterNetworks'>) =>\n head(clusterNetworks)?.hostPrefix;\n\nexport const selectIpv6HostPrefix = ({ clusterNetworks }: Pick<Cluster, 'clusterNetworks'>) =>\n clusterNetworks && clusterNetworks[1].hostPrefix;\n\nexport const isArmArchitecture = ({ cpuArchitecture }: Pick<Cluster, 'cpuArchitecture'>) =>\n cpuArchitecture === CpuArchitecture.ARM;\n\nconst getOldSchedulableMastersAlwaysOn = (cluster: Cluster) => {\n return cluster.hosts ? cluster.hosts.length < 5 : true;\n};\n\nexport const selectMastersMustRunWorkloads = (cluster: Cluster): boolean => {\n // TODO camador 2022-06-30 Remove the logic for old schedulableMasters logic after a few weeks\n // as by then all clusters should have the new field \"schedulableMastersForcedTrue\"\n if (cluster.schedulableMastersForcedTrue === undefined) {\n return getOldSchedulableMastersAlwaysOn(cluster);\n }\n return cluster.schedulableMastersForcedTrue;\n};\n\nexport const selectSchedulableMasters = (cluster: Cluster): boolean => {\n if (selectMastersMustRunWorkloads(cluster)) {\n return true;\n }\n return cluster.schedulableMasters || false;\n};\n\nexport const isClusterPlatformTypeVM = ({ platform }: Pick<Cluster, 'platform'>) =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n SupportedPlatformIntegrations.includes(platform?.type ?? 'none');\n\n/**\n * Determines whether users can select multiple architectures when adding hosts.\n * The cluster may actually NOT support multi-arch, because the capability\n * is determined at the Organization level and not at the Cluster's level.\n * @param cluster the cluster\n */\nexport const canSelectCpuArchitecture = (cluster: Cluster) => {\n // The field \"canSelectCpuArch\" is being passed only from OCM.\n // Therefore, on Stand-alone we must always allow cpu architecture selection\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return cluster.canSelectCpuArch !== false;\n};\n", "import filesize from 'filesize.js';\nimport Fuse from 'fuse.js';\nimport { Host, Cluster, Inventory } from '../../api/types';\nimport { hostRoles, TIME_ZERO } from '../../config';\nimport { DASH } from '../constants';\nimport { stringToJSON } from '../../api';\nimport { Validation, ValidationsInfo as HostValidationsInfo } from '../../types/hosts';\nimport { TFunction } from 'i18next';\n\nexport const canEnable = (clusterStatus: Cluster['status'], status: Host['status']) =>\n ['pending-for-input', 'insufficient', 'ready', 'adding-hosts'].includes(clusterStatus) &&\n ['disabled', 'disabled-unbound'].includes(status);\n\nexport const canDisable = (clusterStatus: Cluster['status'], status: Host['status']) =>\n ['pending-for-input', 'insufficient', 'ready', 'adding-hosts'].includes(clusterStatus) &&\n [\n 'discovering',\n 'discovering-unbound',\n 'disconnected',\n 'disconnected-unbound',\n 'known',\n 'known-unbound',\n 'insufficient',\n 'insufficient-unbound',\n 'pending-for-input',\n ].includes(status);\n\nexport const canDelete = (clusterStatus: Cluster['status'], status: Host['status']) =>\n ['pending-for-input', 'insufficient', 'ready', 'adding-hosts'].includes(clusterStatus) &&\n [\n 'discovering',\n 'discovering-unbound',\n 'known',\n 'known-unbound',\n 'disconnected',\n 'disconnected-unbound',\n 'disabled',\n 'disabled-unbound',\n 'insufficient',\n 'insufficient-unbound',\n 'resetting',\n 'resetting-pending-user-input',\n 'resetting-pending-user-action',\n 'installing-pending-user-action',\n 'pending-for-input',\n 'added-to-existing-cluster',\n 'error',\n ].includes(status);\n\nexport const canReset = (clusterStatus: Cluster['status'], status: Host['status']) =>\n ['adding-hosts'].includes(clusterStatus) &&\n ['error', 'installing-pending-user-action'].includes(status);\n\nexport const canEditHost = (clusterStatus: Cluster['status'], status: Host['status']) =>\n ['pending-for-input', 'insufficient', 'ready', 'adding-hosts'].includes(clusterStatus) &&\n [\n 'discovering',\n 'discovering-unbound',\n 'known',\n 'known-unbound',\n 'disconnected',\n 'disconnected-unbound',\n 'disabled',\n 'disabled-unbound',\n 'insufficient',\n 'insufficient-unbound',\n 'pending-for-input',\n ].includes(status);\n\nexport const canEditRole = (\n clusterStatus: Cluster['status'],\n status: Host['status'],\n isSNO?: boolean,\n) => canEditHost(clusterStatus, status) && !isSNO;\n\nexport const canEditHostname = (clusterStatus: Cluster['status']) =>\n ['insufficient', 'adding-hosts', 'ready', 'pending-for-input'].includes(clusterStatus);\n\nexport const canEditDisks = canEditHost;\n\nexport const canDownloadKubeconfig = (clusterStatus: Cluster['status']) =>\n ['installing', 'finalizing', 'error', 'cancelled', 'installed', 'adding-hosts'].includes(\n clusterStatus,\n );\n\nexport const canInstallHost = (cluster: Cluster, hostStatus: Host['status']) =>\n cluster.kind === 'AddHostsCluster' && cluster.status === 'adding-hosts' && hostStatus === 'known';\n\nexport const getHostProgressStages = (host: Host) => host.progressStages || [];\n\nexport const getHostProgress = (host: Host) =>\n host.progress?.currentStage\n ? host.progress\n : {\n currentStage: 'Starting installation',\n progressInfo: undefined,\n installationPercentage: undefined,\n };\n\nexport const getHostProgressStageNumber = (host: Host) => {\n const stages = getHostProgressStages(host);\n const progress = getHostProgress(host);\n\n return Math.round(((progress?.installationPercentage || 0) / 100) * stages.length);\n};\n\nexport const canHostnameBeChanged = (hostStatus: Host['status']) =>\n [\n 'discovering',\n 'discovering-unbound',\n 'known',\n 'known-unbound',\n 'disconnected',\n 'disconnected-unbound',\n 'insufficient',\n 'insufficient-unbound',\n 'pending-for-input',\n ].includes(hostStatus);\n\nexport const getHostRole = (host: Host, t: TFunction, schedulableMasters?: boolean): string => {\n let roleLabel = `${\n hostRoles(t).find((role) => role.value === host.role)?.label || hostRoles(t)[0].label\n }`;\n\n if (schedulableMasters && host.role === 'master') {\n roleLabel = t('ai:Control plane node, Worker');\n }\n return `${roleLabel}${host.bootstrap ? ' (bootstrap)' : ''}`;\n};\n\nexport const canDownloadHostLogs = (host: Host) =>\n !!host.logsCollectedAt && host.logsCollectedAt !== TIME_ZERO;\n\nexport const canDownloadClusterLogs = (cluster: Cluster) =>\n cluster.controllerLogsCollectedAt !== TIME_ZERO ||\n !!(cluster.hosts || []).find((host) => canDownloadHostLogs(host));\n\nexport const getReadyHostCount = (cluster: Cluster) => cluster.readyHostCount || 0;\nexport const getEnabledHostCount = (cluster: Cluster) => cluster.enabledHostCount || 0;\nexport const getTotalHostCount = (cluster: Cluster) => cluster.totalHostCount || 0;\n\nexport const getEnabledHosts = (hosts: Host[] = []) =>\n hosts.filter((host) => host.status !== 'disabled');\n\nexport const getHostname = (host: Host, inventory: Inventory) =>\n host.requestedHostname || inventory.hostname || '';\n\nexport const getHardwareTypeText = (inventory: Inventory, t: TFunction) => {\n let hardwareTypeText = DASH;\n const { systemVendor } = inventory;\n\n if (systemVendor !== undefined) {\n if (systemVendor.virtual) {\n hardwareTypeText = t('ai:Virtual machine');\n } else {\n hardwareTypeText = t('ai:Bare metal');\n }\n }\n\n return hardwareTypeText;\n};\n\nexport const fileSize: typeof filesize = (...args) =>\n filesize\n .call(null, ...args)\n .toUpperCase()\n .replace(/I/, 'i');\n\nexport const getInventory = (host: Host) => {\n const { inventory: inventoryString = '' } = host;\n return stringToJSON<Inventory>(inventoryString) || {};\n};\n\nexport const filterByHostname = (hosts: Host[], hostnameFilter: string | undefined) => {\n if (!hostnameFilter) {\n return hosts;\n }\n const hostsWithHostname = hosts.map((host) => {\n const { inventory: inventoryString = '' } = host;\n const inventory = stringToJSON<Inventory>(inventoryString) || {};\n const hostname = getHostname(host, inventory);\n return {\n hostname,\n host,\n };\n });\n\n const fuse = new Fuse(hostsWithHostname, {\n ignoreLocation: true,\n keys: ['hostname'],\n });\n return fuse.search(hostnameFilter).map(({ item }) => item.host);\n};\n\nexport const getFailingHostValidations = (validationsInfo: HostValidationsInfo) =>\n Object.keys(validationsInfo).reduce((curr, group) => {\n const failingValidations: Validation[] = (validationsInfo[group] as Validation[]).filter(\n (validation: Validation) => validation.status === 'failure',\n );\n return [...curr, ...failingValidations];\n }, [] as Validation[]);\n\nexport const areOnlySoftValidationsFailing = (validationsInfo: HostValidationsInfo) => {\n const failingValidationIds = getFailingHostValidations(validationsInfo).map(\n (validation) => validation.id,\n );\n if (!failingValidationIds.length) return false;\n for (const id of failingValidationIds) {\n if (!['ntp-synced', 'container-images-available'].includes(id)) {\n return false;\n }\n }\n return true;\n};\n", "/*\n Constants reused through-out the code.\n Please keep config-like constants within config/constants.ts.\n*/\n\nexport const DASH = '-';\nexport const OpticalDiskDriveType = 'ODD';\n", "import { TFunction } from 'i18next';\n\nexport const clusterNameValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH_OCM: t('ai:1-54 characters'),\n INVALID_LENGTH_ACM: t('ai:2-54 characters'),\n INVALID_VALUE_OCM: nameValidationMessages(t).INVALID_VALUE,\n INVALID_VALUE_ACM: t('ai:Use lowercase alphanumeric characters or hyphen (-)'),\n INVALID_START_END: t('ai:Start and end with a lowercase letter or a number.'),\n NOT_UNIQUE: t('ai:Must be unique'),\n});\n\nexport const ocmClusterNameValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH: clusterNameValidationMessages(t).INVALID_LENGTH_OCM,\n INVALID_VALUE: clusterNameValidationMessages(t).INVALID_VALUE_OCM,\n INVALID_START_END: clusterNameValidationMessages(t).INVALID_START_END,\n});\n\nexport const uniqueOcmClusterNameValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH: clusterNameValidationMessages(t).INVALID_LENGTH_OCM,\n INVALID_VALUE: clusterNameValidationMessages(t).INVALID_VALUE_OCM,\n INVALID_START_END: clusterNameValidationMessages(t).INVALID_START_END,\n NOT_UNIQUE: clusterNameValidationMessages(t).NOT_UNIQUE,\n});\n\nexport const acmClusterNameValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH: clusterNameValidationMessages(t).INVALID_LENGTH_ACM,\n INVALID_VALUE: clusterNameValidationMessages(t).INVALID_VALUE_ACM,\n INVALID_START_END: clusterNameValidationMessages(t).INVALID_START_END,\n NOT_UNIQUE: clusterNameValidationMessages(t).NOT_UNIQUE,\n});\n\nexport const nameValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH: t('ai:1-253 characters'),\n NOT_UNIQUE: t('ai:Must be unique'),\n INVALID_VALUE: t('ai:Use lowercase alphanumeric characters, dot (.) or hyphen (-)'),\n INVALID_START_END: t('ai:Must start and end with an lowercase alphanumeric character'),\n INVALID_FORMAT: t('ai:Number of characters between dots (.) must be 1-63'),\n});\n\nexport const hostnameValidationMessages = (t: TFunction) => ({\n ...nameValidationMessages(t),\n LOCALHOST_ERR: t('ai:Do not use forbidden words, for example: \"localhost\".'),\n});\n\nexport const locationValidationMessages = (t: TFunction) => ({\n INVALID_LENGTH: t('ai:1-63 characters'),\n INVALID_VALUE: t('ai:Use alphanumeric characters, dot (.), underscore (_) or hyphen (-)'),\n INVALID_START_END: t('ai:Must start and end with an alphanumeric character'),\n});\n\nexport const bmcAddressValidationMessages = (t: TFunction) => ({\n INVALID_VALUE: t(\n 'ai:The Value is not valid BMC address, supported protocols are redfish-virtualmedia or idrac-virtualmedia.',\n ),\n});\n\nexport const FORBIDDEN_HOSTNAMES = [\n 'localhost',\n 'localhost.localdomain',\n 'localhost4',\n 'localhost4.localdomain4',\n 'localhost6',\n 'localhost6.localdomain6',\n];\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, Label } from '@patternfly/react-core';\nimport TagsInput from 'react-tagsinput';\nimport { InputFieldProps } from './types';\nimport { getFieldId } from './utils';\nimport HelperText from './HelperText';\n\nimport './LabelField.css';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\ntype LabelValueProps = {\n value: React.ReactText;\n onClose?: () => void;\n};\n\nexport const LabelValue: React.FC<LabelValueProps> = ({ value, onClose }) => (\n <Label className=\"label-field__value\" variant=\"outline\" onClose={onClose}>\n {value}\n </Label>\n);\n\ntype LabelFieldProps = InputFieldProps & {\n // eslint-disable-next-line\n onChange?: (tags: any[]) => void;\n};\n\nexport const LabelField: React.FC<LabelFieldProps> = ({\n label,\n labelIcon,\n helperText,\n isRequired,\n onChange,\n validate,\n idPostfix,\n ...props\n}) => {\n const { t } = useTranslation();\n const [input, setInput] = React.useState('');\n const [field, { touched, error }, { setValue, setTouched }] = useField({\n name: props.name,\n validate,\n });\n const fieldId = getFieldId(props.name, 'input', idPostfix);\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={errorMessage}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n labelIcon={labelIcon}\n >\n {t(\"ai:Enter key=value and then press 'enter' or 'space' or use a ',' to input the label.\")}\n <div className=\"co-search-input pf-c-form-control\">\n <TagsInput\n {...field}\n onChange={(tags) => {\n setValue(tags);\n setInput('');\n onChange && onChange(tags);\n !touched && setTouched(true);\n }}\n addKeys={[13, 32, 188]}\n renderTag={({ tag, key, onRemove, getTagDisplayValue }) => (\n <LabelValue key={key} onClose={() => onRemove(key)} value={getTagDisplayValue(tag)} />\n )}\n addOnBlur\n inputProps={{\n autoFocus: false,\n className: 'label-field__input',\n placeholder: field.value?.length ? '' : 'app=frontend',\n spellCheck: 'false',\n id: 'tags-input',\n value: input,\n // eslint-disable-next-line\n onChange: (e: any) => setInput(e.target.value),\n ['data-test']: 'tags-input',\n }}\n />\n </div>\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport {\n Title,\n EmptyState as PFEmptyState,\n EmptyStateBody,\n Bullseye,\n EmptyStateIcon,\n EmptyStateSecondaryActions,\n EmptyStateIconProps,\n} from '@patternfly/react-core';\nimport { SearchIcon } from '@patternfly/react-icons';\n\ntype Props = {\n title?: string;\n content?: React.ReactNode;\n icon?: EmptyStateIconProps['icon'];\n primaryAction?: React.ReactNode;\n secondaryActions?: React.ReactNode[];\n};\n\nconst EmptyState: React.FC<Props> = ({\n title = 'No results found',\n content,\n icon = SearchIcon,\n primaryAction,\n secondaryActions,\n}) => (\n <Bullseye>\n <PFEmptyState>\n <EmptyStateIcon icon={icon} />\n <Title headingLevel=\"h2\">{title}</Title>\n {content && <EmptyStateBody>{content}</EmptyStateBody>}\n {primaryAction}\n {secondaryActions && (\n <EmptyStateSecondaryActions>{secondaryActions}</EmptyStateSecondaryActions>\n )}\n </PFEmptyState>\n </Bullseye>\n);\n\nexport default EmptyState;\n", "import React from 'react';\nimport {\n Title,\n EmptyState,\n EmptyStateBody,\n Bullseye,\n EmptyStateIcon,\n EmptyStateVariant,\n Button,\n ButtonVariant,\n EmptyStateSecondaryActions,\n EmptyStateIconProps,\n} from '@patternfly/react-core';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons';\nimport { global_danger_color_200 as globalDangerColor200 } from '@patternfly/react-tokens';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\ntype ErrorStateProps = {\n title?: string;\n content?: React.ReactNode;\n fetchData?: () => void;\n icon?: EmptyStateIconProps['icon'];\n iconColor?: string;\n primaryAction?: React.ReactNode;\n actions?: React.ReactNode[];\n variant?: EmptyStateVariant;\n};\n\nconst DefaultErrorContent = ({ fetchData }: { fetchData: ErrorStateProps['fetchData'] }) => {\n const { t } = useTranslation();\n return (\n <>\n {t('ai:There was an error retrieving data. Check your connection and')}{' '}\n {fetchData ? (\n <Button onClick={fetchData} variant={ButtonVariant.link} isInline>\n {t('ai:try again')}\n </Button>\n ) : (\n t('ai:try again')\n )}\n .\n </>\n );\n};\n\nconst ErrorState = ({\n title = 'Error loading data',\n content,\n fetchData,\n icon = ExclamationCircleIcon,\n iconColor = globalDangerColor200.value,\n variant = EmptyStateVariant.small,\n primaryAction,\n actions,\n}: ErrorStateProps) => {\n return (\n <Bullseye>\n <EmptyState variant={variant}>\n <EmptyStateIcon icon={icon} color={iconColor} />\n <Title headingLevel=\"h2\">{title}</Title>\n <EmptyStateBody>{content || <DefaultErrorContent fetchData={fetchData} />}</EmptyStateBody>\n {primaryAction}\n {actions && <EmptyStateSecondaryActions>{actions}</EmptyStateSecondaryActions>}\n </EmptyState>\n </Bullseye>\n );\n};\n\nexport default ErrorState;\n", "import React from 'react';\nimport {\n EmptyState,\n EmptyStateBody,\n Bullseye,\n EmptyStateVariant,\n Spinner,\n EmptyStateSecondaryActions,\n} from '@patternfly/react-core';\n\ntype Props = {\n content?: React.ReactNode;\n primaryAction?: React.ReactNode;\n secondaryActions?: React.ReactNode[];\n};\n\nconst LoadingState: React.FC<Props> = ({ content, primaryAction, secondaryActions }) => (\n <Bullseye>\n <EmptyState variant={EmptyStateVariant.small}>\n <Spinner size=\"xl\" />\n {content && <EmptyStateBody>{content}</EmptyStateBody>}\n {primaryAction}\n {secondaryActions && (\n <EmptyStateSecondaryActions>{secondaryActions}</EmptyStateSecondaryActions>\n )}\n </EmptyState>\n </Bullseye>\n);\n\nexport default LoadingState;\n", "import React from 'react';\nimport { Button, ToolbarItem } from '@patternfly/react-core';\n\nconst ToolbarButton: React.FC<React.ComponentProps<typeof Button>> = ({ ...props }) => (\n <ToolbarItem>\n <Button {...props} />\n </ToolbarItem>\n);\n\nexport default ToolbarButton;\n", "import React from 'react';\n\nimport { ToolbarItem, Text } from '@patternfly/react-core';\n\nconst ToolbarText: React.FC<React.ComponentProps<typeof Text>> = (props) => (\n <ToolbarItem>\n <Text {...props} />\n </ToolbarItem>\n);\n\nexport default ToolbarText;\n", "import React from 'react';\n\nimport { ToolbarGroup, ToolbarItem, Progress, ProgressSize } from '@patternfly/react-core';\n\nconst ToolbarProgress: React.FC<React.ComponentProps<typeof Progress>> = ({\n style,\n size = ProgressSize.sm,\n}) => (\n <ToolbarGroup style={{ flexGrow: 1 }}>\n <ToolbarItem style={{ flexGrow: 1 }}>\n <Progress style={{ ...style, gridGap: 0 }} size={size} />\n </ToolbarItem>\n </ToolbarGroup>\n);\n\nexport default ToolbarProgress;\n", "import React from 'react';\nimport { ToolbarGroup } from '@patternfly/react-core';\n\nconst ToolbarSecondaryGroup: React.FC = ({ children }) => (\n <ToolbarGroup alignment={{ md: 'alignRight' }}>{children}</ToolbarGroup>\n);\n\nexport default ToolbarSecondaryGroup;\n", "import * as React from 'react';\nimport { useField } from 'formik';\nimport { FormGroup, TextContent, Text } from '@patternfly/react-core';\nimport { getFieldId, HelperText } from './formik';\n\nexport interface StaticFieldProps {\n name: string;\n label: string;\n helperText?: React.ReactNode;\n helperTextInvalid?: React.ReactNode;\n isRequired?: boolean;\n isValid?: boolean;\n}\n\nexport const StaticField: React.FC<StaticFieldProps> = ({\n label,\n name,\n children,\n helperText,\n helperTextInvalid,\n isRequired,\n isValid = true,\n}) => {\n const fieldId = getFieldId(name, 'static');\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={label}\n helperText={\n typeof helperText === 'string' ? (\n helperText\n ) : (\n <HelperText fieldId={fieldId}>{helperText}</HelperText>\n )\n }\n helperTextInvalid={helperTextInvalid}\n validated={isValid ? 'default' : 'error'}\n isRequired={isRequired}\n >\n {children}\n </FormGroup>\n );\n};\n\n/**\n * Static Formik field which sets value prop as formik field value\n */\ntype FormikStaticFieldProps = {\n value: string;\n} & StaticFieldProps;\n\nexport const FormikStaticField: React.FC<FormikStaticFieldProps> = ({ value, ...props }) => {\n const [, , helpers] = useField({ name: props.name });\n\n React.useEffect(() => {\n helpers.setValue(value);\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return <StaticField {...props} />;\n};\n\n/**\n * Simplified form component for rendering static text.\n * Does not reflect field value from formik.\n */\nexport const StaticTextField: React.FC<StaticFieldProps> = ({ children, ...props }) => {\n const fieldId = getFieldId(props.name, 'static');\n\n return (\n <StaticField {...props}>\n <TextContent>\n <Text component=\"p\" id={fieldId} aria-describedby={`${fieldId}-helper`}>\n {children}\n </Text>\n </TextContent>\n </StaticField>\n );\n};\n", "import * as React from 'react';\nimport {\n ActionList,\n ActionListItem,\n Button,\n ButtonVariant,\n Spinner,\n SplitItem,\n Stack,\n StackItem,\n Text,\n TextVariants,\n} from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Cluster } from '../../api';\nimport { EventListFetchProps } from '../../types/events';\nimport ViewClusterEventsButton from './ViewClusterEventsButton';\n\nexport type WizardFooterGenericProps = {\n onNext?: () => void;\n onBack?: () => void;\n onCancel?: () => void;\n isNextDisabled?: boolean;\n isBackDisabled?: boolean;\n isSubmitting?: boolean;\n submittingText?: string;\n nextButtonText?: string;\n};\n\ntype WizardFooterProps = WizardFooterGenericProps & {\n alerts?: React.ReactNode;\n errors?: React.ReactNode;\n leftExtraActions?: React.ReactNode;\n cluster?: Cluster;\n onFetchEvents?: EventListFetchProps['onFetchEvents'];\n};\n\nexport const WizardFooter: React.FC<WizardFooterProps> = ({\n alerts,\n errors,\n onNext,\n onBack,\n onCancel,\n isNextDisabled,\n isBackDisabled,\n leftExtraActions,\n isSubmitting,\n submittingText,\n nextButtonText,\n cluster,\n onFetchEvents,\n}) => {\n const { t } = useTranslation();\n submittingText = submittingText || t('ai:Saving changes...');\n return (\n <Stack hasGutter>\n {alerts && <StackItem>{alerts}</StackItem>}\n {errors && <StackItem>{errors}</StackItem>}\n <StackItem>\n <ActionList data-testid=\"wizard-step-actions\">\n {leftExtraActions}\n {onNext && (\n <ActionListItem>\n <Button\n variant={ButtonVariant.primary}\n name=\"next\"\n onClick={onNext}\n isDisabled={isNextDisabled}\n >\n {nextButtonText || t('ai:Next')}\n </Button>\n </ActionListItem>\n )}\n {onBack && (\n <ActionListItem>\n <Button\n variant={ButtonVariant.secondary}\n name=\"back\"\n onClick={onBack}\n isDisabled={isBackDisabled}\n >\n {t('ai:Back')}\n </Button>\n </ActionListItem>\n )}\n <ActionListItem>\n <Button\n variant={ButtonVariant.link}\n name=\"cancel\"\n onClick={onCancel}\n isDisabled={false}\n >\n {t('ai:Cancel')}\n </Button>\n </ActionListItem>\n {isSubmitting && (\n <ActionListItem>\n <Text component={TextVariants.small}>\n <Spinner size=\"sm\" /> {submittingText}\n </Text>\n </ActionListItem>\n )}\n <SplitItem isFilled />\n {cluster && onFetchEvents && (\n <ActionListItem>\n <ViewClusterEventsButton cluster={cluster} onFetchEvents={onFetchEvents} />\n </ActionListItem>\n )}\n </ActionList>\n </StackItem>\n </Stack>\n );\n};\n", "import React from 'react';\nimport { ButtonVariant } from '@patternfly/react-core';\nimport { EventsModalButton } from './eventsModal';\nimport { MonitoringIcon } from '@patternfly/react-icons';\nimport { Cluster } from '../../api';\nimport { EventListFetchProps } from '../../types';\n\ntype ViewClusterEventsProps = {\n cluster: Cluster;\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n};\n\nconst ViewClusterEventsButton = ({ cluster, onFetchEvents }: ViewClusterEventsProps) => {\n return (\n <EventsModalButton\n id=\"cluster-events-button\"\n entityKind=\"cluster\"\n icon={<MonitoringIcon />}\n cluster={cluster}\n title=\"Cluster Events\"\n variant={ButtonVariant.secondary}\n onFetchEvents={onFetchEvents}\n >\n View Cluster Events\n </EventsModalButton>\n );\n};\n\nexport default ViewClusterEventsButton;\n", "import React from 'react';\nimport { Button, Modal, ButtonVariant, ModalVariant, ModalBoxBody } from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as globalWarningColor100 } from '@patternfly/react-tokens';\nimport { ToolbarButton } from './Toolbar';\nimport { Cluster, Event } from '../../api';\nimport { EventListFetchProps, EventsEntityKind } from '../../types';\nimport { EventListFetch } from '../fetching/EventListFetch';\nimport ExternalLink from './ExternalLink';\nimport ErrorState from './uiState/ErrorState';\n\nimport './EventsModal.css';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\ntype EventsModalButtonProps = React.ComponentProps<typeof Button> & {\n ButtonComponent?: typeof Button | typeof ToolbarButton;\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n onClick?: () => void;\n hostId?: Event['hostId'];\n cluster: Cluster;\n entityKind: EventsEntityKind;\n title: string;\n fallbackEventsURL?: string;\n};\n\nexport const EventsModalButton: React.FC<EventsModalButtonProps> = ({\n ButtonComponent = ToolbarButton,\n onFetchEvents,\n onClick,\n hostId,\n cluster,\n entityKind,\n children,\n title,\n fallbackEventsURL,\n ...props\n}) => {\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const closeModal = () => setIsModalOpen(false);\n const handleClick = onClick || (() => setIsModalOpen(true));\n return (\n <>\n <ButtonComponent {...props} onClick={handleClick}>\n {children || title}\n </ButtonComponent>\n <EventsModal\n title={title}\n isOpen={isModalOpen}\n onClose={closeModal}\n hostId={hostId}\n cluster={cluster}\n entityKind={entityKind}\n onFetchEvents={onFetchEvents}\n fallbackEventsURL={fallbackEventsURL}\n />\n </>\n );\n};\n\ntype EventsModalProps = {\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n hostId: Event['hostId'];\n cluster: Cluster;\n entityKind: EventsEntityKind;\n onClose: () => void;\n isOpen: boolean;\n title: string;\n fallbackEventsURL?: string;\n};\n\nexport const EventsModal: React.FC<EventsModalProps> = ({\n onFetchEvents,\n hostId,\n cluster,\n entityKind,\n onClose,\n isOpen,\n title,\n fallbackEventsURL,\n}) => {\n const { t } = useTranslation();\n return (\n <Modal\n title={title}\n isOpen={isOpen}\n aria-label={t('ai:Displays events')}\n hasNoBodyWrapper\n actions={[\n <Button key=\"close\" variant={ButtonVariant.primary} onClick={onClose}>\n {t('ai:Close')}\n </Button>,\n ]}\n onClose={onClose}\n variant={ModalVariant.large}\n className=\"events-modal\"\n >\n <ModalBoxBody className=\"events-modal__body\">\n {fallbackEventsURL ? (\n <ErrorState\n title={t('ai:Could not load events')}\n content={\n <>\n <Trans t={t}>\n ai:Could not load events from the standard location. You can check the events in\n the <ExternalLink href={fallbackEventsURL}>raw format</ExternalLink>.\n </Trans>\n </>\n }\n icon={ExclamationTriangleIcon}\n iconColor={globalWarningColor100.value}\n />\n ) : (\n <EventListFetch\n hostId={hostId}\n cluster={cluster}\n entityKind={entityKind}\n onFetchEvents={onFetchEvents}\n className=\"events-modal__event-list\"\n />\n )}\n </ModalBoxBody>\n </Modal>\n );\n};\n", "import React, { useEffect, useState } from 'react';\nimport { EventList } from '../../api';\nimport { EVENTS_POLLING_INTERVAL } from '../../config';\nimport { EventListFetchProps } from '../../types';\n\n// avoid circular dep\nimport { ErrorState, LoadingState } from '../ui/uiState';\nimport EventsList from '../ui/EventsList';\nimport ClusterEventsList from '../ui/ClusterEventsList';\n\nexport const EventListFetch: React.FC<EventListFetchProps> = ({ onFetchEvents, ...props }) => {\n const [events, setEvents] = useState<EventList>();\n const [lastPolling, setLastPolling] = useState(0);\n const [error, setError] = useState('');\n\n const { cluster, hostId, entityKind, className } = props;\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n\n void onFetchEvents(\n {\n clusterId: cluster.id,\n hostId,\n },\n (events: EventList) => {\n setEvents(events);\n setError('');\n timer = setTimeout(() => setLastPolling(Date.now()), EVENTS_POLLING_INTERVAL);\n },\n setError,\n );\n\n return () => clearTimeout(timer);\n }, [lastPolling, cluster.id, hostId, onFetchEvents]);\n\n const forceRefetch = React.useCallback(() => {\n setLastPolling(Date.now());\n }, [setLastPolling]);\n\n if (error) {\n return <ErrorState title={error} fetchData={forceRefetch} />;\n }\n\n if (!events) {\n return <LoadingState />;\n }\n\n if (entityKind === 'cluster') {\n return <ClusterEventsList events={events} cluster={cluster} className={className} />;\n }\n\n return <EventsList events={events} className={className} />;\n};\n", "import React from 'react';\nimport { Label } from '@patternfly/react-core';\nimport { TableVariant, Table, TableBody, breakWord } from '@patternfly/react-table';\nimport {\n InfoCircleIcon,\n ExclamationTriangleIcon,\n ExclamationCircleIcon,\n SearchIcon,\n} from '@patternfly/react-icons';\nimport { ExtraParamsType } from '@patternfly/react-table/dist/js/components/Table/base';\nimport { Event, EventList } from '../../api';\nimport { EmptyState } from './uiState';\nimport { getHumanizedDateTime } from './utils';\nimport { fitContent, noPadding } from './table';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nconst getEventRowKey = ({ rowData }: ExtraParamsType) =>\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n rowData?.props?.event.sortableTime + rowData?.props?.event.message;\n\nconst getLabelColor = (severity: Event['severity']) => {\n switch (severity) {\n case 'info':\n return 'blue';\n case 'warning':\n return 'orange';\n case 'error':\n return 'red';\n case 'critical':\n return 'purple';\n }\n};\n\nconst getLabelIcon = (severity: Event['severity']) => {\n switch (severity) {\n case 'info':\n return <InfoCircleIcon />;\n case 'warning':\n return <ExclamationTriangleIcon />;\n case 'error':\n case 'critical':\n return <ExclamationCircleIcon />;\n }\n};\n\nexport type EventsListProps = {\n events: EventList;\n className?: string;\n};\n\nconst EventsList: React.FC<EventsListProps> = ({ events, className }) => {\n const { t } = useTranslation();\n if (events.length === 0) {\n return (\n <EmptyState\n icon={SearchIcon}\n title={t('ai:No events found')}\n content={t('ai:There are no events found.')}\n />\n );\n }\n\n // Do not memoize result to keep it recomputed since we use \"relative\" time bellow\n const sortedEvents = events\n .map((event) => ({\n ...event,\n sortableTime: new Date(event.eventTime).getTime(),\n }))\n .sort(\n // Descending order\n (a, b) => b.sortableTime - a.sortableTime,\n );\n\n const rows = sortedEvents.map((event) => ({\n cells: [\n {\n title: <strong>{getHumanizedDateTime(event.eventTime)}</strong>,\n },\n {\n title: (\n <>\n {event.severity !== 'info' && (\n <>\n <Label color={getLabelColor(event.severity)} icon={getLabelIcon(event.severity)}>\n {event.severity}\n </Label>{' '}\n </>\n )}\n {event.message}\n </>\n ),\n },\n ],\n props: { event },\n }));\n\n return (\n <div className={className}>\n <Table\n rows={rows}\n cells={[\n { title: t('ai:Time'), cellTransforms: [fitContent, noPadding] },\n { title: t('ai:Message'), cellTransforms: [breakWord] },\n ]}\n variant={TableVariant.compact}\n aria-label={t('ai:Events table')}\n borders={false}\n >\n <TableBody rowKey={getEventRowKey} />\n </Table>\n </div>\n );\n};\n\nexport default EventsList;\n", "import { DASH } from '../constants';\n\nexport const getHumanizedDateTime = (dateTime?: string) => {\n if (!dateTime) return DASH;\n const date = new Date(dateTime);\n return date.toLocaleString();\n};\n\nexport const getHumanizedTime = (dateTime?: string) => {\n if (!dateTime) return DASH;\n const date = new Date(dateTime);\n return date.toLocaleTimeString();\n};\n", "import React from 'react';\nimport upperFirst from 'lodash/upperFirst';\nimport endsWith from 'lodash/endsWith';\nimport { ISortBy, SortByDirection, IRow } from '@patternfly/react-table';\nimport { getHumanizedDateTime } from '../utils';\n\nexport type HumanizedSortable = {\n title: string | React.ReactNode;\n sortableValue: number | string;\n};\n\ntype GetCellType = (row: IRow, index: number | undefined) => string | HumanizedSortable;\n\n/**\n * Generates rows array for item which spans across all table columns.\n * Used to put EmptyState etc. components into the table body.\n */\nexport const getColSpanRow = (content: React.ReactNode, columnCount: number): IRow[] => [\n {\n heightAuto: true,\n cells: [\n {\n props: { colSpan: columnCount },\n title: content,\n },\n ],\n },\n];\n\nexport const rowSorter =\n (sortBy: ISortBy, getCell: GetCellType) =>\n (a: IRow, b: IRow): number => {\n const coefficient = sortBy.direction === SortByDirection.asc ? 1 : -1;\n const cellA = getCell(a, sortBy.index);\n const cellB = getCell(b, sortBy.index);\n\n let valA = typeof cellA === 'string' ? cellA : cellA?.sortableValue;\n let valB = typeof cellB === 'string' ? cellB : cellB?.sortableValue;\n\n if (typeof valA === 'string' || typeof valB === 'string') {\n valA = (valA || '') as string; // handle undefined\n return valA.localeCompare(valB as string) * coefficient;\n }\n\n // numeric (like timestamp or memory)\n valA = valA || 0; // handle undefined\n valB = valB || 0;\n return (valA - valB) * coefficient;\n };\n\n/** Converts string into a sentence by capitalizing first letter and appending with . */\nexport const toSentence = (s: string) =>\n `${upperFirst(s)}${endsWith(s, '.') || s === '' ? '' : '.'}`;\n\nexport const getDateTimeCell = (time?: string): HumanizedSortable => {\n const date = getHumanizedDateTime(time);\n return {\n title: date,\n sortableValue: time ? new Date(time).getTime() : 0,\n };\n};\n", "// TODO(jtomasek): replace this module with transforms from @patternfly/react-table\n// when available\nimport { ITransform } from '@patternfly/react-table';\n\nimport './wrappable.css';\n\nexport const breakWord: ITransform = () => ({\n className: 'pf-m-break-word',\n});\n\nexport const fitContent: ITransform = () => ({\n className: 'pf-m-fit-content',\n});\n\nexport const nowrap: ITransform = () => ({\n className: 'pf-m-nowrap',\n});\n\nexport const truncate: ITransform = () => ({\n className: 'pf-m-truncate',\n});\n\nexport const wrappable: ITransform = () => ({\n className: 'pf-m-wrap',\n});\n\nexport const noPadding: ITransform = () => ({\n className: 'table-no-padding',\n});\n", "import React from 'react';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { SearchIcon } from '@patternfly/react-icons';\nimport { Cluster, EventList } from '../../api';\nimport { ClusterEventsFiltersType } from '../../types';\nimport { EmptyState } from './uiState';\nimport EventsList from './EventsList';\nimport ClusterEventsToolbar, { getInitialClusterEventsFilters } from './ClusterEventsToolbar';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type ClusterEventsListProps = {\n events: EventList;\n cluster: Cluster;\n className?: string;\n};\n\nconst filterEvents = (\n filters: ClusterEventsFiltersType,\n events: EventList = [],\n clusterHosts: Cluster['hosts'],\n) => {\n return events\n .filter((event) => filters.severity.length === 0 || filters.severity.includes(event.severity))\n .filter(\n (event) =>\n !event.hostId ||\n filters.hosts.includes(event.hostId) ||\n (filters.orphanedHosts && !(clusterHosts || []).find((host) => host.id === event.hostId)),\n )\n .filter((event) => event.hostId || filters.clusterLevel)\n .filter(\n (event) =>\n !filters.fulltext ||\n (event.message || '').toLowerCase().includes(filters.fulltext.toLowerCase()),\n );\n};\n\nconst ClusterEventsList: React.FC<ClusterEventsListProps> = ({ events, cluster, className }) => {\n const [filters, setFilters] = React.useState<ClusterEventsFiltersType>(() =>\n getInitialClusterEventsFilters(cluster),\n );\n\n const filteredEvents = React.useMemo(\n () => filterEvents(filters, events, cluster.hosts),\n [filters, events, cluster.hosts],\n );\n const { t } = useTranslation();\n return (\n <>\n <ClusterEventsToolbar\n filters={filters}\n setFilters={setFilters}\n cluster={cluster}\n events={events}\n />\n {filteredEvents.length === 0 && events.length > 0 ? (\n <EmptyState\n icon={SearchIcon}\n title={t('ai:No matching events')}\n content={t(\n 'ai:There are no events that match the current filters. Adjust or clear the filters to view events.',\n )}\n primaryAction={\n <Button\n variant={ButtonVariant.primary}\n onClick={() => setFilters(getInitialClusterEventsFilters(cluster))}\n id=\"empty-state-cluster-events-clear-filters-button\"\n data-ouia-id=\"button-clear-events-filter\"\n >\n {t('ai:Clear filters')}\n </Button>\n }\n />\n ) : (\n <EventsList events={filteredEvents} className={className} />\n )}\n </>\n );\n};\n\nexport default ClusterEventsList;\n", "import React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport {\n Toolbar,\n ToolbarItem,\n ToolbarContent,\n ToolbarFilter,\n ToolbarChip,\n Button,\n ButtonVariant,\n InputGroup,\n Select,\n SelectOption,\n TextInput,\n ToolbarProps,\n ToolbarFilterProps,\n SelectProps,\n TextInputProps,\n Badge,\n} from '@patternfly/react-core';\nimport { SearchIcon, FilterIcon } from '@patternfly/react-icons';\nimport { ClusterEventsFiltersType } from '../../types';\nimport { Cluster, Event, Host, Inventory, stringToJSON } from '../../api';\nimport { EVENT_SEVERITIES } from '../../config';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype ClustersListToolbarProps = {\n filters: ClusterEventsFiltersType;\n setFilters: React.Dispatch<React.SetStateAction<ClusterEventsFiltersType>>;\n cluster: Cluster;\n events: Event[];\n};\n\nconst Placeholder = ({ text }: { text: string }) => (\n <>\n <FilterIcon /> {text}\n </>\n);\n\nconst SELECT_ALL = 'select-all-actions';\nconst CLUSTER_LEVEL = 'cluster-level-action';\nconst ORPHANS = 'deleted-hosts-action';\n\nconst mapHosts = (hosts: Cluster['hosts']) =>\n (hosts || []).map((host) => {\n const inventory = stringToJSON<Inventory>(host.inventory) || {};\n let hostname = host.requestedHostname;\n if (inventory.hostname !== host.requestedHostname) {\n hostname += ` (${inventory.hostname})`;\n }\n return {\n hostname,\n id: host.id,\n };\n });\n\nexport const getInitialClusterEventsFilters = (cluster: Cluster): ClusterEventsFiltersType => ({\n fulltext: '',\n hosts: mapHosts(cluster.hosts).map((host) => host.id),\n severity: [],\n clusterLevel: true,\n orphanedHosts: true,\n selectAll: true,\n});\n\nconst getEventsCount = (severity: Event['severity'], events: Event[]) =>\n events.filter((event) => event.severity === severity).length;\n\nconst ClusterEventsToolbar: React.FC<ClustersListToolbarProps> = ({\n filters,\n setFilters,\n cluster,\n events,\n}) => {\n const [isHostExpanded, setHostExpanded] = React.useState(false);\n const [isSeverityExpanded, setSeverityExpanded] = React.useState(false);\n\n const allHosts = React.useMemo(() => mapHosts(cluster.hosts), [cluster.hosts]);\n const onClearAllFilters: ToolbarProps['clearAllFilters'] = () => {\n setFilters(getInitialClusterEventsFilters(cluster));\n };\n\n const onSelect = (\n type: 'hosts' | 'severity',\n isChecked: boolean,\n value: Host['id'] | Event['severity'],\n ) => {\n const setNextSelectedValues = (\n type: 'hosts' | 'severity',\n isChecked: boolean,\n value: Host['id'] | Event['severity'],\n filters: ClusterEventsFiltersType,\n ) => ({\n ...filters,\n [type]: isChecked\n ? [...filters[type], value]\n : filters[type].filter((val: string) => val !== value),\n });\n\n const setNextSelectAllValue = (\n totalHostsInCluster: number,\n filters: ClusterEventsFiltersType,\n ) => ({\n ...filters,\n selectAll:\n type === 'severity'\n ? filters.selectAll\n : filters.hosts.length === totalHostsInCluster &&\n filters.orphanedHosts &&\n filters.clusterLevel,\n });\n\n let nextFilters = setNextSelectedValues(type, isChecked, value, filters);\n nextFilters = setNextSelectAllValue(cluster.hosts?.length || 0, nextFilters);\n\n setFilters(nextFilters);\n };\n\n const onHostToggle: SelectProps['onToggle'] = () => setHostExpanded(!isHostExpanded);\n const onHostSelect: SelectProps['onSelect'] = (event, value) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const isChecked = event.target.checked;\n\n switch (value) {\n case SELECT_ALL:\n if (isChecked) {\n setFilters({\n ...filters,\n hosts: mapHosts(cluster.hosts).map((host) => host.id),\n clusterLevel: true,\n orphanedHosts: true,\n selectAll: true,\n });\n } else {\n setFilters({\n ...filters,\n clusterLevel: false,\n orphanedHosts: false,\n selectAll: false,\n hosts: [],\n });\n }\n break;\n case ORPHANS:\n setFilters({\n ...filters,\n orphanedHosts: isChecked,\n selectAll:\n isChecked && filters.clusterLevel && filters.hosts.length === cluster.hosts?.length,\n });\n break;\n case CLUSTER_LEVEL:\n setFilters({\n ...filters,\n clusterLevel: isChecked,\n selectAll:\n isChecked && filters.orphanedHosts && filters.hosts.length === cluster.hosts?.length,\n });\n break;\n default:\n onSelect('hosts', isChecked, value as string);\n }\n };\n\n const onSeverityToggle: SelectProps['onToggle'] = () => setSeverityExpanded(!isSeverityExpanded);\n const onSeveritySelect: SelectProps['onSelect'] = (event, value) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n onSelect('severity', event.target.checked, value as string);\n };\n\n const onFulltextChange: TextInputProps['onChange'] = (fulltext) => {\n setFilters({\n ...filters,\n fulltext,\n });\n };\n\n const onDeleteChip: ToolbarFilterProps['deleteChip'] = (type, chip) => {\n if (type) {\n const id = chip['key'] || chip;\n setFilters({\n ...filters,\n [type as string]: filters[type as string].filter((v: string) => v !== id),\n });\n } else {\n onClearAllFilters();\n }\n };\n\n const onDeleteChipGroup: ToolbarFilterProps['deleteChipGroup'] = (type) => {\n setFilters({\n ...filters,\n [type as string]: [],\n });\n };\n\n const getSelections = (): string[] => {\n let selections = filters.clusterLevel ? [...filters.hosts, CLUSTER_LEVEL] : filters.hosts;\n selections = filters.orphanedHosts ? [...selections, ORPHANS] : selections;\n selections = filters.selectAll ? [...selections, SELECT_ALL] : selections;\n\n return selections;\n };\n const { t } = useTranslation();\n return (\n <Toolbar\n id=\"clusters-events-toolbar\"\n className=\"pf-m-toggle-group-container\"\n collapseListedFiltersBreakpoint=\"xl\"\n clearAllFilters={onClearAllFilters}\n >\n <ToolbarContent>\n <ToolbarFilter categoryName=\"hosts\">\n <Select\n variant=\"checkbox\"\n aria-label=\"hosts\"\n onToggle={onHostToggle}\n onSelect={onHostSelect}\n selections={getSelections()}\n customBadgeText={filters.hosts?.length || 0}\n isOpen={isHostExpanded}\n placeholderText={<Placeholder text=\"Hosts\" />}\n isDisabled={allHosts.length === 0}\n >\n {[\n <SelectOption inputId={`checkbox-${SELECT_ALL}`} key={SELECT_ALL} value={SELECT_ALL}>\n {t('ai:Select All')}\n </SelectOption>,\n <SelectOption\n inputId={`checkbox-${CLUSTER_LEVEL}`}\n key={CLUSTER_LEVEL}\n value={CLUSTER_LEVEL}\n >\n {t('ai:Cluster-level events')}\n </SelectOption>,\n <SelectOption inputId={`checkbox-${ORPHANS}`} key={ORPHANS} value={ORPHANS}>\n {t('ai:Deleted hosts')}\n </SelectOption>,\n ...allHosts.map((host) => (\n <SelectOption key={host.id} value={host.id}>\n {host.hostname}\n </SelectOption>\n )),\n ]}\n </Select>\n </ToolbarFilter>\n\n <ToolbarFilter\n chips={filters.severity.map(\n (severity): ToolbarChip => ({\n key: severity,\n node: capitalize(severity),\n }),\n )}\n deleteChip={onDeleteChip}\n deleteChipGroup={onDeleteChipGroup}\n categoryName=\"severity\"\n >\n <Select\n variant=\"checkbox\"\n aria-label=\"Severity\"\n onToggle={onSeverityToggle}\n onSelect={onSeveritySelect}\n selections={filters.severity}\n isOpen={isSeverityExpanded}\n placeholderText={<Placeholder text=\"Severity\" />}\n >\n {EVENT_SEVERITIES.map((severity) => (\n <SelectOption\n data-testid={`${severity}-filter-option`}\n key={severity}\n value={severity}\n >\n {capitalize(severity)} <Badge isRead>{getEventsCount(severity, events)}</Badge>\n </SelectOption>\n ))}\n </Select>\n </ToolbarFilter>\n\n <ToolbarItem>\n <InputGroup>\n <TextInput\n name=\"search-text\"\n id=\"search-text\"\n type=\"search\"\n aria-label=\"text to be searched\"\n onChange={onFulltextChange}\n value={filters.fulltext}\n placeholder={t('ai:Filter by text')}\n />\n <Button variant={ButtonVariant.control} aria-label=\"search text button\">\n <SearchIcon />\n </Button>\n </InputGroup>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n );\n};\n\nexport default ClusterEventsToolbar;\n", "import React, { PropsWithChildren } from 'react';\n\ninterface RenderIfProps {\n condition: boolean;\n}\n\nexport const RenderIf = ({ condition = false, children }: PropsWithChildren<RenderIfProps>) =>\n condition ? <>{children}</> : null;\n", "import React from 'react';\nimport { DropdownItem, DropdownToggle, Dropdown, DropdownProps } from '@patternfly/react-core';\nimport { CaretDownIcon } from '@patternfly/react-icons';\nimport { HostRole } from '../../../common/types/hosts';\nimport './SimpleDropdown.css';\n\ntype SimpleDropdownProps = {\n current?: string;\n defaultValue: string;\n items: HostRole[];\n setValue: (value?: string) => void;\n isDisabled: boolean;\n idPrefix?: string;\n position?: DropdownProps['position'];\n menuAppendTo?: DropdownProps['menuAppendTo'];\n};\n\nexport const SimpleDropdown = ({\n current,\n defaultValue,\n items,\n setValue,\n isDisabled,\n idPrefix,\n position,\n menuAppendTo,\n}: SimpleDropdownProps) => {\n const [isOpen, setOpen] = React.useState(false);\n const dropdownItems = items.map(({ value, label, description }) => (\n <DropdownItem key={value} id={value} description={description}>\n {label}\n </DropdownItem>\n ));\n\n const onSelect = React.useCallback(\n (event?: React.SyntheticEvent<HTMLDivElement>) => {\n setValue(event?.currentTarget.id);\n setOpen(false);\n },\n [setValue, setOpen],\n );\n\n const toggle = React.useMemo(\n () => (\n <DropdownToggle\n onToggle={(val) => setOpen(!isDisabled && val)}\n toggleIndicator={CaretDownIcon}\n isDisabled={isDisabled}\n id={idPrefix ? `${idPrefix}-dropdown-toggle-items` : undefined}\n className=\"role-dropdown\"\n >\n {current || defaultValue}\n </DropdownToggle>\n ),\n [setOpen, current, isDisabled, defaultValue, idPrefix],\n );\n\n return (\n <Dropdown\n onSelect={onSelect}\n dropdownItems={dropdownItems}\n toggle={toggle}\n isOpen={isOpen}\n isPlain\n id={idPrefix ? `${idPrefix}-dropdown-toggle` : undefined}\n position={position}\n menuAppendTo={menuAppendTo}\n />\n );\n};\n", "import React, { ReactChild, ReactNode } from 'react';\nimport {\n TextContent,\n TextList,\n TextListVariants,\n TextListItem,\n TextListItemVariants,\n Text,\n TextProps,\n} from '@patternfly/react-core';\nimport { WithTestID } from '../../types';\n\nimport './DetailList.css';\n\nexport type DetailListProps = {\n children: ReactChild | (ReactChild | undefined)[];\n title?: string;\n titleComponent?: TextProps['component'];\n};\n\nexport type DetailItemProps = {\n title: string | ReactNode;\n value?:\n | {\n title: string;\n value?: string;\n }[]\n | React.ReactNode;\n idPrefix?: string;\n isHidden?: boolean;\n classNameValue?: string;\n};\n\nexport const DetailList: React.FC<DetailListProps> = ({\n children,\n title,\n titleComponent = 'h2',\n}) => (\n <TextContent>\n {title && <Text component={titleComponent}>{title}</Text>}\n <TextList component={TextListVariants.dl} className=\"detail-list\">\n {children}\n </TextList>\n </TextContent>\n);\n\nexport const DetailItem: React.FC<DetailItemProps & WithTestID> = ({\n title,\n value = '',\n idPrefix,\n testId,\n isHidden = false,\n classNameValue,\n}) =>\n isHidden ? null : (\n <>\n <TextListItem\n component={TextListItemVariants.dt}\n id={idPrefix ? `${idPrefix}-title` : undefined}\n data-testid={testId ? `${testId}-title` : undefined}\n >\n {title}\n </TextListItem>\n <TextListItem\n component={TextListItemVariants.dd}\n id={idPrefix ? `${idPrefix}-value` : undefined}\n data-testid={testId ? `${testId}-value` : undefined}\n className={classNameValue}\n >\n {Array.isArray(value) ? (\n <TextList component={TextListVariants.dl}>\n {value.map((item, idx) => [\n <TextListItem\n data-testid={testId ? `${testId}-title-${idx}` : undefined}\n key={item.title}\n component={TextListItemVariants.dt}\n >\n {item.title}\n </TextListItem>,\n <TextListItem\n data-testid={testId ? `${testId}-value-${idx}` : undefined}\n key={`dd-${item.title}`}\n component={TextListItemVariants.dd}\n >\n {item.value}\n </TextListItem>,\n ])}\n </TextList>\n ) : (\n value\n )}\n </TextListItem>\n </>\n );\n", "import React, { PropsWithChildren, ReactNode } from 'react';\nimport { WizardNavItem, WizardNavItemProps } from '@patternfly/react-core';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens';\n\nconst getNavItemContent = (\n content: ReactNode,\n isValid: () => boolean,\n isDisabled?: boolean,\n isCurrent?: boolean,\n): ReactNode => {\n if (!isDisabled && !isCurrent && !isValid()) {\n return (\n <>\n {content}\n <ExclamationCircleIcon\n className=\"wizard-nav-item-warning-icon\"\n color={dangerColor.value}\n size=\"sm\"\n />\n </>\n );\n }\n return content;\n};\n\ntype NavItemProps = PropsWithChildren<WizardNavItemProps & { isValid?: () => boolean }>;\nconst NavItem = ({ isValid = () => true, children, ...props }: NavItemProps) => {\n const { content, isDisabled, isCurrent } = props;\n\n return (\n <WizardNavItem {...props} content={getNavItemContent(content, isValid, isDisabled, isCurrent)}>\n {children}\n </WizardNavItem>\n );\n};\n\nexport default NavItem;\n", "import React from 'react';\nimport { AlertGroup, AlertActionCloseButton, Alert } from '@patternfly/react-core';\nimport { useAlerts } from '../AlertsContextProvider';\nimport { AlertProps } from '../../reducers/alertsSlice';\n\nconst Alerts: React.FC<{ className?: string }> = ({ className }) => {\n const { alerts, removeAlert } = useAlerts();\n const onClose = (alert: AlertProps) => removeAlert(alert.key);\n\n if (alerts.length) {\n return (\n <AlertGroup className={className}>\n {alerts.map((alert) => (\n // eslint-disable-next-line react/jsx-key\n <Alert\n actionClose={<AlertActionCloseButton onClose={() => onClose(alert)} />}\n isInline\n {...alert}\n >\n {alert.message}\n </Alert>\n ))}\n </AlertGroup>\n );\n }\n return null;\n};\n\nexport default Alerts;\n", "import React from 'react';\nimport { AlertProps, AlertPayload, alertsSlice } from '../reducers';\nimport { useTranslation } from '../../common/hooks/use-translation-wrapper';\n\nconst {\n addAlert: addAlertAction,\n removeAlert: removeAlertAction,\n clearAlerts: clearAlertsAction,\n} = alertsSlice.actions;\nconst alertsReducer = alertsSlice.reducer;\n\nexport type AlertsContextType = {\n alerts: AlertProps[];\n addAlert: (alert: AlertPayload) => void;\n removeAlert: (alertKey: string) => void;\n clearAlerts: () => void;\n};\n\nconst AlertsContext = React.createContext<AlertsContextType | null>(null);\n\nexport const AlertsContextProvider: React.FC = ({ children }) => {\n const [alerts, dispatch] = React.useReducer(alertsReducer, []);\n const context = {\n alerts,\n addAlert: React.useCallback((alert: AlertPayload) => dispatch(addAlertAction(alert)), []),\n removeAlert: React.useCallback((alertKey: string) => dispatch(removeAlertAction(alertKey)), []),\n clearAlerts: React.useCallback(() => dispatch(clearAlertsAction()), []),\n };\n return <AlertsContext.Provider value={context}>{children}</AlertsContext.Provider>;\n};\n\nexport const useAlerts = () => {\n const context = React.useContext(AlertsContext);\n const { t } = useTranslation();\n if (!context) {\n throw new Error(t('ai:useAlerts must be used within AlertsContextProvider'));\n }\n return context;\n};\n", "export * from './alertsSlice';\nexport * from './dialogsSlice';\n", "import { v4 as uuidv4 } from 'uuid';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { AlertVariant } from '@patternfly/react-core';\n\nexport type AlertPayload = {\n title: string;\n message?: string;\n variant?: AlertVariant;\n};\n\nexport type AlertProps = {\n key: string;\n title: string;\n variant: AlertVariant;\n message?: string;\n};\n\nconst initialState: AlertProps[] = [];\n\nexport const alertsSlice = createSlice({\n initialState,\n name: 'alerts',\n reducers: {\n addAlert: (state, action: PayloadAction<AlertPayload>) => [\n { key: uuidv4(), variant: AlertVariant.danger, ...action.payload },\n ...state,\n ],\n removeAlert: (state, action: PayloadAction<string>) =>\n state.filter((alert) => alert.key !== action.payload),\n clearAlerts: () => initialState,\n },\n});\n", "import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nexport type DialogPayload = {\n dialogId: string;\n data?: unknown;\n};\n\nconst initialState = {};\n\nexport const dialogsSlice = createSlice({\n initialState,\n name: 'alerts',\n reducers: {\n openDialog: (state, action: PayloadAction<DialogPayload>) => {\n state[action.payload.dialogId] = action.payload.data || {};\n return state;\n },\n closeDialog: (state, action: PayloadAction<DialogPayload>) => {\n state[action.payload.dialogId] = undefined;\n return state;\n },\n },\n});\n", "import React from 'react';\nimport Highlight, { defaultProps, Language, PrismTheme } from 'prism-react-renderer';\nimport { Text, TextVariants, ClipboardCopy, clipboardCopyFunc } from '@patternfly/react-core';\nimport defaultTheme from 'prism-react-renderer/themes/github';\nimport './PrismCode.css';\ntype PrismCodeProps = {\n code: string;\n language?: Language;\n theme?: PrismTheme;\n copiable?: boolean;\n};\nconst PrismCode: React.FC<PrismCodeProps> = ({\n code,\n language = 'bash',\n theme = defaultTheme,\n copiable = false,\n}) => (\n <Highlight {...defaultProps} code={code} language={language} theme={theme}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <Text component={TextVariants.pre} className={className} style={style}>\n {copiable && (\n <ClipboardCopy\n isReadOnly\n variant={'inline-compact'}\n onCopy={(e) => clipboardCopyFunc(e, code)}\n style={{ float: 'right', background: 'inherit' }}\n >\n {}\n </ClipboardCopy>\n )}\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </Text>\n )}\n </Highlight>\n);\n\nexport default PrismCode;\n", "import React from 'react';\n\n/**\n * This component allows to maintain grid gap behaviour of PF Form by wrapping\n * FormGroup components which are inside of Grid\n */\nconst GridGap: React.FC = (props) => <div {...props} className=\"pf-c-form\" />;\n\nexport default GridGap;\n", "import * as React from 'react';\nimport {\n Alert,\n AlertVariant,\n Progress,\n ProgressMeasureLocation,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype ModalProgressProps = {\n error?: {\n title: string;\n message: string;\n };\n progress: number | null;\n};\n\nconst ModalProgress: React.FC<ModalProgressProps> = ({ error, progress }) => {\n const { t } = useTranslation();\n return (\n <Stack hasGutter>\n {error && (\n <StackItem>\n <Alert variant={AlertVariant.danger} title={error.title} isInline>\n {error.message}\n </Alert>\n </StackItem>\n )}\n {progress !== null && (\n <StackItem>\n <Progress\n value={progress}\n measureLocation={ProgressMeasureLocation.outside}\n aria-label={t('ai:Progress')}\n />\n </StackItem>\n )}\n </Stack>\n );\n};\n\nexport default ModalProgress;\n", "import * as React from 'react';\nimport { Modal, Button, ModalVariant, ButtonProps, ModalProps } from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype ConfirmationModalProps = {\n title: string;\n titleIconVariant?: ModalProps['titleIconVariant'];\n content: React.ReactNode;\n confirmationButtonVariant?: ButtonProps['variant'];\n confirmationButtonText?: string;\n onClose: () => void;\n onConfirm: () => void;\n};\n\nconst ConfirmationModal: React.FC<ConfirmationModalProps> = ({\n title,\n titleIconVariant,\n content,\n confirmationButtonText = 'Yes',\n confirmationButtonVariant = 'danger',\n onClose,\n onConfirm,\n}) => {\n const { t } = useTranslation();\n return (\n <Modal\n title={title}\n titleIconVariant={titleIconVariant}\n isOpen={true}\n onClose={onClose}\n variant={ModalVariant.small}\n actions={[\n <Button\n data-testid=\"confirm-modal-submit\"\n key=\"confirm\"\n variant={confirmationButtonVariant}\n onClick={onConfirm}\n >\n {confirmationButtonText}\n </Button>,\n <Button key=\"cancel\" variant=\"link\" onClick={onClose}>\n {t('ai:Cancel')}\n </Button>,\n ]}\n >\n {content}\n </Modal>\n );\n};\n\nexport default ConfirmationModal;\n", "import React from 'react';\nimport { Text, TextContent } from '@patternfly/react-core';\n\nconst ClusterWizardStepHeader: React.FC = ({ children }) => (\n <TextContent>\n <Text component=\"h2\">{children}</Text>\n </TextContent>\n);\n\nexport default ClusterWizardStepHeader;\n", "import React from 'react';\nimport { WizardBody } from '@patternfly/react-core';\nimport { css } from '@patternfly/react-styles';\nimport styles from '@patternfly/react-styles/css/components/Wizard/wizard';\n\nimport './ClusterWizardStep.css';\n\ntype ClusterWizardStepProps = {\n footer?: React.ReactNode;\n navigation?: React.ReactNode;\n};\n\nconst ClusterWizardStep: React.FC<ClusterWizardStepProps> = ({ navigation, footer, children }) => {\n return (\n <div className={css(styles.wizardOuterWrap, 'cluster-wizard-step')}>\n <div className={css(styles.wizardInnerWrap)}>\n {navigation}\n {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /* @ts-ignore: the prop should be optional depending on the WizardBody usage */\n }\n <WizardBody aria-labelledby=\"step-id\" hasNoBodyPadding={false}>\n {children}\n </WizardBody>\n </div>\n {footer && <div className=\"pf-c-wizard__footer cluster-wizard-step__footer\">{footer}</div>}\n </div>\n );\n};\n\nexport default ClusterWizardStep;\n", "import lodashValues from 'lodash/values';\nimport React from 'react';\nimport {\n Alert,\n AlertGroup,\n AlertVariant,\n Flex,\n FlexItem,\n List,\n ListItem,\n} from '@patternfly/react-core';\nimport { checkHostValidations, WizardStepsValidationMap } from './validationsInfoUtils';\nimport { Cluster } from '../../api/types';\nimport { ValidationsInfo } from '../../types/clusters';\nimport { ValidationsInfo as HostValidationsInfo } from '../../types/hosts';\nimport { ClusterWizardStepHostStatusDeterminationObject, Validation } from '../../types/hosts';\nimport {\n getWizardStepClusterStatus,\n getWizardStepClusterValidationsInfo,\n} from './validationsInfoUtils';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { stringToJSON } from '../../api';\n\ntype ClusterWizardStepValidationsAlertProps<ClusterWizardStepsType extends string> = {\n currentStepId: ClusterWizardStepsType;\n validationsInfo?: ValidationsInfo;\n clusterStatus: Cluster['status'];\n hosts: ClusterWizardStepHostStatusDeterminationObject[];\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>;\n children?: React.ReactNode;\n};\n\nconst ClusterWizardStepValidationsAlert = <ClusterWizardStepsType extends string>({\n currentStepId,\n clusterStatus,\n validationsInfo,\n hosts,\n wizardStepsValidationsMap,\n children,\n}: ClusterWizardStepValidationsAlertProps<ClusterWizardStepsType>) => {\n const { failedClusterValidations, failedHostnameValidations } = React.useMemo(() => {\n const reducedValidationsInfo = getWizardStepClusterValidationsInfo(\n validationsInfo || {},\n currentStepId,\n wizardStepsValidationsMap,\n );\n\n const flattenedValues = lodashValues(reducedValidationsInfo).flat();\n\n const hostnameValidations = hosts.some((host) => {\n const validations =\n typeof host.validationsInfo === 'string'\n ? stringToJSON<HostValidationsInfo>(host.validationsInfo)\n : host.validationsInfo;\n\n return !checkHostValidations(validations || {}, ['hostname-valid', 'hostname-unique']);\n });\n\n return {\n failedClusterValidations: flattenedValues.filter(\n (validation) => validation?.status === 'failure',\n ),\n failedHostnameValidations: hostnameValidations,\n };\n }, [validationsInfo, currentStepId, wizardStepsValidationsMap, hosts]);\n\n const isClusterReady =\n getWizardStepClusterStatus(\n currentStepId,\n wizardStepsValidationsMap,\n { status: clusterStatus, validationsInfo: validationsInfo || {} },\n hosts,\n ) === 'ready';\n const { t } = useTranslation();\n return (\n <>\n {!validationsInfo && (\n <Alert variant={AlertVariant.info} title=\"Cluster validations are initializing.\" isInline>\n {t('ai:Please hold on till background checks are started.')}\n </Alert>\n )}\n {!isClusterReady && (\n <AlertGroup>\n {children}\n <Alert variant={AlertVariant.warning} title=\"Cluster is not ready yet.\" isInline>\n <Flex spaceItems={{ default: 'spaceItemsSm' }} direction={{ default: 'column' }}>\n {!!failedClusterValidations.length && (\n <>\n <FlexItem>{t('ai:The following requirements must be met:')}</FlexItem>\n <FlexItem>\n <List>\n {(failedClusterValidations.filter(Boolean) as Validation[]).map(\n (validation) => (\n <ListItem key={validation.id}>{validation.message}</ListItem>\n ),\n )}\n </List>\n </FlexItem>\n </>\n )}\n {failedHostnameValidations && (\n <FlexItem>\n {t(\n 'ai:The cluster is not ready yet. Some hosts have an ineligible name. To change the hostname, click on it.',\n )}\n </FlexItem>\n )}\n </Flex>\n </Alert>\n </AlertGroup>\n )}\n </>\n );\n};\n\nexport default ClusterWizardStepValidationsAlert;\n", "import lodashValues from 'lodash/values';\nimport lodashKeys from 'lodash/keys';\nimport reduce from 'lodash/reduce';\n\nimport { Cluster, ClusterValidationId, Host, HostValidationId } from '../../api/types';\nimport {\n ClusterWizardStepStatusDeterminationObject,\n ValidationGroup as ClusterValidationGroup,\n ValidationsInfo as ClusterValidationsInfo,\n} from '../../../common/types/clusters';\nimport {\n ClusterWizardStepHostStatusDeterminationObject,\n Validation,\n ValidationGroup as HostValidationGroup,\n ValidationsInfo as HostValidationsInfo,\n} from '../../../common/types/hosts';\nimport { stringToJSON } from '../../api/utils';\n\nexport type WizardStepValidationMap = {\n cluster: {\n groups: ClusterValidationGroup[];\n validationIds: ClusterValidationId[];\n };\n host: {\n allowedStatuses: Host['status'][];\n groups: HostValidationGroup[];\n validationIds: HostValidationId[];\n };\n softValidationIds: (HostValidationId | ClusterValidationId)[];\n};\n\nexport type WizardStepsValidationMap<T extends string> = {\n [key in T]: WizardStepValidationMap;\n};\n\nexport const findValidationFixStep = <ClusterWizardStepsType extends string>(\n {\n validationId,\n hostGroup,\n clusterGroup,\n }: {\n // validation IDs are unique\n validationId: ClusterValidationId | HostValidationId;\n hostGroup?: HostValidationGroup;\n clusterGroup?: ClusterValidationGroup;\n },\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n): ClusterWizardStepsType | undefined => {\n const keys = lodashKeys(wizardStepsValidationsMap) as ClusterWizardStepsType[];\n return keys.find((key) => {\n // find first matching validation-map name\n const { cluster: clusterValidationMap, host: hostValidationMap } =\n wizardStepsValidationsMap[key];\n return (\n clusterValidationMap.validationIds.includes(validationId as ClusterValidationId) ||\n hostValidationMap.validationIds.includes(validationId as HostValidationId) ||\n (clusterGroup && clusterValidationMap.groups.includes(clusterGroup)) ||\n (hostGroup && hostValidationMap.groups.includes(hostGroup))\n );\n });\n};\n\nexport const checkClusterValidations = (\n clusterValidationsInfo: ClusterValidationsInfo,\n requiredIds: ClusterValidationId[],\n): boolean => {\n const requiredValidations = lodashValues(clusterValidationsInfo)\n .flat()\n .filter((v) => v && requiredIds.includes(v.id));\n return (\n requiredValidations.length === requiredIds.length &&\n requiredValidations.every((v) => v?.status === 'disabled' || v?.status === 'success')\n );\n};\n\nexport const checkClusterValidationGroups = (\n clusterValidationsInfo: ClusterValidationsInfo,\n groups: ClusterValidationGroup[],\n softValidationIds: WizardStepValidationMap['softValidationIds'],\n) =>\n groups.every((group) =>\n clusterValidationsInfo[group]?.every(\n (validation) =>\n validation.status === 'disabled' ||\n validation.status === 'success' ||\n softValidationIds.includes(validation.id),\n ),\n );\n\nexport const checkHostValidations = (\n hostValidationsInfo: HostValidationsInfo,\n requiredIds: HostValidationId[],\n): boolean => {\n const requiredValidations = lodashValues(hostValidationsInfo)\n .flat()\n .filter((v) => v && requiredIds.includes(v.id));\n\n return (\n requiredValidations.length === requiredIds.length &&\n requiredValidations.every((v) => v?.status === 'disabled' || v?.status === 'success')\n );\n};\n\nexport const checkHostValidationGroups = (\n hostValidationsInfo: HostValidationsInfo,\n groups: HostValidationGroup[],\n softValidationIds: WizardStepValidationMap['softValidationIds'],\n) =>\n groups.every((group) =>\n hostValidationsInfo[group]?.every(\n (validation) =>\n validation.status === 'disabled' ||\n validation.status === 'success' ||\n softValidationIds.includes(validation.id),\n ),\n );\n\nexport const getWizardStepHostValidationsInfo = <ClusterWizardStepsType extends string>(\n validationsInfo: HostValidationsInfo,\n wizardStepId: ClusterWizardStepsType,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n): HostValidationsInfo => {\n const { groups, validationIds } = wizardStepsValidationsMap[wizardStepId].host;\n return reduce(\n validationsInfo,\n (result, groupValidations, groupName) => {\n if (groups.includes(groupName as HostValidationGroup)) {\n result[groupName] = groupValidations;\n return result;\n }\n const selectedValidations = (groupValidations || []).filter((validation) =>\n validationIds.includes(validation.id),\n );\n if (selectedValidations.length) {\n result[groupName] = selectedValidations;\n return result;\n }\n return result;\n },\n {},\n );\n};\n\nexport const getWizardStepHostStatus = <ClusterWizardStepsType extends string>(\n wizardStepId: ClusterWizardStepsType,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n host: ClusterWizardStepHostStatusDeterminationObject,\n): Host['status'] => {\n const { status } = host;\n if (['insufficient', 'pending-for-input'].includes(status)) {\n const { softValidationIds } = wizardStepsValidationsMap[wizardStepId];\n // NOTE(jtomasek): REST API validationsInfo is string, K8s validationsInfo is ClusterValidationsInfo object\n const validationsInfo =\n (typeof host.validationsInfo === 'string'\n ? stringToJSON<HostValidationsInfo>(host.validationsInfo)\n : host.validationsInfo) || {};\n const { groups, validationIds } = wizardStepsValidationsMap[wizardStepId].host;\n return checkHostValidationGroups(validationsInfo, groups, softValidationIds) &&\n checkHostValidations(validationsInfo, validationIds)\n ? 'known'\n : status;\n }\n return status;\n};\n\nexport const getWizardStepClusterValidationsInfo = <ClusterWizardStepsType extends string>(\n validationsInfo: ClusterValidationsInfo,\n wizardStepId: ClusterWizardStepsType,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n): ClusterValidationsInfo => {\n const { groups, validationIds } = wizardStepsValidationsMap[wizardStepId].cluster;\n return reduce(\n validationsInfo,\n (result, groupValidations, groupName) => {\n if (groups.includes(groupName as ClusterValidationGroup)) {\n result[groupName] = groupValidations;\n return result;\n }\n const selectedValidations = (groupValidations || []).filter((validation) =>\n validationIds.includes(validation.id),\n );\n if (selectedValidations.length) {\n result[groupName] = selectedValidations;\n return result;\n }\n return result;\n },\n {},\n );\n};\n\nexport const getWizardStepClusterStatus = <ClusterWizardStepsType extends string>(\n wizardStepId: ClusterWizardStepsType,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n cluster: ClusterWizardStepStatusDeterminationObject,\n clusterHosts: ClusterWizardStepHostStatusDeterminationObject[] = [],\n): Cluster['status'] => {\n const { status } = cluster;\n if (['insufficient', 'pending-for-input'].includes(status)) {\n // NOTE(jtomasek): REST API validationsInfo is string, K8s validationsInfo is ClusterValidationsInfo object\n const validationsInfo =\n (typeof cluster.validationsInfo === 'string'\n ? stringToJSON<ClusterValidationsInfo>(cluster.validationsInfo)\n : cluster.validationsInfo) || {};\n const { groups, validationIds } = wizardStepsValidationsMap[wizardStepId].cluster;\n const { softValidationIds } = wizardStepsValidationsMap[wizardStepId];\n const { allowedStatuses } = wizardStepsValidationsMap[wizardStepId].host;\n const allHostsReady = clusterHosts.every(\n (host) =>\n allowedStatuses.length === 0 ||\n allowedStatuses.includes(\n getWizardStepHostStatus(wizardStepId, wizardStepsValidationsMap, host),\n ),\n );\n return allHostsReady &&\n checkClusterValidationGroups(validationsInfo, groups, softValidationIds) &&\n checkClusterValidations(validationsInfo, validationIds)\n ? 'ready'\n : status;\n }\n return status;\n};\n\nexport const getAllClusterWizardSoftValidationIds = <ClusterWizardStepsType extends string>(\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n): WizardStepValidationMap['softValidationIds'] =>\n Object.keys(wizardStepsValidationsMap).reduce(\n (prev, curr) => [...prev, ...wizardStepsValidationsMap[curr].softValidationIds],\n [] as WizardStepValidationMap['softValidationIds'],\n );\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const getFailingClusterWizardStepHostValidations = <ClusterWizardStepsType extends string>(\n wizardHostStepValidationsInfo: HostValidationsInfo,\n) =>\n Object.keys(wizardHostStepValidationsInfo).reduce((curr, group) => {\n const failingValidations = wizardHostStepValidationsInfo[group].filter(\n (validation: Validation) => validation.status === 'failure',\n );\n return [...curr, ...failingValidations];\n }, [] as Validation[]);\n\nexport const areOnlySoftValidationsOfWizardStepFailing = <ClusterWizardStepsType extends string>(\n validationsInfo: HostValidationsInfo,\n wizardStepId: ClusterWizardStepsType,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n) => {\n const stepValidationsInfo = getWizardStepHostValidationsInfo(\n validationsInfo,\n wizardStepId,\n wizardStepsValidationsMap,\n );\n const failingValidationIds = getFailingClusterWizardStepHostValidations(stepValidationsInfo).map(\n (validation) => validation.id,\n );\n if (!failingValidationIds.length) return false;\n for (const id of failingValidationIds) {\n if (!wizardStepsValidationsMap[wizardStepId].softValidationIds.includes(id)) {\n return false;\n }\n }\n return true;\n};\n\nexport const findValidationStep = <ClusterWizardStepsType extends string>(\n validationId: ClusterValidationId | HostValidationId,\n wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType>,\n minimumStep: ClusterWizardStepsType,\n): ClusterWizardStepsType | undefined => {\n const wizardStepsIds = lodashKeys(wizardStepsValidationsMap) as ClusterWizardStepsType[];\n let isBeforeMinimumStep = true;\n return wizardStepsIds.find((wizardStepId) => {\n if (wizardStepId === minimumStep) {\n isBeforeMinimumStep = false;\n }\n if (isBeforeMinimumStep) {\n return false;\n }\n // find first matching validation-map name, ignoring steps before minimumStep\n const { host: hostValidationMap } = wizardStepsValidationsMap[wizardStepId];\n return hostValidationMap.validationIds.includes(validationId as HostValidationId);\n });\n};\n", "import { Table, TableBody, TableVariant } from '@patternfly/react-table';\nimport * as React from 'react';\nimport { stringToJSON, Inventory, Host } from '../../api';\nimport { getEnabledHosts, fileSize } from '../hosts';\nimport { getSimpleHardwareInfo } from '../hosts/hardwareInfo';\n\nconst ReviewHostsInventory: React.FC<{ hosts?: Host[] }> = ({ hosts = [] }) => {\n const rows = React.useMemo(() => {\n const summary = getEnabledHosts(hosts).reduce(\n (summary, host) => {\n summary.count++;\n const inventory = stringToJSON<Inventory>(host.inventory);\n if (inventory) {\n const hwInfo = getSimpleHardwareInfo(inventory);\n summary.cores += hwInfo.cores;\n summary.memory += hwInfo.memory;\n summary.fs += hwInfo.disks;\n }\n return summary;\n },\n {\n count: 0,\n cores: 0,\n memory: 0,\n fs: 0,\n },\n );\n\n return [\n {\n cells: ['Hosts', summary.count],\n },\n {\n cells: ['Cores', summary.cores],\n },\n {\n cells: ['Memory', fileSize(summary.memory, 2, 'iec')],\n },\n {\n cells: ['Storage', fileSize(summary.fs, 2, 'si')],\n },\n ];\n }, [hosts]);\n\n return (\n <Table\n rows={rows}\n cells={['', '']}\n variant={TableVariant.compact}\n borders={false}\n aria-label=\"Cluster summary table\"\n className=\"review-hosts-table\"\n >\n <TableBody />\n </Table>\n );\n};\n\nexport default ReviewHostsInventory;\n", "import React, { Fragment, ReactElement } from 'react';\nimport { Alert, AlertGroup, AlertVariant, Level, LevelItem } from '@patternfly/react-core';\nimport {\n global_warning_color_100 as warningColor,\n global_success_color_100 as okColor,\n} from '@patternfly/react-tokens';\nimport { PendingIcon, CheckCircleIcon, ExclamationTriangleIcon } from '@patternfly/react-icons';\n\nimport { Host, HostValidationId } from '../../api';\nimport { Validation, ValidationsInfo } from '../../types/hosts';\nimport {\n hostValidationFailureHints,\n hostValidationGroupLabels,\n hostValidationLabels,\n} from '../../config';\nimport { toSentence } from '../ui/table/utils';\n\nimport './HostValidationGroups.css';\nimport Hostname from './Hostname';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type AdditionNtpSourcePropsType = {\n AdditionalNTPSourcesDialogToggleComponent?: React.FC;\n};\n\nexport type UpdateDay2ApiVipPropsType = {\n UpdateDay2ApiVipDialogToggleComponent?: React.FC;\n};\n\nexport type InvalidHostnameActionProps = {\n onEditHostname?: () => void;\n host: Host;\n};\n\nexport type ValidationInfoActionProps = AdditionNtpSourcePropsType &\n InvalidHostnameActionProps &\n UpdateDay2ApiVipPropsType;\n\ntype HostValidationGroupsProps = ValidationInfoActionProps & {\n validationsInfo: ValidationsInfo;\n};\n\ntype ValidationGroupAlertProps = ValidationInfoActionProps & {\n variant: AlertVariant;\n validations: Validation[];\n title: string;\n};\n\nconst ValidationsAlert: React.FC<{\n validations: Validation[];\n variant: AlertVariant;\n title: string;\n actionLinks?: ReactElement[];\n}> = ({ validations, variant, title, actionLinks = [] }) => {\n const { t } = useTranslation();\n return (\n <Alert title={title} variant={variant} actionLinks={actionLinks} isInline>\n <ul>\n {validations.map((v) => (\n <li key={v.id}>\n <strong>{hostValidationLabels(t)[v.id] || v.id}:</strong>&nbsp;{toSentence(v.message)}{' '}\n {v.status === 'failure' && hostValidationFailureHints(t)[v.id]}\n </li>\n ))}\n </ul>\n </Alert>\n );\n};\n\nconst HostnameAlert: React.FC<\n Required<InvalidHostnameActionProps> & {\n hostnameValidations: Validation[];\n variant: AlertVariant;\n }\n> = ({ onEditHostname, host, hostnameValidations, variant }) => {\n const { t } = useTranslation();\n const actionLinks = [\n <Hostname\n key=\"change-hostname\"\n title={t('ai:Change hostname')}\n onEditHostname={onEditHostname}\n host={host}\n />,\n ];\n const title = t('ai:Illegal hostname');\n return hostnameValidations.length === 1 ? (\n <Alert title={title} variant={variant} actionLinks={actionLinks} isInline>\n {toSentence(hostnameValidations[0].message)}\n </Alert>\n ) : (\n <ValidationsAlert\n title={title}\n validations={hostnameValidations}\n variant={variant}\n actionLinks={actionLinks}\n />\n );\n};\n\nconst NtpSyncAlert: React.FC<\n Required<AdditionNtpSourcePropsType> & { variant: AlertVariant; validation: Validation }\n> = ({ AdditionalNTPSourcesDialogToggleComponent, variant, validation }) => {\n const actionLinks = [<AdditionalNTPSourcesDialogToggleComponent key=\"add-ntp-sources\" />];\n const { t } = useTranslation();\n return (\n <Alert\n title={t('ai:NTP synchronization failure')}\n variant={variant}\n actionLinks={actionLinks}\n isInline\n >\n {toSentence(validation.message)} {hostValidationFailureHints(t)[validation.id]}\n </Alert>\n );\n};\n\nconst ApiVipConnectivityAlert: React.FC<\n Required<UpdateDay2ApiVipPropsType> & { variant: AlertVariant; validation: Validation }\n> = ({ UpdateDay2ApiVipDialogToggleComponent, variant, validation }) => {\n const actionLinks = [<UpdateDay2ApiVipDialogToggleComponent key=\"update-api-vip\" />];\n const { t } = useTranslation();\n return (\n <Alert\n title={t('ai:API connectivity failure')}\n variant={variant}\n actionLinks={actionLinks}\n isInline\n >\n {toSentence(validation.message)}\n </Alert>\n );\n};\n\nconst ValidationGroupAlerts: React.FC<ValidationGroupAlertProps> = ({\n validations,\n title,\n variant,\n onEditHostname,\n AdditionalNTPSourcesDialogToggleComponent,\n UpdateDay2ApiVipDialogToggleComponent,\n host,\n}) => {\n if (!validations.length) {\n return null;\n }\n const validationsWithActions: { [id in HostValidationId]?: Validation } = {\n ['hostname-unique']: undefined,\n ['hostname-valid']: undefined,\n ['ntp-synced']: undefined,\n ['ignition-downloadable']: undefined,\n };\n const alerts = [];\n const validationsWithoutActions: Validation[] = [];\n for (const v of validations) {\n if (v.id in validationsWithActions && v.status === 'failure') {\n validationsWithActions[v.id] = v;\n } else {\n validationsWithoutActions.push(v);\n }\n }\n const hostnameValidations: Validation[] = [];\n if (validationsWithActions['hostname-unique']) {\n hostnameValidations.push(validationsWithActions['hostname-unique']);\n }\n if (validationsWithActions['hostname-valid']) {\n hostnameValidations.push(validationsWithActions['hostname-valid']);\n }\n if (hostnameValidations.length > 0 && onEditHostname) {\n alerts.push(\n <HostnameAlert\n hostnameValidations={hostnameValidations}\n variant={variant}\n onEditHostname={onEditHostname}\n host={host}\n key=\"hostname-alert\"\n />,\n );\n }\n if (validationsWithActions['ignition-downloadable'] && UpdateDay2ApiVipDialogToggleComponent) {\n alerts.push(\n <ApiVipConnectivityAlert\n UpdateDay2ApiVipDialogToggleComponent={UpdateDay2ApiVipDialogToggleComponent}\n validation={validationsWithActions['ignition-downloadable']}\n variant={variant}\n key=\"ignition-downloadable-alert\"\n />,\n );\n }\n if (validationsWithActions['ntp-synced'] && AdditionalNTPSourcesDialogToggleComponent) {\n alerts.push(\n <NtpSyncAlert\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggleComponent}\n validation={validationsWithActions['ntp-synced']}\n variant={variant}\n key=\"ntp-sync-alert\"\n />,\n );\n }\n if (validationsWithoutActions.length > 0) {\n alerts.push(\n <ValidationsAlert\n validations={validationsWithoutActions}\n variant={variant}\n title={title}\n key=\"insufficient-alert\"\n />,\n );\n }\n return <AlertGroup>{alerts}</AlertGroup>;\n};\n\nexport const HostValidationGroups: React.FC<HostValidationGroupsProps> = ({\n validationsInfo,\n ...props\n}) => {\n const { t } = useTranslation();\n return (\n <>\n {Object.keys(validationsInfo).map((groupName) => {\n const groupLabel = hostValidationGroupLabels(t)[groupName] as string;\n\n const pendingValidations = (validationsInfo[groupName] as Validation[]).filter(\n (v: Validation) => v.status === 'pending',\n );\n const failedValidations = (validationsInfo[groupName] as Validation[]).filter(\n (v: Validation) => v.status === 'failure' || v.status === 'error',\n );\n\n const getValidationGroupState = () => {\n if (failedValidations.length) {\n return (\n <>\n {t('ai:Failed')} <ExclamationTriangleIcon color={warningColor.value} />\n </>\n );\n } else if (pendingValidations.length) {\n return (\n <>\n {t('ai:Pending input')} <PendingIcon />\n </>\n );\n }\n return (\n <>\n {t('ai:Ready')} <CheckCircleIcon color={okColor.value} />\n </>\n );\n };\n\n return (\n <Fragment key={groupName}>\n <Level className=\"host-validation-groups__validation-group\">\n <LevelItem>\n <strong>{groupLabel}</strong>\n </LevelItem>\n <LevelItem>{getValidationGroupState()}</LevelItem>\n </Level>\n {!failedValidations.length && ( // display pending validations only if there are no failing validations\n <ValidationGroupAlerts\n variant={AlertVariant.info}\n title={t('ai:Pending validations:')}\n validations={pendingValidations}\n {...props}\n />\n )}\n <ValidationGroupAlerts\n variant={AlertVariant.warning}\n title={t('ai:Failed validations:')}\n validations={failedValidations}\n {...props}\n />\n </Fragment>\n );\n })}\n </>\n );\n};\n", "import React from 'react';\nimport { Button, ButtonVariant, Flex, FlexItem, Popover } from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens';\nimport { Host, Inventory, stringToJSON } from '../../api';\nimport { getHostname } from './utils';\nimport { DASH } from '../constants';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype HostnameProps = {\n host: Host;\n onEditHostname?: () => void;\n className?: string;\n // Provide either inventory or title\n inventory?: Inventory;\n title?: string;\n hosts?: Host[];\n readonly?: boolean;\n};\n\nconst Hostname: React.FC<HostnameProps> = ({\n host,\n inventory = {},\n onEditHostname,\n title,\n className,\n hosts,\n readonly = false,\n}) => {\n const hostname = title || getHostname(host, inventory) || DASH;\n\n const isNotLocalhost = hostname !== 'localhost';\n const isUnique = hosts\n ? !hosts.find((h) => {\n const hostInventory = stringToJSON<Inventory>(h.inventory || '') || {};\n return h.id !== host.id && getHostname(h, hostInventory) === hostname;\n })\n : true;\n\n const isValid = isUnique && isNotLocalhost;\n\n const body = (\n <Flex alignItems={{ default: 'alignItemsCenter' }}>\n {onEditHostname && !isValid && (\n <FlexItem className={'pf-u-mr-xs'}>\n <ExclamationTriangleIcon color={warningColor.value} />\n </FlexItem>\n )}\n <FlexItem>{hostname}</FlexItem>\n </Flex>\n );\n const { t } = useTranslation();\n return !readonly && onEditHostname ? (\n isValid ? (\n <Button variant={ButtonVariant.link} isInline onClick={onEditHostname} className={className}>\n {body}\n </Button>\n ) : (\n <Popover\n headerContent={\n <Flex alignItems={{ default: 'alignItemsCenter' }}>\n <FlexItem className={'pf-u-mr-xs'}>\n <ExclamationTriangleIcon color={warningColor.value} />\n </FlexItem>\n <FlexItem>{t('ai:Hostname is not valid')}</FlexItem>\n </Flex>\n }\n bodyContent={\n !isNotLocalhost ? t('ai:Hostname can not be localhost') : t('ai:Hostname is not unique')\n }\n footerContent={\n <Button\n variant={ButtonVariant.link}\n isInline\n className={className}\n onClick={onEditHostname}\n >\n {t('ai:Change hostname')}\n </Button>\n }\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n hideOnOutsideClick\n zIndex={300}\n >\n <Button variant={ButtonVariant.link} isInline className={className}>\n {body}\n </Button>\n </Popover>\n )\n ) : (\n body\n );\n};\nexport default Hostname;\n", "import { DropdownProps } from '@patternfly/react-core';\nimport React from 'react';\nimport { Host, HostUpdateParams } from '../../api';\nimport RoleDropdown from './RoleDropdown';\n\nexport type RoleCellProps = {\n host: Host;\n role: string;\n readonly?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onEditRole?: (role: HostUpdateParams['hostRole']) => Promise<any>;\n displayTooltip?: boolean;\n position?: DropdownProps['position'];\n};\n\nconst RoleCell: React.FC<RoleCellProps> = ({\n host,\n role,\n readonly = false,\n onEditRole,\n position,\n}) =>\n !readonly && onEditRole ? (\n <RoleDropdown host={host} onEditRole={onEditRole} current={role} position={position} />\n ) : (\n <span>{role}</span>\n );\n\nexport default RoleCell;\n", "import React from 'react';\nimport { hostRoles } from '../../config/constants';\nimport { Host, HostUpdateParams } from '../../api';\nimport { SimpleDropdown } from '../ui';\nimport { useStateSafely } from '../../hooks';\nimport { DropdownProps } from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype RoleDropdownProps = {\n host: Host;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onEditRole: (role: HostUpdateParams['hostRole']) => Promise<any>;\n current: string;\n position?: DropdownProps['position'];\n};\n\nconst RoleDropdown: React.FC<RoleDropdownProps> = ({ host, onEditRole, current, position }) => {\n const [isDisabled, setDisabled] = useStateSafely(false);\n const setRole = async (role?: string) => {\n setDisabled(true);\n try {\n await onEditRole(role as HostUpdateParams['hostRole']);\n } finally {\n setDisabled(false);\n }\n };\n const { t } = useTranslation();\n return (\n <SimpleDropdown\n defaultValue={hostRoles(t)[0].value}\n current={current}\n items={hostRoles(t)}\n setValue={setRole}\n isDisabled={isDisabled}\n idPrefix={`role-${host.requestedHostname}`}\n position={position}\n menuAppendTo={() => document.body}\n />\n );\n};\n\nexport default RoleDropdown;\n", "import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react';\n\nexport const useStateSafely = <S>(initialState: S): [S, Dispatch<SetStateAction<S>>] => {\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const [state, setState] = useState(initialState);\n const setStateSafely: Dispatch<SetStateAction<S>> = useCallback((arg) => {\n if (mountedRef.current) {\n setState(arg);\n }\n }, []);\n\n return [state, setStateSafely];\n};\n\nexport default useStateSafely;\n", "import * as React from 'react';\nimport isEqual from 'lodash/isEqual';\n\nconst useDeepCompareMemoize = <T>(value: T): T => {\n const ref = React.useRef<T>(value);\n\n if (!isEqual(value, ref.current)) {\n ref.current = value;\n }\n\n return ref.current;\n};\n\nexport default useDeepCompareMemoize;\n", "import React from 'react';\nimport { Popover, Level, LevelItem } from '@patternfly/react-core';\nimport { Cluster } from '../../api';\nimport { getEnabledHostCount, getReadyHostCount, getTotalHostCount } from './utils';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype HostsCountProps = {\n cluster: Cluster;\n inParenthesis?: boolean;\n valueId?: string;\n};\n\nconst HostsCount: React.FC<HostsCountProps> = ({\n cluster,\n inParenthesis = false,\n valueId = 'hosts-count',\n}) => {\n const { t } = useTranslation();\n const body = (\n <>\n {'readyHostCount' in cluster && (\n <Level>\n <LevelItem>{t('ai:Ready for the installation')}</LevelItem>\n <LevelItem>{getReadyHostCount(cluster)}</LevelItem>\n </Level>\n )}\n {'enabledHostCount' in cluster && (\n <Level>\n <LevelItem>{t('ai:Enabled for the installation')}</LevelItem>\n <LevelItem>{getEnabledHostCount(cluster)}</LevelItem>\n </Level>\n )}\n <Level>\n <LevelItem>{t('ai:All discovered')}</LevelItem>\n <LevelItem>{getTotalHostCount(cluster)}</LevelItem>\n </Level>\n </>\n );\n\n const summary =\n 'enabledHostCount' in cluster ? getEnabledHostCount(cluster) : getTotalHostCount(cluster);\n return (\n <Popover headerContent={t('ai:Hosts in the cluster')} bodyContent={body}>\n <a id={valueId}>\n {inParenthesis && '('}\n {summary}\n {inParenthesis && ')'}\n </a>\n </Popover>\n );\n};\n\nexport default HostsCount;\n", "import React from 'react';\nimport {\n Popover,\n Button,\n Text,\n TextContent,\n FlexItem,\n Flex,\n ButtonProps,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { PopoverProps } from '@patternfly/react-core/dist/js/components/Popover/Popover';\nimport hdate from 'human-date';\n\nimport { Host } from '../../api';\nimport { ValidationsInfo } from '../../types/hosts';\nimport { ExternalLink, getHumanizedDateTime } from '../ui';\n\nimport HostProgress from './HostProgress';\nimport { getHostProgressStageNumber, getHostProgressStages } from './utils';\nimport {\n AdditionNtpSourcePropsType,\n HostValidationGroups,\n ValidationInfoActionProps,\n} from './HostValidationGroups';\nimport OcpConsoleNodesSectionLink from './OcpConsoleNodesSectionLink';\nimport { toSentence } from '../ui/table/utils';\nimport { HostStatusProps } from './types';\nimport { UpdateDay2ApiVipPropsType } from './HostValidationGroups';\nimport { UnknownIcon } from '@patternfly/react-icons';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { APPROVE_NODES_IN_CL_LINK } from '../../config';\n\nconst getTitleWithProgress = (host: Host, status: HostStatusProps['status']) => {\n const stages = getHostProgressStages(host);\n const stageNumber = getHostProgressStageNumber(host);\n return status.withProgress ? `${status.title} ${stageNumber}/${stages.length}` : status.title;\n};\n\ntype HostStatusPopoverContentProps = ValidationInfoActionProps & {\n details?: string;\n validationsInfo: ValidationsInfo;\n autoCSR?: boolean;\n additionalPopoverContent?: React.ReactNode;\n};\n\nconst HostStatusPopoverContent: React.FC<HostStatusPopoverContentProps> = ({\n details,\n autoCSR,\n additionalPopoverContent,\n ...props\n}) => {\n const { host } = props;\n const { status, statusInfo } = host;\n const { t } = useTranslation();\n\n if (['installing-in-progress'].includes(status)) {\n return (\n <TextContent>\n <HostProgress host={host} />\n </TextContent>\n );\n }\n\n if (['error', 'cancelled', 'installing-pending-user-action'].includes(status)) {\n return (\n <TextContent>\n <Text>\n {details}\n <br />\n {toSentence(statusInfo)}\n </Text>\n <HostProgress host={host} />\n </TextContent>\n );\n }\n\n if (['installed'].includes(status)) {\n return (\n <TextContent>\n <Text>{details}</Text>\n <HostProgress host={host} />\n </TextContent>\n );\n }\n\n if (['added-to-existing-cluster'].includes(status)) {\n return (\n <TextContent>\n <Text>{details}</Text>\n {!autoCSR && (\n <>\n <br />\n {t(\n \"ai:To finish adding nodes to the cluster, approve the join request inside OpenShift Console's Nodes section.\",\n )}\n <br />\n {t('ai:It may take a few minutes for the join request to appear.')}\n <br />\n {t('ai:If you prefer using the CLI, follow the instructions in')}&nbsp;\n <ExternalLink href={APPROVE_NODES_IN_CL_LINK}>\n {t('ai:How to approve nodes using the CLI')}\n </ExternalLink>\n </>\n )}\n <HostProgress host={host} />\n </TextContent>\n );\n }\n\n if (\n [\n 'preparing-for-installation',\n 'preparing-successful',\n 'installing',\n 'unbinding-pending-user-action',\n 'binding',\n 'unbinding',\n 'reclaiming',\n 'reclaiming-rebooting',\n ].includes(status)\n ) {\n // No additional error messages shown\n return (\n <TextContent>\n <Text>{details}</Text>\n </TextContent>\n );\n }\n\n return (\n <Stack hasGutter>\n {additionalPopoverContent}\n <StackItem>\n {details && (\n <TextContent>\n <Text>{details}</Text>\n </TextContent>\n )}\n <HostValidationGroups {...props} />\n </StackItem>\n </Stack>\n );\n};\n\nconst HostStatusPopoverFooter: React.FC<{ host: Host }> = ({ host }) => {\n const { progress, statusUpdatedAt } = host;\n const { t } = useTranslation();\n\n if (host.status === 'added-to-existing-cluster') {\n return (\n <OcpConsoleNodesSectionLink\n id={`host-status-detail-link-to-ocp-nodes-${host.requestedHostname || host.id}`}\n />\n );\n }\n let footerText;\n if (host.status === 'installing-in-progress') {\n if (progress?.stageUpdatedAt && progress.stageUpdatedAt !== progress.stageStartedAt) {\n footerText = t('ai:Step started at {{startedAt}}, updated {{updatedAt}}', {\n startedAt: getHumanizedDateTime(progress.stageStartedAt),\n updatedAt: hdate.relativeTime(progress.stageUpdatedAt),\n });\n } else {\n footerText = t('ai:Step started at {{startedAt}}', {\n startedAt: getHumanizedDateTime(progress?.stageStartedAt || statusUpdatedAt),\n });\n }\n } else if (statusUpdatedAt) {\n footerText = t('ai:Status updated at {{humanizedDataTime}}', {\n humanizedDataTime: getHumanizedDateTime(statusUpdatedAt),\n });\n }\n\n return <>{!!footerText && <small>{footerText}</small>}</>;\n};\n\ntype WithHostStatusPopoverProps = AdditionNtpSourcePropsType &\n UpdateDay2ApiVipPropsType & {\n hideOnOutsideClick: PopoverProps['hideOnOutsideClick'];\n host: Host;\n onEditHostname: HostStatusPopoverContentProps['onEditHostname'];\n title: string;\n validationsInfo: ValidationsInfo;\n isSmall?: ButtonProps['isSmall'];\n details?: string;\n zIndex?: number;\n autoCSR?: boolean;\n additionalPopoverContent?: React.ReactNode;\n };\n\nconst WithHostStatusPopover: React.FC<WithHostStatusPopoverProps> = (props) => (\n <Popover\n headerContent={<div>{props.title}</div>}\n bodyContent={<HostStatusPopoverContent {...props} />}\n footerContent={<HostStatusPopoverFooter host={props.host} />}\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n hideOnOutsideClick={props.hideOnOutsideClick}\n zIndex={props.zIndex || 300}\n >\n <Button variant={'link'} isInline isSmall={props.isSmall}>\n {props.children}\n </Button>\n </Popover>\n);\n\nconst HostStatus: React.FC<HostStatusProps> = ({\n host,\n validationsInfo,\n status,\n onEditHostname,\n AdditionalNTPSourcesDialogToggleComponent,\n UpdateDay2ApiVipDialogToggleComponent,\n children,\n zIndex,\n autoCSR,\n additionalPopoverContent,\n}) => {\n const [keepOnOutsideClick, onValidationActionToggle] = React.useState(false);\n\n const toggleHostname = React.useCallback(() => {\n onValidationActionToggle(!keepOnOutsideClick);\n onEditHostname?.();\n }, [keepOnOutsideClick, onEditHostname]);\n\n const { title, icon, sublabel, details, noPopover } = status;\n const titleWithProgress = getTitleWithProgress(host, status);\n const popoverProps: WithHostStatusPopoverProps = {\n hideOnOutsideClick: !keepOnOutsideClick,\n host,\n onEditHostname: toggleHostname,\n AdditionalNTPSourcesDialogToggleComponent,\n title,\n validationsInfo,\n details,\n UpdateDay2ApiVipDialogToggleComponent,\n zIndex,\n autoCSR,\n additionalPopoverContent,\n };\n\n return (\n <Flex alignItems={{ default: 'alignItemsCenter' }} spaceItems={{ default: 'spaceItemsXs' }}>\n {<FlexItem>{icon || <UnknownIcon />}</FlexItem>}\n\n <Flex direction={{ default: 'column' }} spaceItems={{ default: 'spaceItemsXs' }}>\n {!children && !sublabel && !noPopover ? (\n <WithHostStatusPopover {...popoverProps}>{titleWithProgress}</WithHostStatusPopover>\n ) : (\n <FlexItem>{titleWithProgress}</FlexItem>\n )}\n {children && <FlexItem>{children}</FlexItem>}\n {sublabel && (\n <FlexItem\n className=\"pf-u-font-size-xs\"\n style={{ marginTop: 'calc(-1 * var(--pf-l-flex--spacer--xs))' }}\n >\n <WithHostStatusPopover {...popoverProps}>{sublabel}</WithHostStatusPopover>\n </FlexItem>\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport default HostStatus;\n", "import React from 'react';\nimport {\n Progress,\n ProgressVariant,\n ProgressMeasureLocation,\n ProgressSize,\n} from '@patternfly/react-core';\nimport { Host } from '../../api';\nimport { getHostProgress, getHostProgressStages, getHostProgressStageNumber } from './utils';\n\nconst getProgressVariant = (status: Host['status']) => {\n switch (status) {\n case 'cancelled':\n case 'error':\n return ProgressVariant.danger;\n case 'installed':\n return ProgressVariant.success;\n default:\n return undefined;\n }\n};\n\nconst getMeasureLocation = (status: Host['status']) =>\n status === 'installed' ? ProgressMeasureLocation.none : ProgressMeasureLocation.top;\n\nconst HostProgress = ({ host }: { host: Host }) => {\n const { status } = host;\n const stages = getHostProgressStages(host);\n const { currentStage, progressInfo } = getHostProgress(host);\n const currentStageNumber = getHostProgressStageNumber(host);\n const progressLabel = `${currentStage}${progressInfo ? `: ${progressInfo}` : ' '}`;\n\n return (\n <Progress\n title={progressLabel}\n value={currentStageNumber}\n min={1}\n max={stages.length}\n label={`Step ${currentStageNumber} of ${stages.length}`}\n valueText={`Step ${currentStageNumber} of ${stages.length}: ${progressLabel}`}\n variant={getProgressVariant(status)}\n measureLocation={getMeasureLocation(status)}\n size={ProgressSize.sm}\n />\n );\n};\n\nexport default HostProgress;\n", "import React from 'react';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { AddHostsContext } from '../AddHosts/AddHostsContext';\nimport { getOcpConsoleNodesPage } from '../../config';\n\nconst OcpConsoleNodesSectionLink: React.FC<{\n id?: string;\n title?: string;\n}> = ({ id, title = 'OpenShift console' }) => {\n const { ocpConsoleUrl } = React.useContext(AddHostsContext) || {};\n if (!ocpConsoleUrl) {\n return null;\n }\n return (\n <Button\n variant={ButtonVariant.link}\n onClick={() =>\n window.open(getOcpConsoleNodesPage(ocpConsoleUrl), '_blank', 'noopener noreferrer')\n }\n id={id}\n >\n {title} <ExternalLinkAltIcon />\n </Button>\n );\n};\n\nexport default OcpConsoleNodesSectionLink;\n", "import React from 'react';\nimport { Cluster } from '../../api';\n\nexport type AddHostsContextType = {\n cluster?: Cluster;\n resetCluster?: () => Promise<void>;\n ocpConsoleUrl?: string;\n};\n\nexport const AddHostsContext = React.createContext<AddHostsContextType>({});\n\nexport const AddHostsContextProvider: React.FC<AddHostsContextType> = ({\n cluster,\n resetCluster,\n ocpConsoleUrl,\n children,\n}) => (\n <AddHostsContext.Provider value={{ cluster, resetCluster, ocpConsoleUrl }}>\n {children}\n </AddHostsContext.Provider>\n);\n", "import React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport { Host, Inventory } from '../../api';\nimport EditHostForm, { EditHostFormProps } from './EditHostForm';\nimport { EditHostFormValues } from './types';\n\ntype EditHostModalProps = {\n host?: Host;\n inventory?: Inventory;\n isOpen: boolean;\n usedHostnames: string[] | undefined;\n onClose: () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSave: (values: EditHostFormValues) => Promise<any>;\n onFormSaveError?: EditHostFormProps['onFormSaveError'];\n};\n\nconst EditHostModal: React.FC<EditHostModalProps> = ({\n isOpen,\n host,\n inventory,\n usedHostnames,\n onClose,\n onSave,\n onFormSaveError,\n}) =>\n host && inventory ? (\n <Modal\n aria-label=\"Change hostname dialog\"\n title=\"Change hostname\"\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n >\n <EditHostForm\n host={host}\n inventory={inventory}\n usedHostnames={usedHostnames}\n onCancel={onClose}\n onSave={onSave}\n onFormSaveError={onFormSaveError}\n />\n </Modal>\n ) : null;\n\nexport default EditHostModal;\n", "import React from 'react';\nimport * as Yup from 'yup';\nimport {\n Button,\n ButtonVariant,\n ButtonType,\n Form,\n ModalBoxBody,\n ModalBoxFooter,\n AlertVariant,\n Alert,\n AlertActionCloseButton,\n} from '@patternfly/react-core';\n\nimport { Formik } from 'formik';\nimport { Host, Inventory } from '../../api';\nimport {\n richNameValidationSchema,\n RichInputField,\n StaticTextField,\n hostnameValidationMessages,\n getRichTextValidation,\n} from '../ui';\nimport { canHostnameBeChanged } from './utils';\nimport GridGap from '../ui/GridGap';\nimport { EditHostFormValues } from './types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nexport type EditHostFormProps = {\n host: Host;\n inventory: Inventory;\n usedHostnames: string[] | undefined;\n onCancel: () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSave: (values: EditHostFormValues) => Promise<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFormSaveError?: (e: any) => void | string;\n};\n\nconst validationSchema = (\n t: TFunction,\n initialValues: EditHostFormValues,\n usedHostnames: string[] = [],\n) =>\n Yup.object().shape({\n hostname: richNameValidationSchema(t, usedHostnames, initialValues.hostname),\n });\n\nconst EditHostForm: React.FC<EditHostFormProps> = ({\n host,\n inventory,\n usedHostnames,\n onCancel,\n onSave,\n onFormSaveError,\n}) => {\n const hostnameInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n hostnameInputRef.current?.focus();\n hostnameInputRef.current?.select();\n }, []);\n\n const { requestedHostname } = host;\n const { hostname } = inventory;\n\n const initialValues: EditHostFormValues = {\n hostId: host.id,\n hostname: requestedHostname || '',\n };\n const { t } = useTranslation();\n return (\n <Formik\n validateOnMount\n initialValues={initialValues}\n initialStatus={{ error: null }}\n validate={getRichTextValidation(validationSchema(t, initialValues, usedHostnames))}\n onSubmit={async (values, formikActions) => {\n if (values.hostname === initialValues.hostname) {\n // no change to save\n onCancel();\n return;\n }\n try {\n await onSave(values);\n onCancel();\n } catch (e) {\n const message = (onFormSaveError && onFormSaveError(e)) || t('ai:Host update failed.');\n formikActions.setStatus({\n error: {\n title: t('ai:Failed to update host'),\n message,\n },\n });\n }\n }}\n >\n {({ handleSubmit, status, setStatus, isSubmitting, isValid, dirty }) => (\n <Form onSubmit={handleSubmit}>\n <ModalBoxBody>\n <GridGap>\n {status.error && (\n <Alert\n variant={AlertVariant.danger}\n title={status.error.title}\n actionClose={\n <AlertActionCloseButton onClose={() => setStatus({ error: null })} />\n }\n isInline\n >\n {status.error.message}\n </Alert>\n )}\n <Alert\n variant={AlertVariant.info}\n title={t('ai:This name will replace the original discovered hostname.')}\n isInline\n />\n <StaticTextField name=\"discoveredHostname\" label=\"Discovered hostname\">\n {hostname || ''}\n </StaticTextField>\n <RichInputField\n label={t('ai:New hostname')}\n name=\"hostname\"\n ref={hostnameInputRef}\n isRequired\n isDisabled={!canHostnameBeChanged(host.status)}\n richValidationMessages={hostnameValidationMessages(t)}\n />\n </GridGap>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n key=\"submit\"\n type={ButtonType.submit}\n isDisabled={isSubmitting || !isValid || !dirty}\n >\n {t('ai:Change')}\n </Button>\n <Button key=\"cancel\" variant={ButtonVariant.link} onClick={onCancel}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </Form>\n )}\n </Formik>\n );\n};\n\nexport default EditHostForm;\n", "import { List, ListItem, TextContent } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { fileSize } from './utils';\nimport ExternalLink from '../ui/ExternalLink';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype HWRequirements = {\n cpuCores?: number;\n ramMib?: number;\n diskSizeGb?: number;\n};\n\nconst parseRAM = (req?: HWRequirements) =>\n fileSize((req?.ramMib || 16 * 1024) * 1024 * 1024, 2, 'iec');\n\nexport type HostRequirementsListProps = {\n master?: HWRequirements;\n worker?: HWRequirements;\n sno?: HWRequirements;\n isSNOCluster?: boolean;\n};\n\nexport const HostRequirementsList: React.FC<HostRequirementsListProps> = ({\n master,\n worker,\n sno,\n isSNOCluster,\n}) => {\n const masterRam = parseRAM(master);\n const workerRam = parseRAM(worker);\n const snoRam = parseRAM(sno);\n const { t } = useTranslation();\n return (\n <List>\n {!isSNOCluster && (\n <>\n <ListItem>\n {t(\n 'ai:Control plane nodes: At least {{master_cpu_cores}} CPU cores, {{master_ram}} RAM, {{master_disksize}} GB disk size for every control plane node.',\n {\n master_cpu_cores: master?.cpuCores || 4,\n master_ram: masterRam,\n master_disksize: master?.diskSizeGb || 120,\n },\n )}\n </ListItem>\n <ListItem>\n {t(\n 'ai:Workers: At least {{worker_cpu_cores}} CPU cores, {{worker_ram}} RAM, {{worker_disksize}} GB disk size for each worker ',\n {\n worker_cpu_cores: worker?.cpuCores || 2,\n worker_ram: workerRam,\n worker_disksize: worker?.diskSizeGb || 12,\n },\n )}\n </ListItem>\n </>\n )}\n\n {(isSNOCluster === true || isSNOCluster === undefined) && (\n <>\n <ListItem>\n {t(\n 'ai:SNO: One host is required with at least {{sno_cpu_cores}} CPU cores, {{snoRam}} of RAM, and {{sno_disksize}} GB of disk size storage.',\n {\n sno_cpu_cores: sno?.cpuCores || 4,\n snoRam: snoRam,\n sno_disksize: sno?.diskSizeGb || 120,\n },\n )}\n </ListItem>\n </>\n )}\n <ListItem>\n {t(\n \"ai:Also note that each host's disk write speed should meet the minimum requirements to run OpenShift. \",\n )}\n <ExternalLink href={'https://access.redhat.com/solutions/4885641'}>\n {t('ai:Learn more')}\n </ExternalLink>\n </ListItem>\n </List>\n );\n};\n\nconst HostRequirements: React.FC<HostRequirementsListProps> = (props) => (\n <TextContent>\n <HostRequirementsList {...props} />\n </TextContent>\n);\n\nexport default HostRequirements;\n", "import React from 'react';\nimport {\n Button,\n ButtonVariant,\n Popover,\n Text,\n TextContent,\n TextVariants,\n} from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { PrismCode } from '../../../common/components/ui';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\nconst Hint = () => {\n const { t } = useTranslation();\n return (\n <TextContent>\n <Text component={TextVariants.p}>\n {t(\n 'ai:Your libvirt virtual machines should be configured to restart automatically after a reboot. You can check this by running:',\n )}\n </Text>\n <PrismCode code=\"virsh dumpxml <name> | grep on_reboot\" />\n <Text component={TextVariants.p}>{t('ai:And verify that this is the output:')}</Text>\n <PrismCode code=\"<on_reboot>restart</on_reboot>\" />\n <Text component={TextVariants.p}>\n {t('ai:If not, please start your VMs with the following configuration:')}\n </Text>\n <PrismCode code=\"--events on_reboot=restart\" />\n <Text component={TextVariants.p}>\n <Trans\n t={t}\n components={{ code: <code /> }}\n i18nKey=\"ai:When using <code>{{executionCommand}}</code>, please run:\"\n values={{ executionCommand: 'virt-install' }}\n />\n </Text>\n <PrismCode code=\"virt-install --wait -1 <rest of the command>\" />\n <Text component={TextVariants.p}>\n {t('ai:Otherwise, the VMs will not be able to reboot during the installation process.')}\n </Text>\n </TextContent>\n );\n};\n\nconst VMRebootConfigurationInfo: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Text component=\"p\">\n <Popover bodyContent={<Hint />} minWidth=\"35rem\">\n <Button variant={ButtonVariant.link} isInline>\n <InfoCircleIcon size=\"sm\" />\n &nbsp;{t('ai:Check your VM reboot configuration')}\n </Button>\n </Popover>\n </Text>\n );\n};\n\nexport default VMRebootConfigurationInfo;\n", "import * as React from 'react';\nimport {\n Dropdown,\n DropdownItem,\n DropdownToggle,\n DropdownToggleCheckbox,\n OnPerPageSelect,\n OnSetPage,\n Pagination,\n PerPageOptions,\n Split,\n SplitItem,\n Toolbar,\n ToolbarContent,\n ToolbarItem,\n ToolbarProps,\n Tooltip,\n} from '@patternfly/react-core';\nimport { CaretDownIcon } from '@patternfly/react-icons';\n\nimport './TableToolbar.css';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype TableToolbarProps = {\n itemIDs: string[];\n selectedIDs: string[];\n setSelectedIDs: (selectedIDs: string[]) => void;\n actions?: React.ReactNode[];\n showPagination: boolean;\n perPage: number;\n onPerPageSelect: OnPerPageSelect;\n page: number;\n onSetPage: OnSetPage;\n perPageOptions: PerPageOptions[];\n clearAllFilters?: ToolbarProps['clearAllFilters'];\n};\n\nconst TableToolbar: React.FC<TableToolbarProps> = ({\n itemIDs,\n selectedIDs,\n setSelectedIDs,\n actions,\n showPagination,\n clearAllFilters,\n children,\n ...paginationProps\n}) => {\n const [actionsOpen, setActionsOpen] = React.useState(false);\n const [selectOpen, setSelectOpen] = React.useState(false);\n const onSelectToggle = React.useCallback(() => setSelectOpen(!selectOpen), [selectOpen]);\n const onActionsToggle = React.useCallback(() => setActionsOpen(!actionsOpen), [actionsOpen]);\n\n React.useEffect(() => {\n if (!selectedIDs.every((id) => itemIDs.includes(id))) {\n setSelectedIDs(selectedIDs.filter((id) => itemIDs.includes(id)));\n }\n }, [selectedIDs, itemIDs, setSelectedIDs]);\n\n let isChecked: boolean | null = false;\n if (selectedIDs.length) {\n isChecked =\n selectedIDs.length === itemIDs.length && itemIDs.every((id) => selectedIDs.includes(id))\n ? true\n : null;\n }\n\n const isDisabled = isChecked === false;\n\n const actionsDropdown = (\n <Dropdown\n onSelect={onActionsToggle}\n toggle={\n <DropdownToggle\n onToggle={onActionsToggle}\n toggleIndicator={CaretDownIcon}\n isDisabled={isDisabled}\n >\n Actions\n </DropdownToggle>\n }\n isOpen={actionsOpen}\n dropdownItems={actions}\n />\n );\n\n const onSelectAll = () => setSelectedIDs(itemIDs);\n const onSelectNone = () => setSelectedIDs([]);\n const { t } = useTranslation();\n return (\n <Split hasGutter>\n <SplitItem isFilled>\n <Toolbar className=\"table-toolbar\" clearAllFilters={clearAllFilters}>\n <ToolbarContent className=\"table-toolbar__content\">\n <ToolbarItem>\n <Dropdown\n onSelect={onSelectToggle}\n toggle={\n <DropdownToggle\n splitButtonItems={[\n <DropdownToggleCheckbox\n id=\"select-checkbox\"\n key=\"select-checkbox\"\n aria-label={t('ai:Select all')}\n onChange={(checked) => (checked ? onSelectAll() : onSelectNone())}\n isChecked={isChecked}\n >\n {selectedIDs.length} {t('ai:selected')}\n </DropdownToggleCheckbox>,\n ]}\n onToggle={onSelectToggle}\n />\n }\n isOpen={selectOpen}\n dropdownItems={[\n <DropdownItem key=\"select-all\" onClick={onSelectAll}>\n {t('ai:Select all')}\n </DropdownItem>,\n <DropdownItem key=\"select-none\" onClick={onSelectNone}>\n {t('ai:Select none')}\n </DropdownItem>,\n ]}\n />\n </ToolbarItem>\n {children}\n <ToolbarItem>\n {isDisabled ? (\n <Tooltip content=\"Select one or more hosts\">{actionsDropdown}</Tooltip>\n ) : (\n actionsDropdown\n )}\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n </SplitItem>\n {showPagination && (\n <SplitItem>\n <Pagination itemCount={itemIDs.length} {...paginationProps} isCompact />\n </SplitItem>\n )}\n </Split>\n );\n};\n\nexport default TableToolbar;\n", "import * as React from 'react';\nimport { DropdownItem } from '@patternfly/react-core';\n\ntype ChangeHostnameActionProps = {\n onChangeHostname: VoidFunction;\n};\n\nexport const ChangeHostnameAction: React.FC<ChangeHostnameActionProps> = ({ onChangeHostname }) => (\n <DropdownItem onClick={onChangeHostname}>Change hostname</DropdownItem>\n);\n\ntype DeleteHostActionProps = {\n onDeleteHost: VoidFunction;\n};\n\nexport const DeleteHostAction: React.FC<DeleteHostActionProps> = ({ onDeleteHost }) => (\n <DropdownItem onClick={onDeleteHost}>Delete</DropdownItem>\n);\n", "import * as React from 'react';\nimport {\n Button,\n ButtonType,\n ButtonVariant,\n Form,\n HelperText,\n HelperTextItem,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n Popover,\n Split,\n SplitItem,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, useFormikContext } from 'formik';\nimport * as Yup from 'yup';\nimport { global_palette_blue_300 as blueInfoColor } from '@patternfly/react-tokens/dist/js/global_palette_blue_300';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\n\nimport {\n RichInputField,\n getRichTextValidation,\n richNameValidationSchema,\n hostnameValidationMessages,\n ModalProgress,\n FORBIDDEN_HOSTNAMES,\n} from '../ui';\nimport { Host } from '../../api';\nimport { getHostname as getHostnameUtils, getInventory } from './utils';\nimport { ActionCheck } from './types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nimport './MassChangeHostnameModal.css';\nimport { TFunction } from 'i18next';\nimport { getApiErrorMessage } from '../../../ocm/api'; // eslint-disable-line no-restricted-imports\n\nconst getHostname = (host: Host) => {\n const inventory = getInventory(host);\n return getHostnameUtils(host, inventory) || '';\n};\n\nconst templateToHostname = (index: number, values: EditHostFormValues) =>\n values.hostname.replace(/{{n+}}/g, `${index + 1}`);\n\nconst getNewHostnames = (\n values: EditHostFormValues,\n selectedHosts: Host[],\n canChangeHostname: (host: Host) => ActionCheck,\n) => {\n let index = 0;\n return selectedHosts.map((h) => {\n const [changeEnabled, reason] = canChangeHostname(h);\n const hostnameRes = {\n newHostname: changeEnabled ? templateToHostname(index, values) : undefined,\n reason: changeEnabled ? undefined : reason,\n };\n if (changeEnabled) {\n index++;\n }\n return hostnameRes;\n });\n};\n\ntype EditHostFormValues = {\n hostname: string;\n};\n\nconst initialValues = {\n hostname: '',\n};\n\nconst validationSchema = (\n initialValues: EditHostFormValues,\n usedHostnames: string[],\n t: TFunction,\n) =>\n Yup.object().shape({\n hostname: richNameValidationSchema(t, usedHostnames, initialValues.hostname).required(\n t('ai:Required field'),\n ),\n });\n\nconst updateHostnameValidationResult = (\n validationResult: { [key: string]: string[] } | undefined,\n message: string,\n) => {\n validationResult = {\n ...(validationResult || {}),\n hostname: (validationResult?.hostname || []).concat(message),\n };\n return validationResult;\n};\n\nconst withTemplate =\n (\n selectedHosts: Host[],\n hosts: Host[],\n schema: ReturnType<typeof validationSchema>,\n canChangeHostname: (host: Host) => ActionCheck,\n t: TFunction,\n ) =>\n async (values: EditHostFormValues) => {\n const newHostnames = getNewHostnames(values, selectedHosts, canChangeHostname)\n .filter((h) => !h.reason)\n .map(({ newHostname }) => newHostname);\n\n const usedHostnames = hosts.reduce<string[]>((acc, host) => {\n if (!selectedHosts.find((a) => a.id === host.id)) {\n acc.push(getHostname(host));\n }\n return acc;\n }, []);\n\n let validationResult = await getRichTextValidation(schema)({\n ...values,\n hostname: newHostnames[0] || '',\n });\n\n if (\n newHostnames.some((newHostname) => usedHostnames.includes(newHostname || '')) ||\n new Set(newHostnames).size !== newHostnames.length\n ) {\n validationResult = updateHostnameValidationResult(\n validationResult,\n hostnameValidationMessages(t).NOT_UNIQUE,\n );\n }\n\n if (newHostnames.some((hostname) => FORBIDDEN_HOSTNAMES.includes(hostname || ''))) {\n validationResult = updateHostnameValidationResult(\n validationResult,\n hostnameValidationMessages(t).LOCALHOST_ERR,\n );\n }\n\n return validationResult;\n };\n\ntype MassChangeHostnameFormProps = {\n selectedHosts: Host[];\n isOpen: boolean;\n onClose: VoidFunction;\n patchingHost: number;\n canChangeHostname: (host: Host) => ActionCheck;\n};\n\nconst MassChangeHostnameForm: React.FC<MassChangeHostnameFormProps> = ({\n selectedHosts: initHosts,\n isOpen,\n patchingHost,\n onClose,\n canChangeHostname,\n}) => {\n const { values, handleSubmit, isSubmitting, status, isValid } =\n useFormikContext<EditHostFormValues>();\n\n const hostnameInputRef = React.useRef<HTMLInputElement>();\n const ref = React.useRef<Host[]>(initHosts);\n\n React.useEffect(() => {\n isOpen && hostnameInputRef.current?.focus();\n }, [isOpen]);\n\n React.useCallback(() => {\n if (!isSubmitting) {\n ref.current = initHosts;\n }\n }, [initHosts, isSubmitting]);\n\n const selectedHosts = ref.current;\n\n const newHostnames = getNewHostnames(values, selectedHosts, canChangeHostname);\n const { t } = useTranslation();\n return (\n <Form onSubmit={handleSubmit}>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <div>{t('ai:Rename hostnames using the custom template:')}</div>\n <div>\n <strong>{`{{n}}`}</strong> {t('ai:to add a number.')}\n </div>\n </StackItem>\n <StackItem>\n <RichInputField\n name=\"hostname\"\n ref={hostnameInputRef}\n isRequired\n richValidationMessages={hostnameValidationMessages(t)}\n />\n <HelperText>\n <HelperTextItem variant=\"indeterminate\">\n {t('ai:For example: host-{{n}}', {\n interpolation: { suffix: '###', prefix: '###' },\n })}\n </HelperTextItem>\n </HelperText>\n </StackItem>\n <StackItem>\n {t('ai:Preview')}\n <div className=\"hostname-preview\">\n {selectedHosts.map((h, index) => {\n const { newHostname, reason } = newHostnames[index];\n return (\n <Split key={h.id || index} hasGutter>\n <SplitItem className=\"hostname-column\">\n <div className=\"hostname-column__text\">\n <strong>{getHostname(h)}</strong>\n </div>\n </SplitItem>\n <SplitItem>\n <div>\n <strong>{'>'}</strong>\n </div>\n </SplitItem>\n <SplitItem isFilled>\n {reason ? (\n <Popover\n aria-label={t('ai:Cannot change hostname popover')}\n headerContent={<div>{t('ai:Hostname cannot be changed')}</div>}\n bodyContent={<div>{reason}</div>}\n >\n <Button\n variant=\"link\"\n icon={<InfoCircleIcon color={blueInfoColor.value} />}\n isInline\n >\n {t('ai:Not changeable')}\n </Button>\n </Popover>\n ) : (\n newHostname || t('ai:New hostname will appear here...')\n )}\n </SplitItem>\n </Split>\n );\n })}\n </div>\n </StackItem>\n <StackItem>\n <ModalProgress\n error={status?.error}\n progress={isSubmitting ? (100 * (patchingHost + 1)) / selectedHosts.length : null}\n />\n </StackItem>\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button key=\"submit\" type={ButtonType.submit} isDisabled={isSubmitting || !isValid}>\n {t('ai:Change')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary} isDisabled={isSubmitting}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </Form>\n );\n};\n\nexport type MassChangeHostnameModalProps = {\n hosts: Host[];\n selectedHostIDs: string[];\n isOpen: boolean;\n onClose: VoidFunction;\n // eslint-disable-next-line\n onChangeHostname: (host: Host, hostname: string) => Promise<any>;\n canChangeHostname: (host: Host) => ActionCheck;\n};\n\nconst MassChangeHostnameModal: React.FC<MassChangeHostnameModalProps> = ({\n isOpen,\n onClose,\n selectedHostIDs,\n hosts,\n onChangeHostname,\n canChangeHostname,\n}) => {\n const [patchingHost, setPatchingHost] = React.useState<number>(0);\n\n const selectedHosts = hosts.filter((h) => selectedHostIDs.includes(h.id));\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Change hostnames dialog')}\n title={t('ai:Change hostnames')}\n isOpen={isOpen}\n onClose={onClose}\n hasNoBodyWrapper\n id=\"mass-change-hostname-modal\"\n variant=\"small\"\n >\n <Formik\n initialValues={initialValues}\n validate={withTemplate(\n selectedHosts,\n hosts,\n validationSchema(initialValues, [], t),\n canChangeHostname,\n t,\n )}\n onSubmit={async (values, formikActions) => {\n let i = 0;\n try {\n for (const agent of selectedHosts) {\n setPatchingHost(i);\n const newHostname = templateToHostname(i, values);\n await onChangeHostname(agent, newHostname);\n i++;\n }\n onClose();\n } catch (e) {\n formikActions.setStatus({\n error: {\n title: t('ai:Failed to update host'),\n message: getApiErrorMessage(e),\n },\n });\n }\n }}\n >\n <MassChangeHostnameForm\n isOpen={isOpen}\n selectedHosts={selectedHosts}\n patchingHost={patchingHost}\n onClose={onClose}\n canChangeHostname={canChangeHostname}\n />\n </Formik>\n </Modal>\n );\n};\n\nexport default MassChangeHostnameModal;\n", "import * as React from 'react';\nimport {\n Button,\n ButtonVariant,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\n\nimport ModalProgress from '../ui/ModalProgress';\nimport { Host } from '../../api';\nimport { getErrorMessage } from '../../utils';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype MassDeleteHostModalProps = {\n isOpen: boolean;\n onClose: VoidFunction;\n hosts: Host[];\n // eslint-disable-next-line\n onDelete: (host: Host) => Promise<any>;\n};\n\nconst MassDeleteHostModal: React.FC<MassDeleteHostModalProps> = ({\n isOpen,\n onClose,\n onDelete,\n hosts,\n children,\n}) => {\n const [progress, setProgress] = React.useState<number | null>(null);\n const [error, setError] = React.useState<{ title: string; message: string }>();\n const { t } = useTranslation();\n const onClick = async () => {\n setError(undefined);\n const i = 0;\n\n try {\n for (const host of hosts) {\n setProgress((100 * (i + 1)) / hosts.length);\n await onDelete(host);\n }\n setProgress(null);\n onClose();\n } catch (e) {\n setError({\n title: t('ai:Failed to delete host'),\n message: getErrorMessage(e),\n });\n setProgress(null);\n }\n };\n return (\n <Modal\n aria-label={t('ai:Delete hosts dialog')}\n title={t('ai:Delete hosts')}\n isOpen={isOpen}\n onClose={onClose}\n hasNoBodyWrapper\n id=\"mass-delete-modal\"\n variant=\"medium\"\n titleIconVariant=\"warning\"\n >\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:You are deleting multiple resources. All resources listed below will be deleted if you continue. This action cannot be undone.',\n )}\n </StackItem>\n <StackItem>{children}</StackItem>\n <StackItem>\n <ModalProgress error={error} progress={progress} />\n </StackItem>\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={onClick} isDisabled={progress !== null} variant={ButtonVariant.danger}>\n {t('ai:Delete hosts')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary} isDisabled={progress !== null}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </Modal>\n );\n};\n\nexport default MassDeleteHostModal;\n", "import * as React from 'react';\nimport {\n AddCircleOIcon,\n BanIcon,\n CheckCircleIcon,\n ConnectedIcon,\n DisconnectedIcon,\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n InProgressIcon,\n LinkIcon,\n PendingIcon,\n PlusIcon,\n} from '@patternfly/react-icons';\nimport {\n global_danger_color_100 as dangerColor,\n global_warning_color_100 as warningColor,\n global_success_color_100 as okColor,\n chart_color_blue_300 as blueColor,\n} from '@patternfly/react-tokens';\nimport { Host } from '../../api';\nimport { HostStatus } from './types';\n\nexport const hostStatus: HostStatus<Host['status']> = Object.freeze({\n 'unbinding-pending-user-action': {\n key: 'unbinding-pending-user-action',\n title: 'Removing from cluster',\n category: 'Discovery related',\n icon: <InProgressIcon />,\n details:\n 'This host is being removed from the cluster. To finish, reboot the host with the infrastructure environment ISO.',\n },\n reclaiming: {\n key: 'reclaiming',\n title: 'Returning to the infrastructure environment',\n category: 'Discovery related',\n icon: <InProgressIcon />,\n details: 'This host is being removed from the cluster.',\n },\n 'reclaiming-rebooting': {\n key: 'reclaiming-rebooting',\n title: 'Rebooting while returning to the infrastructure environment',\n category: 'Discovery related',\n icon: <InProgressIcon />,\n details: 'This host is being rebooted to be available for reuse in another cluster.',\n },\n 'preparing-failed': {\n key: 'preparing-failed',\n title: 'Preparing step failed',\n category: 'Installation related',\n details: 'Preparing step failed',\n },\n unbinding: {\n key: 'unbinding',\n title: 'Removing from cluster',\n category: 'Discovery related',\n icon: <InProgressIcon />,\n details: 'This host is being removed from the cluster.',\n },\n 'disabled-unbound': {\n key: 'disabled-unbound',\n title: 'Disabled',\n category: 'Discovery related',\n icon: <BanIcon />,\n details:\n 'This host was manually removed from a cluster and can not be included in another one. Enable this host to make it available again.',\n },\n 'disconnected-unbound': {\n key: 'disconnected-unbound',\n title: 'Disconnected',\n category: 'Discovery related',\n icon: <DisconnectedIcon />,\n details: 'Ensure the host is running, responsive, and is able to contact the installer.',\n },\n 'discovering-unbound': {\n key: 'discovering-unbound',\n title: 'Discovering',\n category: 'Discovery related',\n icon: <ConnectedIcon />,\n details:\n 'This host is transmitting its hardware and networking information to the installer. Please wait while this information is received.',\n },\n 'insufficient-unbound': {\n key: 'insufficient-unbound',\n title: 'Insufficient',\n category: 'Discovery related',\n icon: <ExclamationTriangleIcon color={warningColor.value} />,\n details:\n 'This host does not meet the minimum hardware or networking requirements and can not be included in the cluster.',\n },\n 'known-unbound': {\n key: 'known-unbound',\n title: 'Available',\n category: 'Discovery related',\n icon: <PlusIcon color={blueColor.value} />,\n details:\n 'This host meets the minimum hardware and networking requirements and can be included in the cluster.',\n },\n binding: {\n key: 'binding',\n title: 'Binding',\n category: 'Discovery related',\n icon: <LinkIcon />,\n details: 'This host is being added to the cluster.',\n },\n discovering: {\n key: 'discovering',\n title: 'Discovering',\n category: 'Discovery related',\n icon: <ConnectedIcon />,\n details:\n 'This host is transmitting its hardware and networking information to the installer. Please wait while this information is received.',\n },\n 'pending-for-input': {\n key: 'pending-for-input',\n title: 'Pending input',\n category: 'Discovery related',\n icon: <PendingIcon />,\n },\n known: {\n key: 'known',\n title: 'Ready',\n category: 'Discovery related',\n icon: <CheckCircleIcon color={okColor.value} />,\n details:\n 'This host meets the minimum hardware and networking requirements and will be included in the cluster.',\n },\n disconnected: {\n key: 'disconnected',\n title: 'Disconnected',\n category: 'Discovery related',\n icon: <DisconnectedIcon />,\n details:\n 'This host has lost its connection to the installer and will not be included in the cluster unless connectivity is restored.',\n },\n insufficient: {\n key: 'insufficient',\n title: 'Insufficient',\n category: 'Discovery related',\n icon: <ExclamationTriangleIcon color={warningColor.value} />,\n details:\n 'This host does not meet the minimum hardware or networking requirements and will not be included in the cluster.',\n },\n disabled: {\n key: 'disabled',\n title: 'Disabled',\n category: 'Discovery related',\n icon: <BanIcon />,\n details:\n 'This host was manually disabled and will not be included in the cluster. Enable this host to include it again.',\n },\n 'preparing-for-installation': {\n key: 'preparing-for-installation',\n title: 'Preparing for installation',\n category: 'Installation related',\n icon: <InProgressIcon />,\n },\n 'preparing-successful': {\n key: 'preparing-successful',\n title: 'Preparing step successful',\n category: 'Installation related',\n icon: <InProgressIcon />,\n },\n installing: {\n key: 'installing',\n title: 'Starting installation',\n category: 'Installation related',\n icon: <InProgressIcon />,\n },\n 'installing-in-progress': {\n key: 'installing-in-progress',\n title: 'Installing',\n category: 'Installation related',\n icon: <InProgressIcon />,\n withProgress: true,\n },\n 'installing-pending-user-action': {\n key: 'installing-pending-user-action',\n title: 'Pending user action',\n category: 'Installation related',\n icon: <ExclamationTriangleIcon color={warningColor.value} />,\n details: 'This host is pending user action',\n },\n installed: {\n key: 'installed',\n title: 'Installed',\n category: 'Installation related',\n icon: <CheckCircleIcon color={okColor.value} />,\n details: 'This host completed its installation successfully.',\n },\n cancelled: {\n key: 'cancelled',\n title: 'Installation cancelled',\n category: 'Installation related',\n icon: <BanIcon />,\n details: 'This host installation has been cancelled.',\n withProgress: true,\n },\n error: {\n key: 'error',\n title: 'Error',\n category: 'Installation related',\n icon: <ExclamationCircleIcon color={dangerColor.value} />,\n details: 'This host failed its installation.',\n withProgress: true,\n },\n resetting: {\n key: 'resetting',\n title: 'Resetting',\n category: 'Installation related',\n icon: <InProgressIcon />,\n details: 'This host is resetting the installation.',\n },\n 'resetting-pending-user-action': {\n key: 'resetting-pending-user-action',\n title: 'Reboot required',\n category: 'Installation related',\n icon: <ExclamationTriangleIcon color={warningColor.value} />,\n details:\n 'Host already booted from disk during previous installation. To finish resetting the installation please boot the host into Discovery ISO.',\n },\n 'added-to-existing-cluster': {\n key: 'added-to-existing-cluster',\n title: 'Installed',\n category: 'Installation related',\n icon: <AddCircleOIcon />,\n details: 'This host completed its installation successfully.',\n },\n});\n", "import Humanize from 'humanize-plus';\nimport { Disk, Inventory } from '../../api';\nimport { DASH, OpticalDiskDriveType } from '../constants';\nimport { HumanizedSortable } from '../ui/table/utils';\nimport { fileSize } from './utils';\n\nexport type HostRowHardwareInfo = {\n serialNumber: string;\n cores: HumanizedSortable;\n cpuSpeed: string;\n memory: HumanizedSortable;\n disk: HumanizedSortable;\n};\n\nexport type SimpleHardwareInfo = {\n cores: number;\n memory: number;\n disks: number;\n};\n\nexport const getMemoryCapacity = (inventory: Inventory): number =>\n inventory.memory?.physicalBytes || 0;\nexport const getDiskCapacity = (inventory: Inventory): number =>\n inventory.disks\n ?.filter((disk) => disk.driveType !== OpticalDiskDriveType)\n .reduce((diskSize: number, disk: Disk) => diskSize + (disk.sizeBytes || 0), 0) || 0;\n\nexport const getHumanizedCpuClockSpeed = (inventory: Inventory) =>\n Humanize.formatNumber(inventory.cpu?.frequency || 0);\n\nexport const getSimpleHardwareInfo = (inventory: Inventory): SimpleHardwareInfo => ({\n cores: inventory.cpu?.count || 0,\n memory: getMemoryCapacity(inventory),\n disks: getDiskCapacity(inventory),\n});\n\nconst EMPTY = {\n title: DASH,\n sortableValue: 0,\n};\n\nexport const getHostRowHardwareInfo = (inventory: Inventory): HostRowHardwareInfo => {\n let cores = EMPTY;\n let memory = EMPTY;\n let disk = EMPTY;\n let cpuSpeed = DASH;\n\n if (inventory.cpu?.count) {\n const hyperThreading = inventory.cpu?.flags?.includes('ht') ? ' (hyper-threaded)' : '';\n cpuSpeed = `${inventory.cpu?.count} cores${hyperThreading} at ${getHumanizedCpuClockSpeed(\n inventory,\n )} MHz`;\n cores = {\n title: inventory.cpu?.count.toString(),\n sortableValue: inventory.cpu?.count,\n };\n }\n\n const memCapacity = getMemoryCapacity(inventory);\n if (memCapacity) {\n memory = {\n title: fileSize(memCapacity, 2, 'iec'),\n sortableValue: memCapacity,\n };\n }\n\n const disksCapacity = getDiskCapacity(inventory);\n if (disksCapacity) {\n disk = {\n title: fileSize(disksCapacity, 2, 'si'),\n sortableValue: disksCapacity,\n };\n }\n\n return {\n serialNumber: inventory.systemVendor?.serialNumber || DASH,\n cores,\n cpuSpeed,\n memory,\n disk,\n };\n};\n", "import React from 'react';\nimport lodashValues from 'lodash/values';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n} from '@patternfly/react-icons';\nimport {\n global_success_color_100 as okColor,\n global_danger_color_100 as dangerColor,\n global_warning_color_100 as warningColor,\n} from '@patternfly/react-tokens';\nimport {\n ValidationsInfo as ClusterValidationsInfo,\n ValidationGroup as ClusterValidationGroup,\n Validation as ClusterValidation,\n} from '../../types/clusters';\nimport {\n ValidationsInfo as HostValidationsInfo,\n ValidationGroup as HostValidationGroup,\n Validation as HostValidation,\n} from '../../types/hosts';\nimport { stringToJSON } from '../../api';\nimport { clusterValidationLabels, hostValidationLabels } from '../../config';\nimport { getEnabledHosts } from '../hosts';\nimport { findValidationFixStep } from './validationsInfoUtils';\nimport {\n HostsValidationsFC,\n ClusterValidationsFC,\n FailingValidationsFC,\n ValidationActionLinkFC,\n} from './types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\nconst AllValidationsPassed = () => {\n const { t } = useTranslation();\n return (\n <>\n <CheckCircleIcon color={okColor.value} /> {t('ai:All validations passed')}\n </>\n );\n};\n\nconst PendingValidations: React.FC<{ id: string; count: number }> = ({ id, count }) => {\n const { t } = useTranslation();\n return <div id={id}>{t('ai:There is still {{count}} pending validation', { count: count })}</div>;\n};\n\nconst ValidationActionLink: ValidationActionLinkFC = ({\n step,\n setCurrentStepId,\n wizardStepNames,\n}) => (\n <Button variant={ButtonVariant.link} onClick={() => setCurrentStepId(step)} isInline>\n {wizardStepNames[step]}\n </Button>\n);\n\nconst FailingValidation: FailingValidationsFC = ({\n validation,\n clusterGroup,\n hostGroup,\n severity = 'danger',\n setCurrentStepId,\n wizardStepNames,\n wizardStepsValidationsMap,\n}) => {\n const { t } = useTranslation();\n\n const issue = t('ai:{{check_failed}} check failed', {\n check_failed:\n hostValidationLabels(t)[validation.id] ||\n clusterValidationLabels(t)[validation.id] ||\n validation.id,\n });\n\n let fix;\n // eslint-disable-next-line\n const step = findValidationFixStep<any>(\n { validationId: validation.id, clusterGroup, hostGroup },\n wizardStepsValidationsMap,\n );\n\n if (step === 'review') {\n // no sooner step, so the user can not do anything about it ...\n fix = t('ai:Please wait till all validations are finished.');\n } else if (step) {\n fix = (\n <>\n <Trans t={t}>\n ai:It can be fixed in the{' '}\n <ValidationActionLink\n step={step}\n setCurrentStepId={setCurrentStepId}\n wizardStepNames={wizardStepNames}\n />{' '}\n step.\n </Trans>\n </>\n );\n } else {\n console.error(\n 'Unknown validation ID detected in the ',\n clusterGroup || hostGroup,\n ' group:',\n JSON.stringify(validation),\n );\n }\n\n let icon;\n if (severity === 'warning') {\n icon = <ExclamationTriangleIcon color={warningColor.value} />;\n } else {\n icon = <ExclamationCircleIcon color={dangerColor.value} size=\"sm\" />;\n }\n\n return (\n <div id={`failing-validation-${validation.id}`}>\n {icon} {issue}\n {fix ? '.' : ''} {fix}\n </div>\n );\n};\n\nexport const ClusterValidations: ClusterValidationsFC = ({\n validationsInfo: validationsInfoString = '',\n setCurrentStepId,\n wizardStepNames,\n wizardStepsValidationsMap,\n}) => {\n const validationsInfo = stringToJSON<ClusterValidationsInfo>(validationsInfoString) || {};\n const failingValidations: React.ReactNode[] = [];\n let pendingCount = 0;\n Object.keys(validationsInfo).forEach((group) => {\n const f: (validation: ClusterValidation) => void = (validation) => {\n if (validation.status === 'pending') {\n pendingCount++;\n }\n\n if (validation.status === 'failure') {\n failingValidations.push(\n <FailingValidation\n key={validation.id}\n validation={validation}\n clusterGroup={group as ClusterValidationGroup}\n setCurrentStepId={setCurrentStepId}\n wizardStepNames={wizardStepNames}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />,\n );\n }\n };\n\n validationsInfo[group].forEach(f);\n });\n\n if (pendingCount) {\n failingValidations.unshift(\n <PendingValidations\n key=\"pending-validations\"\n id=\"cluster-pending-validations\"\n count={pendingCount}\n />,\n );\n }\n\n if (failingValidations.length === 0) {\n return <AllValidationsPassed />;\n }\n\n return <>{failingValidations}</>;\n};\n\nexport const HostsValidations: HostsValidationsFC = ({\n hosts = [],\n setCurrentStepId,\n wizardStepNames,\n allClusterWizardSoftValidationIds,\n wizardStepsValidationsMap,\n}) => {\n const failingValidations = {};\n getEnabledHosts(hosts).forEach((host) => {\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n Object.keys(validationsInfo).forEach((group) => {\n const f: (validation: HostValidation) => void = (validation) => {\n if (validation.status === 'failure') {\n const severity = allClusterWizardSoftValidationIds.includes(validation.id)\n ? 'warning'\n : 'danger';\n failingValidations[validation.id] = failingValidations[validation.id] || (\n <FailingValidation\n key={validation.id}\n validation={validation}\n hostGroup={group as HostValidationGroup}\n severity={severity}\n setCurrentStepId={setCurrentStepId}\n wizardStepNames={wizardStepNames}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n );\n }\n };\n\n validationsInfo[group].forEach(f);\n });\n });\n\n const array = lodashValues(failingValidations);\n if (array.length === 0) {\n return <AllValidationsPassed />;\n }\n\n return <>{array}</>;\n};\n", "import * as Yup from 'yup';\nimport { Cluster, ManagedDomain } from '../../api';\nimport { CpuArchitecture, OpenshiftVersionOptionType } from '../../types';\nimport { TangServer } from '../clusterConfiguration/DiskEncryptionFields/DiskEncryptionValues';\nimport { FeatureSupportLevelData } from '../featureSupportLevels';\nimport {\n dnsNameValidationSchema,\n getDefaultOpenShiftVersion,\n nameValidationSchema,\n pullSecretValidationSchema,\n} from '../ui';\nimport { ClusterDetailsValues } from './types';\nimport { TFunction } from 'i18next';\n\nconst emptyTangServers = (): TangServer[] => {\n return [\n {\n url: '',\n thumbprint: '',\n },\n ];\n};\n\nexport const parseTangServers = (tangServersString?: string): TangServer[] => {\n if (!tangServersString) {\n return emptyTangServers();\n }\n\n let parsedTangServers = emptyTangServers();\n try {\n parsedTangServers = JSON.parse(tangServersString);\n } catch (e) {\n console.warn('Tang Servers can not be parsed');\n }\n\n return parsedTangServers;\n};\n\nexport const getClusterDetailsInitialValues = ({\n cluster,\n pullSecret,\n managedDomains,\n ocpVersions,\n baseDomain,\n}: {\n cluster?: Cluster;\n pullSecret?: string;\n managedDomains: ManagedDomain[];\n ocpVersions: OpenshiftVersionOptionType[];\n baseDomain?: string;\n}): ClusterDetailsValues => {\n const {\n name = '',\n highAvailabilityMode = 'Full',\n baseDnsDomain = baseDomain || '',\n openshiftVersion = getDefaultOpenShiftVersion(ocpVersions),\n } = cluster || {};\n\n return {\n name,\n highAvailabilityMode,\n openshiftVersion,\n pullSecret: pullSecret || '',\n baseDnsDomain,\n SNODisclaimer: highAvailabilityMode === 'None',\n useRedHatDnsService:\n !!baseDnsDomain && managedDomains.map((d) => d.domain).includes(baseDnsDomain),\n enableDiskEncryptionOnMasters: ['all', 'masters'].includes(\n cluster?.diskEncryption?.enableOn ?? 'none',\n ),\n enableDiskEncryptionOnWorkers: ['all', 'workers'].includes(\n cluster?.diskEncryption?.enableOn ?? 'none',\n ),\n diskEncryptionMode: cluster?.diskEncryption?.mode ?? 'tpmv2',\n diskEncryptionTangServers: parseTangServers(cluster?.diskEncryption?.tangServers),\n diskEncryption: cluster?.diskEncryption ?? {},\n cpuArchitecture: cluster?.cpuArchitecture || CpuArchitecture.x86,\n };\n};\n\nexport const getClusterDetailsValidationSchema = ({\n usedClusterNames,\n featureSupportLevels,\n pullSecretSet,\n ocpVersions,\n validateUniqueName,\n isOcm,\n t,\n}: {\n usedClusterNames: string[];\n featureSupportLevels: FeatureSupportLevelData;\n pullSecretSet?: boolean;\n ocpVersions?: OpenshiftVersionOptionType[];\n validateUniqueName?: boolean;\n isOcm?: boolean;\n t: TFunction;\n}) =>\n Yup.lazy<{ baseDnsDomain: string }>((values) => {\n const validateName = () =>\n nameValidationSchema(t, usedClusterNames, values.baseDnsDomain, validateUniqueName, isOcm);\n if (pullSecretSet) {\n return Yup.object({\n name: validateName(),\n baseDnsDomain: dnsNameValidationSchema.required('Required'),\n });\n }\n return Yup.object({\n name: validateName(),\n baseDnsDomain: dnsNameValidationSchema.required('Required'),\n pullSecret: pullSecretValidationSchema.required('Required.'),\n SNODisclaimer: Yup.boolean().when(['highAvailabilityMode', 'openshiftVersion'], {\n // The disclaimer is required only if SNO is enabled and SNO feature is not fully supported in that version\n is: (highAvailabilityMode, openshiftVersion) => {\n const selectedVersion = (ocpVersions || []).find((v) => v.value === openshiftVersion);\n return (\n highAvailabilityMode === 'None' &&\n selectedVersion &&\n featureSupportLevels.getFeatureSupportLevel(selectedVersion.value, 'SNO') ===\n 'dev-preview'\n );\n },\n then: Yup.bool().oneOf(\n [true],\n t('ai:Confirm the Single Node OpenShift disclaimer to continue.'),\n ),\n }),\n diskEncryptionTangServers: Yup.array().when('diskEncryptionMode', {\n is: (diskEncryptionMode) => {\n return diskEncryptionMode === 'tang';\n },\n then: Yup.array().of(\n Yup.object().shape({\n url: Yup.string()\n .url(\n t('ai:Tang Server URL must be a valid URL starting with \"http://\" or \"https://\"'),\n )\n .required(t('ai:Required.')),\n thumbprint: Yup.string().required(t('ai:Required.')),\n }),\n ),\n }),\n });\n });\n", "import React from 'react';\nimport {\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n Grid,\n GridItem,\n} from '@patternfly/react-core';\nimport { DASH } from '../constants';\n\ntype ClusterPropertyItem = {\n key: string;\n value?: React.ReactNode;\n};\n\nconst ListItem = ({ item }: { item: ClusterPropertyItem }) => (\n <DescriptionListGroup>\n <DescriptionListTerm>{item.key}</DescriptionListTerm>\n <DescriptionListDescription>{item.value || DASH}</DescriptionListDescription>\n </DescriptionListGroup>\n);\n\ntype ClusterPropertiesListProps = {\n leftItems: ClusterPropertyItem[];\n rightItems?: ClusterPropertyItem[];\n};\n\nconst ClusterPropertiesList = ({ leftItems, rightItems = [] }: ClusterPropertiesListProps) => {\n return (\n <Grid hasGutter>\n <GridItem span={rightItems.length ? 6 : 12}>\n <DescriptionList>\n {leftItems.map((item) => (\n <ListItem key={item.key} item={item} />\n ))}\n </DescriptionList>\n </GridItem>\n {rightItems.length && (\n <GridItem span={6}>\n <DescriptionList>\n {rightItems.map((item) => (\n <ListItem key={item.key} item={item} />\n ))}\n </DescriptionList>\n </GridItem>\n )}\n </Grid>\n );\n};\n\nexport default ClusterPropertiesList;\n", "import React from 'react';\nimport {\n Flex,\n FlexItem,\n Progress,\n ProgressMeasureLocation,\n ProgressVariant,\n} from '@patternfly/react-core';\nimport { Cluster } from '../../api/types';\nimport { DetailItem, DetailList, getHumanizedDateTime, RenderIf } from '../ui';\nimport { clusterStatusLabels } from '../../config';\nimport './ClusterProgress.css';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nconst getProgressVariant = (status: Cluster['status']) => {\n switch (status) {\n case 'cancelled':\n case 'error':\n return ProgressVariant.danger;\n case 'installed':\n case 'adding-hosts':\n return ProgressVariant.success;\n default:\n return undefined;\n }\n};\n\nconst getMeasureLocation = (status: Cluster['status']) =>\n ['installed', 'adding-hosts'].includes(status)\n ? ProgressMeasureLocation.none\n : ProgressMeasureLocation.top;\n\nconst getInstallationStatus = (\n status: Cluster['status'],\n installCompletedAt: Cluster['installCompletedAt'],\n t: TFunction,\n) => {\n if (status === 'installed' || status === 'adding-hosts') {\n return t('ai:Installed on {{humanizedDataTime}}', {\n humanizedDataTime: getHumanizedDateTime(installCompletedAt),\n });\n }\n if (status === 'error') {\n return t('ai:Failed on {{humanizedDataTime}}', {\n humanizedDataTime: getHumanizedDateTime(installCompletedAt),\n });\n }\n if (status === 'cancelled') {\n return t('ai:Cancelled on {{humanizedDataTime}}', {\n humanizedDataTime: getHumanizedDateTime(installCompletedAt),\n });\n }\n\n return clusterStatusLabels(t)[status] || status;\n};\n\ntype ClusterProgressProps = {\n cluster: Cluster;\n minimizedView?: boolean;\n totalPercentage?: number;\n};\n\nconst ClusterProgress = ({\n cluster,\n minimizedView = false,\n totalPercentage,\n}: ClusterProgressProps) => {\n const { status } = cluster;\n const { t } = useTranslation();\n return (\n <>\n <DetailList>\n <Flex direction={{ default: minimizedView ? 'row' : 'column' }}>\n <FlexItem>\n <DetailItem\n title={t('ai:Started on')}\n value={getHumanizedDateTime(cluster.installStartedAt)}\n idPrefix=\"cluster-progress-started-on\"\n />\n </FlexItem>\n <FlexItem>\n <DetailItem\n title={t('ai:Status')}\n value={getInstallationStatus(cluster.status, cluster.installCompletedAt, t)}\n idPrefix=\"cluster-progress-status\"\n />\n </FlexItem>\n </Flex>\n </DetailList>\n <RenderIf condition={!minimizedView}>\n <Progress\n value={totalPercentage || 0}\n label={`${totalPercentage || 0}%`}\n title=\" \"\n measureLocation={getMeasureLocation(status)}\n variant={getProgressVariant(status)}\n className=\"cluster-progress-bar\"\n />\n </RenderIf>\n </>\n );\n};\n\nexport default ClusterProgress;\n", "import React from 'react';\nimport { GridItem, ClipboardCopy, clipboardCopyFunc, Button, Alert } from '@patternfly/react-core';\nimport { Credentials, Cluster } from '../../api/types';\nimport { LoadingState, ErrorState } from '../../components/ui/uiState';\nimport { DetailList, DetailItem } from '../../components/ui/DetailList';\nimport { TroubleshootingOpenshiftConsoleButton } from './ConsoleModal';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype ClusterCredentialsProps = {\n cluster: Cluster;\n error?: boolean;\n retry?: () => void;\n credentials?: Credentials;\n idPrefix?: string;\n credentialsError?: string;\n};\n\nconst ClusterCredentials: React.FC<ClusterCredentialsProps> = ({\n cluster,\n credentials,\n error = false,\n retry,\n idPrefix = 'cluster-creds',\n credentialsError = '',\n}) => {\n let credentialsBody: JSX.Element;\n const { t } = useTranslation();\n if (error) {\n //Unauthorized users can't fetch cluster credentials\n if (credentialsError.includes('403')) {\n credentialsBody = (\n <Alert\n variant=\"info\"\n isInline\n title={'You do not have permission to view the cluster credentials'}\n >\n For more information, contact your organization administrator\n </Alert>\n );\n } else {\n credentialsBody = (\n <ErrorState title={t('ai:Failed to fetch cluster credentials.')} fetchData={retry} />\n );\n }\n } else if (!credentials) {\n credentialsBody = <LoadingState />;\n } else if (!credentials.username && !credentials.consoleUrl) {\n return <>N/A</>;\n } else {\n credentialsBody = (\n <DetailList>\n {credentials.consoleUrl && (\n <DetailItem\n title={t('ai:Web Console URL')}\n value={\n <>\n <Button\n variant=\"link\"\n icon={<ExternalLinkAltIcon />}\n iconPosition=\"right\"\n isInline\n onClick={() => window.open(credentials.consoleUrl, '_blank', 'noopener')}\n data-testid={`${idPrefix}-link-console-url`}\n >\n {credentials.consoleUrl}\n </Button>\n <br />\n {cluster.apiVip && cluster.ingressVip && (\n <TroubleshootingOpenshiftConsoleButton\n consoleUrl={credentials.consoleUrl}\n cluster={cluster}\n idPrefix={idPrefix}\n />\n )}\n </>\n }\n />\n )}\n {credentials.username && (\n <>\n <DetailItem title=\"Username\" value={credentials.username} />\n <DetailItem\n title={t('ai:Password')}\n value={\n <ClipboardCopy\n isReadOnly\n onCopy={(event) => clipboardCopyFunc(event, credentials.password)}\n >\n &bull;&bull;&bull;&bull;&bull;\n </ClipboardCopy>\n }\n />\n </>\n )}\n </DetailList>\n );\n }\n\n return <GridItem span={12}>{credentialsBody}</GridItem>;\n};\n\nexport default ClusterCredentials;\n", "import React from 'react';\nimport {\n Modal,\n Button,\n ButtonVariant,\n Text,\n ModalVariant,\n ExpandableSection,\n} from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { Cluster, removeProtocolFromURL } from '../../api';\nimport { ToolbarButton } from '../ui/Toolbar';\nimport PrismCode from '../ui/PrismCode';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype WebConsoleHintProps = {\n cluster: Cluster;\n consoleUrl?: string;\n idPrefix?: string;\n};\n\ntype LaunchOpenshiftConsoleButtonProps = WebConsoleHintProps & {\n isDisabled: boolean;\n id?: string;\n};\n\ntype ConsoleModalProps = WebConsoleHintProps & {\n closeModal: () => void;\n isOpen: boolean;\n};\n\ntype ModalExpandableSectionProps = {\n toggleText: string;\n className: string;\n isExpanded: boolean;\n onToggle: () => void;\n requiredList: string[];\n};\n\nconst formatMultilineString = (multiLineList: string[]): string =>\n multiLineList && multiLineList.length > 0\n ? [...multiLineList.slice(1)].reduce((accu, elem) => `${accu}\\n${elem}`, multiLineList[0])\n : '';\n\nconst ModalExpandableSection: React.FC<ModalExpandableSectionProps> = (props) => {\n const { requiredList, ...otherProps } = props;\n return (\n <ExpandableSection {...otherProps}>\n <PrismCode code={formatMultilineString(requiredList)} language=\"markup\" copiable />\n </ExpandableSection>\n );\n};\n\nexport const WebConsoleHint: React.FC<WebConsoleHintProps> = ({ cluster, consoleUrl }) => {\n const [isDNSExpanded, setIsDNSExpanded] = React.useState(true);\n const handleToggle = () => setIsDNSExpanded(!isDNSExpanded);\n const [apiVip = '', ingressVip = ''] = [cluster.apiVip, cluster.ingressVip];\n const clusterUrl = `${cluster.name}.${cluster.baseDnsDomain}`;\n const appsUrl = `apps.${clusterUrl}`;\n const etcHosts = [\n `${apiVip}\\tapi.${clusterUrl}`,\n `${ingressVip}\\toauth-openshift.${appsUrl}`,\n `${ingressVip}\\t${removeProtocolFromURL(consoleUrl)}`,\n `${ingressVip}\\tgrafana-openshift-monitoring.${appsUrl}`,\n `${ingressVip}\\tthanos-querier-openshift-monitoring.${appsUrl}`,\n `${ingressVip}\\tprometheus-k8s-openshift-monitoring.${appsUrl}`,\n `${ingressVip}\\talertmanager-main-openshift-monitoring.${appsUrl}`,\n ];\n // Pad the lines as long as the longest record\n const paddingNum = `*.${appsUrl}.`.length + 2;\n const aRecords = [\n `api.${clusterUrl}`.padEnd(paddingNum) + `A\\t${apiVip}`,\n `*.${appsUrl}`.padEnd(paddingNum) + `A\\t${ingressVip}`,\n ];\n const { t } = useTranslation();\n return (\n <>\n <Text component=\"p\">\n {t(\n 'ai:In order to access the OpenShift Web Console, use external DNS server or local configuration to resolve its hostname. To do so, either:',\n )}\n </Text>\n <ModalExpandableSection\n toggleText={t('ai:Option 1: Add the following records to your DNS server (recommended)')}\n className=\"pf-u-pb-md\"\n isExpanded={isDNSExpanded}\n onToggle={handleToggle}\n requiredList={aRecords}\n />\n <ModalExpandableSection\n toggleText={t('ai:Option 2: Update your local /etc/hosts or /etc/resolv.conf files')}\n className=\"pf-u-pb-md\"\n isExpanded={!isDNSExpanded}\n onToggle={handleToggle}\n requiredList={etcHosts}\n />\n </>\n );\n};\n\nexport const LaunchOpenshiftConsoleButton: React.FC<LaunchOpenshiftConsoleButtonProps> = ({\n cluster,\n consoleUrl,\n isDisabled,\n id,\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n const { t } = useTranslation();\n return (\n <>\n <ToolbarButton\n type=\"button\"\n variant={ButtonVariant.primary}\n isDisabled={isDisabled}\n onClick={() => setOpen(true)}\n data-testid={id}\n >\n {t('ai:Launch OpenShift Console')}\n </ToolbarButton>\n <ConsoleModal\n closeModal={() => setOpen(false)}\n consoleUrl={consoleUrl}\n cluster={cluster}\n isOpen={isOpen}\n />\n </>\n );\n};\n\nexport const TroubleshootingOpenshiftConsoleButton: React.FC<WebConsoleHintProps> = ({\n cluster,\n consoleUrl,\n idPrefix,\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n const { t } = useTranslation();\n return (\n <>\n <Button\n variant=\"link\"\n icon={<InfoCircleIcon />}\n iconPosition=\"left\"\n isInline\n onClick={() => setOpen(true)}\n data-testid={`${idPrefix}-troubleshooting-hint-open`}\n >\n {t('ai:Not able to access the Web Console?')}\n </Button>\n <ConsoleModal\n closeModal={() => setOpen(false)}\n consoleUrl={consoleUrl}\n cluster={cluster}\n isOpen={isOpen}\n />\n </>\n );\n};\n\nexport const ConsoleModal: React.FC<ConsoleModalProps> = ({\n closeModal,\n cluster,\n consoleUrl,\n isOpen,\n}) => {\n const { t } = useTranslation();\n const actions = [\n <Button\n type=\"submit\"\n key=\"launch\"\n variant={ButtonVariant.primary}\n onClick={() => window.open(consoleUrl, '_blank', 'noopener')}\n isDisabled={!consoleUrl}\n >\n {t('ai:Launch OpenShift Console')}\n </Button>,\n <Button variant={ButtonVariant.secondary} onClick={() => closeModal()} key=\"close\">\n {t('ai:Close')}\n </Button>,\n ];\n return (\n <Modal\n title={t('ai:OpenShift Web Console troubleshooting')}\n isOpen={isOpen}\n onClose={closeModal}\n actions={actions}\n variant={ModalVariant.large}\n >\n <WebConsoleHint cluster={cluster} consoleUrl={consoleUrl} />\n </Modal>\n );\n};\n", "import React from 'react';\nimport { saveAs } from 'file-saver';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { canDownloadKubeconfig } from '../hosts/utils';\nimport { useAlerts } from '../AlertsContextProvider';\nimport { Cluster } from '../../api/types';\n/* eslint-disable no-restricted-imports */\nimport { ocmClient } from '../../../ocm/api/axiosClient';\nimport { getApiErrorMessage, handleApiError } from '../../../ocm/api/utils';\nimport ClustersAPI from '../../../ocm/services/apis/ClustersAPI';\n/* eslint-enable no-restricted-imports */\nimport { AxiosResponseHeaders } from 'axios';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\ntype KubeconfigDownloadProps = {\n clusterId: Cluster['id'];\n status: Cluster['status'];\n id?: string;\n handleDownload?: () => void;\n};\n\nconst getKubeconfigFileName = (headers: AxiosResponseHeaders) => {\n const fileNameMatch =\n headers['content-disposition'] && headers['content-disposition'].match(/filename=\".*\"/);\n return fileNameMatch ? fileNameMatch[0].slice(10, -1) : 'kubeconfig';\n};\n\nconst KubeconfigDownload: React.FC<KubeconfigDownloadProps> = ({\n clusterId,\n status,\n id,\n handleDownload,\n}) => {\n const { addAlert } = useAlerts();\n\n const download = React.useCallback(\n async (clusterId: Cluster['id'], t: TFunction) => {\n try {\n if (ocmClient) {\n const { data } = await ClustersAPI.getPresignedForClusterCredentials({\n clusterId,\n fileName: 'kubeconfig',\n });\n saveAs(data.url);\n } else {\n const response = await ClustersAPI.downloadClusterCredentials(clusterId, 'kubeconfig');\n const fileName = getKubeconfigFileName(response.headers);\n\n saveAs(response.data, fileName);\n }\n } catch (e) {\n handleApiError(e, (e) => {\n addAlert({\n title: t('ai:Could not download kubeconfig'),\n message: getApiErrorMessage(e),\n });\n });\n }\n },\n [addAlert],\n );\n const { t } = useTranslation();\n return (\n <Button\n variant={ButtonVariant.secondary}\n onClick={handleDownload || (() => download(clusterId, t))}\n isDisabled={!canDownloadKubeconfig(status)}\n id={id}\n data-testid={id}\n >\n Download kubeconfig\n </Button>\n );\n};\n\nexport default KubeconfigDownload;\n", "import { client } from '../../api/axiosClient';\nimport {\n Cluster,\n ClusterCreateParams,\n ClusterDefaultConfig,\n V2ClusterUpdateParams,\n Credentials,\n Host,\n ImportClusterParams,\n PlatformType,\n PreflightHardwareRequirements,\n PresignedUrl,\n} from '../../../common/api/types';\nimport { AxiosResponse } from 'axios';\nimport { ClustersAPIGetPresignedOptions } from './types';\n\nlet _getRequestAbortController = new AbortController();\n\nconst ClustersAPI = {\n abortLastGetRequest() {\n _getRequestAbortController.abort();\n /**\n * The AbortController.signal can only be aborted once per instance.\n * Therefore in order for other requests to be also abortable we need\n * to create a new instance when this event occurs\n */\n _getRequestAbortController = new AbortController();\n },\n\n makeBaseURI(clusterId?: Cluster['id']) {\n return `/v2/clusters/${clusterId ? clusterId : ''}`;\n },\n\n makeDownloadsBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeBaseURI(clusterId)}/downloads`;\n },\n\n makeLogsBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeBaseURI(clusterId)}/logs`;\n },\n\n makeDownloadsCredentialsBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeDownloadsBaseURI(clusterId)}/credentials`;\n },\n\n makeDownloadsCredentialsPresignedBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeDownloadsBaseURI(clusterId)}/credentials-presigned`;\n },\n\n makeDownloadsFilesPresignedBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeDownloadsBaseURI(clusterId)}/files-presigned`;\n },\n\n makeSupportedPlatformsBaseURI(clusterId: Cluster['id']) {\n return `${ClustersAPI.makeBaseURI(clusterId)}/supported-platforms`;\n },\n\n makeActionsBaseURI(clusterId: string) {\n return `${ClustersAPI.makeBaseURI(clusterId)}/actions`;\n },\n\n downloadClusterCredentials(clusterId: Cluster['id'], fileName: string) {\n return client.get<Blob>(\n `${ClustersAPI.makeDownloadsCredentialsBaseURI(clusterId)}?file_name=${fileName}`,\n {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n },\n );\n },\n\n getPresignedForClusterCredentials({\n clusterId,\n fileName,\n hostId,\n logsType,\n }: ClustersAPIGetPresignedOptions) {\n const queryParams = `${logsType ? `&logs_type=${logsType}` : ''}${\n hostId ? `&host_id=${hostId}` : ''\n }`;\n return client.get<PresignedUrl>(\n `${ClustersAPI.makeDownloadsCredentialsPresignedBaseURI(\n clusterId,\n )}?file_name=${fileName}${queryParams}`,\n );\n },\n\n getPresignedForClusterFiles({\n clusterId,\n fileName,\n hostId,\n logsType,\n }: ClustersAPIGetPresignedOptions) {\n const queryParams = `${logsType ? `&logs_type=${logsType}` : ''}${\n hostId ? `&host_id=${hostId}` : ''\n }`;\n return client.get<PresignedUrl>(\n `${ClustersAPI.makeDownloadsFilesPresignedBaseURI(\n clusterId,\n )}?file_name=${fileName}${queryParams}`,\n );\n },\n\n list() {\n return client.get<Cluster[]>(`${ClustersAPI.makeBaseURI()}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n get(clusterId: Cluster['id']) {\n return client.get<Cluster>(`${ClustersAPI.makeBaseURI(clusterId)}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n getSupportedPlatforms(clusterId: Cluster['id']) {\n return client.get<PlatformType[]>(`${ClustersAPI.makeSupportedPlatformsBaseURI(clusterId)}`);\n },\n\n getPreflightRequirements(clusterId: Cluster['id']) {\n return client.get<PreflightHardwareRequirements>(\n `${ClustersAPI.makeBaseURI(clusterId)}/preflight-requirements`,\n );\n },\n\n getDefaultConfig() {\n return client.get<ClusterDefaultConfig>(`${ClustersAPI.makeBaseURI()}/default-config`);\n },\n\n deregister(clusterId: Cluster['id']) {\n return client.delete<void>(`${ClustersAPI.makeBaseURI(clusterId)}`);\n },\n\n register(params: ClusterCreateParams) {\n return client.post<Cluster, AxiosResponse<Cluster>, ClusterCreateParams>(\n `${ClustersAPI.makeBaseURI()}`,\n params,\n );\n },\n\n update(clusterId: Cluster['id'], params: V2ClusterUpdateParams) {\n return client.patch<Cluster, AxiosResponse<Cluster>, V2ClusterUpdateParams>(\n `${ClustersAPI.makeBaseURI(clusterId)}`,\n params,\n );\n },\n\n install(clusterId: Cluster['id']) {\n return client.post<Cluster, AxiosResponse<Cluster>, never>(\n `${ClustersAPI.makeActionsBaseURI(clusterId)}/install`,\n );\n },\n\n cancel(clusterId: Cluster['id']) {\n return client.post<Cluster, AxiosResponse<Cluster>, never>(\n `${ClustersAPI.makeActionsBaseURI(clusterId)}/cancel`,\n );\n },\n\n reset(clusterId: Cluster['id']) {\n return client.post<Cluster, AxiosResponse<Cluster>, never>(\n `${ClustersAPI.makeActionsBaseURI(clusterId)}/reset`,\n );\n },\n\n registerAddHosts(params: ImportClusterParams) {\n return client.post<Cluster, AxiosResponse<Cluster>, ImportClusterParams>(\n `${ClustersAPI.makeBaseURI()}import`,\n params,\n );\n },\n\n allowAddHosts(clusterId: Cluster['id']) {\n return client.post<Cluster, AxiosResponse<Cluster>, never>(\n `${ClustersAPI.makeActionsBaseURI(clusterId)}/allow-add-workers`,\n );\n },\n\n downloadLogs(clusterId: Cluster['id'], hostId?: Host['id']) {\n const queryParams = `logs_type=${!hostId ? 'all' : `host&host_id=${hostId}`}`;\n return client.get<Blob>(`${ClustersAPI.makeLogsBaseURI(clusterId)}?${queryParams}`, {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n });\n },\n\n getCredentials(clusterId: Cluster['id']) {\n return client.get<Credentials>(`${ClustersAPI.makeBaseURI(clusterId)}/credentials`);\n },\n\n listByOpenshiftId(openshiftId: Cluster['openshiftClusterId']) {\n return client.get<Cluster[]>(\n `${ClustersAPI.makeBaseURI()}?openshift_cluster_id=${openshiftId || ''}`,\n );\n },\n\n listBySubscriptionIds(subscriptionIds: Cluster['amsSubscriptionId'][]) {\n return client.get<Cluster[]>(\n `${ClustersAPI.makeBaseURI()}?ams_subscription_ids=${subscriptionIds.toString()}`,\n );\n },\n};\n\nexport default ClustersAPI;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { ClusterDetailsValues } from '../../../common/components/clusterWizard/types';\nimport { SingleNodeCheckbox } from '../ui';\nimport { OpenshiftVersionOptionType } from '../../types';\nimport SNODisclaimer from './SNODisclaimer';\nimport { useFeatureSupportLevel } from '../featureSupportLevels';\n\ntype SNOControlGroupProps = {\n versions: OpenshiftVersionOptionType[];\n highAvailabilityMode: ClusterDetailsValues['highAvailabilityMode'];\n};\n\nconst SNOControlGroup = ({ versions, highAvailabilityMode }: SNOControlGroupProps) => {\n const { values } = useFormikContext<ClusterDetailsValues>();\n const featureSupportLevelContext = useFeatureSupportLevel();\n const snoSupportLevel = featureSupportLevelContext.getFeatureSupportLevel(\n values.openshiftVersion,\n 'SNO',\n );\n const snoExpansion = featureSupportLevelContext.isFeatureSupported(\n values.openshiftVersion,\n 'SINGLE_NODE_EXPANSION',\n );\n const isDisabled = featureSupportLevelContext.isFeatureDisabled(values.openshiftVersion, 'SNO');\n\n return (\n <>\n <SingleNodeCheckbox name=\"highAvailabilityMode\" versions={versions} isDisabled={isDisabled} />\n {highAvailabilityMode === 'None' && snoSupportLevel && (\n <SNODisclaimer\n isDisabled={isDisabled}\n snoSupportLevel={snoSupportLevel}\n snoExpansionSupported={snoExpansion}\n />\n )}\n </>\n );\n};\n\nexport default SNOControlGroup;\n", "import React from 'react';\nimport { Alert, AlertVariant, List, ListItem, Stack, StackItem } from '@patternfly/react-core';\nimport { CheckboxField } from '../ui';\nimport { SupportLevel } from '../../types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype SNODisclaimerProps = {\n snoSupportLevel: SupportLevel;\n isDisabled?: boolean;\n snoExpansionSupported?: boolean;\n};\nconst SNODisclaimer = ({\n snoSupportLevel,\n isDisabled = false,\n snoExpansionSupported = false,\n}: SNODisclaimerProps) => {\n const { t } = useTranslation();\n if (!['dev-preview', 'supported'].includes(snoSupportLevel)) {\n //if tech preview or unsupported there's no definition which warning to show\n return null;\n }\n const isDevPreview = snoSupportLevel === 'dev-preview';\n const generalSNOFacts = (\n <>\n <ListItem>\n {t('ai:Installing SNO will result in a non-highly available OpenShift deployment.')}\n </ListItem>\n {!snoExpansionSupported && (\n <ListItem>\n {t('ai:Currently, adding additional machines to your cluster is not supported.')}\n </ListItem>\n )}\n </>\n );\n const unsupportedWarnings = (\n <>\n <ListItem>\n {t('ai:SNO is in a proof-of-concept stage and is not supported in any way.')}\n </ListItem>\n <ListItem>\n {t(\n \"ai:OpenShift in-place upgrades aren't expected to work with SNO. If an upgrade is needed, your system will need a redeployment.\",\n )}\n </ListItem>\n </>\n );\n\n return (\n <Alert\n variant={isDevPreview ? AlertVariant.warning : AlertVariant.info}\n title={t('ai:Limitations for using Single Node OpenShift')}\n isInline\n >\n <Stack hasGutter>\n <StackItem>\n <List>\n {generalSNOFacts}\n {isDevPreview && unsupportedWarnings}\n </List>\n </StackItem>\n {isDevPreview && (\n <StackItem>\n <CheckboxField\n name=\"SNODisclaimer\"\n label={t(\n 'ai:I understand, accept, and agree to the limitations associated with using Single Node OpenShift.',\n )}\n isDisabled={isDisabled}\n />\n </StackItem>\n )}\n </Stack>\n </Alert>\n );\n};\n\nexport default SNODisclaimer;\n", "import React from 'react';\nimport {\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n ExternalLinkAltIcon,\n} from '@patternfly/react-icons';\nimport {\n global_warning_color_100 as warningColor,\n global_danger_color_100 as dangerColor,\n} from '@patternfly/react-tokens';\nimport { OPENSHIFT_LIFE_CYCLE_DATES_LINK } from '../../config';\nimport { OpenshiftVersionOptionType } from '../../types';\nimport { SelectField } from '../ui';\n// eslint-disable-next-line no-restricted-imports\nimport openshiftVersionData from '../../../ocm/data/openshiftVersionsData.json';\nimport { diffInDaysBetweenDates } from '../../sevices/DateAndTime';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nconst OpenShiftLifeCycleDatesLink = () => {\n const { t } = useTranslation();\n return (\n <a href={OPENSHIFT_LIFE_CYCLE_DATES_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Learn more')} <ExternalLinkAltIcon />\n </a>\n );\n};\n\nconst getOpenshiftVersionHelperText =\n // eslint-disable-next-line react/display-name\n (versions: OpenshiftVersionOptionType[]) => (selectedVersionValue: string) => {\n const { t } = useTranslation();\n if (!versions.length) {\n return (\n <>\n <ExclamationCircleIcon color={dangerColor.value} size=\"sm\" />\n &nbsp; {t('ai:No release image is available.')}\n </>\n );\n }\n let helperTextComponent = null;\n const selectedVersion = versions.find((version) => version.value === selectedVersionValue);\n if (selectedVersion?.supportLevel !== 'production') {\n helperTextComponent = (\n <>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n &nbsp;{t('ai:Please note that this version is not production-ready.')}&nbsp;\n <OpenShiftLifeCycleDatesLink />\n </>\n );\n } else if (\n selectedVersionValue in openshiftVersionData['versions'] &&\n diffInDaysBetweenDates(openshiftVersionData['versions'][selectedVersionValue]) <= 30\n ) {\n helperTextComponent = (\n <>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n &nbsp;\n {t(\n \"ai:Full support for this version ends on {{openshiftversion}} and won't be available as an installation option afterwards.\",\n { openshiftversion: openshiftVersionData['versions'][selectedVersionValue] },\n )}\n &nbsp;\n <OpenShiftLifeCycleDatesLink />\n </>\n );\n }\n return helperTextComponent;\n };\n\ntype OpenShiftVersionSelectProps = {\n versions: OpenshiftVersionOptionType[];\n};\nconst OpenShiftVersionSelect: React.FC<OpenShiftVersionSelectProps> = ({ versions }) => {\n const selectOptions = React.useMemo(\n () =>\n versions\n .filter((version) => version.supportLevel !== 'maintenance')\n .map((version) => ({\n label: version.label,\n value: version.value,\n })),\n [versions],\n );\n const { t } = useTranslation();\n return (\n <SelectField\n label={t('ai:OpenShift version')}\n name=\"openshiftVersion\"\n options={selectOptions}\n getHelperText={getOpenshiftVersionHelperText(versions)}\n isDisabled={versions.length === 0}\n isRequired\n />\n );\n};\n\nexport default OpenShiftVersionSelect;\n", "import { TIME_ZERO, MS_PER_DAY } from '../config/constants';\n\nexport function diffInDaysBetweenDates(inputDate: string) {\n const dateObject = new Date(inputDate);\n const today = new Date();\n return Math.floor(Math.abs(today.valueOf() - dateObject.valueOf()) / MS_PER_DAY);\n}\n\nexport function calculateClusterDateDiff(inactiveDeletionDays: number, completedAt?: string) {\n if (completedAt && completedAt !== TIME_ZERO) {\n return inactiveDeletionDays - diffInDaysBetweenDates(completedAt);\n } else {\n return inactiveDeletionDays;\n }\n}\n", "import * as React from 'react';\nimport { useField } from 'formik';\n\nimport { PopoverIcon, trimSshPublicKey, UploadField } from '../ui';\nimport { SshPublicKeyHelperText } from './SecurityFields';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype UploadSSHProps = {\n isRequired?: boolean;\n};\n\nconst UploadSSH: React.FC<UploadSSHProps> = ({ isRequired }) => {\n const [{ name, value }, , { setValue }] = useField('sshPublicKey');\n const { t } = useTranslation();\n return (\n <UploadField\n label={\n <>\n {t('ai:SSH public key')}{' '}\n <PopoverIcon\n bodyContent={t(\n 'ai:Provide an SSH key to be able to connect to the hosts for debugging purposes during the discovery process',\n )}\n />\n </>\n }\n name={name}\n helperText={<SshPublicKeyHelperText />}\n idPostfix=\"discovery\"\n onBlur={() => value && setValue(trimSshPublicKey(value))}\n dropzoneProps={{\n accept: '.pub',\n maxSize: 2048,\n onDropRejected:\n ({ setError }) =>\n () =>\n setError(t('ai:File not supported.')),\n }}\n transformValue={trimSshPublicKey}\n isRequired={isRequired}\n />\n );\n};\n\nexport default UploadSSH;\n", "import * as React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Checkbox, FormGroup } from '@patternfly/react-core';\n\nimport { RenderIf } from '../ui/RenderIf';\nimport { getFieldId, HelperText, TextAreaField, trimSshPublicKey, ExternalLink } from '../ui';\nimport { Cluster } from '../../api';\nimport { NetworkConfigurationValues } from '../../types/clusters';\nimport { SSH_GENERATION_DOC_LINK } from '../../config';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport const SshPublicKeyHelperText: React.FC<{\n fieldId?: string;\n}> = ({ fieldId = 'sshPublicKey' }) => {\n const { t } = useTranslation();\n return (\n <HelperText fieldId={fieldId}>\n {t(\n 'ai:Paste the content of a public ssh key you want to use to connect to the hosts into this field.',\n )}{' '}\n <ExternalLink href={SSH_GENERATION_DOC_LINK}>{t('ai:Learn more')}</ExternalLink>\n </HelperText>\n );\n};\n\ninterface SecurityFieldsFieldsProps {\n clusterSshKey: Cluster['sshPublicKey'];\n imageSshKey?: Cluster['imageInfo']['sshPublicKey'];\n isDisabled?: boolean;\n}\n\nconst SecurityFields = ({\n clusterSshKey,\n imageSshKey,\n isDisabled = false,\n}: SecurityFieldsFieldsProps) => {\n //shareSshKey shouldn't response to changes. imageSshKey stays the same, there's a loading state while it's requested\n //clusterSshKey updating causes the textarea to disappear when the user clears it to edit it\n const defaultShareSshKey = !!imageSshKey && (clusterSshKey === imageSshKey || !clusterSshKey);\n const [shareSshKey, setShareSshKey] = React.useState(defaultShareSshKey);\n const { values, setFieldValue, errors, touched } =\n useFormikContext<Pick<NetworkConfigurationValues, 'sshPublicKey'>>();\n\n const errorMsg = errors.sshPublicKey;\n\n const handleSshKeyBlur = () => {\n if (values.sshPublicKey) {\n setFieldValue('sshPublicKey', trimSshPublicKey(values.sshPublicKey));\n }\n };\n\n React.useEffect(() => {\n if (!isDisabled && shareSshKey) {\n setFieldValue('sshPublicKey', imageSshKey);\n }\n }, [shareSshKey, imageSshKey, setFieldValue, isDisabled]);\n\n const fieldId = getFieldId('shareDiscoverySshKey', 'checkbox');\n const { t } = useTranslation();\n return (\n <>\n <FormGroup\n fieldId={fieldId}\n label={t('ai:Host SSH Public Key for troubleshooting after installation')}\n helperTextInvalid={errorMsg}\n validated={touched && errorMsg ? 'error' : 'default'}\n >\n <RenderIf condition={Boolean(imageSshKey)}>\n <Checkbox\n name=\"shareDiscoverySshKey\"\n id={fieldId}\n label={t('ai:Use the same host discovery SSH key')}\n aria-describedby={`${fieldId}-helper`}\n isChecked={shareSshKey}\n isDisabled={isDisabled}\n onChange={setShareSshKey}\n />\n </RenderIf>\n <RenderIf condition={!shareSshKey}>\n <TextAreaField\n name=\"sshPublicKey\"\n helperText={<SshPublicKeyHelperText />}\n onBlur={handleSshKeyBlur}\n isDisabled={isDisabled}\n />\n </RenderIf>\n </FormGroup>\n </>\n );\n};\n\nexport default SecurityFields;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Grid } from '@patternfly/react-core';\nimport { InputField, CheckboxField, trimCommaSeparatedList, PopoverIcon } from '../ui';\nimport { ProxyFieldsType } from '../../types';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nimport './ProxyFields.css';\nimport { Trans } from 'react-i18next';\n\nexport const ProxyInputFields = () => {\n const { setFieldValue, values } = useFormikContext<ProxyFieldsType>();\n const onNoProxyBlur = () => {\n if (values.noProxy) {\n setFieldValue('noProxy', trimCommaSeparatedList(values.noProxy));\n }\n };\n const { t } = useTranslation();\n return (\n <Grid hasGutter>\n <InputField\n label={\n <>\n {t('ai:HTTP proxy URL')}{' '}\n <PopoverIcon\n bodyContent={t(\n 'ai:The HTTP proxy URL that agents should use to access the discovery service.',\n )}\n />\n </>\n }\n name=\"httpProxy\"\n placeholder=\"http://<user>:<password>@<ipaddr>:<port>\"\n helperText={\n <div>\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:URL must start with <bold>http</bold>.\"\n />\n </div>\n }\n />\n <InputField\n label={\n <>\n {t('ai:HTTPS proxy URL')}{' '}\n <PopoverIcon\n bodyContent={t(\n \"ai:Specify the HTTPS proxy that agents should use to access the discovery service. If you don't provide a value, your HTTP proxy URL will be used by default for both HTTP and HTTPS connections.\",\n )}\n />\n </>\n }\n name=\"httpsProxy\"\n placeholder=\"http://<user>:<password>@<ipaddr>:<port>\"\n helperText={\n <div>\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:URL must start with <bold>http</bold> (https schemes are not currently supported).\"\n />\n </div>\n }\n />\n <InputField\n label={\n <>\n {t('ai:No proxy domains')}{' '}\n <PopoverIcon\n bodyContent={t(\n 'ai:Exclude destination domain names, IP addresses, or other network CIDRs from proxying by adding them to this comma-separated list.',\n )}\n />\n </>\n }\n name=\"noProxy\"\n placeholder=\"one.domain.com,second.domain.com\"\n helperText={\n <div>\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations.\"\n />\n </div>\n }\n onBlur={onNoProxyBlur}\n />\n </Grid>\n );\n};\n\nconst ProxyFields: React.FC = () => {\n const { setFieldValue, values, initialValues } = useFormikContext<ProxyFieldsType>();\n const resetProxy = (isNewlyChecked: boolean) => {\n if (isNewlyChecked) {\n setFieldValue('httpProxy', initialValues.httpProxy);\n setFieldValue('httpsProxy', initialValues.httpsProxy);\n setFieldValue('noProxy', initialValues.noProxy);\n } else {\n setFieldValue('httpProxy', '');\n setFieldValue('httpsProxy', '');\n setFieldValue('noProxy', '');\n }\n };\n const { t } = useTranslation();\n // https://docs.openshift.com/container-platform/4.6/networking/enable-cluster-wide-proxy.html\n return (\n <>\n <CheckboxField\n label={t('ai:Configure cluster-wide proxy settings')}\n name=\"enableProxy\"\n className=\"ai-proxy-fields\"\n helperText={\n <p>\n {t(\n 'ai:If hosts are behind a firewall that requires the use of a proxy, provide additional information about the proxy.',\n )}\n </p>\n }\n onChange={(value: boolean) => resetProxy(value)}\n body={values.enableProxy && <ProxyInputFields />}\n />\n </>\n );\n};\n\nexport default ProxyFields;\n", "import React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport DownloadIso, { DownloadISOProps } from './DownloadIso';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype DownloadIsoModalProps = DownloadISOProps & {\n isOpen: boolean;\n};\n\nconst DownloadIsoModal: React.FC<DownloadIsoModalProps> = ({ isOpen, ...props }) => {\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Download host discovery ISO dialog')}\n title={t('ai:Add host')}\n isOpen={isOpen}\n onClose={props.onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"download-discovery-iso-modal\"\n >\n <DownloadIso {...props} />\n </Modal>\n );\n};\n\nexport default DownloadIsoModal;\n", "import React from 'react';\nimport { saveAs } from 'file-saver';\nimport {\n Alert,\n Button,\n ButtonVariant,\n ClipboardCopy,\n clipboardCopyFunc,\n ModalBoxBody,\n ModalBoxFooter,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { DetailItem, DetailList } from '../ui';\nimport DiscoveryInstructions from './DiscoveryInstructions';\nimport { StaticIPInfo } from './DiscoveryImageConfigForm';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type DownloadISOProps = {\n hasDHCP?: boolean;\n isSNO?: boolean;\n fileName?: string;\n downloadUrl?: string;\n onClose: () => void;\n onReset?: () => void;\n};\n\nconst DownloadIso = ({\n fileName = 'discovery.iso',\n downloadUrl,\n onClose,\n onReset,\n hasDHCP,\n isSNO = false,\n}: DownloadISOProps) => {\n const wgetCommand = `wget -O ${fileName} '${downloadUrl || ''}'`;\n const { t } = useTranslation();\n return (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <Alert\n isInline\n variant=\"success\"\n title={t('ai:Discovery ISO is ready to be downloaded')}\n >\n <>\n &nbsp;\n <DiscoveryInstructions isSNO={isSNO} />\n </>\n </Alert>\n </StackItem>\n {hasDHCP === false && (\n <StackItem>\n <StaticIPInfo />\n </StackItem>\n )}\n <StackItem>\n <DetailList>\n <DetailItem\n title={t('ai:Discovery ISO URL')}\n value={\n <ClipboardCopy\n isReadOnly\n onCopy={(event) => clipboardCopyFunc(event, downloadUrl)}\n >\n {downloadUrl}\n </ClipboardCopy>\n }\n />\n <DetailItem\n title={t('ai:Command to download the ISO:')}\n value={\n <ClipboardCopy\n isReadOnly\n onCopy={(event) => clipboardCopyFunc(event, wgetCommand)}\n >\n {wgetCommand}\n </ClipboardCopy>\n }\n />\n </DetailList>\n <Alert\n variant=\"info\"\n isInline\n title={`${t('ai:Never share your downloaded ISO with anyone else.')} ${t(\n 'ai:Forwarding it could put your credentials and personal data at risk.',\n )}`}\n />\n </StackItem>\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n variant={ButtonVariant.primary}\n onClick={() => downloadUrl && saveAs(downloadUrl)}\n data-testid=\"download-iso-btn\"\n isDisabled={!downloadUrl}\n >\n {t('ai:Download Discovery ISO')}\n </Button>\n <Button variant={ButtonVariant.secondary} onClick={onClose} data-testid=\"close-iso-btn\">\n {t('ai:Close')}\n </Button>\n {onReset && (\n <Button variant={ButtonVariant.link} onClick={onReset} data-testid=\"edit-iso-btn\">\n {t('ai:Edit ISO configuration')}\n </Button>\n )}\n </ModalBoxFooter>\n </>\n );\n};\n\nexport default DownloadIso;\n", "import React from 'react';\nimport { TextListItem, OrderType, Text, TextContent, TextList } from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\ntype DiscoveryInstructionsProps = {\n showAllInstructions?: boolean;\n isSNO?: boolean;\n};\n\nconst DiscoveryInstructions = ({\n showAllInstructions = false,\n isSNO = false,\n}: DiscoveryInstructionsProps) => {\n const { t } = useTranslation();\n return (\n <TextContent>\n <Text component=\"h3\">{t('ai:Adding hosts instructions')}</Text>\n <TextList component=\"ol\" type={OrderType.number} style={{ marginLeft: 0 }}>\n <TextListItem hidden={!showAllInstructions}>\n {t('ai:Click the Add host button.', { count: +isSNO })}\n </TextListItem>\n <TextListItem hidden={!showAllInstructions}>\n {t('ai:Configure the SSH key and proxy settings after the modal appears (optional).')}\n </TextListItem>\n <TextListItem>\n {t(\n 'ai:Download the Discovery ISO (onto a USB drive, attach it to a virtual media, etc.) and use it to boot your hosts.',\n )}\n </TextListItem>\n <TextListItem>\n <Trans\n t={t}\n count={+isSNO}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:Keep the Discovery ISO media connected to the device throughout the installation process and set each host to boot <bold>only one time</bold> from this device. \"\n />\n </TextListItem>\n <TextListItem>\n {t(\n 'ai:Booted hosts should appear in the host inventory table. This may take a few minutes.',\n )}\n </TextListItem>\n </TextList>\n </TextContent>\n );\n};\n\nexport default DiscoveryInstructions;\n", "import React from 'react';\nimport * as Yup from 'yup';\nimport {\n Button,\n Form,\n ModalBoxBody,\n ModalBoxFooter,\n AlertVariant,\n Alert,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { Formik, FormikHelpers } from 'formik';\nimport { ImageCreateParams, ImageType, Proxy } from '../../api';\nimport {\n httpProxyValidationSchema,\n noProxyValidationSchema,\n sshPublicKeyValidationSchema,\n} from '../../../common/components/ui';\nimport { ProxyFieldsType } from '../../types';\nimport ProxyFields from './ProxyFields';\nimport UploadSSH from './UploadSSH';\nimport DiscoveryImageTypeControlGroup from './DiscoveryImageTypeControlGroup';\nimport { OCP_STATIC_IP_DOC } from '../../config/constants';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport const StaticIPInfo: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Alert\n title={t(\n 'ai:To use static network configuration, follow the steps listed in the documentation.',\n )}\n isInline\n variant=\"info\"\n >\n <Button\n variant=\"link\"\n icon={<ExternalLinkAltIcon />}\n iconPosition=\"right\"\n isInline\n onClick={() => window.open(OCP_STATIC_IP_DOC, '_blank', 'noopener')}\n >\n {t('ai:View documentation')}\n </Button>\n </Alert>\n );\n};\n\nexport type DiscoveryImageFormValues = ImageCreateParams & ProxyFieldsType;\n\nconst validationSchema = Yup.lazy<DiscoveryImageFormValues>((values) =>\n Yup.object<DiscoveryImageFormValues>().shape({\n sshPublicKey: sshPublicKeyValidationSchema,\n httpProxy: httpProxyValidationSchema(values, 'httpsProxy'),\n httpsProxy: httpProxyValidationSchema(values, 'httpProxy'), // share the schema, httpS is currently not supported\n noProxy: noProxyValidationSchema,\n }),\n);\n\ntype DiscoveryImageConfigFormProps = Proxy & {\n onCancel: () => void;\n handleSubmit: (\n values: DiscoveryImageFormValues,\n formikActions: FormikHelpers<DiscoveryImageFormValues>,\n ) => Promise<void>;\n hasDHCP?: boolean;\n hideDiscoveryImageType?: boolean;\n sshPublicKey?: string;\n imageType?: ImageType;\n};\n\nexport const DiscoveryImageConfigForm: React.FC<DiscoveryImageConfigFormProps> = ({\n handleSubmit,\n onCancel,\n sshPublicKey,\n httpProxy,\n httpsProxy,\n noProxy,\n imageType,\n hideDiscoveryImageType,\n hasDHCP,\n}) => {\n const initialValues: DiscoveryImageFormValues = {\n sshPublicKey: sshPublicKey || '',\n httpProxy: httpProxy || '',\n httpsProxy: httpsProxy || '',\n noProxy: noProxy || '',\n enableProxy: !!(httpProxy || httpsProxy || noProxy),\n imageType: imageType || 'minimal-iso',\n };\n\n const { t } = useTranslation();\n return (\n <Formik\n initialValues={initialValues}\n initialStatus={{ error: null }}\n validationSchema={validationSchema}\n onSubmit={handleSubmit}\n >\n {({ submitForm, isSubmitting, status }) => {\n return (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <Alert\n variant={AlertVariant.info}\n isInline\n title={t('ai:Generate a Discovery ISO in order to add hosts to the cluster.')}\n />\n </StackItem>\n {hasDHCP === false && (\n <StackItem>\n <StaticIPInfo />\n </StackItem>\n )}\n <StackItem>\n <Form>\n {status?.error && (\n <Alert variant={AlertVariant.danger} title={status.error.title} isInline>\n {status.error.message}\n </Alert>\n )}\n {!hideDiscoveryImageType && <DiscoveryImageTypeControlGroup />}\n <UploadSSH />\n <ProxyFields />\n </Form>\n </StackItem>\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={submitForm} isDisabled={isSubmitting} isLoading={isSubmitting}>\n {isSubmitting ? t('ai:Generating') : t('ai:Generate Discovery ISO')}\n </Button>\n <Button key=\"cancel\" variant=\"link\" onClick={onCancel}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n }}\n </Formik>\n );\n};\n", "import React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { PopoverIcon, RadioField } from '../ui';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nconst GROUP_NAME = 'imageType';\n\nconst DiscoveryImageTypeControlGroupLabel = ({\n text,\n popoverContent,\n}: {\n text: string;\n popoverContent: string;\n}) => (\n <>\n {text} <PopoverIcon component={'a'} bodyContent={popoverContent} noVerticalAlign />\n </>\n);\n\nconst DiscoveryImageTypeControlGroup = () => {\n const { t } = useTranslation();\n return (\n <Stack hasGutter>\n <StackItem>\n <RadioField\n name={GROUP_NAME}\n id={'minimal-iso'}\n value={'minimal-iso'}\n label={\n <DiscoveryImageTypeControlGroupLabel\n text={t('ai:Minimal image file: Provision with virtual media')}\n popoverContent={t(\n \"ai:Recommended option. The generated discovery ISO will be smaller, but will need to download additional data during boot. This option is useful if ISO storage capacity is limited or if it's being served over a constrained network.\",\n )}\n />\n }\n />\n </StackItem>\n <StackItem>\n <RadioField\n name={GROUP_NAME}\n id={'full-iso'}\n value={'full-iso'}\n label={\n <DiscoveryImageTypeControlGroupLabel\n text={t('ai:Full image file: Provision with physical media')}\n popoverContent={t(\n 'ai:The generated discovery ISO will contain everything needed to boot.',\n )}\n />\n }\n />\n </StackItem>\n </Stack>\n );\n};\n\nexport default DiscoveryImageTypeControlGroup;\n", "import React from 'react';\nimport { Alert, AlertVariant } from '@patternfly/react-core';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype FormatDiskWarningProps = {\n someDisksAreSkipFormatting?: boolean;\n};\n\nconst FormatDiskWarning = ({ someDisksAreSkipFormatting }: FormatDiskWarningProps) => {\n const { t } = useTranslation();\n return (\n <Alert\n variant={AlertVariant.warning}\n isInline\n title={\n someDisksAreSkipFormatting\n ? t('ai:There may be issues with the boot order')\n : t(\n 'ai:All bootable disks will be formatted during installation. Make sure to backup any sensitive data.',\n )\n }\n >\n {someDisksAreSkipFormatting\n ? t(\n 'ai:You have opted out of formatting bootable disks on some hosts. To ensure the hosts reboot into the expected installation disk, manual user intervention may be required during OpenShift installation.',\n )\n : ''}\n </Alert>\n );\n};\n\nexport default FormatDiskWarning;\n", "import React from 'react';\nimport {\n Button,\n Modal,\n ButtonVariant,\n ModalVariant,\n TextContent,\n Text,\n TextVariants,\n} from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { PrismCode } from '../ui';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\nexport const DiscoveryTroubleshootingModalContent: React.FC = () => {\n const { t } = useTranslation();\n return (\n <TextContent>\n <Text component={TextVariants.p}>\n {t('ai:To troubleshoot host discovery issues, complete the following steps:')}\n </Text>\n <Text component={TextVariants.h2}>{t('ai:Verify that your host machine is powered on')}</Text>\n <Text component={TextVariants.p}>\n {t(\n 'ai:Note: Boot time depends on several factors such as your hardware and network configuration, and if you are booting from an ISO.',\n )}\n </Text>\n <Text component={TextVariants.h2}>\n {t('ai:If you used DHCP networking, verify that your DHCP server is enabled')}\n </Text>\n <Text component={TextVariants.h2}>\n {t(\n 'ai:If you used static IP, bridges, and bonds networking, verify that your configurations are correct',\n )}\n </Text>\n <Text component={TextVariants.h2}>{t('ai:SSH into your machine')}</Text>\n <Text component={TextVariants.p}>\n {t(\n 'ai:Verify that you can access your host machine using SSH, or a console such as BMC or virtual machine console. In the CLI, enter the following command:',\n )}\n </Text>\n <PrismCode code=\"ssh -i <identity_file> core@<machine-ip>\" />\n <Text component={TextVariants.p}>\n {t(\n 'ai:NOTE: Authentication is provided by the discovery ISO, therefore when you access your host using SSH, a password is not required. Optional -i parameter can be used to specify the private key that matches the public key provided when generating Discovery ISO.',\n )}\n </Text>\n <Text component={TextVariants.h2}>\n {t('ai:Verify that the discovery agent is running with the correct parameters')}\n </Text>\n <PrismCode code={`ps -ef | grep agent`} />\n <Text component={TextVariants.p}>{t('ai:The output displays the following:')}</Text>\n <PrismCode\n code={`root 1786 1 0 08:03 ? 00:00:00 /usr/local/bin/agent --url https://api.openshift.com --cluster-id e4c85fbe-77c7-411e-b107-5120f615c4fb --agent-version registry.redhat.io/openshift4/assisted-installer-agent-rhel8:v4.6.0-17 --insecure=false\ncore 2362 2311 0 08:04 pts/0 00:00:00 grep --color=auto agent`}\n />\n <Text component={TextVariants.h2}>{t('ai:Verify that the agent ran successfully')}</Text>\n <Text component={TextVariants.p}>\n {t('ai:To verify that the agent ran successfully, check the logs:')}\n </Text>\n <PrismCode code=\"sudo journalctl -u agent.service\" />\n <Text component={TextVariants.p}>\n {t('ai:In the following example, the errors indicate there is a network issue:')}\n </Text>\n <PrismCode\n code={`Oct 15 11:26:35 localhost systemd[1]: agent.service: Service RestartSec=3s expired, scheduling restart.\nOct 15 11:26:35 localhost systemd[1]: agent.service: Scheduled restart job, restart counter is at 9.\nOct 15 11:26:35 localhost systemd[1]: Stopped agent.service.\nOct 15 11:26:35 localhost systemd[1]: Starting agent.service...\nOct 15 11:26:35 localhost podman[1834]: Trying to pull quay.io/ocpmetal/assisted-installer-agent:latest...\nOct 15 11:26:35 localhost podman[1834]: Get \"https://quay.io/v2/\": dial tcp: lookup quay.io on [::1]:53: read udp [::1]:58297->[::1]:53: read: connection refused\nOct 15 11:26:35 localhost podman[1834]: Error: unable to pull quay.io/ocpmetal/assisted-installer-agent:latest: unable to pull image: Error initializing source docker://quay.io/ocpmetal/assisted-installer-agent:latest: error pinging dock>\nOct 15 11:26:35 localhost systemd[1]: agent.service: Control process exited, code=exited status=125\nOct 15 11:26:35 localhost systemd[1]: agent.service: Failed with result 'exit-code'.\nOct 15 11:26:35 localhost systemd[1]: Failed to start agent.service.`}\n />\n <Text component={TextVariants.p}>\n <Trans\n t={t}\n components={{ code: <code /> }}\n i18nKey=\"ai:Check the proxy settings and verify that the assisted installer service is connected to a network. You can use <code>nmcli</code> to get additional information about your network configuration.\"\n />\n </Text>\n <Text component={TextVariants.h2}>{t('ai:Check agent logs')}</Text>\n <Text component={TextVariants.p}>\n {t('ai:To view detailed agent logs and communication use following command:')}\n </Text>\n <PrismCode code=\"sudo journalctl TAG=agent | less\" />\n <Text component={TextVariants.h2}>{t('ai:Check assisted-installer logs')}</Text>\n <PrismCode\n code={`sudo su\npodman ps -a | grep assisted-installer\npodman logs <container id>`}\n />\n <Text component={TextVariants.h2}>{t('ai:Check bootkube logs')}</Text>\n <PrismCode code={`sudo journalctl -u bootkube`} />\n </TextContent>\n );\n};\n\nexport type HostsNotShowingLinkProps = {\n setDiscoveryHintModalOpen: (isOpen: boolean) => void;\n isSNO?: boolean;\n};\n\ntype DiscoveryTroubleshootingModalProps = {\n setDiscoveryHintModalOpen: (isOpen: boolean) => void;\n isOpen: boolean;\n};\n\nexport const HostsNotShowingLink: React.FC<HostsNotShowingLinkProps> = ({\n setDiscoveryHintModalOpen,\n isSNO = false,\n}) => {\n const { t } = useTranslation();\n return (\n <Button variant={ButtonVariant.link} onClick={() => setDiscoveryHintModalOpen(true)} isInline>\n <InfoCircleIcon size=\"sm\" />\n &nbsp;{t('ai:Host not showing up?', { count: +isSNO })}\n </Button>\n );\n};\n\nexport const DiscoveryTroubleshootingModal: React.FC<DiscoveryTroubleshootingModalProps> = ({\n setDiscoveryHintModalOpen,\n isOpen,\n}) => {\n const onClose = React.useCallback(\n () => setDiscoveryHintModalOpen(false),\n [setDiscoveryHintModalOpen],\n );\n\n const { t } = useTranslation();\n return (\n <Modal\n title={t('ai:Troubleshooting Host Discovery Issues')}\n isOpen={isOpen}\n actions={[\n <Button key=\"close\" variant={ButtonVariant.primary} onClick={onClose}>\n {t('ai:Close')}\n </Button>,\n ]}\n onClose={onClose}\n variant={ModalVariant.large}\n >\n <DiscoveryTroubleshootingModalContent />\n </Modal>\n );\n};\n", "import React from 'react';\nimport { Checkbox } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport { ClusterCreateParams } from '../../api';\nimport { PullSecretField, PullSecretInfo } from '../ui';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type PullSecretProps = {\n defaultPullSecret?: string;\n isOcm?: boolean;\n};\n\nconst PullSecret: React.FC<PullSecretProps> = ({ defaultPullSecret, isOcm = false }) => {\n // Fetched pull secret will never change - see LoadingState in NewCluster\n const [isExpanded, setExpanded] = React.useState(!defaultPullSecret);\n const { setFieldValue } = useFormikContext<ClusterCreateParams>();\n const { t } = useTranslation();\n if (isOcm) {\n const onCheckboxChange = () => {\n if (isExpanded) {\n // about to collapse, reset to original value\n setFieldValue('pullSecret', defaultPullSecret);\n }\n setExpanded(!isExpanded);\n };\n\n return (\n <>\n <Checkbox\n id=\"checkbox-pull-secret\"\n className=\"pf-u-display-inline-flex\"\n aria-label={t('ai:edit pull secret')}\n isChecked={isExpanded}\n onChange={onCheckboxChange}\n label={\n <>\n {t('ai:Edit pull secret')} <PullSecretInfo isOcm={isOcm} />\n </>\n }\n />\n {isExpanded && <PullSecretField isOcm={isOcm} />}\n </>\n );\n }\n\n return <PullSecretField isOcm={isOcm} />;\n};\n\nexport default PullSecret;\n", "export { default as ManagedDomainsAPI } from './ManagedDomainsAPI';\nexport { default as SupportedOpenshiftVersionsAPI } from './SupportedOpenshiftVersionsAPI';\nexport { default as ComponentVersionsAPI } from './ComponentVersionsAPI';\nexport { default as ClustersAPI } from './ClustersAPI';\nexport { default as HostsAPI } from './HostsAPI';\nexport { default as InfraEnvsAPI } from './InfraEnvsAPI';\nexport { default as EventsAPI } from './EventsAPI';\nexport { default as FeatureSupportLevelsAPI } from './FeatureSupportLevelsAPI';\n", "import { client } from '../../api/axiosClient';\nimport { ManagedDomain } from '../../../common';\n\nconst ManagedDomainsAPI = {\n makeBaseURI() {\n return `/v2/domains`;\n },\n\n list() {\n return client.get<ManagedDomain[]>(ManagedDomainsAPI.makeBaseURI());\n },\n};\n\nexport default ManagedDomainsAPI;\n", "import { client } from '../../api/axiosClient';\nimport { OpenshiftVersion } from '../../../common';\n\nconst SupportedOpenshiftVersionsAPI = {\n makeBaseURI() {\n return `/v2/openshift-versions`;\n },\n\n list() {\n return client.get<OpenshiftVersion[]>(`${SupportedOpenshiftVersionsAPI.makeBaseURI()}`);\n },\n};\n\nexport default SupportedOpenshiftVersionsAPI;\n", "import { client } from '../../api';\nimport { ListVersions } from '../../../common';\n\nconst ComponentVersionsAPI = {\n makeBaseURI() {\n return `/v2/component-versions`;\n },\n\n list() {\n return client.get<ListVersions>(`${ComponentVersionsAPI.makeBaseURI()}`);\n },\n};\n\nexport default ComponentVersionsAPI;\n", "import { client } from '../../api';\nimport {\n InfraEnv,\n InfraEnvCreateParams,\n PresignedUrl,\n InfraEnvUpdateParams,\n} from '../../../common';\nimport { AxiosResponse } from 'axios';\n\nlet _getRequestAbortController = new AbortController();\n\nconst InfraEnvsAPI = {\n abortLastGetRequest() {\n _getRequestAbortController.abort();\n /*\n * The AbortController.signal can only be aborted once per instance.\n * Therefore in order for other requests to be also abortable we need\n * to create a new instance when this event occurs\n */\n _getRequestAbortController = new AbortController();\n },\n\n makeBaseURI(infraEnvId?: InfraEnv['id']) {\n return `/v2/infra-envs/${infraEnvId ? infraEnvId : ''}`;\n },\n\n /**\n * Retrieves the list of infra-envs.\n * @param clusterId If provided, returns only infra-envs which directly reference the given clusterId.\n */\n list(clusterId = '') {\n const query = clusterId && `?${new URLSearchParams({ ['cluster_id']: clusterId }).toString()}`;\n return client.get<InfraEnv[]>(`${InfraEnvsAPI.makeBaseURI()}${query}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n get(infraEnvId: InfraEnv['id']) {\n return client.get<InfraEnv>(`${InfraEnvsAPI.makeBaseURI(infraEnvId)}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n update(infraEnvId: InfraEnv['id'], params: InfraEnvUpdateParams) {\n return client.patch<InfraEnv, AxiosResponse<InfraEnv>, InfraEnvUpdateParams>(\n `${InfraEnvsAPI.makeBaseURI(infraEnvId)}`,\n params,\n );\n },\n\n register(params: InfraEnvCreateParams) {\n return client.post<InfraEnv, AxiosResponse<InfraEnv>, InfraEnvCreateParams>(\n `${InfraEnvsAPI.makeBaseURI()}`,\n params,\n );\n },\n\n deregister(infraEnvId: InfraEnv['id']) {\n return client.delete<void>(`${InfraEnvsAPI.makeBaseURI(infraEnvId)}`);\n },\n\n getImageUrl(infraEnvId: InfraEnv['id']) {\n return client.get<PresignedUrl>(`${InfraEnvsAPI.makeBaseURI(infraEnvId)}/downloads/image-url`);\n },\n};\n\nexport default InfraEnvsAPI;\n", "import { Host, HostUpdateParams, InfraEnv } from '../../../common';\nimport { client } from '../../api';\nimport { AxiosResponse } from 'axios';\nimport InfraEnvsAPI from './InfraEnvsAPI';\n\nlet _getRequestAbortController = new AbortController();\n\nconst HostsAPI = {\n abortLastGetRequest() {\n _getRequestAbortController.abort();\n /**\n * The AbortController.signal can only be aborted once per instance.\n * Therefore in order for other requests to be also abortable we need\n * to create a new instance when this event occurs\n */\n _getRequestAbortController = new AbortController();\n },\n\n makeBaseURI(infraEnvId: InfraEnv['id'], hostId?: Host['id']) {\n return `${InfraEnvsAPI.makeBaseURI(infraEnvId)}/hosts/${hostId ? hostId : ''}`;\n },\n\n makeActionsBaseURI(infraEnvId: InfraEnv['id'], hostId: Host['id']) {\n return `${HostsAPI.makeBaseURI(infraEnvId, hostId)}/actions`;\n },\n\n list(infraEnvId: InfraEnv['id']) {\n return client.get<Host[]>(`${HostsAPI.makeBaseURI(infraEnvId)}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n get(infraEnvId: InfraEnv['id'], hostId: Host['id']) {\n return client.get<Host>(`${HostsAPI.makeBaseURI(infraEnvId, hostId)}`, {\n signal: _getRequestAbortController.signal,\n });\n },\n\n update(infraEnvId: InfraEnv['id'], hostId: Host['id'], params: HostUpdateParams) {\n return client.patch<Host, AxiosResponse<Host>, HostUpdateParams>(\n `${HostsAPI.makeBaseURI(infraEnvId, hostId)}`,\n params,\n );\n },\n\n deregister(infraEnvId: InfraEnv['id'], hostId: Host['id']) {\n return client.delete<void>(`${HostsAPI.makeBaseURI(infraEnvId, hostId)}`);\n },\n\n reset(infraEnvId: InfraEnv['id'], hostId: Host['id']) {\n return client.post<Host, AxiosResponse<Host>, never>(\n `${HostsAPI.makeActionsBaseURI(infraEnvId, hostId)}/reset`,\n );\n },\n\n installHost(infraEnvId: InfraEnv['id'], hostId: Host['id']) {\n return client.post<Host, AxiosResponse<Host>, never>(\n `${HostsAPI.makeActionsBaseURI(infraEnvId, hostId)}/install`,\n );\n },\n};\n\nexport default HostsAPI;\n", "import { EventList } from '../../../common';\nimport { client } from '../../api';\nimport { EventsAPIListOptions } from './types';\n\nconst EventsAPI = {\n makeBaseURI() {\n return '/v2/events';\n },\n\n list(options: EventsAPIListOptions) {\n let queryParams = '?';\n\n queryParams += options.clusterId ? `cluster_id=${options.clusterId}&` : '';\n queryParams += options.hostId ? `host_id=${options.hostId}&` : '';\n queryParams += options.infraEnvId ? `infra_env_id=${options.infraEnvId}&` : '';\n if (options.categories) {\n queryParams += `categories=`;\n options.categories.forEach((category) => {\n queryParams += `${category},`;\n });\n }\n queryParams = queryParams.slice(0, -1);\n\n return client.get<EventList>(`${EventsAPI.makeBaseURI()}${queryParams}`);\n },\n};\n\nexport default EventsAPI;\n", "import { FeatureSupportLevels } from '../../../common/api/types';\nimport { client } from '../../api/axiosClient';\n\nconst FeatureSupportLevelsAPI = {\n makeBaseURI() {\n return `/v2/feature-support-levels`;\n },\n\n list() {\n return client.get<FeatureSupportLevels>(FeatureSupportLevelsAPI.makeBaseURI());\n },\n};\n\nexport default FeatureSupportLevelsAPI;\n", "import findIndex from 'lodash/findIndex';\nimport set from 'lodash/set';\nimport { AxiosError } from 'axios';\nimport { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport {\n AssistedInstallerPermissionTypesListType,\n Cluster,\n Host,\n ResourceUIState,\n} from '../../../common';\nimport {\n getApiErrorMessage,\n getApiErrorCode,\n handleApiError,\n FETCH_ABORTED_ERROR_CODE,\n} from '../../api';\nimport { ClustersService } from '../../services';\n\nexport type FetchErrorType = {\n code: string | number;\n message: string;\n};\n\ntype CurrentClusterStateSlice = {\n data?: Cluster;\n uiState: ResourceUIState;\n isReloadScheduled: number;\n permissions: AssistedInstallerPermissionTypesListType;\n errorDetail?: FetchErrorType;\n};\n\nexport const fetchClusterAsync = createAsyncThunk<\n Cluster | void,\n string,\n {\n rejectValue: FetchErrorType;\n }\n>('currentCluster/fetchClusterAsync', async (clusterId, { rejectWithValue }) => {\n try {\n const cluster = await ClustersService.get(clusterId);\n return cluster;\n } catch (e) {\n return handleApiError(e, () => {\n return rejectWithValue({\n code: getApiErrorCode(e as Error | AxiosError),\n message: getApiErrorMessage(e),\n });\n });\n }\n});\n\nconst initialState: CurrentClusterStateSlice = {\n data: undefined,\n uiState: ResourceUIState.LOADING,\n permissions: { isViewerMode: false },\n errorDetail: undefined,\n isReloadScheduled: 0,\n};\n\nexport const currentClusterSlice = createSlice({\n initialState,\n name: 'currentCluster',\n reducers: {\n updateClusterBase: (state, action: PayloadAction<Cluster>) => {\n // Should not overwrite the hosts once they are created\n const originalHosts = state.data?.hosts || [];\n return { ...state, data: { ...action.payload, hosts: originalHosts } };\n },\n updateCluster: (state, action: PayloadAction<Cluster>) => {\n return { ...state, data: action.payload };\n },\n updateHost: (state, action: PayloadAction<Host>) => {\n const hostIndex = findIndex(state.data?.hosts, (host) => host.id === action.payload.id);\n\n if (hostIndex >= 0) {\n set(state, `data.hosts[${hostIndex}]`, action.payload);\n }\n return state;\n },\n cleanCluster: () => initialState,\n forceReload: (state) => ({\n ...state,\n isReloadScheduled: state.isReloadScheduled + 1,\n }),\n cancelForceReload: (state) => ({\n ...state,\n isReloadScheduled: 0,\n }),\n updateClusterPermissions: (\n state,\n action: PayloadAction<AssistedInstallerPermissionTypesListType>,\n ) => ({\n ...state,\n permissions: action.payload,\n }),\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchClusterAsync.pending, (state) => {\n const needsReload =\n state.uiState === ResourceUIState.LOADED ||\n (state.uiState === ResourceUIState.ERROR && state.data);\n return {\n ...state,\n uiState: needsReload ? ResourceUIState.RELOADING : ResourceUIState.LOADING,\n };\n })\n .addCase(fetchClusterAsync.fulfilled, (state, action) => {\n return {\n ...state,\n data: action.payload as Cluster,\n uiState: ResourceUIState.LOADED,\n };\n })\n .addCase(fetchClusterAsync.rejected, (state, action) => {\n const error = action.payload as FetchErrorType;\n if (error.code === FETCH_ABORTED_ERROR_CODE && !!state.data) {\n // This failure is due to having aborted the request on purpose (to avoid conflicts with update operations).\n // The error can be ignored, and the data will be refreshed on the next polling\n return {\n ...state,\n uiState: ResourceUIState.LOADED,\n };\n }\n return {\n ...state,\n uiState: ResourceUIState.ERROR,\n errorDetail: error,\n };\n });\n },\n});\n\nexport const {\n updateCluster,\n updateClusterBase,\n updateHost,\n cleanCluster,\n forceReload,\n cancelForceReload,\n updateClusterPermissions,\n} = currentClusterSlice.actions;\nexport default currentClusterSlice.reducer;\n", "export { default as ClustersService } from './ClustersService';\nexport { default as ClusterDetailsService } from './ClusterDetailsService';\nexport { default as HostsService } from './HostsService';\nexport { default as HostDiscoveryService } from './HostDiscoveryService';\nexport { default as InfraEnvsService } from './InfraEnvsService';\nexport { default as DiscoveryImageFormService } from './DiscoveryImageFormService';\nexport { default as DiskEncryptionService } from './DiskEncryptionService';\nexport { default as OperatorsService } from './OperatorsService';\nexport * from './types';\nexport * as APIs from './apis';\n", "import { Disk, DiskRole, Host, HostUpdateParams } from '../../common';\nimport { HostsAPI } from '../services/apis';\n\nconst HostsService = {\n /**\n * Removes all the hosts in the list assuming\n * all of them have a valid infraEnvId value.\n * @param hosts\n */\n removeAll(hosts: Host[]) {\n const promises = [];\n\n for (const { id, infraEnvId } of hosts) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n promises.push(HostsAPI.deregister(infraEnvId!, id));\n }\n\n return Promise.all(promises);\n },\n\n update(host: Host, params: HostUpdateParams) {\n HostsAPI.abortLastGetRequest();\n if (!host.infraEnvId) {\n throw new Error(`Cannot update host ${host.id}, missing infraEnvId`);\n }\n\n return HostsAPI.update(host.infraEnvId, host.id, params);\n },\n\n updateHostName(host: Host, newHostName: HostUpdateParams['hostName']) {\n return HostsService.update(host, { hostName: newHostName });\n },\n\n updateRole(host: Host, newHostRole: HostUpdateParams['hostRole']) {\n return HostsService.update(host, { hostRole: newHostRole });\n },\n\n updateHostODF(host: Host, newNodeLabels: HostUpdateParams['nodeLabels']) {\n return HostsService.update(host, { nodeLabels: newNodeLabels }); //need to edit that\n },\n\n updateDiskRole(host: Host, diskId: Required<Disk>['id'], newDiskRole: DiskRole) {\n const params: HostUpdateParams = {\n disksSelectedConfig: [{ id: diskId, role: newDiskRole }],\n };\n if (newDiskRole === 'install') {\n params.disksSkipFormatting = [{ diskId, skipFormatting: false }];\n }\n return HostsService.update(host, params);\n },\n\n updateFormattingDisks(host: Host, diskIdValue: Required<Disk>['id'], shouldSkipFormat: boolean) {\n return HostsService.update(host, {\n disksSkipFormatting: [{ diskId: diskIdValue, skipFormatting: shouldSkipFormat }],\n });\n },\n\n delete(host: Host) {\n if (!host.infraEnvId) {\n throw new Error(`Cannot delete host ${host.id}, missing infraEnvId`);\n }\n\n return HostsAPI.deregister(host.infraEnvId, host.id);\n },\n\n reset(host: Host) {\n if (!host.infraEnvId) {\n throw new Error(`Cannot reset host ${host.id}, missing infraEnvId`);\n }\n\n return HostsAPI.reset(host.infraEnvId, host.id);\n },\n\n install(host: Host) {\n if (!host.infraEnvId) {\n throw new Error(`Cannot install host ${host.id}, missing infraEnvId`);\n }\n\n return HostsAPI.installHost(host.infraEnvId, host.id);\n },\n\n installAll(hosts: Host[]) {\n const promises = [];\n for (const host of hosts) {\n promises.push(HostsService.install(host));\n }\n\n return Promise.all(promises);\n },\n};\n\nexport default HostsService;\n", "import { Cluster, CpuArchitecture, InfraEnv, SupportedCpuArchitectures } from '../../common';\n\nconst CACHE_KEY = 'infra-env-ids-cache-v2';\n\ntype ClusterInfraEnvIds = Partial<Record<CpuArchitecture, InfraEnv['id']>>;\ntype InfraEnvCache = Record<Cluster['id'], ClusterInfraEnvIds>;\n\nconst update = (cache: InfraEnvCache): void => {\n localStorage.setItem(CACHE_KEY, JSON.stringify(cache));\n};\n\nconst read = (): InfraEnvCache => {\n const EMPTY_CACHE = '{}';\n const cache = localStorage.getItem(CACHE_KEY) || EMPTY_CACHE;\n\n try {\n return JSON.parse(cache) as InfraEnvCache;\n } catch {\n return {};\n }\n};\n\ntype InfraEnvStorage = Omit<Storage, 'getItem' | 'removeItem' | 'setItem'> & {\n getInfraEnvId(clusterId: string, cpuArchitecture: CpuArchitecture): string | null;\n removeInfraEnvId(clusterId: string, cpuArchitecture: CpuArchitecture): void;\n removeInfraEnvs(clusterId: string): void;\n updateInfraEnvs(clusterId: string, infraEnvs: InfraEnv[]): void;\n};\n\nconst InfraEnvIdsCacheService: InfraEnvStorage = {\n key(index: number): string | null {\n const cache = read();\n return Object.keys(cache)[index];\n },\n\n get length(): number {\n const cache = read();\n return Object.keys(cache).length;\n },\n\n clear(): void {\n localStorage.removeItem(CACHE_KEY);\n },\n\n getInfraEnvId(clusterId: string, cpuArchitecture: CpuArchitecture): string | null {\n if (!clusterId || !cpuArchitecture) {\n return null;\n }\n\n const cache = read();\n const clusterInfraEnvs = cache[clusterId];\n if (!clusterInfraEnvs) {\n return null;\n }\n if (cpuArchitecture !== CpuArchitecture.USE_DAY1_ARCHITECTURE) {\n return clusterInfraEnvs[cpuArchitecture] || null;\n }\n\n const architectures = SupportedCpuArchitectures.filter((arch) => {\n return clusterInfraEnvs[arch];\n });\n\n if (architectures.length === 1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return clusterInfraEnvs[architectures[0]]!;\n }\n throw new Error(\n `More than one infraEnv found for cluster ${clusterId} without specified architecture`,\n );\n },\n\n removeInfraEnvId(clusterId: string, cpuArchitecture: CpuArchitecture): void {\n if (!clusterId) {\n return;\n }\n\n const cache = read();\n if (cpuArchitecture === CpuArchitecture.USE_DAY1_ARCHITECTURE) {\n delete cache[clusterId];\n } else if (cache[clusterId]) {\n delete cache[clusterId][cpuArchitecture];\n }\n update(cache);\n },\n\n removeInfraEnvs(clusterId: string): void {\n if (!clusterId) {\n return;\n }\n\n const cache = read();\n delete cache[clusterId];\n update(cache);\n },\n\n updateInfraEnvs(clusterId: string, infraEnvs: InfraEnv[]): void {\n if (!clusterId) {\n return;\n }\n\n const cache = read();\n if (!cache[clusterId]) {\n cache[clusterId] = {};\n }\n infraEnvs.forEach((infraEnv) => {\n if (infraEnv.cpuArchitecture) {\n cache[clusterId][infraEnv.cpuArchitecture] = infraEnv.id;\n }\n });\n update(cache);\n },\n};\n\nexport default InfraEnvIdsCacheService;\n", "import { HostStaticNetworkConfig } from '../../../../../common';\n\nexport enum StaticIpView {\n YAML = 'yaml',\n FORM = 'form',\n}\n\nexport enum ProtocolVersion {\n ipv4 = 'ipv4',\n ipv6 = 'ipv6',\n}\n\nexport type StaticProtocolType = 'ipv4' | 'dualStack';\n\nexport type Cidr = {\n ip: string;\n prefixLength: number | '';\n};\n\nexport type IpConfig = {\n machineNetwork: Cidr;\n gateway: string;\n};\n\nexport type IpConfigs = { [protocolVersion in ProtocolVersion]: IpConfig };\n\nexport type HostIps = { [protocolVersion in ProtocolVersion]: string };\n\nexport type MachineNetworks = { [protocolVersion in ProtocolVersion]: string };\n\nexport type FormViewHost = {\n macAddress: string;\n ips: HostIps;\n};\n\nexport type StaticFormData = {\n networkWide: FormViewNetworkWideValues;\n hosts: FormViewHost[];\n};\n\nexport type StaticIpInfo = {\n isDataComplete: boolean;\n view: StaticIpView;\n formViewProtocolType: StaticProtocolType | null;\n};\n\nexport interface YamlViewValues {\n hosts: HostStaticNetworkConfig[];\n}\n\nexport interface FormViewHostsValues {\n hosts: FormViewHost[];\n}\n\nexport interface FormViewNetworkWideValues {\n protocolType: StaticProtocolType;\n useVlan: boolean;\n vlanId: number | '';\n dns: string;\n ipConfigs: IpConfigs;\n}\n", "import { ProtocolVersion } from './dataTypes';\n\nexport enum NmstateInterfaceType {\n ETHERNET = 'ethernet',\n VLAN = 'vlan',\n}\n\nexport type NmstateAddress = {\n ip: string;\n 'prefix-length': number;\n};\n\nexport type NmstateProtocolConfig = {\n address: NmstateAddress[];\n enabled: boolean;\n dhcp: boolean;\n};\n\nexport type NmstateProtocolConfigs = {\n [protocolVersion in ProtocolVersion]?: NmstateProtocolConfig;\n};\n\nexport type NmstateEthernetInterface = {\n name: string;\n type: NmstateInterfaceType.ETHERNET;\n state: string;\n} & NmstateProtocolConfigs;\n\nexport type NmstateRoutesConfig = {\n destination: string;\n 'next-hop-address': string;\n 'next-hop-interface': string;\n 'table-id': number;\n};\n\nexport type NmstateRoutes = {\n config: NmstateRoutesConfig[];\n};\n\nexport type NmstateDns = {\n config: {\n server: string[];\n };\n};\n\nexport type NmstateVlanInterface = {\n name: string;\n type: NmstateInterfaceType.VLAN;\n state: string;\n vlan: {\n 'base-iface': string;\n id: number;\n };\n} & NmstateProtocolConfigs;\n\nexport type NmstateInterface = NmstateEthernetInterface | NmstateVlanInterface;\n\nexport const isVlanInterface = (\n nmStateInterface: NmstateVlanInterface | NmstateEthernetInterface,\n): nmStateInterface is NmstateVlanInterface => {\n return nmStateInterface.type === NmstateInterfaceType.VLAN;\n};\n\nexport const isEthernetInterface = (\n nmStateInterface: NmstateVlanInterface | NmstateEthernetInterface,\n): nmStateInterface is NmstateEthernetInterface => {\n return nmStateInterface.type === NmstateInterfaceType.ETHERNET;\n};\n\nexport type Nmstate = {\n 'dns-resolver'?: NmstateDns;\n routes?: {\n config: {\n destination: string;\n 'next-hop-address': string;\n 'next-hop-interface': string;\n 'table-id': number;\n }[];\n };\n interfaces: NmstateInterface[];\n};\n", "import { dump, load } from 'js-yaml';\nimport {\n Nmstate,\n NmstateDns,\n NmstateInterface,\n NmstateInterfaceType,\n NmstateProtocolConfig,\n NmstateProtocolConfigs,\n NmstateRoutesConfig,\n} from './nmstateTypes';\nimport {\n FormViewNetworkWideValues,\n MachineNetworks,\n ProtocolVersion,\n StaticProtocolType,\n} from './dataTypes';\nimport findLastIndex from 'lodash/findLastIndex';\n\nconst ROUTE_DESTINATIONS = {\n ipv4: '0.0.0.0/0',\n ipv6: '::/0',\n};\nconst TABLE_ID = 254;\nexport const YAML_COMMENT_CHAR = '#';\nexport const FORM_VIEW_PREFIX = 'generated by ui form view';\n\nexport const getMachineNetworkFieldName = (protocolVersion: ProtocolVersion): string => {\n return `${protocolVersion}MachineNetwork`;\n};\n\nexport const getVlanNicName = (nicName: string, vlanId: number) => `${nicName}.${vlanId}`;\n\nexport const getProtocolVersionIdx = (protocolVersion: ProtocolVersion): number => {\n return protocolVersion === ProtocolVersion.ipv4 ? 0 : 1;\n};\n\nexport const yamlToNmstateObject = (yaml: string): Nmstate => {\n return load(yaml) as Nmstate;\n};\n\nexport const getYamlComments = (yaml: string): string[] => {\n const lines = yaml.split('\\n');\n const lastCommentIdx = findLastIndex(lines, (line) => line.startsWith(YAML_COMMENT_CHAR));\n return lines.slice(0, lastCommentIdx + 1).map((line) => line.slice(1));\n};\n\nexport const toYamlWithComments = (json: object, comments: string[]) => {\n const yamlComments = comments.map((comment) => `${YAML_COMMENT_CHAR}${comment}`);\n return `${yamlComments.join('\\n')}\\n${dump(json)}`;\n};\n\nconst getMachineNetwork = (comments: string[], protocolVersion: ProtocolVersion) => {\n const line = comments.find((comment) =>\n comment.startsWith(getMachineNetworkFieldName(protocolVersion)),\n );\n return line ? line.split(' ')[1] : '';\n};\n\nexport const getMachineNetworks = (comments: string[]): MachineNetworks => {\n return {\n ipv4: getMachineNetwork(comments, ProtocolVersion.ipv4),\n ipv6: getMachineNetwork(comments, ProtocolVersion.ipv6),\n };\n};\n\nexport const getProtocolType = (comments: string[]): StaticProtocolType | null => {\n const machineNetworks = getMachineNetworks(comments);\n if (machineNetworks[ProtocolVersion.ipv4] && machineNetworks[ProtocolVersion.ipv6]) {\n return 'dualStack';\n }\n if (machineNetworks[ProtocolVersion.ipv4]) {\n return 'ipv4';\n }\n return null;\n};\n\nexport const getNmstateProtocolConfig = (\n ipAddress: string,\n prefixLength: number,\n): NmstateProtocolConfig => {\n return {\n address: [\n {\n ip: ipAddress,\n 'prefix-length': prefixLength,\n },\n ],\n enabled: true,\n dhcp: false,\n };\n};\n\nexport const getDnsSection = (dns: string): NmstateDns => {\n const dnsServers = dns.split(',');\n return { config: { server: dnsServers } };\n};\n\nexport const getInterface = (\n nicName: string,\n protocolConfigs: NmstateProtocolConfigs,\n networkWide: FormViewNetworkWideValues,\n): NmstateInterface => {\n if (networkWide.useVlan && networkWide.vlanId) {\n return {\n name: getVlanNicName(nicName, networkWide.vlanId),\n type: NmstateInterfaceType.VLAN,\n state: 'up',\n vlan: { 'base-iface': nicName, id: networkWide.vlanId },\n ...protocolConfigs,\n };\n } else {\n return {\n name: nicName,\n type: NmstateInterfaceType.ETHERNET,\n state: 'up',\n ...protocolConfigs,\n };\n }\n};\n\nexport const getRouteConfig = (\n protocolVersion: ProtocolVersion,\n gatewayAddress: string,\n nicName: string,\n): NmstateRoutesConfig => {\n return {\n destination: ROUTE_DESTINATIONS[protocolVersion],\n 'next-hop-address': gatewayAddress,\n 'next-hop-interface': nicName,\n 'table-id': TABLE_ID,\n };\n};\n", "import { HostStaticNetworkConfig, MacInterfaceMap } from '../../../../../common';\nimport { ProtocolVersion, StaticIpInfo, StaticIpView } from './dataTypes';\nimport { NmstateEthernetInterface, NmstateInterfaceType } from './nmstateTypes';\nimport { FORM_VIEW_PREFIX, getNmstateProtocolConfig, toYamlWithComments } from './nmstateYaml';\n\nconst DUMMY_MAC = '01:23:45:67:89:AB';\nconst DUMMY_NIC_PREFIX = 'DUMMY';\n\nexport const getDummyNicName = (protocolVersion: ProtocolVersion) => {\n const protocolNumber = protocolVersion === ProtocolVersion.ipv4 ? 4 : 6;\n return `${DUMMY_NIC_PREFIX}${protocolNumber}`;\n};\n\nexport const DUMMY_NMSTATE_ADDRESSES = {\n ipv4: {\n prefixLength: 24,\n ip: '0.0.0.0',\n },\n ipv6: {\n prefixLength: 64,\n ip: '0::0',\n },\n};\n\nexport const getDummyInterfaces = (): NmstateEthernetInterface[] => {\n return [\n {\n name: getDummyNicName(ProtocolVersion.ipv4),\n type: NmstateInterfaceType.ETHERNET,\n state: 'up',\n ipv4: getNmstateProtocolConfig(\n DUMMY_NMSTATE_ADDRESSES.ipv4.ip,\n DUMMY_NMSTATE_ADDRESSES.ipv4.prefixLength,\n ),\n },\n ];\n};\n\nexport const getDummyMacInterfaceMap = (): MacInterfaceMap => {\n return [{ macAddress: DUMMY_MAC, logicalNicName: getDummyNicName(ProtocolVersion.ipv4) }];\n};\n\nexport const isDummyInterface = (nicName: string) => {\n return nicName.startsWith(DUMMY_NIC_PREFIX);\n};\n\nexport const isDummyYaml = (yaml: string): boolean => {\n return yaml.includes(DUMMY_NIC_PREFIX);\n};\n\nexport const getDummyInfraEnvField = (): HostStaticNetworkConfig[] => {\n const json = { interfaces: getDummyInterfaces() };\n const comments = [FORM_VIEW_PREFIX];\n const dummyYaml = toYamlWithComments(json, comments);\n return [{ networkYaml: dummyYaml, macInterfaceMap: getDummyMacInterfaceMap() }];\n};\n\nexport const getDummyStaticIpInfo = (): StaticIpInfo => ({\n isDataComplete: false,\n view: StaticIpView.FORM,\n formViewProtocolType: null,\n});\n", "import { AxiosResponse } from 'axios';\nimport {\n Cluster,\n CpuArchitecture,\n HostStaticNetworkConfig,\n InfraEnv,\n InfraEnvCreateParams,\n} from '../../common';\nimport { InfraEnvsAPI } from './apis';\nimport InfraEnvCache from './InfraEnvIdsCacheService';\nimport { getDummyInfraEnvField } from '../components/clusterConfiguration/staticIp/data/dummyData';\n\nconst InfraEnvsService = {\n async getInfraEnvId(clusterId: Cluster['id'], cpuArchitecture: CpuArchitecture): Promise<string> {\n let infraEnvId = InfraEnvCache.getInfraEnvId(clusterId, cpuArchitecture);\n if (infraEnvId === null) {\n const { data: infraEnvs } = await InfraEnvsAPI.list(clusterId);\n if (infraEnvs.length > 0) {\n InfraEnvCache.updateInfraEnvs(clusterId, infraEnvs);\n infraEnvId = InfraEnvCache.getInfraEnvId(clusterId, cpuArchitecture);\n }\n if (!infraEnvId) {\n InfraEnvCache.removeInfraEnvId(clusterId, cpuArchitecture);\n throw new Error(\n `No InfraEnv could be found for clusterId: ${clusterId} and architecture ${\n cpuArchitecture || ''\n }`,\n );\n }\n }\n return infraEnvId;\n },\n\n async getInfraEnv(clusterId: Cluster['id'], cpuArchitecture: CpuArchitecture) {\n const infraEnvId = await InfraEnvsService.getInfraEnvId(clusterId, cpuArchitecture);\n if (infraEnvId) {\n const { data } = await InfraEnvsAPI.get(infraEnvId);\n return data;\n } else {\n throw new Error(\n `No InfraEnv could be found for clusterId: ${clusterId} and architecture ${\n cpuArchitecture || ''\n }`,\n );\n }\n },\n\n async getAllInfraEnvIds(clusterId: Cluster['id']): Promise<string[]> {\n const { data: infraEnvs } = await InfraEnvsAPI.list(clusterId);\n return infraEnvs.map((infraEnv) => infraEnv.id);\n },\n\n async create(params: InfraEnvCreateParams) {\n if (!params.clusterId) {\n throw new Error('Cannot create InfraEnv, clusterId is missing');\n }\n\n const { data: infraEnv } = await InfraEnvsAPI.register(params);\n\n if (!infraEnv.id) {\n throw new Error('API returned no ID for the underlying InfraEnv');\n }\n\n InfraEnvCache.updateInfraEnvs(params.clusterId, [infraEnv]);\n },\n\n async removeAll(clusterId: Cluster['id']) {\n const { data: infraEnvs } = await InfraEnvsAPI.list(clusterId);\n\n const promises = infraEnvs.map((infraEnv) => {\n return InfraEnvsAPI.deregister(infraEnv.id);\n });\n\n InfraEnvCache.removeInfraEnvs(clusterId);\n\n return Promise.all(promises);\n },\n\n async updateAllInfraEnvsToDhcp(clusterId: Cluster['id']) {\n const infraEnvIds = await InfraEnvsService.getAllInfraEnvIds(clusterId);\n const infraEnvUpdates = infraEnvIds.map((id) =>\n InfraEnvsAPI.update(id, {\n staticNetworkConfig: [],\n }),\n );\n return Promise.all(infraEnvUpdates);\n },\n\n async setDummyStaticConfigToInfraEnv(infraEnvId: InfraEnv['id']): Promise<InfraEnv> {\n const { data } = await InfraEnvsAPI.update(infraEnvId, {\n staticNetworkConfig: getDummyInfraEnvField(),\n });\n return data;\n },\n\n async syncStaticIpConfigs(\n clusterId: Cluster['id'],\n currentInfraEnvId: InfraEnv['id'],\n staticNetworkConfig: HostStaticNetworkConfig[],\n ): Promise<InfraEnv> {\n // Updates staticIpConfigs on \"currentInfraEnvId\", and then it\n const { data: updatedInfraEnv } = await InfraEnvsAPI.update(currentInfraEnvId, {\n staticNetworkConfig,\n });\n\n const updateRequests: Promise<AxiosResponse<InfraEnv, unknown>>[] = [];\n const infraEnvIds = await InfraEnvsService.getAllInfraEnvIds(clusterId);\n infraEnvIds.forEach((infraEnvId) => {\n // Copies the same configuration to the other infraEnvs of the same cluster\n if (infraEnvId !== currentInfraEnvId) {\n updateRequests.push(\n InfraEnvsAPI.update(infraEnvId, {\n staticNetworkConfig,\n }),\n );\n }\n });\n\n // TODO (multi-arch) what should happen if one of the infraEnvs fails to get the same configuration\n return Promise.all(updateRequests).then(() => {\n return updatedInfraEnv;\n });\n },\n};\n\nexport default InfraEnvsService;\n", "import { ClustersAPI } from '../services/apis';\nimport HostsService from './HostsService';\nimport InfraEnvsService from './InfraEnvsService';\nimport { AI_UI_TAG, Cluster, Host, V2ClusterUpdateParams } from '../../common';\nimport { ocmClient } from '../api';\nimport { ClusterCreateParamsWithStaticNetworking } from './types';\nimport omit from 'lodash/omit';\n\nconst ClustersService = {\n findHost(hosts: Cluster['hosts'] = [], hostId: Host['id']) {\n return hosts.find((host) => host.id === hostId);\n },\n\n async create(params: ClusterCreateParamsWithStaticNetworking) {\n const { data: cluster } = await ClustersAPI.register(omit(params, 'staticNetworkConfig'));\n await InfraEnvsService.create({\n name: `${params.name}_infra-env`,\n pullSecret: params.pullSecret,\n clusterId: cluster.id,\n openshiftVersion: params.openshiftVersion,\n cpuArchitecture: params.cpuArchitecture,\n staticNetworkConfig: params.staticNetworkConfig,\n });\n\n return cluster;\n },\n\n async remove(clusterId: Cluster['id']) {\n const { data: cluster } = await ClustersAPI.get(clusterId);\n const hosts = cluster.hosts ?? [];\n\n if (hosts.length > 0) {\n await HostsService.removeAll(hosts);\n }\n await InfraEnvsService.removeAll(clusterId);\n await ClustersAPI.deregister(clusterId);\n },\n\n async downloadLogs(clusterId: Cluster['id'], hostId?: Host['id']) {\n const { data, headers } = await ClustersAPI.downloadLogs(clusterId, hostId);\n const contentHeader = headers['content-disposition'];\n const fileName = contentHeader?.match(/filename=\"(.+)\"/)?.[1];\n return { data, fileName };\n },\n\n update(clusterId: Cluster['id'], clusterTags: Cluster['tags'], params: V2ClusterUpdateParams) {\n ClustersAPI.abortLastGetRequest();\n if (ocmClient) {\n params = ClustersService.updateClusterTags(clusterTags, params);\n }\n return ClustersAPI.update(clusterId, params);\n },\n\n async install(clusterId: Cluster['id'], clusterTags: Cluster['tags']) {\n if (ocmClient) {\n const params = ClustersService.updateClusterTags(clusterTags, {});\n if (params.tags) {\n await ClustersService.update(clusterId, clusterTags, {});\n }\n }\n\n return ClustersAPI.install(clusterId);\n },\n\n updateClusterTags(\n clusterTags: Cluster['tags'],\n params: V2ClusterUpdateParams,\n ): V2ClusterUpdateParams {\n const tags = clusterTags?.split(',') || <string[]>[];\n if (tags.includes(AI_UI_TAG)) {\n delete params.tags;\n } else {\n tags?.push(AI_UI_TAG);\n params.tags = tags?.join(',');\n }\n return params;\n },\n\n async get(clusterId: Cluster['id']) {\n const { data: cluster } = await ClustersAPI.get(clusterId);\n return cluster;\n },\n};\n\nexport default ClustersService;\n", "import {\n AI_UI_TAG,\n Cluster,\n CpuArchitecture,\n InfraEnv,\n ManagedDomain,\n OpenshiftVersionOptionType,\n getClusterDetailsInitialValues,\n isArmArchitecture,\n} from '../../common';\nimport omit from 'lodash/omit';\nimport DiskEncryptionService from './DiskEncryptionService';\nimport {\n ClusterCreateParamsWithStaticNetworking,\n HostsNetworkConfigurationType,\n OcmClusterDetailsValues,\n} from './types';\nimport { getDummyInfraEnvField } from '../components/clusterConfiguration/staticIp/data/dummyData';\nimport { ocmClient } from '../api';\n\nconst ClusterDetailsService = {\n getClusterCreateParams(values: OcmClusterDetailsValues): ClusterCreateParamsWithStaticNetworking {\n const params: ClusterCreateParamsWithStaticNetworking = omit(values, [\n 'useRedHatDnsService',\n 'SNODisclaimer',\n 'enableDiskEncryptionOnMasters',\n 'enableDiskEncryptionOnWorkers',\n 'diskEncryptionMode',\n 'diskEncryption',\n 'diskEncryptionTangServers',\n 'hostsNetworkConfigurationType',\n ]);\n params.diskEncryption = DiskEncryptionService.getDiskEncryptionParams(values);\n if (isArmArchitecture({ cpuArchitecture: params.cpuArchitecture })) {\n params.userManagedNetworking = true;\n }\n if (values.hostsNetworkConfigurationType === HostsNetworkConfigurationType.STATIC) {\n params.staticNetworkConfig = getDummyInfraEnvField();\n }\n if (ocmClient) {\n params.tags = AI_UI_TAG;\n }\n return params;\n },\n\n getClusterDetailsInitialValues({\n cluster,\n infraEnv,\n urlSearchParams,\n ...args\n }: {\n cluster?: Cluster;\n infraEnv?: InfraEnv;\n pullSecret?: string;\n managedDomains: ManagedDomain[];\n ocpVersions: OpenshiftVersionOptionType[];\n urlSearchParams: string;\n }): OcmClusterDetailsValues {\n const values = getClusterDetailsInitialValues({\n cluster,\n ...args,\n });\n const params = new URLSearchParams(urlSearchParams);\n const hasArmSearchParam = params.get('useArm') === 'true';\n const cpuArchitecture =\n cluster?.cpuArchitecture || (hasArmSearchParam ? CpuArchitecture.ARM : CpuArchitecture.x86);\n const hostsNetworkConfigurationType = infraEnv?.staticNetworkConfig\n ? HostsNetworkConfigurationType.STATIC\n : HostsNetworkConfigurationType.DHCP;\n return { ...values, cpuArchitecture, hostsNetworkConfigurationType };\n },\n};\n\nexport default ClusterDetailsService;\n", "import { ClusterCreateParams, ClusterDetailsValues, DiskEncryption } from '../../common';\n\nconst DiskEncryptionService = {\n diskEncryptionEnableOn(\n isEnableOnMasters: boolean,\n isEnableOnWorkers: boolean,\n ): DiskEncryption['enableOn'] {\n let enableOnParam: DiskEncryption['enableOn'];\n if (isEnableOnMasters && isEnableOnWorkers) enableOnParam = 'all';\n else if (isEnableOnWorkers) enableOnParam = 'workers';\n else if (isEnableOnMasters) enableOnParam = 'masters';\n else enableOnParam = 'none';\n return enableOnParam;\n },\n\n getDiskEncryptionParams(values: ClusterDetailsValues): ClusterCreateParams['diskEncryption'] {\n return {\n mode: values.diskEncryptionMode,\n enableOn:\n values.highAvailabilityMode === 'None'\n ? values.enableDiskEncryptionOnMasters\n ? 'all'\n : 'none'\n : DiskEncryptionService.diskEncryptionEnableOn(\n values.enableDiskEncryptionOnMasters,\n values.enableDiskEncryptionOnWorkers,\n ),\n tangServers:\n values.diskEncryptionMode === 'tang'\n ? JSON.stringify(values.diskEncryptionTangServers)\n : undefined,\n };\n },\n};\n\nexport default DiskEncryptionService;\n", "import { ClusterCreateParams, ClusterDetailsValues, HostStaticNetworkConfig } from '../../common';\n\nexport type ClusterCreateParamsWithStaticNetworking = ClusterCreateParams & {\n staticNetworkConfig?: HostStaticNetworkConfig[];\n};\n\nexport enum HostsNetworkConfigurationType {\n STATIC = 'static',\n DHCP = 'dhcp',\n}\n\nexport type OcmClusterDetailsValues = ClusterDetailsValues & {\n hostsNetworkConfigurationType: HostsNetworkConfigurationType;\n};\n", "import {\n Cluster,\n V2ClusterUpdateParams,\n HostDiscoveryValues,\n selectMastersMustRunWorkloads,\n SupportedPlatformType,\n} from '../../common';\n\nconst HostDiscoveryService = {\n setPlatform(\n params: V2ClusterUpdateParams,\n platformToIntegrate: SupportedPlatformType | undefined,\n userManagedNetworking: boolean | undefined,\n ): void {\n //the UI client sends cluster.platform.type=none if UMN is selected.\n //the UI client sends cluster.platform.type=baremetal if UMN is not selected.\n const resetPlatform = userManagedNetworking ? 'none' : 'baremetal';\n const type = platformToIntegrate === undefined ? resetPlatform : platformToIntegrate;\n params.platform = {\n type,\n };\n },\n\n setSchedulableMasters(\n params: V2ClusterUpdateParams,\n values: HostDiscoveryValues,\n cluster: Cluster,\n ): void {\n // The backend tells us when the control to update schedulable_masters is enabled,\n if (!selectMastersMustRunWorkloads(cluster)) {\n params.schedulableMasters = values.schedulableMasters;\n }\n },\n};\n\nexport default HostDiscoveryService;\n", "import {\n V2ClusterUpdateParams,\n InfraEnvUpdateParams,\n Cluster,\n InfraEnv,\n} from '../../common/api/types';\nimport { InfraEnvsAPI } from './apis';\nimport { DiscoveryImageFormValues } from '../../common/components/clusterConfiguration';\nimport ClustersService from './ClustersService';\n\nconst DiscoveryImageFormService = {\n async update(\n clusterId: Cluster['id'],\n clusterTags: Cluster['tags'],\n infraEnvId: InfraEnv['id'],\n formValues: DiscoveryImageFormValues,\n ocmPullSecret?: string,\n ) {\n const proxyParams: V2ClusterUpdateParams = {\n httpProxy: formValues.httpProxy,\n httpsProxy: formValues.httpsProxy,\n noProxy: formValues.noProxy,\n // TODO(mlibra): Does the user need to change pull-secret?\n pullSecret: ocmPullSecret || undefined,\n sshPublicKey: formValues.sshPublicKey,\n };\n\n const infraEnvParams: InfraEnvUpdateParams = {\n proxy: {\n httpProxy: formValues.httpProxy,\n httpsProxy: formValues.httpsProxy,\n noProxy: formValues.noProxy,\n },\n sshAuthorizedKey: formValues.sshPublicKey,\n pullSecret: ocmPullSecret || undefined,\n staticNetworkConfig: formValues.staticNetworkConfig,\n imageType: formValues.imageType,\n };\n\n const { data: updatedCluster } = await ClustersService.update(\n clusterId,\n clusterTags,\n proxyParams,\n );\n InfraEnvsAPI.abortLastGetRequest();\n const { data: updatedInfraEnv } = await InfraEnvsAPI.update(infraEnvId, infraEnvParams);\n\n return { updatedCluster, updatedInfraEnv };\n },\n};\n\nexport default DiscoveryImageFormService;\n", "import {\n Cluster,\n selectOlmOperators,\n LogsState,\n MonitoredOperator,\n MonitoredOperatorsList,\n OperatorCreateParams,\n} from '../../../common';\n\n// The Day2 cluster\nexport const isAddHostsCluster = (cluster: Cluster) => cluster.kind === 'AddHostsCluster';\n\nexport const filterHostsByLogStates = (cluster: Cluster, logStates: LogsState[]) =>\n cluster.hosts?.filter(({ logsInfo }) => logsInfo && logStates.includes(logsInfo)) || [];\n\nexport const calculateCollectedLogsCount = (cluster: Cluster) => {\n const collectedLogStates: LogsState[] = ['completed', 'timeout'];\n const clusterHasCollectedLogs = cluster.logsInfo && collectedLogStates.includes(cluster.logsInfo);\n const hostsWithCollectedLogsCount = filterHostsByLogStates(cluster, collectedLogStates).length;\n\n return (clusterHasCollectedLogs ? 1 : 0) + hostsWithCollectedLogsCount;\n};\n\nexport const getBuiltInOperators = (monitoredOperators: MonitoredOperatorsList = []) =>\n monitoredOperators.filter((operator: MonitoredOperator) => operator.operatorType === 'builtin');\n\nexport const getOlmOperatorCreateParams = (cluster?: Cluster): OperatorCreateParams[] =>\n selectOlmOperators(cluster).map((operator) => ({\n name: operator.name,\n properties: operator.properties,\n }));\n\nexport const getOlmOperatorCreateParamsByName = (cluster?: Cluster) =>\n getOlmOperatorCreateParams(cluster).reduce(\n (result: { [key: string]: OperatorCreateParams }, operator) => {\n if (operator.name) {\n result[operator.name] = operator;\n }\n return result;\n },\n {},\n );\n\nexport const canAbortInstallation = (cluster: Cluster) => {\n const allowedClusterStates: Cluster['status'][] = [\n 'preparing-for-installation',\n 'installing',\n 'installing-pending-user-action',\n 'finalizing',\n ];\n return allowedClusterStates.includes(cluster.status);\n};\n\nexport const isSomeDisksSkipFormatting = (cluster: Cluster) => {\n return cluster.hosts?.some(\n (host) => host.skipFormattingDisks && host.skipFormattingDisks.length > 0,\n );\n};\n", "import {\n Cluster,\n OperatorsValues,\n OperatorCreateParams,\n OPERATOR_NAME_CNV,\n OPERATOR_NAME_ODF,\n OPERATOR_NAME_LSO,\n OPERATOR_NAME_LVM,\n} from '../../common';\nimport { getOlmOperatorCreateParamsByName } from '../components/clusters/utils';\n\nconst hasActiveOperators = (values: OperatorsValues) => {\n return Object.keys(values).some((operatorName) => !!values[operatorName]);\n};\n\nconst OperatorsService = {\n getOLMOperators(values: OperatorsValues, cluster: Cluster): OperatorCreateParams[] {\n const enabledOlmOperatorsByName = getOlmOperatorCreateParamsByName(cluster);\n const setOperator = (name: string, enabled: boolean) => {\n if (enabled) {\n enabledOlmOperatorsByName[name] = { name };\n } else {\n delete enabledOlmOperatorsByName[name];\n }\n };\n\n setOperator(OPERATOR_NAME_LVM, values.useOdfLogicalVolumeManager);\n setOperator(OPERATOR_NAME_CNV, values.useContainerNativeVirtualization);\n\n setOperator(OPERATOR_NAME_ODF, values.useOpenShiftDataFoundation);\n // TODO(jtomasek): remove following once enabling OCS is moved into a separate storage step and LSO option is exposed to the user\n if (!hasActiveOperators(values)) {\n setOperator(OPERATOR_NAME_LSO, false);\n }\n\n return Object.values(enabledOlmOperatorsByName);\n },\n\n /**\n * Depending on the Openshift version and certain selected operators, the\n * Backend can activate some other operators.\n * We need to synchronise them back to the form\n */\n syncOperators(\n uiOperators: OperatorCreateParams[],\n updatedOperators: Cluster['monitoredOperators'],\n ): Partial<OperatorsValues> {\n // LVM operator can be automatically selected depending on Openshift version + other operators\n const prevInactive = uiOperators?.find((op) => op.name === OPERATOR_NAME_LVM) === undefined;\n const nowActive = updatedOperators?.find((op) => op.name === OPERATOR_NAME_LVM) !== undefined;\n\n const updates: Partial<OperatorsValues> = {};\n if (prevInactive && nowActive) {\n updates.useOdfLogicalVolumeManager = true;\n }\n return updates;\n },\n};\nexport default OperatorsService;\n", "import type { InfraEnv } from '../../../../common';\nimport { createSlice } from '@reduxjs/toolkit';\n\n// This slice holds a list of infra-envs where each one has a different cpuArchitecture.\n// There should be no repetitions.\nconst infraEnvsSlice = createSlice({\n name: 'infraEnvs',\n initialState: [] as InfraEnv[],\n reducers: {},\n extraReducers: {},\n});\n\nexport const infraEnvsActions = infraEnvsSlice.actions;\nexport const infraEnvsReducer = infraEnvsSlice.reducer;\n", "export * from './currentCluster';\nexport * from './clusters';\n", "import { AssistedInstallerPermissionTypesListType } from '../../common';\nimport { RootState } from '../store';\n\nexport const selectCurrentClusterState = (state: RootState) => state.currentCluster;\nexport const selectCurrentCluster = (state: RootState) => state.currentCluster.data;\nexport const selectCurrentClusterUIState = (state: RootState) => state.currentCluster.uiState;\nexport const selectIsCurrentClusterSNO = (state: RootState) =>\n state.currentCluster.data?.highAvailabilityMode === 'None';\nexport const selectCurrentClusterPermissionsState = (\n state: RootState,\n): AssistedInstallerPermissionTypesListType => {\n if (state.currentCluster) {\n return state.currentCluster.permissions;\n }\n // This shouldn't happen, but to be on the safe side, return the default permissions\n return { isViewerMode: false };\n};\n", "import React from 'react';\nimport { createSelector } from 'reselect';\nimport { IRow, IRowData } from '@patternfly/react-table';\nimport { Link } from 'react-router-dom';\n\nimport { ClusterTableRows } from '../../common/types/clusters';\nimport {\n Cluster,\n DASH,\n getDateTimeCell,\n getEnabledHostCount,\n getTotalHostCount,\n HostsCount,\n HumanizedSortable,\n ResourceUIState,\n} from '../../common';\nimport ClusterStatus, { getClusterStatusText } from '../components/clusters/ClusterStatus';\nimport { routeBasePath } from '../config/routeBaseBath';\nimport { TFunction } from 'i18next';\nimport { RootState } from '../store';\n\nconst selectClusters = (state: RootState) => state.clusters.data;\nconst clustersUIState = (state: RootState) => state.clusters.uiState;\nconst currentClusterName = (state: RootState) => state.currentCluster.data?.name;\n\nexport const selectClustersUIState = createSelector(\n [selectClusters, clustersUIState],\n (clusters, uiState): ResourceUIState => {\n const { LOADED, EMPTY } = ResourceUIState;\n return !clusters.length && uiState === LOADED ? EMPTY : uiState;\n },\n);\n\nconst clusterToClusterTableRow = (cluster: Cluster, t: TFunction): IRow => {\n const { id, name = '', openshiftVersion, baseDnsDomain, createdAt } = cluster;\n const dateTimeCell = getDateTimeCell(createdAt);\n return {\n cells: [\n {\n title: (\n <Link key={name} to={`${routeBasePath}/clusters/${id}`} id={`cluster-link-${id}`}>\n {name}\n </Link>\n ),\n props: { 'data-testid': `cluster-name-${name}` },\n sortableValue: name,\n } as HumanizedSortable,\n {\n title: baseDnsDomain || DASH,\n props: { 'data-testid': `cluster-base-domain-${name}` },\n sortableValue: baseDnsDomain,\n },\n {\n title: openshiftVersion,\n props: { 'data-testid': `cluster-version-${name}` },\n sortableValue: openshiftVersion,\n },\n {\n title: <ClusterStatus status={cluster.status} />,\n props: { 'data-testid': `cluster-status-${name}` },\n sortableValue: getClusterStatusText(t, cluster.status),\n } as HumanizedSortable,\n {\n title: <HostsCount cluster={cluster} />,\n props: { 'data-testid': `cluster-hosts-count-${name}` },\n sortableValue:\n 'enabledHostCount' in cluster ? getEnabledHostCount(cluster) : getTotalHostCount(cluster),\n } as HumanizedSortable,\n {\n title: dateTimeCell.title,\n props: { 'data-testid': `cluster-created-time-${name}` },\n sortableValue: dateTimeCell.sortableValue,\n } as HumanizedSortable,\n ],\n props: {\n name,\n id,\n baseDnsDomain,\n },\n };\n};\n\nexport const getClusterTableStatusCell = (rowData: IRowData) =>\n rowData?.cells?.[3] as HumanizedSortable;\n\nexport const selectClusterTableRows = (t: TFunction) => {\n return createSelector(\n selectClusters,\n (clusters): ClusterTableRows => clusters.map((c) => clusterToClusterTableRow(c, t)),\n );\n};\n\nexport const selectClusterNames = createSelector(selectClusters, (clusters) =>\n clusters.map((c) => c.name),\n);\n\nexport const selectClusterNamesButCurrent = createSelector(\n selectClusterNames,\n currentClusterName,\n (clusterNames, currentName) => clusterNames.filter((n) => n !== currentName),\n);\n", "import React from 'react';\nimport {\n global_danger_color_100 as dangerColor,\n global_success_color_100 as okColor,\n global_warning_color_100 as warningColor,\n} from '@patternfly/react-tokens';\nimport {\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n FileAltIcon,\n CheckCircleIcon,\n InProgressIcon,\n BanIcon,\n} from '@patternfly/react-icons';\nimport { Cluster, clusterStatusLabels, WithTestID } from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\ntype ClusterStatusProps = {\n status: Cluster['status'];\n className?: string;\n};\n\ntype ClusterStatusIconProps = {\n status: Cluster['status'];\n className?: string;\n};\n\nexport const ClusterStatusIcon: React.FC<ClusterStatusIconProps> = ({ status, ...extraProps }) => {\n switch (status) {\n case 'cancelled':\n return <BanIcon size={'sm'} {...extraProps} />;\n case 'insufficient':\n case 'pending-for-input':\n case 'ready':\n return <FileAltIcon size={'sm'} {...extraProps} />;\n case 'error':\n return <ExclamationCircleIcon color={dangerColor.value} size={'sm'} {...extraProps} />;\n case 'installed':\n return <CheckCircleIcon color={okColor.value} size={'sm'} {...extraProps} />;\n case 'installing-pending-user-action':\n return <ExclamationTriangleIcon color={warningColor.value} size={'sm'} {...extraProps} />;\n case 'preparing-for-installation':\n case 'installing':\n case 'finalizing':\n case 'adding-hosts':\n return <InProgressIcon size={'sm'} {...extraProps} />;\n default:\n return <></>;\n }\n};\n\nexport const getClusterStatusText = (t: TFunction, status: Cluster['status']) => {\n return clusterStatusLabels(t)[status] || status;\n};\n\nconst ClusterStatus: React.FC<ClusterStatusProps & WithTestID> = ({\n status,\n testId,\n className,\n}) => {\n const { t } = useTranslation();\n const title = getClusterStatusText(t, status);\n\n return (\n <>\n <ClusterStatusIcon status={status} data-testid={testId} className={className} /> {title}\n </>\n );\n};\n\nexport default ClusterStatus;\n", "export let routeBasePath = '';\n\nexport const setRouteBasePath = (basePath: string) => {\n routeBasePath = basePath;\n};\n", "export * from './routeBaseBath';\nexport * from './constants';\n", "import {\n AssistedInstallerOCMPermissionTypesListType,\n AssistedInstallerPermissionTypesListType,\n Cluster,\n} from '../../common';\n\nexport const isSingleClusterMode = () => {\n return process.env.REACT_APP_BUILD_MODE === 'single-cluster';\n};\n\n/* Used from Integration tests so we can mock the permissions */\nexport type ExtendedCluster = Cluster & {\n permissions: AssistedInstallerOCMPermissionTypesListType;\n};\n\nexport const getBasePermissions = (\n cluster: ExtendedCluster,\n): AssistedInstallerPermissionTypesListType => {\n if (cluster.permissions) {\n return { isViewerMode: !cluster.permissions.canEdit };\n }\n\n const basePermissions = { isViewerMode: false };\n if (!process.env.REACT_APP_CLUSTER_PERMISSIONS) {\n return basePermissions;\n }\n const ocmPermissions = JSON.parse(\n process.env.REACT_APP_CLUSTER_PERMISSIONS,\n ) as AssistedInstallerOCMPermissionTypesListType;\n\n return {\n ...basePermissions,\n ...ocmPermissionsToAIPermissions(ocmPermissions),\n };\n};\n\nexport const ocmPermissionsToAIPermissions = (\n ocmPermissions: AssistedInstallerOCMPermissionTypesListType,\n): Partial<AssistedInstallerPermissionTypesListType> => {\n const permissions: Partial<AssistedInstallerPermissionTypesListType> = {};\n if (ocmPermissions.canEdit !== undefined) {\n permissions.isViewerMode = !ocmPermissions.canEdit;\n }\n return permissions;\n};\n\nexport const OCM_CLUSTER_LIST_LINK = '/openshift'; // TODO(mlibra): Tweak it!!!\n", "import { saveAs } from 'file-saver';\nimport get from 'lodash/get';\nimport { ocmClient, handleApiError, getApiErrorMessage } from '../../api';\nimport {\n Cluster,\n Host,\n HostRole,\n Inventory,\n stringToJSON,\n AlertsContextType,\n} from '../../../common';\nimport { ClustersAPI } from '../../services/apis';\nimport { ClustersService } from '../../services';\n\nexport const downloadClusterInstallationLogs = async (\n addAlert: AlertsContextType['addAlert'],\n clusterId: string,\n) => {\n try {\n if (ocmClient) {\n const { data } = await ClustersAPI.getPresignedForClusterFiles({\n clusterId,\n fileName: 'logs',\n hostId: undefined,\n logsType: 'all',\n });\n saveAs(data.url);\n } else {\n const { data, fileName } = await ClustersService.downloadLogs(clusterId);\n saveAs(data, fileName);\n }\n } catch (e) {\n handleApiError(e, (e) => {\n addAlert({\n title: 'Could not download cluster installation logs.',\n message: getApiErrorMessage(e),\n });\n });\n }\n};\n\nconst getHostRoleCount = (hosts: Host[], role: HostRole) =>\n hosts.filter((host) => host.status !== 'disabled' && host.role === role).length;\n\nexport const getMasterCount = (hosts: Host[]) => getHostRoleCount(hosts, 'master');\n\nexport const getWorkerCount = (hosts: Host[]) => getHostRoleCount(hosts, 'worker');\n\nconst getClusterResources = (cluster: Cluster, resourcePath: string): number => {\n if (!cluster.hosts) {\n return 0;\n }\n\n const masterCount = getMasterCount(cluster.hosts);\n const workerCount = getWorkerCount(cluster.hosts);\n\n // Cluster contain only master hosts\n const countMastersOnly = masterCount >= 3 && workerCount === 0;\n\n // Cluster contain master and worker hosts\n const countWorkersOnly = masterCount >= 3 && workerCount >= 2;\n\n const singleNodeMode = masterCount === 1;\n\n const result = cluster.hosts\n .filter((host) => 'inventory' in host)\n .filter(\n (host) =>\n (host.role === 'worker' && countWorkersOnly) ||\n (host.role === 'master' && countMastersOnly) ||\n (host.role === 'master' && singleNodeMode),\n )\n .map((host) => stringToJSON<Inventory>(host.inventory) || {})\n .map((inventory) => get(inventory, resourcePath, 0) as number)\n .reduce((total, value) => total + value, 0);\n\n return result;\n};\n\nexport const getClustervCPUCount = (cluster: Cluster): number =>\n getClusterResources(cluster, 'cpu.count');\n\nexport const getClusterMemoryAmount = (cluster: Cluster): number =>\n getClusterResources(cluster, 'memory.physicalBytes');\n\nexport const getClusterDetailId = (suffix: string) => `cluster-detail-${suffix}`;\n", "import React from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Stack,\n StackItem,\n TextContent,\n Text,\n ButtonVariant,\n GridItem,\n Grid,\n} from '@patternfly/react-core';\nimport {\n ToolbarButton,\n ToolbarSecondaryGroup,\n Alerts,\n canDownloadClusterLogs,\n useAlerts,\n getEnabledHosts,\n selectOlmOperators,\n isSNO,\n useFeatureSupportLevel,\n} from '../../../common';\nimport { Cluster } from '../../../common/api/types';\nimport ClusterHostsTable from '../hosts/ClusterHostsTable';\nimport ClusterToolbar from '../clusters/ClusterToolbar';\nimport { downloadClusterInstallationLogs, getClusterDetailId } from './utils';\nimport { LaunchOpenshiftConsoleButton } from '../../../common/components/clusterDetail/ConsoleModal';\nimport ClusterProperties from './ClusterProperties';\nimport { isSingleClusterMode, routeBasePath } from '../../config';\nimport ClusterDetailStatusVarieties, {\n useClusterStatusVarieties,\n} from './ClusterDetailStatusVarieties';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport { canAbortInstallation } from '../clusters/utils';\nimport ClusterProgress from '../../../common/components/clusterDetail/ClusterProgress';\nimport ClusterProgressItems from '../../../common/components/clusterDetail/ClusterProgressItems';\nimport { onFetchEvents } from '../fetching/fetchEvents';\nimport { getClusterProgressAlerts } from './getProgressBarAlerts';\nimport { ClustersAPI } from '../../services/apis';\nimport { updateCluster } from '../../reducers/clusters';\nimport { handleApiError, ocmClient } from '../../api';\nimport ViewClusterEventsButton from '../../../common/components/ui/ViewClusterEventsButton';\n\ntype ClusterDetailProps = {\n cluster: Cluster;\n};\n\nconst ClusterDetail: React.FC<ClusterDetailProps> = ({ cluster }) => {\n const { addAlert } = useAlerts();\n const { resetClusterDialog, cancelInstallationDialog } = useModalDialogsContext();\n const clusterVarieties = useClusterStatusVarieties(cluster);\n const { credentials, credentialsError } = clusterVarieties;\n const featureSupportLevelContext = useFeatureSupportLevel();\n const isSNOExpansionAllowed =\n cluster.openshiftVersion &&\n featureSupportLevelContext.isFeatureSupported(\n cluster.openshiftVersion,\n 'SINGLE_NODE_EXPANSION',\n );\n const canAddHosts =\n (!isSNO(cluster) || isSNOExpansionAllowed) && cluster.status === 'installed' && !ocmClient;\n\n return (\n <Stack hasGutter>\n <StackItem>\n <Grid hasGutter>\n <GridItem>\n <TextContent>\n <Text component=\"h2\">Installation progress</Text>\n </TextContent>\n </GridItem>\n <GridItem span={6}>\n <ClusterProgress\n cluster={cluster}\n totalPercentage={cluster.progress?.totalPercentage || 0}\n />\n </GridItem>\n <GridItem span={6} rowSpan={4} />\n <GridItem span={6}>\n <ClusterProgressItems cluster={cluster} onFetchEvents={onFetchEvents} />\n </GridItem>\n <GridItem span={6}>\n {getClusterProgressAlerts(\n getEnabledHosts(cluster.hosts),\n cluster,\n selectOlmOperators(cluster),\n )}\n </GridItem>\n <GridItem span={6}>\n <ClusterDetailStatusVarieties cluster={cluster} clusterVarieties={clusterVarieties} />\n </GridItem>\n <GridItem>\n <TextContent>\n <Text component=\"h2\">Host Inventory</Text>\n </TextContent>\n <ClusterHostsTable cluster={cluster} skipDisabled />\n </GridItem>\n <ClusterProperties cluster={cluster} />\n </Grid>\n </StackItem>\n <StackItem>\n <Alerts />\n </StackItem>\n <StackItem>\n <ClusterToolbar>\n {canAbortInstallation(cluster) && (\n <ToolbarButton\n id={getClusterDetailId('button-cancel-installation')}\n variant={ButtonVariant.danger}\n onClick={() => cancelInstallationDialog.open({ clusterId: cluster.id })}\n >\n Abort Installation\n </ToolbarButton>\n )}\n {cluster.status === 'error' && (\n <ToolbarButton\n id={getClusterDetailId('button-reset-cluster')}\n onClick={() => resetClusterDialog.open({ cluster })}\n >\n Reset Cluster\n </ToolbarButton>\n )}\n {['finalizing', 'installed'].includes(cluster.status) && (\n <LaunchOpenshiftConsoleButton\n isDisabled={!credentials || !!credentialsError}\n cluster={cluster}\n consoleUrl={credentials?.consoleUrl}\n id={getClusterDetailId('button-launch-console')}\n />\n )}\n {canAddHosts && (\n <ToolbarButton\n variant={ButtonVariant.primary}\n component={(props) => (\n <Link to={`${routeBasePath}/clusters/${cluster.id}`} {...props} />\n )}\n id={getClusterDetailId('button-add-hosts')}\n onClick={async () => {\n try {\n const { data } = await ClustersAPI.allowAddHosts(cluster.id);\n updateCluster(data);\n } catch (e) {\n handleApiError(e);\n }\n }}\n >\n Add hosts\n </ToolbarButton>\n )}\n {!isSingleClusterMode() && (\n <ToolbarButton\n variant={ButtonVariant.link}\n component={(props) => <Link to={`${routeBasePath}/clusters`} {...props} />}\n id={getClusterDetailId('button-back-to-all-clusters')}\n >\n Back to all clusters\n </ToolbarButton>\n )}\n <ToolbarSecondaryGroup>\n <ToolbarButton\n id=\"cluster-installation-logs-button\"\n variant={ButtonVariant.link}\n onClick={() => downloadClusterInstallationLogs(addAlert, cluster.id)}\n isDisabled={!canDownloadClusterLogs(cluster)}\n >\n Download Installation Logs\n </ToolbarButton>\n <ViewClusterEventsButton cluster={cluster} onFetchEvents={onFetchEvents} />\n </ToolbarSecondaryGroup>\n </ClusterToolbar>\n </StackItem>\n </Stack>\n );\n};\n\nexport default ClusterDetail;\n", "import * as React from 'react';\nimport { Cluster, selectSchedulableMasters, Host, isSNO } from '../../../common';\nimport { AdditionalNTPSourcesDialogToggle } from './AdditionaNTPSourceDialogToggle';\nimport {\n discoveredAtColumn,\n disksColumn,\n hostnameColumn,\n memoryColumn,\n roleColumn,\n statusColumn,\n cpuCoresColumn,\n countColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useHostsTable, HostsTableModals } from './use-hosts-table';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport HostsTableEmptyState from '../hosts/HostsTableEmptyState';\nimport { HostDetail } from '../../../common/components/hosts/HostRowDetail';\nimport { ExpandComponentProps } from '../../../common/components/hosts/AITable';\nimport { UpdateDay2ApiVipDialogToggle } from './UpdateDay2ApiVipDialogToggle';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport {\n HostsTableDetailContextProvider,\n useHostsTableDetailContext,\n} from '../../../common/components/hosts/HostsTableDetailContext';\n\nexport function ExpandComponent({ obj: host }: ExpandComponentProps<Host>) {\n const { onDiskRole, canEditDisks, updateDiskSkipFormatting } = useHostsTableDetailContext();\n return (\n <HostDetail\n host={host}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n hideNTPStatus\n onDiskRole={onDiskRole}\n canEditDisks={canEditDisks}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n />\n );\n}\n\nexport interface ClusterHostsTableProps {\n cluster: Cluster;\n skipDisabled?: boolean;\n}\n\nconst ClusterHostsTable = ({ cluster, skipDisabled }: ClusterHostsTableProps) => {\n const {\n onEditHost,\n onEditRole,\n actionChecks,\n onDiskRole,\n actionResolver,\n updateDiskSkipFormatting,\n ...modalProps\n } = useHostsTable(cluster);\n const { t } = useTranslation();\n const content = React.useMemo(\n () => [\n hostnameColumn(t, onEditHost, undefined, actionChecks.canEditHostname),\n roleColumn(t, actionChecks.canEditRole, onEditRole, selectSchedulableMasters(cluster)),\n statusColumn(t, AdditionalNTPSourcesDialogToggle, onEditHost, UpdateDay2ApiVipDialogToggle),\n discoveredAtColumn,\n cpuCoresColumn,\n memoryColumn,\n disksColumn,\n countColumn(cluster),\n ],\n [t, onEditHost, actionChecks, onEditRole, cluster],\n );\n\n const hosts = cluster.hosts || [];\n const paginationProps = usePagination(hosts.length);\n\n return (\n <>\n <HostsTableDetailContextProvider\n canEditDisks={actionChecks.canEditDisks}\n onDiskRole={onDiskRole}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n >\n <HostsTable\n hosts={hosts}\n skipDisabled={skipDisabled}\n ExpandComponent={ExpandComponent}\n content={content}\n actionResolver={actionResolver}\n {...paginationProps}\n >\n <HostsTableEmptyState isSingleNode={isSNO(cluster)} />\n </HostsTable>\n </HostsTableDetailContextProvider>\n <HostsTableModals cluster={cluster} {...modalProps} />\n </>\n );\n};\n\nexport default ClusterHostsTable;\n", "import React from 'react';\nimport { AlertActionLink } from '@patternfly/react-core';\nimport { useModalDialogsContext } from './ModalDialogsContext';\n\nexport const AdditionalNTPSourcesDialogToggle = () => {\n const {\n additionalNTPSourcesDialog: { open },\n } = useModalDialogsContext();\n\n return <AlertActionLink onClick={() => open()}>Add NTP sources</AlertActionLink>;\n};\n", "import React from 'react';\nimport { Host, Inventory, Cluster } from '../../../common';\nimport { dialogsSlice } from '../../../common';\n\nconst { openDialog: openDialogAction, closeDialog: closeDialogAction } = dialogsSlice.actions;\nconst dialogsReducer = dialogsSlice.reducer;\n\ntype HostIdAndHostname = {\n hostId: Host['id'];\n hostname: string;\n};\n\ntype EditHostProps = {\n host: Host;\n inventory: Inventory;\n};\n\ntype ResetClusterProps = {\n cluster: Cluster;\n};\n\ntype CancelInstallationProps = {\n clusterId: Cluster['id'];\n};\n\ntype DiscoveryImageDialogProps = {\n cluster: Cluster;\n};\n\ntype MassUpdateHostnameDialogProps = {\n cluster: Cluster;\n hostIDs: string[];\n};\n\ntype MassDeleteHostDialogProps = {\n hosts: Host[];\n // eslint-disable-next-line\n onDelete: (host: Host) => Promise<any>;\n};\n\ntype ModalDialogsDataTypes = {\n eventsDialog: HostIdAndHostname;\n editHostDialog: EditHostProps;\n deleteHostDialog: HostIdAndHostname;\n resetHostDialog: HostIdAndHostname;\n additionalNTPSourcesDialog: void;\n resetClusterDialog: ResetClusterProps;\n cancelInstallationDialog: CancelInstallationProps;\n discoveryImageDialog: DiscoveryImageDialogProps;\n day2DiscoveryImageDialog: DiscoveryImageDialogProps;\n UpdateDay2ApiVipDialog: void;\n massUpdateHostnameDialog: MassUpdateHostnameDialogProps;\n massDeleteHostDialog: MassDeleteHostDialogProps;\n};\n\ntype DialogId =\n | 'eventsDialog'\n | 'editHostDialog'\n | 'deleteHostDialog'\n | 'resetHostDialog'\n | 'additionalNTPSourcesDialog'\n | 'resetClusterDialog'\n | 'cancelInstallationDialog'\n | 'discoveryImageDialog'\n | 'day2DiscoveryImageDialog'\n | 'UpdateDay2ApiVipDialog'\n | 'massUpdateHostnameDialog'\n | 'massDeleteHostDialog';\n\nexport type ModalDialogsContextType = {\n [key in DialogId]: {\n isOpen: boolean;\n open: (data: ModalDialogsDataTypes[key]) => void;\n close: () => void;\n data: ModalDialogsDataTypes[key];\n };\n};\n\nconst dialogIds: DialogId[] = [\n 'eventsDialog',\n 'editHostDialog',\n 'deleteHostDialog',\n 'resetHostDialog',\n 'additionalNTPSourcesDialog',\n 'resetClusterDialog',\n 'cancelInstallationDialog',\n 'discoveryImageDialog',\n 'day2DiscoveryImageDialog',\n 'UpdateDay2ApiVipDialog',\n 'massUpdateHostnameDialog',\n 'massDeleteHostDialog',\n];\n\nconst ModalDialogsContext = React.createContext<ModalDialogsContextType | undefined>(undefined);\n\nconst ModalDialogsContextProvider: React.FC = ({ children }) => {\n const [dialogsState, dispatchDialogsAction] = React.useReducer(dialogsReducer, {});\n\n function getOpenDialog<DataType>(dialogId: string) {\n return (data: DataType) => dispatchDialogsAction(openDialogAction({ dialogId, data }));\n }\n\n const getCloseDialog = (dialogId: string) => () =>\n dispatchDialogsAction(closeDialogAction({ dialogId }));\n\n const context = dialogIds.reduce((context, dialogId) => {\n const dialogData = dialogsState[dialogId] as ModalDialogsDataTypes[typeof dialogId];\n context[dialogId] = {\n isOpen: !!dialogData,\n open: (data: ModalDialogsDataTypes[typeof dialogId]) =>\n getOpenDialog<ModalDialogsDataTypes[typeof dialogId]>(dialogId)(data),\n close: () => getCloseDialog(dialogId)(),\n data: dialogData,\n };\n return context;\n }, {});\n\n return (\n <ModalDialogsContext.Provider value={context as ModalDialogsContextType}>\n {children}\n </ModalDialogsContext.Provider>\n );\n};\n\nconst useModalDialogsContext = () => {\n const context = React.useContext(ModalDialogsContext);\n if (context === undefined) {\n throw new Error('useModalDialogsContext must be used within a ModalDialogsContextProvider');\n }\n return context;\n};\n\nexport { ModalDialogsContextProvider, useModalDialogsContext };\n", "import { breakWord, expandable, sortable } from '@patternfly/react-table';\nimport * as React from 'react';\nimport { Address4, Address6 } from 'ip-address';\nimport { Cluster, Host, HostUpdateParams, Interface, stringToJSON } from '../../api';\nimport { ValidationsInfo as HostValidationsInfo } from '../../types/hosts';\nimport { getSubnet } from '../clusterConfiguration';\nimport { DASH } from '../constants';\nimport { getDateTimeCell } from '../ui';\nimport { ActionsResolver, TableRow } from './AITable';\nimport { getHostRowHardwareInfo } from './hardwareInfo';\nimport Hostname from './Hostname';\nimport HostPropertyValidationPopover from './HostPropertyValidationPopover';\nimport HostsCount from './HostsCount';\nimport { HostsTableActions } from './types';\nimport HostStatus from './HostStatus';\nimport RoleCell from './RoleCell';\nimport { areOnlySoftValidationsFailing, getHostname, getHostRole, getInventory } from './utils';\nimport { selectMachineNetworkCIDR } from '../../selectors/clusterSelectors';\nimport { hostStatus } from './status';\nimport { DropdownProps } from '@patternfly/react-core';\nimport { TFunction } from 'i18next';\n\nexport const getSelectedNic = (nics: Interface[], currentSubnet: Address4 | Address6) => {\n return nics.find((nic) => {\n const ipv4Addresses = (nic.ipv4Addresses || []).reduce<Address4[]>((addresses, address) => {\n if (Address4.isValid(address)) {\n addresses.push(new Address4(address));\n }\n return addresses;\n }, []);\n\n if (ipv4Addresses.find((address) => address.isInSubnet(currentSubnet))) {\n return true;\n }\n\n const ipv6Addresses = (nic.ipv6Addresses || []).reduce<Address6[]>((addresses, address) => {\n if (Address6.isValid(address)) {\n addresses.push(new Address6(address));\n }\n return addresses;\n }, []);\n\n return ipv6Addresses.find((address) => address.isInSubnet(currentSubnet));\n });\n};\n\nexport const hostnameColumn = (\n t: TFunction,\n onEditHostname?: HostsTableActions['onEditHost'],\n hosts?: Host[],\n canEditHostname?: HostsTableActions['canEditHostname'],\n): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Hostname'),\n props: {\n id: 'col-header-hostname', // ACM jest tests require id over testId\n },\n transforms: [sortable],\n cellFormatters: [expandable],\n cellTransforms: [breakWord],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n const editHostname = onEditHostname ? () => onEditHostname(host) : undefined;\n const computedHostname = getHostname(host, inventory);\n return {\n title: (\n <Hostname\n host={host}\n inventory={inventory}\n onEditHostname={editHostname}\n hosts={hosts}\n readonly={canEditHostname ? !canEditHostname() : false}\n />\n ),\n props: { 'data-testid': 'host-name' },\n sortableValue: computedHostname || '',\n };\n },\n };\n};\n\nexport const roleColumn = (\n t: TFunction,\n canEditRole?: HostsTableActions['canEditRole'],\n onEditRole?: HostsTableActions['onEditRole'],\n schedulableMasters?: boolean,\n position?: DropdownProps['position'],\n): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Role'),\n props: {\n id: 'col-header-role',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const editRole = onEditRole\n ? (role: HostUpdateParams['hostRole']) => onEditRole(host, role)\n : undefined;\n const isRoleEditable = canEditRole?.(host);\n const hostRole = getHostRole(host, t, schedulableMasters);\n return {\n title: (\n <RoleCell\n host={host}\n readonly={!isRoleEditable}\n role={hostRole}\n onEditRole={editRole}\n position={position}\n />\n ),\n props: { 'data-testid': 'host-role' },\n sortableValue: hostRole,\n };\n },\n };\n};\n\nexport const statusColumn = (\n t: TFunction,\n AdditionalNTPSourcesDialogToggleComponent?: React.FC,\n onEditHostname?: HostsTableActions['onEditHost'],\n UpdateDay2ApiVipDialogToggleComponent?: React.FC,\n): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Status'),\n props: {\n id: 'col-header-status',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n const editHostname = onEditHostname ? () => onEditHostname(host) : undefined;\n const sublabel =\n areOnlySoftValidationsFailing(validationsInfo) &&\n ['known', 'known-unbound'].includes(host.status)\n ? 'Some validations failed'\n : undefined;\n return {\n title: (\n <HostStatus\n host={host}\n status={{ ...hostStatus[host.status], sublabel }}\n onEditHostname={editHostname}\n validationsInfo={validationsInfo}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggleComponent}\n UpdateDay2ApiVipDialogToggleComponent={UpdateDay2ApiVipDialogToggleComponent}\n />\n ),\n props: { 'data-testid': 'host-status' },\n sortableValue: host.status,\n };\n },\n };\n};\n\nexport const discoveredAtColumn: TableRow<Host> = {\n header: {\n title: 'Discovered on',\n props: {\n id: 'col-header-discoveredat',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const { createdAt } = host;\n const dateTimeCell = getDateTimeCell(createdAt);\n return {\n title: dateTimeCell.title,\n props: { 'data-testid': 'host-discovered-time' },\n sortableValue: dateTimeCell.sortableValue,\n };\n },\n};\n\nexport const cpuArchitectureColumn = (t: TFunction): TableRow<Host> => ({\n header: {\n title: t('ai:CPU Architecture'),\n props: {\n id: 'col-header-cpuarchitecture',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n return {\n title: inventory.cpu?.architecture,\n props: { 'data-testid': 'host-cpu-architecture' },\n sortableValue: inventory.cpu?.architecture,\n };\n },\n});\n\nexport const cpuCoresColumn: TableRow<Host> = {\n header: {\n title: 'CPU Cores',\n props: {\n id: 'col-header-cpucores',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n const { cores } = getHostRowHardwareInfo(inventory);\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n const cpuCoresValidation = validationsInfo?.hardware?.find(\n (v) => v.id === 'has-cpu-cores-for-role',\n );\n return {\n title: (\n <HostPropertyValidationPopover validation={cpuCoresValidation}>\n {cores.title}\n </HostPropertyValidationPopover>\n ),\n props: { 'data-testid': 'host-cpu-cores' },\n sortableValue: cores.sortableValue,\n };\n },\n};\n\nexport const memoryColumn: TableRow<Host> = {\n header: {\n title: 'Memory',\n props: {\n id: 'col-header-memory',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n const { memory } = getHostRowHardwareInfo(inventory);\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n const memoryValidation = validationsInfo?.hardware?.find((v) => v.id === 'has-memory-for-role');\n return {\n title: (\n <HostPropertyValidationPopover validation={memoryValidation}>\n {memory.title}\n </HostPropertyValidationPopover>\n ),\n props: { 'data-testid': 'host-memory' },\n sortableValue: memory.sortableValue,\n };\n },\n};\n\nexport const disksColumn: TableRow<Host> = {\n header: {\n title: 'Total storage',\n props: {\n id: 'col-header-disk',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n const { disk } = getHostRowHardwareInfo(inventory);\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n const diskValidation = validationsInfo?.hardware?.find((v) => v.id === 'has-min-valid-disks');\n return {\n title: (\n <HostPropertyValidationPopover validation={diskValidation}>\n {disk.title}\n </HostPropertyValidationPopover>\n ),\n props: { 'data-testid': 'host-disks' },\n sortableValue: disk.sortableValue,\n };\n },\n};\n\nexport const countColumn = (cluster: Cluster): TableRow<Host> => ({\n header: { title: <HostsCount cluster={cluster} inParenthesis /> },\n});\n\nexport const activeNICColumn = (cluster: Cluster): TableRow<Host> => ({\n header: { title: 'Active NIC', transforms: [sortable] },\n cell: (host) => {\n const inventory = getInventory(host);\n const nics = inventory.interfaces || [];\n const machineNetworkCidr = selectMachineNetworkCIDR(cluster);\n const currentSubnet = machineNetworkCidr ? getSubnet(machineNetworkCidr) : null;\n const selectedNic = currentSubnet ? getSelectedNic(nics, currentSubnet) : null;\n return {\n title: selectedNic?.name || DASH,\n props: { 'data-testid': 'nic-name' },\n sortableValue: selectedNic?.name || DASH,\n };\n },\n});\n\nexport const ipv4Column = (cluster: Cluster): TableRow<Host> => ({\n header: { title: 'IPv4 address', transforms: [sortable] },\n cell: (host) => {\n const inventory = getInventory(host);\n const nics = inventory.interfaces || [];\n\n const machineNetworkCidr = selectMachineNetworkCIDR(cluster);\n const currentSubnet = machineNetworkCidr ? getSubnet(machineNetworkCidr) : null;\n const selectedNic = currentSubnet ? getSelectedNic(nics, currentSubnet) : null;\n return {\n title: (selectedNic?.ipv4Addresses || []).join(', ') || DASH,\n props: { 'data-testid': 'nic-ipv4' },\n sortableValue: (selectedNic?.ipv4Addresses || []).join(', ') || DASH,\n };\n },\n});\n\nexport const ipv6Column = (cluster: Cluster): TableRow<Host> => ({\n header: { title: 'IPv6 address', transforms: [sortable] },\n cell: (host) => {\n const inventory = getInventory(host);\n const nics = inventory.interfaces || [];\n\n const machineNetworkCidr = selectMachineNetworkCIDR(cluster);\n const currentSubnet = machineNetworkCidr ? getSubnet(machineNetworkCidr) : null;\n const selectedNic = currentSubnet ? getSelectedNic(nics, currentSubnet) : null;\n return {\n title: (selectedNic?.ipv6Addresses || []).join(', ') || DASH,\n props: { 'data-testid': 'nic-ipv6' },\n sortableValue: (selectedNic?.ipv6Addresses || []).join(', ') || DASH,\n };\n },\n});\n\nexport const macAddressColumn = (cluster: Cluster): TableRow<Host> => ({\n header: { title: 'MAC address', transforms: [sortable] },\n cell: (host) => {\n const inventory = getInventory(host);\n const nics = inventory.interfaces || [];\n\n const machineNetworkCidr = selectMachineNetworkCIDR(cluster);\n const currentSubnet = machineNetworkCidr ? getSubnet(machineNetworkCidr) : null;\n const selectedNic = currentSubnet ? getSelectedNic(nics, currentSubnet) : null;\n return {\n title: selectedNic?.macAddress || DASH,\n props: { 'data-testid': 'nic-mac-address' },\n sortableValue: selectedNic?.macAddress || DASH,\n };\n },\n});\n\nconst ActionTitle: React.FC<{ disabled: boolean; description?: string; title: string }> = ({\n title,\n description,\n disabled,\n}) => (\n <>\n {title}\n {disabled && (\n <>\n <br />\n {description}\n </>\n )}\n </>\n);\n\nexport const hostActionResolver =\n ({\n onInstallHost,\n canInstallHost,\n onEditHost,\n canEditHost,\n onHostEnable,\n canEnable,\n onHostDisable,\n canDisable,\n onHostReset,\n canReset,\n onViewHostEvents,\n onDownloadHostLogs,\n canDownloadHostLogs,\n onDeleteHost,\n canDelete,\n onEditBMH,\n canEditBMH,\n canUnbindHost,\n onUnbindHost,\n }: HostsTableActions): ActionsResolver<Host> =>\n (host) => {\n const actions = [];\n if (host) {\n const inventory = getInventory(host);\n const hostname = getHostname(host, inventory);\n\n if (onInstallHost && canInstallHost?.(host)) {\n actions.push({\n title: 'Install host',\n id: `button-install-host-${hostname}`,\n onClick: () => onInstallHost(host),\n });\n }\n if (onEditHost) {\n if (canEditHost) {\n const canEdit = canEditHost(host);\n if (typeof canEdit === 'boolean') {\n canEdit &&\n actions.push({\n title: 'Change hostname',\n id: `button-edit-host-${hostname}`, // id is everchanging, not ideal for tests\n onClick: () => onEditHost(host),\n });\n } else {\n const [enabled, reason] = canEdit;\n actions.push({\n title: (\n <ActionTitle disabled={!enabled} description={reason} title=\"Change hostname\" />\n ),\n id: `button-edit-host-${hostname}`, // id is everchanging, not ideal for tests\n onClick: () => onEditHost(host),\n isDisabled: !enabled,\n });\n }\n }\n }\n if (onHostEnable && canEnable?.(host)) {\n actions.push({\n title: 'Enable in cluster',\n id: `button-enable-in-cluster-${hostname}`,\n onClick: () => onHostEnable(host),\n });\n }\n if (onHostDisable && canDisable?.(host)) {\n actions.push({\n title: 'Disable in cluster',\n id: `button-disable-in-cluster-${hostname}`,\n onClick: () => onHostDisable(host),\n });\n }\n if (onHostReset && canReset?.(host)) {\n actions.push({\n title: 'Reset host',\n id: `button-reset-host-${hostname}`,\n onClick: () => onHostReset(host),\n });\n }\n if (onViewHostEvents) {\n actions.push({\n title: 'View host events',\n id: `button-view-host-events-${hostname}`,\n onClick: () => onViewHostEvents(host),\n });\n }\n if (onDownloadHostLogs && canDownloadHostLogs?.(host)) {\n actions.push({\n title: 'Download host logs',\n id: `button-download-host-installation-logs-${hostname}`,\n onClick: () => onDownloadHostLogs(host),\n });\n }\n if (onDeleteHost) {\n if (canDelete) {\n const canDeleteHost = canDelete(host);\n if (typeof canDeleteHost === 'boolean') {\n canDeleteHost &&\n actions.push({\n title: 'Delete host',\n id: `button-delete-host-${hostname}`,\n onClick: () => onDeleteHost(host),\n });\n } else {\n const [enabled, reason] = canDeleteHost;\n actions.push({\n title: <ActionTitle disabled={!enabled} description={reason} title=\"Delete host\" />,\n id: `button-delete-host-${hostname}`,\n onClick: () => onDeleteHost(host),\n isDisabled: !enabled,\n });\n }\n }\n }\n if (onEditBMH && host.href === 'bmc') {\n if (canEditBMH) {\n const [enabled, reason] = canEditBMH(host);\n actions.push({\n title: <ActionTitle disabled={!enabled} description={reason} title=\"Edit BMC\" />,\n id: `button-edit-bmh-host-${hostname}`,\n onClick: () => onEditBMH(host),\n isDisabled: !enabled,\n });\n }\n }\n\n if (onUnbindHost && canUnbindHost) {\n const [enabled, reason] = canUnbindHost(host);\n actions.push({\n title: (\n <ActionTitle disabled={!enabled} description={reason} title=\"Remove from the cluster\" />\n ),\n id: `button-unbind-host-${hostname}`,\n onClick: () => onUnbindHost(host),\n isDisabled: !enabled,\n });\n }\n }\n\n return actions;\n };\n", "import React from 'react';\nimport { Button, ButtonVariant, Popover } from '@patternfly/react-core';\nimport { CheckCircleIcon, ExclamationCircleIcon, PendingIcon } from '@patternfly/react-icons';\nimport {\n global_danger_color_100 as dangerColor,\n global_success_color_100 as successColor,\n} from '@patternfly/react-tokens';\nimport { toSentence } from '../ui';\nimport { hostValidationFailureHints, hostValidationLabels } from '../../config';\nimport { Validation } from '../../types/hosts';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype ValidationPopoverProps = {\n validation: Validation;\n actions?: React.ReactNode[];\n};\n\nconst ValidationPopover: React.FC<ValidationPopoverProps> = ({ validation, actions, children }) => {\n const { t } = useTranslation();\n const failedValidationHint = hostValidationFailureHints(t)[validation.id];\n\n return (\n <Popover\n headerContent={<div>{hostValidationLabels(t)[validation.id]}</div>}\n bodyContent={\n <div>\n {toSentence(validation.message)}\n {validation.status === 'failure' && failedValidationHint && ` ${failedValidationHint}`}\n </div>\n }\n footerContent={actions}\n zIndex={300}\n >\n <Button variant={ButtonVariant.link} isInline>\n {children}\n </Button>\n </Popover>\n );\n};\n\ntype HostPropertyValidationPopoverProps = {\n validation?: Validation;\n failureActions?: React.ReactNode[];\n pendingActions?: React.ReactNode[];\n showFailure?: boolean;\n showPending?: boolean;\n showSuccess?: boolean;\n};\n\nconst HostPropertyValidationPopover: React.FC<HostPropertyValidationPopoverProps> = ({\n validation,\n failureActions,\n pendingActions,\n children,\n showFailure = true,\n showPending = false,\n showSuccess = false,\n}) => {\n if (validation) {\n if (showFailure && validation.status === 'failure') {\n return (\n <ValidationPopover validation={validation} actions={failureActions}>\n <ExclamationCircleIcon color={dangerColor.value} /> {children}\n </ValidationPopover>\n );\n }\n if (showPending && validation.status === 'pending') {\n return (\n <ValidationPopover validation={validation} actions={pendingActions}>\n <PendingIcon /> {children}\n </ValidationPopover>\n );\n }\n if (showSuccess && validation.status === 'success') {\n return (\n <ValidationPopover validation={validation}>\n <CheckCircleIcon color={successColor.value} /> {children}\n </ValidationPopover>\n );\n }\n }\n return <>{children}</>;\n};\n\nexport default HostPropertyValidationPopover;\n", "import { OnPerPageSelect, OnSetPage, PerPageOptions } from '@patternfly/react-core';\nimport * as React from 'react';\n\ntype PaginationCallbacks = {\n onSetPage: OnSetPage;\n onPerPageSelect: OnPerPageSelect;\n};\n\nconst perPageOptions: PerPageOptions[] = [\n {\n title: '10',\n value: 10,\n },\n {\n title: '20',\n value: 20,\n },\n];\n\nexport const usePagination = (dataCount: number) => {\n const [perPage, setPerPage] = React.useState(10);\n const [page, setPage] = React.useState(1);\n\n const { onSetPage, onPerPageSelect } = React.useMemo<PaginationCallbacks>(\n () => ({\n onSetPage: (evt, pageNumber) => setPage(pageNumber),\n onPerPageSelect: (evt, perPage) => setPerPage(perPage),\n }),\n [],\n );\n\n const showPagination = dataCount > 10;\n\n return {\n showPagination,\n perPage,\n page,\n onSetPage,\n onPerPageSelect,\n perPageOptions,\n };\n};\n", "import * as React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n useAlerts,\n Cluster,\n Disk,\n DiskRole,\n EventsModal,\n Host,\n HostUpdateParams,\n AddHostsContext,\n MassChangeHostnameModal,\n getInventory,\n MassDeleteHostModal,\n isSNO,\n} from '../../../common';\nimport {\n AdditionalNTPSourcesDialog,\n AdditionalNTPSourcesFormProps,\n} from '../../../common/components/hosts/AdditionalNTPSourcesDialog';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport { forceReload, updateCluster, updateHost } from '../../reducers/clusters';\nimport { useModalDialogsContext } from './ModalDialogsContext';\nimport { downloadHostInstallationLogs, onAdditionalNtpSourceAction } from './utils';\nimport {\n canEditDisks as canEditDisksUtil,\n canEditRole as canEditRoleUtil,\n canInstallHost as canInstallHostUtil,\n canEnable as canEnableUtil,\n canDisable as canDisableUtil,\n canDelete as canDeleteUtil,\n canEditHost as canEditHostUtil,\n canEditHostname as canEditHostnameUtil,\n canDownloadHostLogs,\n canReset as canResetUtil,\n EditHostModal,\n EditHostFormValues,\n} from '../../../common/components/hosts';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport { hostActionResolver, hostnameColumn } from '../../../common/components/hosts/tableUtils';\nimport ResetHostModal from './ResetHostModal';\nimport DeleteHostModal from './DeleteHostModal';\nimport { onFetchEvents } from '../fetching/fetchEvents';\nimport { ClustersService, HostsService } from '../../services';\nimport UpdateDay2ApiVipModal from './UpdateDay2ApiVipModal';\nimport { UpdateDay2ApiVipFormProps } from './UpdateDay2ApiVipForm';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { getErrorMessage } from '../../../common/utils';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\nimport { hardwareStatusColumn } from './HardwareStatus';\n\nexport const useHostsTable = (cluster: Cluster) => {\n const { addAlert } = useAlerts();\n const {\n eventsDialog,\n editHostDialog,\n deleteHostDialog,\n resetHostDialog,\n massUpdateHostnameDialog,\n massDeleteHostDialog,\n } = useModalDialogsContext();\n const { resetCluster } = React.useContext(AddHostsContext);\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const dispatch = useDispatch();\n\n const hostActions = React.useMemo(\n () => ({\n onDeleteHost: (host: Host) => {\n const inventory = getInventory(host);\n deleteHostDialog.open({\n hostId: host.id,\n hostname: (host?.requestedHostname || inventory?.hostname) as string,\n });\n },\n onInstallHost: async (host: Host) => {\n const hostId = host.id;\n try {\n const { data } = await HostsService.install(host);\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: `Failed to enable host ${hostId}`, message: getApiErrorMessage(e) }),\n );\n }\n },\n }),\n [dispatch, resetCluster, addAlert, deleteHostDialog],\n );\n\n const onViewHostEvents = React.useCallback(\n (host: Host) => {\n const { id, requestedHostname } = host;\n const inventory = getInventory(host);\n const hostname = requestedHostname || inventory?.hostname || id;\n eventsDialog.open({ hostId: id, hostname });\n },\n [eventsDialog],\n );\n\n const onEditHost = React.useCallback(\n (host: Host) => {\n const inventory = getInventory(host);\n editHostDialog.open({ host, inventory });\n },\n [editHostDialog],\n );\n\n const onHostReset = React.useCallback(\n (host: Host) => {\n const inventory = getInventory(host);\n const hostname = host?.requestedHostname || inventory?.hostname || '';\n resetHostDialog.open({ hostId: host.id, hostname });\n },\n [resetHostDialog],\n );\n\n const onDownloadHostLogs = React.useCallback(\n (host: Host) => {\n void downloadHostInstallationLogs(addAlert, host);\n },\n [addAlert],\n );\n\n const onDiskRole = React.useCallback(\n async (hostId: Host['id'], diskId: Disk['id'], role: DiskRole) => {\n try {\n if (!diskId) {\n // noinspection ExceptionCaughtLocallyJS\n throw new Error(`Cannot update disk role in host ${hostId}\\nMissing diskId`);\n }\n\n const host = ClustersService.findHost(cluster.hosts, hostId);\n if (!host) {\n throw new Error(`No host found with id:${hostId}`);\n }\n\n const { data } = await HostsService.updateDiskRole(host, diskId, role);\n\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to set disk role', message: getApiErrorMessage(e) }),\n );\n }\n },\n [dispatch, resetCluster, addAlert, cluster.hosts],\n );\n\n const onExcludedODF = React.useCallback(\n async (hostId: Host['id'], nodeLabels: HostUpdateParams['nodeLabels']) => {\n try {\n const host = ClustersService.findHost(cluster.hosts, hostId);\n if (!host) {\n throw new Error(`No host found with id:${hostId}`);\n }\n\n const { data } = await HostsService.updateHostODF(host, nodeLabels);\n resetCluster ? await resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to update ODF status', message: getErrorMessage(e) }),\n );\n }\n },\n [cluster.hosts, resetCluster, dispatch, addAlert],\n );\n\n const onUpdateDay2ApiVip: UpdateDay2ApiVipFormProps['onUpdateDay2ApiVip'] = React.useCallback(\n async (apiVip: string, onError: (message: string) => void) => {\n try {\n const { data } = await ClustersService.update(cluster.id, cluster.tags, {\n apiVipDnsName: apiVip,\n });\n dispatch(updateCluster(data));\n } catch (e) {\n handleApiError(e, () => onError(getApiErrorMessage(e)));\n }\n },\n [cluster.id, cluster.tags, dispatch],\n );\n\n const onAdditionalNtpSource: AdditionalNTPSourcesFormProps['onAdditionalNtpSource'] =\n React.useMemo(\n () =>\n async (...args) =>\n await onAdditionalNtpSourceAction(dispatch, cluster, ...args),\n [cluster, dispatch],\n );\n\n const updateDiskSkipFormatting = React.useCallback(\n async (shouldFormatDisk: boolean, hostId: Host['id'], diskId: Disk['id']) => {\n try {\n if (!cluster.id) {\n throw new Error(\n `Failed to update disks skip formatting state in host ${hostId}\\nMissing cluster id`,\n );\n }\n if (!diskId) {\n throw new Error(\n `Failed to update disks skip formatting state in host ${hostId}\\nMissing disk id`,\n );\n }\n\n const host = ClustersService.findHost(cluster.hosts, hostId);\n if (!host) {\n throw new Error(`No host found with id:${hostId}`);\n }\n\n const { data } = await HostsService.updateFormattingDisks(host, diskId, !shouldFormatDisk);\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: 'Failed to set disks skip formatting',\n message: getApiErrorMessage(e),\n }),\n );\n }\n },\n [dispatch, addAlert, cluster, resetCluster],\n );\n\n const actionChecks = React.useMemo(\n () => ({\n canEditRole: (host: Host) =>\n !isViewerMode && canEditRoleUtil(cluster.status, host.status, isSNO(cluster)),\n canInstallHost: (host: Host) => !isViewerMode && canInstallHostUtil(cluster, host.status),\n canEditDisks: (host: Host) => !isViewerMode && canEditDisksUtil(cluster.status, host.status),\n canEnable: (host: Host) => !isViewerMode && canEnableUtil(cluster.status, host.status),\n canDisable: (host: Host) => !isViewerMode && canDisableUtil(cluster.status, host.status),\n canDelete: (host: Host) => !isViewerMode && canDeleteUtil(cluster.status, host.status),\n canEditHost: (host: Host) => !isViewerMode && canEditHostUtil(cluster.status, host.status),\n canReset: (host: Host) => !isViewerMode && canResetUtil(cluster.status, host.status),\n canEditHostname: () => !isViewerMode && canEditHostnameUtil(cluster.status),\n }),\n [cluster, isViewerMode],\n );\n\n const onReset = React.useCallback(() => {\n const reset = async (hostId: string | undefined) => {\n if (hostId) {\n try {\n const host = ClustersService.findHost(cluster.hosts, hostId);\n if (!host) {\n throw new Error(`No host found with id:${hostId}`);\n }\n\n const { data } = await HostsService.reset(host);\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: `Failed to reset host ${hostId}`,\n message: getApiErrorMessage(e),\n }),\n );\n }\n }\n };\n void reset(resetHostDialog.data?.hostId);\n resetHostDialog.close();\n }, [addAlert, cluster.hosts, dispatch, resetCluster, resetHostDialog]);\n\n const onDelete = React.useCallback(() => {\n const deleteHost = async (hostId: string | undefined) => {\n if (hostId) {\n try {\n const host = ClustersService.findHost(cluster.hosts, hostId);\n if (!host) {\n throw new Error(`No host found with id:${hostId}`);\n }\n\n await HostsService.delete(host);\n resetCluster ? void resetCluster() : dispatch(forceReload());\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: `Failed to delete host ${hostId}`,\n message: getApiErrorMessage(e),\n }),\n );\n }\n }\n };\n void deleteHost(deleteHostDialog.data?.hostId);\n deleteHostDialog.close();\n }, [deleteHostDialog, cluster.hosts, resetCluster, dispatch, addAlert]);\n\n const onEditRole = React.useCallback(\n async (host: Host, role: HostUpdateParams['hostRole']) => {\n try {\n if (!host.clusterId) {\n // noinspection ExceptionCaughtLocallyJS\n throw new Error(`Failed to edit role in host: ${host.id}.\\nMissing cluster_id`);\n }\n const { data } = await HostsService.updateRole(host, role);\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to set role', message: getApiErrorMessage(e) }),\n );\n }\n },\n [addAlert, dispatch, resetCluster],\n );\n\n const actionResolver = React.useMemo(\n () =>\n hostActionResolver({\n ...actionChecks,\n onEditRole,\n onDiskRole,\n onExcludedODF,\n onEditHost,\n onHostReset,\n onDownloadHostLogs,\n onViewHostEvents,\n canDownloadHostLogs,\n ...hostActions,\n }),\n [\n actionChecks,\n hostActions,\n onEditRole,\n onDiskRole,\n onEditHost,\n onHostReset,\n onDownloadHostLogs,\n onExcludedODF,\n onViewHostEvents,\n ],\n );\n\n const [selectedHostIDs, setSelectedHostIDs] = React.useState<string[]>([]);\n const onSelect = React.useCallback(\n (obj: Host, isSelected: boolean) => {\n if (isSelected) {\n setSelectedHostIDs([...selectedHostIDs, obj.id]);\n } else {\n setSelectedHostIDs(selectedHostIDs.filter((sh) => sh !== obj.id));\n }\n },\n [selectedHostIDs],\n );\n const onMassChangeHostname = React.useCallback(() => {\n if (selectedHostIDs.length === 1) {\n const host = cluster.hosts?.find((host) => host.id === selectedHostIDs[0]);\n return host && onEditHost(host);\n }\n return massUpdateHostnameDialog.open({ hostIDs: selectedHostIDs, cluster });\n }, [selectedHostIDs, massUpdateHostnameDialog, cluster, onEditHost]);\n\n const onMassDeleteHost = React.useCallback(\n () =>\n massDeleteHostDialog.open({\n hosts: (cluster.hosts || []).filter((h) => selectedHostIDs.includes(h.id)),\n onDelete: (host) => HostsService.delete(host),\n }),\n [cluster.hosts, selectedHostIDs, massDeleteHostDialog],\n );\n\n return {\n onDiskRole,\n onEditHost,\n actionChecks,\n onEditRole,\n actionResolver,\n onReset,\n onDelete,\n onAdditionalNtpSource,\n onUpdateDay2ApiVip,\n onSelect: isViewerMode ? undefined : onSelect,\n selectedHostIDs,\n setSelectedHostIDs,\n onMassChangeHostname,\n onMassDeleteHost,\n updateDiskSkipFormatting,\n };\n};\n\ntype HostsTableModalsProps = {\n cluster: Cluster;\n onReset: VoidFunction;\n onDelete: VoidFunction;\n onAdditionalNtpSource: (\n additionalNtpSource: string,\n onError: (message: string) => void,\n ) => Promise<void>;\n onUpdateDay2ApiVip: UpdateDay2ApiVipFormProps['onUpdateDay2ApiVip'];\n};\n\nexport const HostsTableModals: React.FC<HostsTableModalsProps> = ({\n cluster,\n onDelete,\n onReset,\n onAdditionalNtpSource,\n onUpdateDay2ApiVip,\n}) => {\n const dispatch = useDispatch();\n const { resetCluster } = React.useContext(AddHostsContext);\n const { t } = useTranslation();\n const {\n eventsDialog,\n editHostDialog,\n deleteHostDialog,\n resetHostDialog,\n additionalNTPSourcesDialog,\n UpdateDay2ApiVipDialog,\n massUpdateHostnameDialog,\n massDeleteHostDialog,\n } = useModalDialogsContext();\n\n const content = React.useMemo(\n () => [hostnameColumn(t), hardwareStatusColumn({ isWithinModal: true })],\n [t],\n );\n const paginationProps = usePagination(massDeleteHostDialog.data?.hosts?.length || 0);\n\n return (\n <>\n {eventsDialog.isOpen && (\n <EventsModal\n isOpen\n title={`Host Events${eventsDialog.isOpen ? `: ${eventsDialog.data?.hostname}` : ''}`}\n entityKind=\"host\"\n cluster={cluster}\n hostId={eventsDialog.data?.hostId}\n onClose={eventsDialog.close}\n onFetchEvents={onFetchEvents}\n />\n )}\n {resetHostDialog.isOpen && (\n <ResetHostModal\n isOpen\n hostname={resetHostDialog.data?.hostname}\n onClose={resetHostDialog.close}\n onReset={onReset}\n />\n )}\n\n {deleteHostDialog.isOpen && (\n <DeleteHostModal\n isOpen\n hostname={deleteHostDialog.data?.hostname}\n onClose={deleteHostDialog.close}\n onDelete={onDelete}\n />\n )}\n\n {editHostDialog.isOpen && (\n <EditHostModal\n isOpen\n host={editHostDialog.data?.host}\n inventory={editHostDialog.data?.inventory}\n usedHostnames={\n cluster?.hosts?.map((h: Host) => h.requestedHostname).filter((h) => h) as\n | string[]\n | undefined\n }\n onClose={editHostDialog.close}\n onSave={async (values: EditHostFormValues) => {\n const host = ClustersService.findHost(cluster.hosts, values.hostId);\n if (!host) {\n throw new Error(`No host found with id:${values.hostId}`);\n }\n\n const { data } = await HostsService.updateHostName(host, values.hostname);\n resetCluster ? void resetCluster() : dispatch(updateHost(data));\n editHostDialog.close();\n }}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFormSaveError={(e: any) => {\n let message;\n handleApiError(e, () => (message = getApiErrorMessage(e)));\n return message;\n }}\n />\n )}\n\n {additionalNTPSourcesDialog.isOpen && (\n <AdditionalNTPSourcesDialog\n isOpen\n additionalNtpSource={cluster.additionalNtpSource}\n onClose={additionalNTPSourcesDialog.close}\n onAdditionalNtpSource={onAdditionalNtpSource}\n />\n )}\n\n {UpdateDay2ApiVipDialog.isOpen && (\n <UpdateDay2ApiVipModal\n isOpen\n onClose={UpdateDay2ApiVipDialog.close}\n onUpdateDay2ApiVip={onUpdateDay2ApiVip}\n currentApiVip={cluster.apiVipDnsName}\n />\n )}\n {massUpdateHostnameDialog.isOpen && (\n <MassChangeHostnameModal\n isOpen\n onClose={massUpdateHostnameDialog.close}\n hosts={massUpdateHostnameDialog.data?.cluster?.hosts || []}\n selectedHostIDs={massUpdateHostnameDialog.data?.hostIDs || []}\n onChangeHostname={(host, hostname) => HostsService.updateHostName(host, hostname)}\n canChangeHostname={() => [true, undefined]}\n />\n )}\n {massDeleteHostDialog.isOpen && (\n <MassDeleteHostModal\n isOpen\n onClose={massDeleteHostDialog.close}\n hosts={massDeleteHostDialog.data?.hosts || []}\n onDelete={massDeleteHostDialog.data?.onDelete}\n >\n <HostsTable\n hosts={massDeleteHostDialog.data?.hosts || []}\n content={content}\n {...paginationProps}\n >\n <div>No hosts selected</div>\n </HostsTable>\n </MassDeleteHostModal>\n )}\n </>\n );\n};\n", "import React from 'react';\nimport { Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { TFunction } from 'i18next';\nimport {\n Alert,\n Form,\n Modal,\n ModalVariant,\n ModalBoxBody,\n ModalBoxFooter,\n Button,\n AlertActionCloseButton,\n AlertVariant,\n} from '@patternfly/react-core';\nimport {\n Cluster,\n V2ClusterUpdateParams,\n ntpSourceValidationSchema,\n AdditionalNTPSourcesField,\n} from '../../../common';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nexport type AdditionalNTPSourcesFormProps = {\n additionalNtpSource: Cluster['additionalNtpSource'];\n onClose: () => void;\n onAdditionalNtpSource: (\n additionalNtpSource: string,\n onError: (message: string) => void,\n ) => Promise<void>;\n};\n\nconst AdditionalNTPSourcesForm = ({\n additionalNtpSource,\n onClose,\n onAdditionalNtpSource,\n}: AdditionalNTPSourcesFormProps) => {\n const initialValues: V2ClusterUpdateParams = {\n additionalNtpSource: additionalNtpSource || '',\n };\n\n const getValidationSchema = (t: TFunction) =>\n Yup.object().shape({\n additionalNtpSource: ntpSourceValidationSchema.required(t('ai:Required field')),\n });\n\n const { t } = useTranslation();\n const handleSubmit = (\n values: V2ClusterUpdateParams,\n formikHelpers: FormikHelpers<V2ClusterUpdateParams>,\n ) => {\n formikHelpers.setStatus({ error: null });\n if (onAdditionalNtpSource && values.additionalNtpSource) {\n const onError = (message: string) =>\n formikHelpers.setStatus({\n error: {\n title: 'Failed to add NTP sources',\n message,\n },\n });\n void onAdditionalNtpSource(values.additionalNtpSource, onError);\n }\n onClose();\n };\n\n return (\n <Formik\n initialValues={initialValues}\n initialTouched={{ additionalNtpSource: true }}\n initialStatus={{ error: null }}\n validationSchema={getValidationSchema(t)}\n onSubmit={handleSubmit}\n >\n {({ submitForm, status, setStatus, isSubmitting, isValid, dirty }) => {\n return (\n <>\n <ModalBoxBody>\n <Form>\n {status.error && (\n <Alert\n variant={AlertVariant.danger}\n title={status.error.title}\n actionClose={\n <AlertActionCloseButton onClose={() => setStatus({ error: null })} />\n }\n isInline\n >\n {status.error.message}\n </Alert>\n )}\n <AdditionalNTPSourcesField\n name=\"additionalNtpSource\"\n label={t('ai:Additional NTP Sources')}\n helperText={t(\n 'ai:A comma separated list of IP or domain names of the NTP pools or servers. Additional NTP sources are added to all hosts to ensure all hosts clocks are synchronized with a valid NTP server. It may take a few minutes for the new NTP sources to sync.',\n )}\n isRequired\n />\n </Form>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n key=\"submit\"\n onClick={submitForm}\n isDisabled={isSubmitting || !isValid || !dirty}\n isLoading={isSubmitting}\n >\n {isSubmitting ? t('ai:Adding...') : t('ai:Add')}\n </Button>\n <Button key=\"cancel\" variant=\"link\" onClick={onClose}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n }}\n </Formik>\n );\n};\n\ntype AdditionalNTPSourcesDialogProps = AdditionalNTPSourcesFormProps & {\n isOpen: boolean;\n};\n\nexport const AdditionalNTPSourcesDialog: React.FC<AdditionalNTPSourcesDialogProps> = ({\n additionalNtpSource,\n isOpen,\n onClose,\n onAdditionalNtpSource,\n}) => (\n <Modal\n aria-label=\"Add NTP sources\"\n title=\"Add NTP sources\"\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n >\n <AdditionalNTPSourcesForm\n additionalNtpSource={additionalNtpSource}\n onClose={onClose}\n onAdditionalNtpSource={onAdditionalNtpSource}\n />\n </Modal>\n);\n", "import { saveAs } from 'file-saver';\nimport {\n AlertsContextType,\n Cluster,\n V2ClusterUpdateParams,\n Host,\n stringToJSON,\n Inventory,\n} from '../../../common';\n\nimport { ocmClient, handleApiError, getApiErrorMessage } from '../../api';\nimport { updateCluster } from '../../reducers/clusters';\nimport { ClustersService } from '../../services';\nimport ClustersAPI from '../../services/apis/ClustersAPI';\n\nexport const downloadHostInstallationLogs = async (\n addAlert: AlertsContextType['addAlert'],\n host: Host,\n) => {\n try {\n if (!host.clusterId) {\n throw new Error(\n `Cannot download logs for host ${host.id}. Missing clusterId field value in host.`,\n );\n }\n if (ocmClient) {\n const { data } = await ClustersAPI.getPresignedForClusterFiles({\n clusterId: host.clusterId,\n fileName: 'logs',\n hostId: host.id,\n logsType: 'host',\n });\n saveAs(data.url);\n } else {\n const { data, fileName } = await ClustersService.downloadLogs(host.clusterId, host.id);\n saveAs(data, fileName);\n }\n } catch (e) {\n handleApiError(e, (e) => {\n addAlert({ title: 'Could not download host logs.', message: getApiErrorMessage(e) });\n });\n }\n};\n\nexport const onAdditionalNtpSourceAction = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dispatch: (payload: any) => void,\n cluster: Cluster,\n additionalNtpSource: string,\n onError: (message: string) => void,\n) => {\n try {\n const values: V2ClusterUpdateParams = {\n additionalNtpSource,\n };\n\n const { data } = await ClustersService.update(cluster.id, cluster.tags, values);\n dispatch(updateCluster(data));\n } catch (e) {\n handleApiError(e, () => onError(getApiErrorMessage(e)));\n }\n};\n\nexport const isAHostVM = (hosts: Host[]) =>\n !!hosts.find((host) => {\n const inventory = stringToJSON<Inventory>(host.inventory || '') || {};\n return inventory.systemVendor?.virtual;\n });\n", "import * as React from 'react';\nimport { ConnectedIcon } from '@patternfly/react-icons';\nimport { HostsNotShowingLink, HostsNotShowingLinkProps } from '../clusterConfiguration';\nimport { Host } from '../../api';\nimport AITable, {\n ExpandComponentProps,\n AITableProps,\n} from '../../../common/components/hosts/AITable';\nimport { HostDetail } from './HostRowDetail';\nimport { WithTestID } from '../../types';\nimport EmptyState from '../ui/uiState/EmptyState';\nimport { usePagination } from './usePagination';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\nconst getHostId = (host: Host) => host.id;\n\ntype HostsTableEmptyStateProps = {\n setDiscoveryHintModalOpen?: HostsNotShowingLinkProps['setDiscoveryHintModalOpen'];\n isSNO?: boolean;\n};\n\nexport const HostsTableEmptyState: React.FC<HostsTableEmptyStateProps> = ({\n setDiscoveryHintModalOpen,\n isSNO = false,\n}) => {\n const { t } = useTranslation();\n return (\n <EmptyState\n icon={ConnectedIcon}\n title={t('ai:Waiting for host...', { count: +isSNO })}\n content={t('ai:Hosts may take a few minutes to appear here after booting.')}\n secondaryActions={\n setDiscoveryHintModalOpen && [\n <HostsNotShowingLink\n key=\"hosts-not-showing\"\n isSNO={isSNO}\n setDiscoveryHintModalOpen={setDiscoveryHintModalOpen}\n />,\n ]\n }\n />\n );\n};\n\nexport const DefaultExpandComponent = ({ obj }: ExpandComponentProps<Host>) => (\n <HostDetail key={obj.id} host={obj} />\n);\n\ntype HostsTableProps = ReturnType<typeof usePagination> &\n Pick<\n AITableProps<Host>,\n | 'content'\n | 'actionResolver'\n | 'onSelect'\n | 'selectedIDs'\n | 'setSelectedIDs'\n | 'ExpandComponent'\n | 'className'\n | 'canSelectAll'\n > & {\n hosts: Host[];\n skipDisabled?: boolean;\n children: React.ReactNode;\n };\n\nconst HostsTable: React.FC<HostsTableProps & WithTestID> = ({ hosts, skipDisabled, ...rest }) => {\n const data = React.useMemo(\n () => (hosts || []).filter((host) => !skipDisabled || host.status !== 'disabled'),\n [hosts, skipDisabled],\n );\n\n return <AITable<Host> getDataId={getHostId} data={data} {...rest} />;\n};\n\nexport default HostsTable;\n", "import React from 'react';\nimport { Checkbox, Pagination, PaginationVariant } from '@patternfly/react-core';\nimport {\n Table,\n TableHeader,\n TableBody,\n IRow,\n SortByDirection,\n ISortBy,\n OnSort,\n RowWrapperProps,\n RowWrapper,\n ICell,\n IAction,\n ISeparator,\n TableProps,\n InnerScrollContainer,\n} from '@patternfly/react-table';\nimport { ExtraParamsType } from '@patternfly/react-table/dist/js/components/Table/base';\nimport xor from 'lodash/xor';\nimport classnames from 'classnames';\n\nimport { getColSpanRow, rowSorter } from '../ui';\nimport { WithTestID } from '../../types';\nimport { usePagination } from './usePagination';\nimport './HostsTable.css';\n\nconst rowKey = ({ rowData }: ExtraParamsType) => rowData?.key;\n\ntype TableMemoProps = {\n rows: TableProps['rows'];\n cells: TableProps['cells'];\n onCollapse: TableProps['onCollapse'];\n className: TableProps['className'];\n sortBy: TableProps['sortBy'];\n onSort: TableProps['onSort'];\n rowWrapper: TableProps['rowWrapper'];\n // eslint-disable-next-line\n actionResolver?: ActionsResolver<any>;\n};\nconst TableMemo: React.FC<WithTestID & TableMemoProps> = React.memo(\n ({ rows, cells, onCollapse, className, sortBy, onSort, rowWrapper, testId, actionResolver }) => {\n const tableActionResolver = React.useCallback(\n (rowData) => actionResolver?.(rowData.obj) as (IAction | ISeparator)[],\n [actionResolver],\n );\n // new prop for @patternfly/react-table 4.67.7 which is used in ACM, but not in OCM\n const newProps = {\n canCollapseAll: false,\n };\n return (\n <InnerScrollContainer>\n <Table\n rows={rows}\n cells={cells}\n onCollapse={onCollapse}\n aria-label=\"Hosts table\"\n className={classnames(className, 'hosts-table')}\n sortBy={sortBy}\n onSort={onSort}\n rowWrapper={rowWrapper}\n data-testid={testId}\n actionResolver={actionResolver ? tableActionResolver : undefined}\n {...newProps}\n >\n <TableHeader />\n <TableBody rowKey={rowKey} />\n </Table>\n </InnerScrollContainer>\n );\n },\n);\nTableMemo.displayName = 'tableMemo';\nconst getMainIndex = (hasOnSelect: boolean, hasExpandComponent: boolean) => {\n if (hasOnSelect && hasExpandComponent) {\n return 2;\n }\n if (hasOnSelect || hasExpandComponent) {\n return 1;\n }\n return 0;\n};\ntype OpenRows = {\n [id: string]: boolean;\n};\nconst HostsTableRowWrapper = (props: RowWrapperProps) => (\n <RowWrapper {...props} data-testid={`host-row-${Number(props.rowProps?.rowIndex)}`} />\n);\nexport type TableRow<R> = {\n header: ICell | string;\n // eslint-disable-next-line\n cell?: (obj: R) => { title: React.ReactNode; props: any; sortableValue?: string | number };\n};\nexport type ActionsResolver<R> = (obj: R) => (IAction | ISeparator)[];\nexport type ExpandComponentProps<R> = {\n obj: R;\n};\n\nconst SelectionProvider = React.createContext<{\n selectedIDs: string[] | undefined;\n allIDs: string[];\n}>({\n selectedIDs: [],\n allIDs: [],\n});\n\ntype SelectCheckboxProps = {\n onSelect: (isChecked: boolean) => void;\n id: string;\n};\nconst SelectCheckbox: React.FC<SelectCheckboxProps> = ({ onSelect, id }) => {\n const { selectedIDs } = React.useContext(SelectionProvider);\n const isChecked = selectedIDs?.includes(id);\n return (\n <Checkbox id={`select-${id}`} onChange={() => onSelect(!isChecked)} isChecked={isChecked} />\n );\n};\n\ntype SelectAllCheckboxProps = {\n onSelect: (isChecked: boolean) => void;\n};\n\nconst SelectAllCheckbox: React.FC<SelectAllCheckboxProps> = ({ onSelect }) => {\n const { allIDs, selectedIDs } = React.useContext(SelectionProvider);\n const isChecked = xor(allIDs, selectedIDs).length === 0;\n return allIDs.length ? (\n <Checkbox id=\"select-all\" onChange={() => onSelect(!isChecked)} isChecked={isChecked} />\n ) : (\n <div />\n );\n};\n\nexport type AITableProps<R> = ReturnType<typeof usePagination> & {\n data: R[];\n content: TableRow<R>[];\n ExpandComponent?: React.ComponentType<ExpandComponentProps<R>>;\n children: React.ReactNode;\n getDataId: (obj: R) => string;\n onSelect?: (obj: R, isSelected: boolean) => void;\n selectedIDs?: string[];\n setSelectedIDs?: (selectedIDs: string[]) => void;\n className?: string;\n actionResolver?: ActionsResolver<R>;\n canSelectAll?: boolean;\n};\n// eslint-disable-next-line\nconst AITable = <R extends any>({\n data,\n testId = 'hosts-table',\n className,\n content,\n ExpandComponent,\n getDataId,\n actionResolver,\n onSelect,\n children,\n selectedIDs,\n setSelectedIDs,\n perPage,\n page,\n onSetPage,\n onPerPageSelect,\n showPagination,\n perPageOptions,\n canSelectAll,\n}: WithTestID & AITableProps<R>) => {\n const itemIDs = React.useMemo(() => data.map(getDataId), [data, getDataId]);\n React.useEffect(() => {\n if (selectedIDs && setSelectedIDs) {\n const idsToRemove: string[] = [];\n selectedIDs.forEach((id) => {\n const matchedData = data.find((d) => getDataId(d) === id);\n if (!matchedData) {\n idsToRemove.push(id);\n }\n });\n if (idsToRemove.length) {\n setSelectedIDs(selectedIDs.filter((id) => !idsToRemove.includes(id)));\n }\n }\n }, [data, setSelectedIDs, selectedIDs, getDataId]);\n const [openRows, setOpenRows] = React.useState<OpenRows>({});\n const [sortBy, setSortBy] = React.useState<ISortBy>({\n index: getMainIndex(!!onSelect, !!ExpandComponent),\n direction: SortByDirection.asc,\n });\n\n const dataRef = React.useRef(data);\n if (dataRef.current !== data) {\n dataRef.current = data;\n }\n const onSelectAll = React.useCallback(\n (isChecked: boolean) => {\n setSelectedIDs?.(isChecked ? dataRef.current.map(getDataId) : []);\n },\n [setSelectedIDs, getDataId],\n );\n\n const [contentWithAdditions, columns] = React.useMemo<[TableRow<R>[], (string | ICell)[]]>(() => {\n let newContent = content;\n if (onSelect) {\n newContent = [\n {\n header: {\n title: canSelectAll ? <SelectAllCheckbox onSelect={onSelectAll} /> : '',\n cellFormatters: [],\n props: {\n style: {\n width: '30px',\n },\n },\n },\n cell: (obj) => {\n const id = getDataId(obj);\n const selectId = `select-${id}`;\n return {\n title: <SelectCheckbox id={id} onSelect={(isChecked) => onSelect(obj, isChecked)} />,\n props: { 'data-testid': selectId },\n };\n },\n },\n ...content,\n ];\n }\n const columns = newContent.map((c) => c.header);\n return [newContent, columns];\n }, [content, onSelect, getDataId, onSelectAll, canSelectAll]);\n\n const hostRows = React.useMemo(() => {\n let rows = (data || [])\n .map<IRow>((obj) => {\n const id = getDataId(obj);\n const cells = contentWithAdditions.filter((c) => !!c.cell).map((c) => c.cell?.(obj));\n const isOpen = !!openRows[id];\n return {\n // visible row\n isOpen,\n cells,\n key: `${id}-master`,\n obj,\n id,\n };\n })\n .sort(\n rowSorter(sortBy, (row, index = 1) =>\n // eslint-disable-next-line\n ExpandComponent ? row.cells?.[index - 1] : (row.cells?.[index] as any),\n ),\n )\n .slice((page - 1) * perPage, page * perPage);\n if (ExpandComponent) {\n rows = rows.reduce((allRows, row: IRow, index) => {\n allRows.push(row);\n if (ExpandComponent) {\n allRows.push({\n // expandable detail\n // parent will be set after sorting\n fullWidth: true,\n cells: [\n {\n // do not render unnecessarily to improve performance\n title: row.isOpen ? <ExpandComponent obj={row.obj as R} /> : undefined,\n },\n ],\n key: `${(row.id as string) || ''}-detail`,\n parent: index * 2,\n });\n }\n return allRows;\n }, [] as IRow[]);\n }\n return rows;\n }, [contentWithAdditions, ExpandComponent, getDataId, data, openRows, sortBy, page, perPage]);\n const rows = React.useMemo(() => {\n if (hostRows.length) {\n return hostRows;\n }\n return getColSpanRow(children, columns.length);\n }, [hostRows, columns, children]);\n const onCollapse = React.useCallback(\n (_event, rowKey: number) => {\n const id = hostRows[rowKey].id as string;\n if (id) {\n setOpenRows(Object.assign({}, openRows, { [id]: !openRows[id] }));\n }\n },\n [hostRows, openRows],\n );\n const onSort: OnSort = React.useCallback((_event, index, direction) => {\n setOpenRows({}); // collapse all\n setSortBy({\n index,\n direction,\n });\n }, []);\n return (\n <>\n <SelectionProvider.Provider\n value={{\n selectedIDs,\n allIDs: itemIDs,\n }}\n >\n <TableMemo\n rows={rows}\n cells={columns}\n onCollapse={ExpandComponent ? onCollapse : undefined}\n className={className}\n sortBy={sortBy}\n onSort={onSort}\n rowWrapper={HostsTableRowWrapper}\n data-testid={testId}\n actionResolver={actionResolver}\n />\n </SelectionProvider.Provider>\n {showPagination && (\n <Pagination\n variant={PaginationVariant.bottom}\n itemCount={itemIDs.length}\n perPage={perPage}\n onPerPageSelect={onPerPageSelect}\n page={page}\n onSetPage={onSetPage}\n perPageOptions={perPageOptions}\n />\n )}\n </>\n );\n};\nexport default AITable;\n", "import React from 'react';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport {\n Table,\n TableHeader,\n TableBody,\n TableVariant,\n RowWrapperProps,\n RowWrapper,\n IRow,\n} from '@patternfly/react-table';\nimport { ExtraParamsType } from '@patternfly/react-table/dist/js/components/Table/base';\nimport { DetailItem, DetailList, DetailListProps } from '../ui';\nimport { Disk, Host, Interface, stringToJSON } from '../../api';\nimport { ValidationsInfo } from '../../types/hosts';\nimport { WithTestID } from '../../types';\nimport { DASH } from '../constants';\nimport { getHostRowHardwareInfo } from './hardwareInfo';\nimport { getHardwareTypeText, getInventory } from './utils';\nimport { ValidationInfoActionProps } from './HostValidationGroups';\nimport NtpValidationStatus from './NtpValidationStatus';\nimport { OnDiskRoleType } from './DiskRole';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport StorageDetail from '../storage/StorageDetail';\nimport SectionTitle from '../ui/SectionTitle';\n\ntype HostDetailProps = {\n host: Host;\n canEditDisks?: (host: Host) => boolean;\n onDiskRole?: OnDiskRoleType;\n AdditionalNTPSourcesDialogToggleComponent?: ValidationInfoActionProps['AdditionalNTPSourcesDialogToggleComponent'];\n hideNTPStatus?: boolean;\n updateDiskSkipFormatting?: (\n shouldFormatDisk: boolean,\n hostId: Host['id'],\n diskId: Disk['id'],\n ) => Promise<unknown>;\n};\n\ntype SectionColumnProps = {\n children: DetailListProps['children'];\n};\n\ntype NicsTableProps = {\n interfaces: Interface[];\n};\n\nconst SectionColumn: React.FC<SectionColumnProps> = ({ children }) => (\n <GridItem span={4}>\n <DetailList>{children}</DetailList>\n </GridItem>\n);\n\nconst nicsColumns = [\n { title: 'Name' },\n { title: 'MAC address' },\n { title: 'IPv4 address' },\n { title: 'IPv6 address' },\n { title: 'Speed' },\n // { title: 'Vendor' }, TODO(mlibra): search HW database for humanized values\n // { title: 'Product' },\n];\n\nconst nicsRowKey = ({ rowData }: ExtraParamsType) => rowData?.name?.title;\n\nconst NICsTableRowWrapper = (props: RowWrapperProps) => (\n <RowWrapper {...props} data-testid={`nic-row:${props.row?.key}`} />\n);\n\nconst NicsTable: React.FC<NicsTableProps & WithTestID> = ({ interfaces, testId }) => {\n const rows: IRow[] = interfaces\n .sort((nicA, nicB) => nicA.name?.localeCompare(nicB.name || '') || 0)\n .map((nic) => ({\n cells: [\n { title: nic.name, props: { 'data-testid': 'nic-name' } },\n { title: nic.macAddress, props: { 'data-testid': 'nic-mac' } },\n {\n title: (nic.ipv4Addresses || []).join(', '),\n props: { 'data-testid': 'nic-ipv4' },\n },\n {\n title: (nic.ipv6Addresses || []).join(', '),\n props: { 'data-testid': 'nic-ipv6' },\n },\n {\n title: nic.speedMbps && nic.speedMbps > 0 ? `${nic.speedMbps} Mbps` : 'N/A',\n props: { 'data-testid': 'nic-speed' },\n },\n ],\n key: nic.name,\n }));\n const { t } = useTranslation();\n return (\n <Table\n data-testid={testId}\n rows={rows}\n cells={nicsColumns}\n variant={TableVariant.compact}\n aria-label={t(\"ai:Host's network interfaces table\")}\n borders={false}\n rowWrapper={NICsTableRowWrapper}\n >\n <TableHeader />\n <TableBody rowKey={nicsRowKey} />\n </Table>\n );\n};\n\nexport const HostDetail = ({\n host,\n canEditDisks,\n onDiskRole,\n AdditionalNTPSourcesDialogToggleComponent,\n hideNTPStatus = false,\n updateDiskSkipFormatting,\n}: HostDetailProps) => {\n const { t } = useTranslation();\n const { id, validationsInfo: hostValidationsInfo } = host;\n const inventory = getInventory(host);\n const validationsInfo = React.useMemo(\n () => stringToJSON<ValidationsInfo>(hostValidationsInfo) || {},\n [hostValidationsInfo],\n );\n const rowInfo = getHostRowHardwareInfo(inventory);\n const nics = inventory.interfaces || [];\n\n let bmcAddress = inventory.bmcAddress;\n if (inventory.bmcV6address) {\n bmcAddress = bmcAddress ? `${bmcAddress}, ${inventory.bmcV6address}` : inventory.bmcV6address;\n }\n bmcAddress = bmcAddress || DASH;\n\n const hardwareType = getHardwareTypeText(inventory, t);\n\n const ntpValidationStatus = React.useMemo(\n () => (\n <NtpValidationStatus\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggleComponent}\n validationsInfo={validationsInfo}\n />\n ),\n [AdditionalNTPSourcesDialogToggleComponent, validationsInfo],\n );\n\n return (\n <Grid hasGutter>\n <SectionTitle testId={'host-details-section'} title=\"Host details\" />\n <SectionColumn>\n <DetailItem testId={'uuid'} title=\"UUID\" value={id} />\n <DetailItem\n testId={'manufacturer'}\n title={t('ai:Manufacturer')}\n value={inventory.systemVendor?.manufacturer || DASH}\n />\n <DetailItem\n testId={'product'}\n title={t('ai:Product')}\n value={inventory.systemVendor?.productName || DASH}\n />\n <DetailItem testId={'serial-number'} title=\"Serial number\" value={rowInfo.serialNumber} />\n </SectionColumn>\n <SectionColumn>\n <DetailItem\n testId={'memory-capacity'}\n title={t('ai:Memory capacity')}\n value={rowInfo.memory.title}\n />\n <DetailItem\n testId={'cpu-model'}\n title={t('ai:CPU model name')}\n value={inventory.cpu?.modelName || DASH}\n />\n <DetailItem\n testId={'cpu-cores-and-clock'}\n title={t('ai:CPU cores and clock speed')}\n value={rowInfo.cpuSpeed}\n />\n <DetailItem\n testId={'cpu-arch'}\n title={t('ai:CPU architecture')}\n value={inventory.cpu?.architecture || DASH}\n />\n </SectionColumn>\n <SectionColumn>\n <DetailItem testId={'hw-type'} title=\"Hardware type\" value={hardwareType} />\n <DetailItem testId={'bmc-address'} title=\"BMC address\" value={bmcAddress} />\n <DetailItem\n testId={'boot-mode'}\n title={t('ai:Boot mode')}\n value={inventory.boot?.currentBootMode || DASH}\n />\n {inventory.boot?.pxeInterface && (\n <DetailItem\n testId={'pxe-interface'}\n title={t('ai:PXE interface')}\n value={inventory.boot?.pxeInterface}\n />\n )}\n <DetailItem\n isHidden={hideNTPStatus}\n testId={'ntp-status'}\n title={t('ai:NTP status')}\n value={ntpValidationStatus}\n />\n </SectionColumn>\n <StorageDetail\n host={host}\n onDiskRole={onDiskRole}\n canEditDisks={canEditDisks}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n />\n <SectionTitle\n testId={'nics-section'}\n title={`${nics.length} NIC${nics.length === 1 ? '' : 's'}`}\n />\n <GridItem>\n <NicsTable interfaces={nics} testId={'nics-table'} />\n </GridItem>\n </Grid>\n );\n};\n", "import React from 'react';\nimport { Validation, ValidationsInfo } from '../../../common/types/hosts';\nimport HostPropertyValidationPopover from './HostPropertyValidationPopover';\nimport { ValidationInfoActionProps } from './HostValidationGroups';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nconst getLabel = (t: TFunction, validationStatus?: Validation['status']) => {\n switch (validationStatus) {\n case 'failure':\n return t('ai:Unreachable');\n case 'success':\n return t('ai:Synced');\n default:\n return t('ai:Not available');\n }\n};\n\ntype NtpValidationsStatusProps = {\n validationsInfo: ValidationsInfo;\n AdditionalNTPSourcesDialogToggleComponent: ValidationInfoActionProps['AdditionalNTPSourcesDialogToggleComponent'];\n};\n\nconst NtpValidationStatus: React.FC<NtpValidationsStatusProps> = ({\n validationsInfo,\n AdditionalNTPSourcesDialogToggleComponent,\n}) => {\n const ntpSyncedValidation = validationsInfo.network?.find((v) => v.id === 'ntp-synced');\n const actions = [];\n if (AdditionalNTPSourcesDialogToggleComponent) {\n actions.push(<AdditionalNTPSourcesDialogToggleComponent key=\"add-ntp-sources\" />);\n }\n const { t } = useTranslation();\n return (\n <HostPropertyValidationPopover\n validation={ntpSyncedValidation}\n failureActions={actions}\n pendingActions={actions}\n showSuccess\n showPending\n >\n {getLabel(t, ntpSyncedValidation?.status)}\n </HostPropertyValidationPopover>\n );\n};\nexport default NtpValidationStatus;\n", "import React from 'react';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport { getInventory, Host } from '../../index';\nimport { OnDiskRoleType } from '../hosts/DiskRole';\nimport { DiskFormattingType } from '../hosts/FormatDiskCheckbox';\nimport DisksTable from './DisksTable';\nimport SectionTitle from '../ui/SectionTitle';\n\ntype StorageDetailProps = {\n host: Host;\n canEditDisks?: (host: Host) => boolean;\n onDiskRole?: OnDiskRoleType;\n updateDiskSkipFormatting?: DiskFormattingType;\n};\n\nconst StorageDetail = ({\n host,\n canEditDisks,\n onDiskRole,\n updateDiskSkipFormatting,\n}: StorageDetailProps) => {\n const inventory = getInventory(host);\n const disks = inventory.disks || [];\n\n return (\n <Grid hasGutter>\n <SectionTitle\n testId={'disks-section'}\n title={`${disks.length} Disk${disks.length === 1 ? '' : 's'}`}\n />\n <GridItem>\n <DisksTable\n testId={'disks-table'}\n canEditDisks={canEditDisks}\n host={host}\n disks={disks}\n installationDiskId={host.installationDiskId}\n onDiskRole={onDiskRole}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n />\n </GridItem>\n </Grid>\n );\n};\n\nexport default StorageDetail;\n", "import React from 'react';\nimport { TextContent, Text, TextVariants, Popover } from '@patternfly/react-core';\nimport {\n Table,\n TableHeader,\n TableBody,\n TableVariant,\n RowWrapperProps,\n RowWrapper,\n IRow,\n} from '@patternfly/react-table';\nimport { ExtraParamsType } from '@patternfly/react-table/dist/js/components/Table/base';\nimport { Disk, fileSize, Host, WithTestID } from '../../index';\nimport DiskRole, { OnDiskRoleType } from '../hosts/DiskRole';\nimport DiskLimitations from '../hosts/DiskLimitations';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\nimport FormatDiskCheckbox, {\n DiskFormattingType,\n isInDiskSkipFormattingList,\n} from '../hosts/FormatDiskCheckbox';\n\ninterface DisksTableProps extends WithTestID {\n canEditDisks?: (host: Host) => boolean;\n onDiskRole?: OnDiskRoleType;\n host: Host;\n disks: Disk[];\n installationDiskId?: string;\n updateDiskSkipFormatting?: DiskFormattingType;\n}\n\nconst diskColumns = [\n { title: 'Name' },\n { title: 'Role' },\n { title: 'Limitations' },\n { title: 'Format?' },\n { title: 'Drive type' },\n { title: 'Size' },\n { title: 'Serial' },\n { title: 'Model' },\n { title: 'WWN' },\n];\n\nconst diskRowKey = ({ rowData }: ExtraParamsType) => rowData?.key as string;\n\nconst DisksTableRowWrapper = (props: RowWrapperProps) => (\n <RowWrapper {...props} data-testid={`disk-row-${(props.row?.key as string) || ''}`} />\n);\n\nconst SkipFormattingDisk = () => (\n <TextContent>\n <Text component={TextVariants.p}>This bootable disk will skip formatting</Text>\n </TextContent>\n);\n\nconst DisksTable = ({\n canEditDisks,\n host,\n disks,\n installationDiskId,\n testId,\n onDiskRole,\n updateDiskSkipFormatting,\n}: DisksTableProps) => {\n const isEditable = !!canEditDisks?.(host);\n\n const rows: IRow[] = [...disks]\n .sort((diskA, diskB) => diskA.name?.localeCompare(diskB.name || '') || 0)\n .map((disk, index) => ({\n cells: [\n {\n title: (\n <>\n {isInDiskSkipFormattingList(host, disk.id) && (\n <Popover bodyContent={<SkipFormattingDisk />} minWidth=\"20rem\" maxWidth=\"30rem\">\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n </Popover>\n )}\n {' '}\n {disk.bootable ? `${disk.name || ''} (bootable)` : disk.name}\n </>\n ),\n props: { 'data-testid': 'disk-name' },\n },\n {\n title: (\n <DiskRole\n host={host}\n disk={disk}\n installationDiskId={installationDiskId}\n isEditable={isEditable}\n onDiskRole={onDiskRole}\n />\n ),\n props: { 'data-testid': 'disk-role' },\n },\n { title: <DiskLimitations disk={disk} />, props: { 'data-testid': 'disk-limitations' } },\n {\n title: (\n <FormatDiskCheckbox\n host={host}\n diskId={disk.id}\n installationDiskId={installationDiskId}\n index={index}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n />\n ),\n props: { 'data-testid': 'disk-formatted' },\n },\n { title: disk.driveType, props: { 'data-testid': 'drive-type' } },\n { title: fileSize(disk.sizeBytes || 0, 2, 'si'), props: { 'data-testid': 'disk-size' } },\n { title: disk.serial, props: { 'data-testid': 'disk-serial' } },\n { title: disk.model, props: { 'data-testid': 'disk-model' } },\n { title: disk.wwn, props: { 'data-testid': 'disk-wwn' } },\n ],\n key: disk.path,\n }));\n\n return (\n <Table\n data-testid={testId}\n rows={rows}\n cells={diskColumns}\n variant={TableVariant.compact}\n aria-label=\"Host's disks table\"\n borders={false}\n rowWrapper={DisksTableRowWrapper}\n >\n <TableHeader />\n <TableBody rowKey={diskRowKey} />\n </Table>\n );\n};\n\nexport default DisksTable;\n", "import React from 'react';\nimport { Dropdown, DropdownItem, DropdownToggle } from '@patternfly/react-core';\nimport { CaretDownIcon } from '@patternfly/react-icons';\nimport { Disk, DiskRole as DiskRoleValue, Host } from '../../api';\nimport { diskRoleLabels } from '../../config';\nimport { useStateSafely } from '../../hooks';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nexport const getCurrentDiskRoleLabel = (\n disk: Disk,\n installationDiskId: Host['installationDiskId'],\n t: TFunction,\n) => (disk.id === installationDiskId ? diskRoleLabels(t).install : diskRoleLabels(t).none);\n\nexport type OnDiskRoleType = (\n hostId: Host['id'],\n diskId: Disk['id'],\n role: DiskRoleValue,\n) => Promise<unknown>;\n\nexport type DiskRoleProps = {\n host: Host;\n disk: Disk;\n installationDiskId: Host['installationDiskId'];\n isEditable: boolean;\n onDiskRole?: OnDiskRoleType;\n};\n\nconst DiskRole: React.FC<DiskRoleProps> = ({\n host,\n disk,\n installationDiskId,\n isEditable,\n onDiskRole,\n}) => {\n const { t } = useTranslation();\n const currentRoleLabel = getCurrentDiskRoleLabel(disk, installationDiskId, t);\n if (isEditable && disk.id !== installationDiskId && onDiskRole) {\n return (\n <DiskRoleDropdown\n host={host}\n disk={disk}\n installationDiskId={installationDiskId}\n onDiskRole={onDiskRole}\n />\n );\n }\n return <>{currentRoleLabel}</>;\n};\n\ntype DiskRoleDropdownProps = {\n host: Host;\n disk: Disk;\n installationDiskId: Host['installationDiskId'];\n onDiskRole: OnDiskRoleType;\n};\n\nconst DiskRoleDropdown: React.FC<DiskRoleDropdownProps> = ({\n host,\n disk,\n installationDiskId,\n onDiskRole,\n}) => {\n const [isOpen, setOpen] = useStateSafely(false);\n const [isDisabled, setDisabled] = useStateSafely(false);\n const { t } = useTranslation();\n const dropdownItems = [\n <DropdownItem\n key=\"install\"\n id=\"install\"\n isDisabled={!disk.installationEligibility?.eligible}\n description={\n !disk.installationEligibility?.eligible && t('ai:Disk is not eligible for installation')\n }\n >\n {diskRoleLabels(t).install}\n </DropdownItem>,\n ];\n\n const onSelect = React.useCallback(\n (event?: React.SyntheticEvent<HTMLDivElement>) => {\n const asyncFunc = async () => {\n if (event?.currentTarget.id) {\n setDisabled(true);\n await onDiskRole(host.id, disk.id, event.currentTarget.id as DiskRoleValue);\n setDisabled(false);\n }\n setOpen(false);\n };\n void asyncFunc();\n },\n [setOpen, setDisabled, onDiskRole, host.id, disk.id],\n );\n\n const currentRoleLabel = getCurrentDiskRoleLabel(disk, installationDiskId, t);\n const toggle = React.useMemo(\n () => (\n <DropdownToggle\n onToggle={(val) => setOpen(val)}\n toggleIndicator={CaretDownIcon}\n isDisabled={isDisabled}\n className=\"pf-c-button pf-m-link pf-m-inline\"\n >\n {currentRoleLabel}\n </DropdownToggle>\n ),\n [setOpen, currentRoleLabel, isDisabled],\n );\n\n return (\n <Dropdown\n onSelect={onSelect}\n dropdownItems={dropdownItems}\n toggle={toggle}\n isOpen={isOpen}\n isPlain\n />\n );\n};\n\nexport default DiskRole;\n", "import React from 'react';\nimport {\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n List,\n ListItem,\n Popover,\n} from '@patternfly/react-core';\nimport { Disk } from '../../api';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype DiskLimitationsProps = {\n disk: Disk;\n};\nconst DiskLimitations: React.FC<DiskLimitationsProps> = ({ disk }) => {\n if (!disk.installationEligibility?.eligible) {\n const limitationsCount = disk.installationEligibility?.notEligibleReasons?.length || 0;\n return (\n <Popover\n headerContent={<div>Disk limitations</div>}\n bodyContent={<DiskLimitationsPopoverContent {...disk.installationEligibility} />}\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n >\n <Button variant={ButtonVariant.link} isInline>\n {limitationsCount}\n </Button>\n </Popover>\n );\n }\n return null;\n};\n\nexport default DiskLimitations;\n\ntype DiskLimitationsPopoverContentProps = {\n eligible?: boolean;\n notEligibleReasons?: string[];\n};\n\nconst DiskLimitationsPopoverContent: React.FC<DiskLimitationsPopoverContentProps> = ({\n eligible,\n notEligibleReasons,\n}) => {\n const alerts = [];\n const { t } = useTranslation();\n if (!eligible) {\n alerts.push(\n <Alert\n key=\"install-eligibility\"\n variant={AlertVariant.warning}\n title={t('ai:Disk is not eligible for installation')}\n isInline\n >\n {notEligibleReasons && (\n <List>\n {notEligibleReasons.map((reason: string) => (\n <ListItem key={reason}>{reason}</ListItem>\n ))}\n </List>\n )}\n </Alert>,\n );\n }\n return <>{alerts}</>;\n};\n", "import React from 'react';\nimport { Checkbox, Tooltip } from '@patternfly/react-core';\nimport { Disk, Host } from '../../api';\nimport { trimCommaSeparatedList } from '../..';\n\nexport type DiskFormattingType = (\n shouldFormatDisk: boolean,\n hostId: Host['id'],\n diskId: Disk['id'],\n) => void;\n\ntype FormatDiskProps = {\n host: Host;\n index: number;\n updateDiskSkipFormatting?: DiskFormattingType;\n diskId?: string;\n installationDiskId?: string;\n};\n\nexport const isInstallationDisk = (diskId?: string, installationDiskId?: string) =>\n diskId === installationDiskId;\n\nexport const isInDiskSkipFormattingList = (host: Host, diskId: string | undefined) => {\n return (\n trimCommaSeparatedList(host.skipFormattingDisks ? host.skipFormattingDisks : '')\n .split(',')\n .filter((diskSkipFormatting) => diskSkipFormatting === diskId).length > 0\n );\n};\nexport const isInDiskToBeFormattedList = (host: Host, diskId: string | undefined) => {\n return (\n trimCommaSeparatedList(host.disksToBeFormatted ? host.disksToBeFormatted : '')\n .split(',')\n .filter((diskToBeFormatted) => diskToBeFormatted === diskId).length > 0\n );\n};\n\nconst isInvalidInstallationDisk = (\n host: Host,\n diskId: string | undefined,\n installationDiskId: Host['installationDiskId'],\n) => {\n // If it's an installation disk that somehow is set to skip formatting, enable the checkbox to let the user fix it\n if (isInstallationDisk(diskId, installationDiskId)) {\n return isInDiskSkipFormattingList(host, diskId);\n }\n return false;\n};\n\nexport const isFormatDiskChecked = (\n host: Host,\n diskId: string | undefined,\n installationDiskId: Host['installationDiskId'],\n) => {\n if (isInstallationDisk(diskId, installationDiskId)) {\n return !isInDiskSkipFormattingList(host, diskId);\n }\n return isInDiskToBeFormattedList(host, diskId) && !isInDiskSkipFormattingList(host, diskId);\n};\n\nexport const isFormatDiskDisabled = (\n host: Host,\n diskId: string | undefined,\n installationDiskId: Host['installationDiskId'],\n) => {\n if (isInstallationDisk(diskId, installationDiskId)) {\n // If it's an installation disk that somehow is set to skip formatting, enable the checkbox to let the user fix it\n return !isInvalidInstallationDisk(host, diskId, installationDiskId);\n }\n return !isInDiskToBeFormattedList(host, diskId);\n};\n\nconst onSelectFormattingDisk = (\n shouldFormatDisk: boolean,\n hostId: string,\n diskId?: string,\n updateDiskSkipFormatting?: DiskFormattingType,\n) => {\n updateDiskSkipFormatting ? updateDiskSkipFormatting(shouldFormatDisk, hostId, diskId) : '';\n};\n\nconst FormatDiskCheckbox = ({\n host,\n diskId,\n installationDiskId,\n index,\n updateDiskSkipFormatting,\n}: FormatDiskProps) => {\n return (\n <Tooltip\n hidden={!isInstallationDisk(diskId, installationDiskId)}\n content={'Installation disks are always being formatted'}\n >\n <Checkbox\n id={`select-formatted-${host.id}-${index}`}\n isChecked={isFormatDiskChecked(host, diskId, installationDiskId)}\n isDisabled={isFormatDiskDisabled(host, diskId, installationDiskId)}\n onChange={(checked: boolean) =>\n onSelectFormattingDisk(checked, host.id, diskId, updateDiskSkipFormatting)\n }\n />\n </Tooltip>\n );\n};\nexport default FormatDiskCheckbox;\n", "import React from 'react';\nimport { TextContent, Text, TextVariants, GridItem } from '@patternfly/react-core';\nimport { WithTestID } from '../../types';\n\ninterface SectionTitleProps extends WithTestID {\n title: string;\n}\n\nconst SectionTitle = ({ title, testId }: SectionTitleProps) => (\n <GridItem>\n <TextContent>\n <Text data-testid={testId} component={TextVariants.h3}>\n {title}\n </Text>\n </TextContent>\n </GridItem>\n);\n\nexport default SectionTitle;\n", "import React from 'react';\nimport { Modal, ModalVariant, Button, ButtonVariant } from '@patternfly/react-core';\n\ntype ResetHostModalProps = {\n hostname?: string;\n isOpen: boolean;\n onClose: () => void;\n onReset: () => void;\n};\n\nconst ResetHostModal: React.FC<ResetHostModalProps> = ({ isOpen, hostname, onClose, onReset }) => (\n <Modal\n title=\"Reset Host\"\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n actions={[\n <Button\n data-testid=\"reset-host-submit\"\n key=\"confirm\"\n variant={ButtonVariant.danger}\n onClick={onReset}\n >\n Reset\n </Button>,\n <Button key=\"cancel\" variant={ButtonVariant.link} onClick={onClose}>\n Cancel\n </Button>,\n ]}\n >\n Are you sure you want to reset host{` ${hostname || ''}`} ?\n </Modal>\n);\n\nexport default ResetHostModal;\n", "import React from 'react';\nimport { Modal, ModalVariant, Button, ButtonVariant } from '@patternfly/react-core';\n\ntype DeleteHostModalProps = {\n hostname?: string;\n isOpen: boolean;\n onClose: () => void;\n onDelete: () => void;\n};\n\nconst DeleteHostModal = ({ isOpen, hostname, onClose, onDelete }: DeleteHostModalProps) => (\n <Modal\n title=\"Delete Host\"\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n actions={[\n <Button\n data-testid=\"delete-host-submit\"\n key=\"confirm\"\n variant={ButtonVariant.danger}\n onClick={onDelete}\n >\n Delete\n </Button>,\n <Button key=\"cancel\" variant={ButtonVariant.link} onClick={onClose}>\n Cancel\n </Button>,\n ]}\n >\n Are you sure you want to delete host{` ${hostname || ''}`} ?\n </Modal>\n);\n\nexport default DeleteHostModal;\n", "import { EventListFetchProps } from '../../../common';\nimport { handleApiError } from '../../api';\nimport { EventsAPI } from '../../services/apis';\n\nexport const onFetchEvents: EventListFetchProps['onFetchEvents'] = async (\n props,\n onSuccess,\n onError,\n) => {\n try {\n const { data } = await EventsAPI.list(props);\n onSuccess(data);\n } catch (error) {\n handleApiError(error, () => {\n onError('Failed to load events');\n });\n }\n};\n", "import React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport UpdateDay2ApiVipForm, { UpdateDay2ApiVipFormProps } from './UpdateDay2ApiVipForm';\n\ntype UpdateDay2ApiVipModalProps = {\n isOpen: boolean;\n} & UpdateDay2ApiVipFormProps;\n\nconst UpdateDay2ApiVipModal: React.FC<UpdateDay2ApiVipModalProps> = ({ isOpen, ...props }) => (\n <Modal\n aria-label=\"Update cluster hostname\"\n title=\"Update cluster hostname\"\n isOpen={isOpen}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n >\n <UpdateDay2ApiVipForm {...props} />\n </Modal>\n);\n\nexport default UpdateDay2ApiVipModal;\n", "import React from 'react';\nimport * as Yup from 'yup';\nimport {\n Button,\n ButtonVariant,\n ButtonType,\n Form,\n ModalBoxBody,\n ModalBoxFooter,\n AlertVariant,\n Alert,\n AlertActionCloseButton,\n} from '@patternfly/react-core';\nimport { Formik } from 'formik';\nimport { day2ApiVipValidationSchema, InputField } from '../../../common/components/ui';\nimport GridGap from '../../../common/components/ui/GridGap';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type UpdateDay2ApiVipFormProps = {\n onClose: () => void;\n onUpdateDay2ApiVip: (apiVip: string, onError: (message: string) => void) => Promise<void>;\n currentApiVip?: string;\n};\n\nexport type UpdateDay2ApiVipValues = {\n apiVip?: string;\n};\n\ntype StatusErrorType = { error?: { message?: string; title?: string } | null };\n\nconst UpdateDay2ApiVipForm: React.FC<UpdateDay2ApiVipFormProps> = ({\n onUpdateDay2ApiVip,\n onClose,\n currentApiVip: originApiVip,\n}) => {\n const { t } = useTranslation();\n\n const apiVipInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n apiVipInputRef.current?.focus();\n apiVipInputRef.current?.select();\n }, []);\n const initialValues = {\n apiVip: originApiVip,\n };\n const validationSchema = React.useMemo(\n () =>\n Yup.object().shape({\n apiVip: day2ApiVipValidationSchema.required(t('ai:Required field')),\n }),\n [t],\n );\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={validationSchema}\n initialStatus={{ error: null }}\n onSubmit={async (values, formikHelpers) => {\n if (values.apiVip) {\n const onError = (message: string) => {\n const error: StatusErrorType = {\n error: {\n title: 'Failed to update API IP',\n message,\n },\n };\n formikHelpers.setStatus(error);\n };\n await onUpdateDay2ApiVip(values.apiVip, onError);\n onClose();\n }\n }}\n >\n {({ handleSubmit, status, setStatus, isSubmitting, isValid, dirty }) => {\n const { error } = status as unknown as StatusErrorType;\n\n return (\n <Form onSubmit={handleSubmit}>\n <ModalBoxBody>\n <GridGap>\n {error && (\n <Alert\n variant={AlertVariant.danger}\n title={error.title}\n actionClose={\n <AlertActionCloseButton onClose={() => setStatus({ error: null })} />\n }\n isInline\n >\n {error.message}\n </Alert>\n )}\n <InputField\n label=\"Set the IP or domain used to reach the cluster\"\n name=\"apiVip\"\n ref={apiVipInputRef}\n isRequired\n />\n </GridGap>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n key=\"submit\"\n type={ButtonType.submit}\n isDisabled={isSubmitting || !isValid || !dirty}\n >\n Update\n </Button>\n <Button key=\"cancel\" variant={ButtonVariant.link} onClick={onClose}>\n Cancel\n </Button>\n </ModalBoxFooter>\n </Form>\n );\n }}\n </Formik>\n );\n};\n\nexport default UpdateDay2ApiVipForm;\n", "import { sortable } from '@patternfly/react-table';\nimport React from 'react';\nimport {\n areOnlySoftValidationsOfWizardStepFailing,\n getWizardStepHostStatus,\n getWizardStepHostValidationsInfo,\n Host,\n HostsTableActions,\n hostStatus,\n HostStatus,\n stringToJSON,\n} from '../../../common';\nimport { TableRow } from '../../../common/components/hosts/AITable';\nimport { ValidationsInfo } from '../../../common/types/hosts';\nimport { wizardStepsValidationsMap } from '../clusterWizard/wizardTransition';\nimport { AdditionalNTPSourcesDialogToggle } from './AdditionaNTPSourceDialogToggle';\n\ntype HardwareStatusProps = {\n host: Host;\n validationsInfo: ValidationsInfo;\n onEditHostname?: () => void;\n isWithinModal?: boolean;\n};\n\nconst DELETE_MODAL_STATUS_Z_INDEX = 500;\n\nconst HardwareStatus = (props: HardwareStatusProps) => {\n const hardwareStatus = getWizardStepHostStatus(\n 'host-discovery',\n wizardStepsValidationsMap,\n props.host,\n );\n const status = hostStatus[hardwareStatus];\n const validationsInfo = getWizardStepHostValidationsInfo(\n props.validationsInfo,\n 'host-discovery',\n wizardStepsValidationsMap,\n );\n const sublabel = areOnlySoftValidationsOfWizardStepFailing(\n validationsInfo,\n 'host-discovery',\n wizardStepsValidationsMap,\n )\n ? 'Some validations failed'\n : undefined;\n\n return (\n <HostStatus\n {...props}\n zIndex={props.isWithinModal ? DELETE_MODAL_STATUS_Z_INDEX : undefined}\n status={{ ...status, sublabel }}\n validationsInfo={validationsInfo}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n />\n );\n};\n\nexport const hardwareStatusColumn = ({\n onEditHostname,\n isWithinModal,\n}: {\n onEditHostname?: HostsTableActions['onEditHost'];\n isWithinModal?: boolean;\n}): TableRow<Host> => {\n return {\n header: {\n title: 'Status',\n props: {\n id: 'col-header-hwstatus',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const validationsInfo = stringToJSON<ValidationsInfo>(host.validationsInfo) || {};\n const editHostname = onEditHostname ? () => onEditHostname(host) : undefined;\n return {\n title: (\n <HardwareStatus\n host={host}\n onEditHostname={editHostname}\n validationsInfo={validationsInfo}\n isWithinModal={isWithinModal}\n />\n ),\n props: { 'data-testid': 'host-hw-status' },\n sortableValue: status,\n };\n },\n };\n};\n\nexport default { HardwareStatus, hardwareStatusColumn };\n", "import {\n Cluster,\n findValidationStep,\n getAllClusterWizardSoftValidationIds,\n getWizardStepClusterStatus,\n Host,\n HostValidationId,\n stringToJSON,\n WizardStepsValidationMap,\n WizardStepValidationMap,\n} from '../../../common';\nimport { Day2WizardStepsType } from '../AddHosts/day2Wizard/constants';\nimport { StaticIpInfo, StaticIpView } from '../clusterConfiguration/staticIp/data/dataTypes';\nimport {\n ValidationsInfo as HostValidationsInfo,\n Validation as HostValidation,\n} from '../../../common/types/hosts';\n\nexport type ClusterWizardStepsType =\n | 'cluster-details'\n | 'static-ip-yaml-view'\n | 'static-ip-network-wide-configurations'\n | 'static-ip-host-configurations'\n | 'operators'\n | 'host-discovery'\n | 'storage'\n | 'networking'\n | 'review';\n\nexport const ClusterWizardFlowStateNew = 'new';\nexport type ClusterWizardFlowStateType = Cluster['status'] | typeof ClusterWizardFlowStateNew;\n\nexport const getClusterWizardFirstStep = (\n locationState: ClusterWizardFlowStateType | undefined,\n staticIpInfo: StaticIpInfo | undefined,\n state?: ClusterWizardFlowStateType,\n hosts?: Host[] | undefined,\n): ClusterWizardStepsType => {\n // Move to operators just the first time after the cluster is created\n if (locationState === ClusterWizardFlowStateNew && !staticIpInfo) {\n return 'operators';\n }\n\n if (staticIpInfo && !staticIpInfo.isDataComplete) {\n if (staticIpInfo.view === StaticIpView.YAML) {\n return 'static-ip-yaml-view';\n }\n return 'static-ip-network-wide-configurations';\n }\n switch (state) {\n case 'ready':\n return 'review';\n case 'pending-for-input':\n case 'adding-hosts':\n case 'insufficient':\n return getStepForFailingHostValidations(hosts);\n default:\n return 'cluster-details';\n }\n};\n\nconst getStepForFailingHostValidations = (hosts: Host[] | undefined) => {\n const failingValidations: HostValidationId[] = getHostFailingValidationIds(hosts);\n const minimumStep = 'host-discovery';\n let step;\n for (const failingValidationId of failingValidations) {\n step = findValidationStep<string>(failingValidationId, wizardStepsValidationsMap, minimumStep);\n if (step !== undefined) {\n break;\n }\n }\n return (step || minimumStep) as ClusterWizardStepsType;\n};\n\nconst getHostFailingValidationIds = (hosts: Host[] | undefined) => {\n const failingValidations: HostValidationId[] = [];\n hosts?.forEach((host) => {\n const validationsInfo = stringToJSON<HostValidationsInfo>(host.validationsInfo) || {};\n Object.keys(validationsInfo).forEach((group) => {\n const f: (validation: HostValidation) => void = (validation) => {\n if (validation.status === 'failure') {\n failingValidations.push(validation.id);\n }\n };\n validationsInfo[group].forEach(f);\n });\n });\n return failingValidations;\n};\n\ntype TransitionProps = { cluster: Cluster };\n\nconst buildEmptyValidationsMap = (): WizardStepValidationMap => ({\n cluster: {\n groups: [],\n validationIds: [],\n },\n host: {\n allowedStatuses: [],\n groups: [],\n validationIds: [],\n },\n softValidationIds: [],\n});\n\nconst staticIpValidationsMap = buildEmptyValidationsMap();\nconst operatorsStepValidationsMap = buildEmptyValidationsMap();\n\nconst clusterDetailsStepValidationsMap: WizardStepValidationMap = {\n cluster: {\n groups: [],\n validationIds: ['pull-secret-set', 'dns-domain-defined'],\n },\n host: {\n allowedStatuses: [],\n groups: [],\n validationIds: [],\n },\n softValidationIds: [],\n};\n\nconst hostDiscoveryStepValidationsMap: WizardStepValidationMap = {\n cluster: {\n groups: [],\n validationIds: [\n 'sufficient-masters-count',\n 'lso-requirements-satisfied',\n 'odf-requirements-satisfied',\n 'lvm-requirements-satisfied',\n 'cnv-requirements-satisfied',\n ],\n },\n host: {\n allowedStatuses: ['known', 'disabled'],\n groups: ['hardware'],\n validationIds: [\n 'connected',\n 'media-connected',\n 'lso-requirements-satisfied',\n 'odf-requirements-satisfied',\n 'lvm-requirements-satisfied',\n 'cnv-requirements-satisfied',\n ],\n },\n softValidationIds: ['no-skip-installation-disk', 'no-skip-missing-disk'],\n};\n\nconst storageStepValidationsMap: WizardStepValidationMap = {\n cluster: {\n groups: [],\n validationIds: ['sufficient-masters-count'],\n },\n host: {\n allowedStatuses: ['known', 'disabled'],\n groups: ['hardware'],\n validationIds: [\n 'connected',\n 'media-connected',\n 'no-skip-installation-disk',\n 'no-skip-missing-disk',\n ],\n },\n softValidationIds: [],\n};\n\nconst networkingStepValidationsMap: WizardStepValidationMap = {\n cluster: {\n groups: ['network'],\n validationIds: [],\n },\n host: {\n allowedStatuses: ['known', 'disabled'],\n groups: ['network'],\n validationIds: [],\n },\n // TODO(jtomasek): container-images-available validation is currently not running on the backend, it stays in pending.\n // marking it as soft validation is the easy way to prevent it from blocking the progress.\n // Alternatively we would have to whitelist network validations instead of using group\n // TODO(mlibra): remove that container-images-available from soft validations and let backend drive it via disabling it.\n // Depends on: https://issues.redhat.com/browse/MGMT-5265\n softValidationIds: ['ntp-synced', 'container-images-available'],\n};\n\nconst reviewStepValidationsMap: WizardStepValidationMap = {\n cluster: {\n groups: [],\n validationIds: ['all-hosts-are-ready-to-install'],\n },\n host: {\n allowedStatuses: ['known', 'disabled'],\n groups: [],\n validationIds: [],\n },\n softValidationIds: [],\n};\n\nexport const wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType> = {\n 'cluster-details': clusterDetailsStepValidationsMap,\n 'static-ip-yaml-view': staticIpValidationsMap,\n 'static-ip-network-wide-configurations': staticIpValidationsMap,\n 'static-ip-host-configurations': staticIpValidationsMap,\n operators: operatorsStepValidationsMap,\n 'host-discovery': hostDiscoveryStepValidationsMap,\n storage: storageStepValidationsMap,\n networking: networkingStepValidationsMap,\n review: reviewStepValidationsMap,\n};\n\nexport const allClusterWizardSoftValidationIds =\n getAllClusterWizardSoftValidationIds(wizardStepsValidationsMap);\n\n/*\nWe are colocating all these canNext* functions for easier maintenance.\nHowever transitions among steps should be independent on each other.\n*/\nexport const canNextClusterDetails = ({ cluster }: TransitionProps): boolean =>\n getWizardStepClusterStatus(\n 'cluster-details',\n wizardStepsValidationsMap,\n cluster,\n cluster.hosts,\n ) === 'ready';\n\nexport const canNextHostDiscovery = ({ cluster }: TransitionProps): boolean =>\n getWizardStepClusterStatus(\n 'host-discovery',\n wizardStepsValidationsMap,\n cluster,\n cluster.hosts,\n ) === 'ready';\n\nexport const canNextStorage = ({ cluster }: TransitionProps): boolean =>\n getWizardStepClusterStatus('storage', wizardStepsValidationsMap, cluster, cluster.hosts) ===\n 'ready';\n\nexport const canNextOperators = ({ cluster }: TransitionProps): boolean =>\n getWizardStepClusterStatus('operators', wizardStepsValidationsMap, cluster, cluster.hosts) ===\n 'ready';\n\nexport const canNextNetwork = ({ cluster }: TransitionProps): boolean =>\n getWizardStepClusterStatus('networking', wizardStepsValidationsMap, cluster, cluster.hosts) ===\n 'ready';\n\nexport const isStaticIpStep = (stepId: ClusterWizardStepsType | Day2WizardStepsType) => {\n return stepId.startsWith('static-ip');\n};\n", "import React from 'react';\nimport { ConnectedIcon } from '@patternfly/react-icons';\nimport { pluralize } from 'humanize-plus';\nimport EmptyState from '../../../common/components/ui/uiState/EmptyState';\nimport HostsDiscoveryTroubleshootingInfoLinkWithModal from './HostsDiscoveryTroubleshootingInfoLinkWithModal';\n\nexport interface HostsTableEmptyStateProps {\n isSingleNode?: boolean;\n}\n\nconst HostsTableEmptyState = ({ isSingleNode = false }: HostsTableEmptyStateProps) => {\n return (\n <EmptyState\n icon={ConnectedIcon}\n title={`Waiting for ${pluralize(+isSingleNode, 'host')}...`}\n content=\"Hosts may take a few minutes to appear here after booting.\"\n secondaryActions={[\n <HostsDiscoveryTroubleshootingInfoLinkWithModal key={'hosts-not-showing'} />,\n ]}\n />\n );\n};\n\nexport default HostsTableEmptyState;\n", "import React from 'react';\nimport InfoLinkWithModal from '../ui/InfoLinkWithModal';\nimport { pluralize } from 'humanize-plus';\nimport { DiscoveryTroubleshootingModalContent } from '../../../common';\n\nexport interface HostsDiscoveryTroubleshootingInfoLinkWithModalProps {\n isSingleNode?: boolean;\n}\n\nconst HostsDiscoveryTroubleshootingInfoLinkWithModal = ({\n isSingleNode = false,\n}: HostsDiscoveryTroubleshootingInfoLinkWithModalProps) => {\n return (\n <InfoLinkWithModal\n linkText={`${pluralize(+isSingleNode, 'Host')} not showing up?`}\n modalTitle={'Troubleshooting Host Discovery Issues'}\n modalVariant={'large'}\n >\n <DiscoveryTroubleshootingModalContent />\n </InfoLinkWithModal>\n );\n};\n\nexport default HostsDiscoveryTroubleshootingInfoLinkWithModal;\n", "import React from 'react';\nimport { Button, ButtonVariant, Modal, ModalProps } from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { SVGIconProps } from '@patternfly/react-icons/dist/js/createIcon';\n\nexport interface InfoLinkWithModalProps {\n linkText: string;\n infoCircleSize?: SVGIconProps['size'];\n modalTitle: string;\n modalVariant?: ModalProps['variant'];\n}\n\nconst InfoLinkWithModal = ({\n linkText,\n infoCircleSize = 'sm',\n modalTitle,\n modalVariant = 'medium',\n children,\n}: React.PropsWithChildren<InfoLinkWithModalProps>) => {\n const [isModalOpen, setModalOpen] = React.useState(false);\n const handleModalClose = React.useCallback(() => setModalOpen(false), []);\n const handleLinkClick = React.useCallback(() => setModalOpen(true), []);\n\n return (\n <>\n <Button variant={ButtonVariant.link} onClick={handleLinkClick} isInline>\n <InfoCircleIcon size={infoCircleSize} /> {linkText}\n </Button>\n <Modal\n title={modalTitle}\n isOpen={isModalOpen}\n actions={[\n <Button key=\"close\" variant={ButtonVariant.primary} onClick={handleModalClose}>\n Close\n </Button>,\n ]}\n onClose={handleModalClose}\n variant={modalVariant}\n >\n {children}\n </Modal>\n </>\n );\n};\n\nexport default InfoLinkWithModal;\n", "import React from 'react';\nimport { AlertActionLink } from '@patternfly/react-core';\nimport { useModalDialogsContext } from './ModalDialogsContext';\n\nexport const UpdateDay2ApiVipDialogToggle: React.FC = () => {\n const {\n UpdateDay2ApiVipDialog: { open },\n } = useModalDialogsContext();\n\n return (\n <>\n Check your DNS and network configuration, or{' '}\n <AlertActionLink onClick={() => open()} isInline>\n set the IP or domain used to reach the cluster.\n </AlertActionLink>\n </>\n );\n};\n", "import React from 'react';\nimport { OnDiskRoleType } from './DiskRole';\nimport { HostsTableActions } from './types';\n\ntype HostsTableDetailContextValue = {\n onDiskRole: OnDiskRoleType | undefined;\n canEditDisks: HostsTableActions['canEditDisks'];\n updateDiskSkipFormatting?: HostsTableActions['updateSkipFormatting'];\n};\n\nconst HostsTableDetailContext = React.createContext<HostsTableDetailContextValue | undefined>(\n undefined,\n);\n\nconst HostsTableDetailContextProvider: React.FC<HostsTableDetailContextValue> = ({\n canEditDisks,\n onDiskRole,\n updateDiskSkipFormatting,\n children,\n}) => {\n const context = {\n canEditDisks,\n onDiskRole,\n updateDiskSkipFormatting,\n };\n\n return (\n <HostsTableDetailContext.Provider value={context as HostsTableDetailContextValue}>\n {children}\n </HostsTableDetailContext.Provider>\n );\n};\n\nconst useHostsTableDetailContext = () => {\n const context = React.useContext(HostsTableDetailContext);\n if (context === undefined) {\n throw new Error(\n 'useHostTableDetailContext must be used within a HostsTableDetailContextProvider',\n );\n }\n return context;\n};\n\nexport { HostsTableDetailContextProvider, useHostsTableDetailContext };\n", "import React from 'react';\nimport { ToolbarContent, Toolbar, ActionGroup } from '@patternfly/react-core';\nimport './ClusterToolbar.css';\n\ninterface Props {\n validationSection?: React.ReactNode;\n}\n\nconst ClusterToolbar: React.FC<Props> = ({ children, validationSection }) => (\n <>\n {validationSection}\n <ActionGroup>\n <Toolbar id=\"cluster-toolbar\" className=\"cluster-toolbar\">\n <ToolbarContent className=\"cluster-toolbar__content\">{children}</ToolbarContent>\n </Toolbar>\n </ActionGroup>\n </>\n);\n\nexport default ClusterToolbar;\n", "import React from 'react';\nimport { GridItem, TextContent, Text } from '@patternfly/react-core';\nimport {\n Cluster,\n DetailList,\n DetailItem,\n DiskEncryption,\n PopoverIcon,\n NETWORK_TYPE_SDN,\n isDualStack,\n selectIpv4Cidr,\n selectIpv6Cidr,\n selectIpv4HostPrefix,\n selectIpv6HostPrefix,\n useFeatureSupportLevel,\n} from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { ClusterFeatureSupportLevelsDetailItem } from '../featureSupportLevels';\nimport OpenShiftVersionDetail from './OpenShiftVersionDetail';\n\nconst CpuArchTitle = ({ isMultiArchSupported }: { isMultiArchSupported: boolean }) => {\n let stringCpuArch: string;\n isMultiArchSupported\n ? (stringCpuArch =\n 'The original cluster hosts CPU architecture. You can add hosts that are using either x86 or arm64 CPU architecture to this cluster.')\n : (stringCpuArch = 'The original cluster hosts CPU architecture.');\n return (\n <>\n {'CPU architecture '}\n <PopoverIcon bodyContent={<p>{stringCpuArch}</p>} />\n </>\n );\n};\n\ntype ClusterPropertiesProps = {\n cluster: Cluster;\n externalMode?: boolean;\n};\n\nconst getNetworkType = (clusterNetworkType: Cluster['networkType']): string => {\n let networkType: string;\n clusterNetworkType === NETWORK_TYPE_SDN\n ? (networkType = 'Software-Defined Networking (SDN)')\n : (networkType = 'Open Virtual Network (OVN)');\n return networkType;\n};\n\nconst getManagementType = (isUserManagementType: boolean | undefined): string => {\n let managementType: string;\n isUserManagementType\n ? (managementType = 'User-Managed Networking')\n : (managementType = 'Cluster-managed networking');\n return managementType;\n};\n\nconst getDiskEncryptionEnabledOnStatus = (diskEncryption: DiskEncryption['enableOn']) => {\n let diskEncryptionType = null;\n switch (diskEncryption) {\n case 'all':\n diskEncryptionType = (\n <>\n Enabled on control plane nodes\n <br />\n Enabled on workers\n </>\n );\n break;\n case 'masters':\n diskEncryptionType = <>Enabled on control plane nodes</>;\n break;\n case 'workers':\n diskEncryptionType = <>Enabled on workers</>;\n break;\n }\n return diskEncryptionType;\n};\n\nconst ClusterProperties = ({ cluster, externalMode = false }: ClusterPropertiesProps) => {\n const { t } = useTranslation();\n const isDualStackType = isDualStack(cluster);\n const featureSupportLevelContext = useFeatureSupportLevel();\n\n const isMultiArchSupported = Boolean(\n cluster.cpuArchitecture === 'multi' ||\n (cluster.openshiftVersion &&\n featureSupportLevelContext.getFeatureSupportLevel(\n cluster.openshiftVersion,\n 'MULTIARCH_RELEASE_IMAGE',\n ) === 'supported'),\n );\n return (\n <>\n {!externalMode && (\n <GridItem>\n <TextContent>\n <Text component=\"h2\">{t('ai:Cluster Details')}</Text>\n </TextContent>\n </GridItem>\n )}\n <GridItem md={6} data-testid=\"cluster-details\">\n <DetailList>\n {externalMode ? undefined : <OpenShiftVersionDetail cluster={cluster} />}\n <DetailItem title=\"Base domain\" value={cluster.baseDnsDomain} testId=\"base-dns-domain\" />\n <DetailItem\n title={<CpuArchTitle isMultiArchSupported={isMultiArchSupported} />}\n value={cluster.cpuArchitecture}\n testId=\"cpu-architecture\"\n />\n <DetailItem\n title=\"API IP\"\n value={cluster.apiVip}\n isHidden={!cluster.apiVip}\n testId=\"api-vip\"\n />\n <DetailItem\n title=\"Ingress IP\"\n value={cluster.ingressVip}\n isHidden={!cluster.ingressVip}\n testId=\"ingress-vip\"\n />\n <DetailItem\n title=\"Network management type\"\n value={getManagementType(cluster.userManagedNetworking)}\n testId=\"network-management-type\"\n />\n <DetailItem\n title=\"Networking Type\"\n value={getNetworkType(cluster.networkType)}\n testId=\"networking-type\"\n />\n </DetailList>\n </GridItem>\n <GridItem md={6}>\n <DetailList>\n <DetailItem\n title=\"Cluster network CIDR (IPv4)\"\n value={selectIpv4Cidr(cluster, 'clusterNetworks')}\n testId=\"cluster-network-cidr-ipv4\"\n />\n <DetailItem\n title=\"Cluster network host prefix (IPv4)\"\n value={selectIpv4HostPrefix(cluster)}\n testId=\"host-prefix-ipv4\"\n />\n {isDualStackType ? (\n <>\n <DetailItem\n title=\"Cluster network CIDR (IPv6)\"\n value={selectIpv6Cidr(cluster, 'clusterNetworks')}\n testId=\"cluster-network-cidr-ipv6\"\n />\n <DetailItem\n title=\"Cluster network host prefix (IPv6)\"\n value={selectIpv6HostPrefix(cluster)}\n testId=\"host-prefix-ipv6\"\n />\n </>\n ) : undefined}\n <DetailItem\n title=\"Service network CIDR (IPv4)\"\n value={selectIpv4Cidr(cluster, 'serviceNetworks')}\n testId=\"service-network-cidr-ipv4\"\n />\n {isDualStackType ? (\n <DetailItem\n title=\"Service network CIDR (IPv6)\"\n value={selectIpv6Cidr(cluster, 'serviceNetworks')}\n testId=\"service-network-cidr-ipv6\"\n />\n ) : undefined}\n <DetailItem\n title=\"Disk encryption\"\n value={getDiskEncryptionEnabledOnStatus(cluster.diskEncryption?.enableOn)}\n isHidden={cluster.diskEncryption?.enableOn === 'none'}\n testId=\"disk-encryption\"\n />\n <ClusterFeatureSupportLevelsDetailItem cluster={cluster} />\n </DetailList>\n </GridItem>\n </>\n );\n};\nexport default ClusterProperties;\n", "import useSWR from 'swr';\nimport React, { PropsWithChildren } from 'react';\nimport * as Sentry from '@sentry/browser';\nimport {\n FeatureSupportLevelsMap,\n FeatureIdToSupportLevel,\n FeatureId,\n SupportLevel,\n FeatureSupportLevels,\n Cluster,\n} from '../../../common';\nimport {\n FeatureSupportLevelContextProvider,\n FeatureSupportLevelData,\n} from '../../../common/components/featureSupportLevels';\nimport { handleApiError } from '../../api';\nimport { FeatureSupportLevelsAPI } from '../../services/apis';\nimport { captureException } from '../../sentry';\nimport { useOpenshiftVersions } from '../../hooks';\nimport { getFeatureDisabledReason, isFeatureSupported } from './featureStateUtils';\n\nexport type SupportLevelProviderProps = PropsWithChildren<{\n clusterFeatureUsage?: string;\n openshiftVersion?: string;\n loadingUi: React.ReactNode;\n cluster?: Cluster;\n}>;\n\nconst getFeatureSupportLevelsMap = (\n featureSupportLevels: FeatureSupportLevels,\n): FeatureSupportLevelsMap => {\n try {\n const featureSupportLevelsMap: FeatureSupportLevelsMap = {};\n for (const { openshiftVersion, features } of featureSupportLevels) {\n if (!openshiftVersion || !features) {\n continue;\n }\n featureSupportLevelsMap[openshiftVersion] = {};\n for (const { featureId, supportLevel } of features) {\n if (!featureId || !supportLevel) {\n continue;\n }\n featureSupportLevelsMap[openshiftVersion][featureId] = supportLevel;\n }\n }\n return featureSupportLevelsMap;\n } catch (err) {\n captureException(err, 'Failed to parse feature support levels', Sentry.Severity.Warning);\n return {};\n }\n};\n\nconst getVersionSupportLevelsMap = (\n versionName: string,\n supportLevelData: FeatureSupportLevelsMap,\n): FeatureIdToSupportLevel | undefined => {\n const versionKey = Object.keys(supportLevelData).find((key) => {\n const versionNameMatch = new RegExp(`^${key}(\\\\..*)?$`); // For version 4.10 match 4.10, 4.10.3, not 4.1, 4.1.5\n return versionNameMatch.test(versionName);\n });\n if (!versionKey) {\n return undefined;\n }\n\n return supportLevelData[versionKey];\n};\n\nexport const getFeatureSupported = (\n openshiftVersion: string,\n featureSupportLevels: FeatureSupportLevels,\n featureId: FeatureId,\n) => {\n const featureSupportLevelsMap = getFeatureSupportLevelsMap(featureSupportLevels);\n const versionSupportLevels = getVersionSupportLevelsMap(\n openshiftVersion,\n featureSupportLevelsMap,\n );\n return versionSupportLevels && versionSupportLevels[featureId] !== 'unsupported';\n};\n\nexport const FeatureSupportLevelProvider: React.FC<SupportLevelProviderProps> = ({\n cluster,\n children,\n loadingUi,\n}) => {\n const { loading: loadingOCPVersions, versions: versionOptions } = useOpenshiftVersions();\n const fetcher = () => FeatureSupportLevelsAPI.list().then((res) => res.data);\n const { data: featureSupportLevels, error } = useSWR<FeatureSupportLevels, unknown>(\n FeatureSupportLevelsAPI.makeBaseURI(),\n fetcher,\n { errorRetryCount: 0, revalidateOnFocus: false },\n );\n const isLoading = (!featureSupportLevels && !error) || loadingOCPVersions;\n\n const supportLevelData: FeatureSupportLevelsMap = React.useMemo<FeatureSupportLevelsMap>(() => {\n if (!featureSupportLevels || error) {\n return {};\n }\n return getFeatureSupportLevelsMap(featureSupportLevels);\n }, [error, featureSupportLevels]);\n\n const getVersionSupportLevelsMapCallback = React.useCallback(\n (versionName: string): FeatureIdToSupportLevel | undefined => {\n return getVersionSupportLevelsMap(versionName, supportLevelData);\n },\n [supportLevelData],\n );\n\n const getFeatureSupportLevel = React.useCallback(\n (versionName: string, featureId: FeatureId): SupportLevel | undefined => {\n const versionSupportLevelData = getVersionSupportLevelsMapCallback(versionName);\n return versionSupportLevelData ? versionSupportLevelData[featureId] : undefined;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [getVersionSupportLevelsMapCallback],\n );\n\n const isFeatureSupportedCallback = React.useCallback(\n (versionName: string, featureId: FeatureId) => {\n const supportLevel = getFeatureSupportLevel(versionName, featureId);\n return isFeatureSupported(versionName, featureId, supportLevel, versionOptions);\n },\n [getFeatureSupportLevel, versionOptions],\n );\n\n //TODO(brotman): move to separate context FeatureStateContext\n const getDisabledReasonCallback = React.useCallback(\n (versionName: string, featureId: FeatureId) => {\n const isSupported = isFeatureSupportedCallback(versionName, featureId);\n return getFeatureDisabledReason(featureId, cluster, versionName, versionOptions, isSupported);\n },\n [isFeatureSupportedCallback, versionOptions, cluster],\n );\n\n const isFeatureDisabled = React.useCallback(\n (version: string, featureId: FeatureId) => !!getDisabledReasonCallback(version, featureId),\n [getDisabledReasonCallback],\n );\n\n const providerValue = React.useMemo<FeatureSupportLevelData>(() => {\n return {\n getVersionSupportLevelsMap: getVersionSupportLevelsMapCallback,\n getFeatureSupportLevel: getFeatureSupportLevel,\n isFeatureDisabled: isFeatureDisabled,\n getFeatureDisabledReason: getDisabledReasonCallback,\n isFeatureSupported: isFeatureSupportedCallback,\n };\n }, [\n getVersionSupportLevelsMapCallback,\n getFeatureSupportLevel,\n isFeatureDisabled,\n getDisabledReasonCallback,\n isFeatureSupportedCallback,\n ]);\n\n React.useEffect(() => {\n if (error) {\n handleApiError(error);\n }\n }, [error]);\n\n return (\n <FeatureSupportLevelContextProvider value={providerValue}>\n {isLoading ? loadingUi : children}\n </FeatureSupportLevelContextProvider>\n );\n};\n\nexport default FeatureSupportLevelProvider;\n", "import React from 'react';\nimport {\n Cluster,\n CpuArchitecture,\n ImportClusterParams,\n OpenshiftVersion,\n OpenshiftVersionOptionType,\n} from '../../common';\nimport { getApiErrorMessage, handleApiError } from '../api';\nimport { SupportedOpenshiftVersionsAPI } from '../services/apis';\n\ntype OpenShiftVersion = Cluster['openshiftVersion'];\n\ntype UseOpenshiftVersionsType = {\n versions: OpenshiftVersionOptionType[];\n normalizeClusterVersion: (version: OpenShiftVersion) => ImportClusterParams['openshiftVersion'];\n isSupportedOpenShiftVersion: (version: OpenShiftVersion) => boolean;\n getCpuArchitectures: (version: OpenShiftVersion) => CpuArchitecture[];\n error?: { title: string; message: string };\n loading: boolean;\n};\n\nconst sortVersions = (versions: OpenshiftVersionOptionType[]) => {\n return versions\n .sort((version1, version2) =>\n version1.label.localeCompare(version2.label, undefined, { numeric: true }),\n )\n .reverse();\n};\n\nconst supportedVersionLevels = ['production', 'maintenance'];\n\nexport default function useOpenshiftVersions(): UseOpenshiftVersionsType {\n const [versions, setVersions] = React.useState<OpenshiftVersionOptionType[]>([]);\n const [error, setError] = React.useState<UseOpenshiftVersionsType['error']>();\n\n const findVersionItemByVersion = React.useCallback(\n (version: OpenShiftVersion) => {\n return versions.find(({ value: versionKey }) => {\n // For version 4.10 match 4.10, 4.10.3, not 4.1, 4.1.5\n const versionNameMatch = new RegExp(`^${versionKey}(\\\\..+)?$`);\n return versionNameMatch.test(version || '');\n });\n },\n [versions],\n );\n\n const fetchOpenshiftVersions = React.useCallback(async () => {\n try {\n const { data } = await SupportedOpenshiftVersionsAPI.list();\n\n const versions: OpenshiftVersionOptionType[] = Object.keys(data).map((key) => {\n const versionItem = data[key] as OpenshiftVersion;\n const version = versionItem.displayName;\n return {\n label: `OpenShift ${version}`,\n value: key,\n version,\n default: Boolean(versionItem.default),\n supportLevel: versionItem.supportLevel,\n cpuArchitectures: versionItem.cpuArchitectures as CpuArchitecture[],\n };\n });\n setVersions(sortVersions(versions));\n } catch (e) {\n handleApiError(e, (e) => {\n setError({\n title: 'Failed to retrieve list of supported OpenShift versions.',\n message: getApiErrorMessage(e),\n });\n });\n }\n }, []);\n\n const normalizeClusterVersion = React.useCallback(\n (version: OpenShiftVersion) => {\n const matchingVersion = findVersionItemByVersion(version);\n return matchingVersion?.value || version;\n },\n [findVersionItemByVersion],\n );\n\n const isSupportedOpenShiftVersion = React.useCallback(\n (version: OpenShiftVersion) => {\n const selectedVersion = findVersionItemByVersion(version);\n return supportedVersionLevels.includes(selectedVersion?.supportLevel || '');\n },\n [findVersionItemByVersion],\n );\n\n const getCpuArchitectures = React.useCallback(\n (version: OpenShiftVersion) => {\n // TODO (multi-arch) confirm this is correctly retrieving the associated version\n const matchingVersion = findVersionItemByVersion(version);\n return matchingVersion?.cpuArchitectures ?? [];\n },\n [findVersionItemByVersion],\n );\n\n React.useEffect(() => {\n void fetchOpenshiftVersions();\n }, [fetchOpenshiftVersions]);\n\n return {\n error,\n loading: !error && versions.length === 0,\n versions,\n normalizeClusterVersion,\n isSupportedOpenShiftVersion,\n getCpuArchitectures,\n };\n}\n", "import React from 'react';\nimport { AxiosError } from 'axios';\nimport useSWR from 'swr';\nimport { getApiErrorMessage, handleApiError } from '../api';\nimport { ClustersAPI } from '../services/apis';\nimport {\n PlatformType,\n POLLING_INTERVAL,\n NonPlatformIntegrations,\n isClusterPlatformTypeVM,\n useAlerts,\n SupportedPlatformType,\n} from '../../common';\nimport { APIErrorMixin } from '../api/types';\n\nexport type SupportedPlatformIntegrationType = 'no-active-integrations' | SupportedPlatformType;\n\nfunction getIntegrablePlatformIntegration(allClusterPlatforms: PlatformType[]) {\n const integrationPlatforms = allClusterPlatforms.filter(\n (platform) => !NonPlatformIntegrations.includes(platform),\n );\n const uniqueIntegrationPlatforms = Array.from(new Set(integrationPlatforms));\n if (integrationPlatforms.length === 1) {\n const [exclusivelyAvailablePlatform] = uniqueIntegrationPlatforms;\n return isClusterPlatformTypeVM({ platform: { type: exclusivelyAvailablePlatform } })\n ? exclusivelyAvailablePlatform\n : undefined;\n }\n return undefined;\n}\n\nexport default function useClusterSupportedPlatforms(clusterId: string) {\n const { addAlert, alerts } = useAlerts();\n const url = ClustersAPI.makeSupportedPlatformsBaseURI(clusterId);\n const fetcher = () => ClustersAPI.getSupportedPlatforms(clusterId).then((res) => res.data);\n const { data, error } = useSWR<PlatformType[], AxiosError<APIErrorMixin>>(url, fetcher, {\n refreshInterval: POLLING_INTERVAL,\n errorRetryCount: 0,\n revalidateOnFocus: false,\n });\n\n const isLoading = !error && !data;\n\n const supportedPlatformIntegration =\n isLoading || !data ? undefined : getIntegrablePlatformIntegration(data);\n\n React.useEffect(() => {\n if (error) {\n const title = `Failed to retrieve supported platforms (clusterId: ${clusterId})`;\n //TODO(brotman) add handling of existing errors to alerts context\n if (alerts.find((alert) => alert.title === title)) {\n return;\n }\n handleApiError(error, () =>\n addAlert({\n title,\n message: getApiErrorMessage(error),\n }),\n );\n }\n }, [error, addAlert, clusterId, alerts]);\n\n return {\n isPlatformIntegrationSupported: supportedPlatformIntegration !== undefined,\n supportedPlatformIntegration: (supportedPlatformIntegration ||\n 'no-active-integrations') as SupportedPlatformIntegrationType,\n isLoading,\n error,\n };\n}\n", "import React from 'react';\nimport { ManagedDomain, useAlerts } from '../../common';\nimport { getApiErrorMessage, handleApiError } from '../api';\nimport { ManagedDomainsAPI } from '../services/apis';\n\nexport default function useManagedDomains() {\n const [managedDomains, setManagedDomains] = React.useState<ManagedDomain[]>();\n const { addAlert } = useAlerts();\n\n const fetchManagedDomains = React.useCallback(async () => {\n try {\n const { data: domains } = await ManagedDomainsAPI.list();\n setManagedDomains(domains);\n } catch (e) {\n setManagedDomains([]);\n handleApiError(e, () =>\n addAlert({ title: 'Failed to retrieve managed domains', message: getApiErrorMessage(e) }),\n );\n }\n }, [addAlert]);\n\n React.useEffect(() => {\n if (!managedDomains) {\n void fetchManagedDomains();\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return managedDomains;\n}\n", "import React from 'react';\nimport { getApiErrorMessage, handleApiError } from '../api';\nimport { ClustersAPI } from '../services/apis';\nimport { Cluster, useAlerts } from '../../common';\n\nexport default function useUsedClusterNames(clusterId: Cluster['id']) {\n const [usedClusterNames, setUsedClusterNames] = React.useState<string[]>();\n const { addAlert } = useAlerts();\n\n const fetcher = React.useCallback(async () => {\n try {\n const { data: clusters } = await ClustersAPI.list();\n const names = clusters\n .filter((c) => c.id !== clusterId)\n .map((c) => `${c.name || ''}.${c.baseDnsDomain || ''}`);\n setUsedClusterNames(names);\n } catch (e) {\n setUsedClusterNames([]);\n handleApiError(e, () =>\n addAlert({\n title: 'Failed to retrieve names of existing clusters.',\n message: getApiErrorMessage(e),\n }),\n );\n }\n }, [addAlert, clusterId]);\n\n React.useEffect(() => {\n void fetcher();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { usedClusterNames };\n}\n", "import React from 'react';\nimport { Cluster, CpuArchitecture, InfraEnv } from '../../common';\nimport { getErrorMessage } from '../../common/utils';\nimport { InfraEnvsService } from '../services';\n\nexport default function useInfraEnvId(clusterId: Cluster['id'], cpuArchitecture: CpuArchitecture) {\n const [infraEnvId, setInfraEnv] = React.useState<InfraEnv['id']>();\n const [error, setError] = React.useState('');\n\n const findInfraEnvId = React.useCallback(async () => {\n try {\n const infraEnvId = await InfraEnvsService.getInfraEnvId(clusterId, cpuArchitecture);\n setInfraEnv(infraEnvId);\n } catch (e) {\n setError(getErrorMessage(e));\n }\n }, [clusterId, cpuArchitecture]);\n\n React.useEffect(() => {\n if (clusterId && !infraEnvId) {\n void findInfraEnvId();\n }\n }, [clusterId, findInfraEnvId, infraEnvId]);\n\n return { infraEnvId, error };\n}\n", "import React from 'react';\nimport { getApiErrorMessage, handleApiError, ocmClient } from '../api';\nimport { useAlerts } from '../../common';\nimport { OcmClientRequestResponse } from '../types';\n\nexport default function usePullSecret() {\n const [pullSecret, setPullSecret] = React.useState<string>();\n const { addAlert } = useAlerts();\n\n const getPullSecret = React.useCallback(async () => {\n try {\n if (ocmClient) {\n const response: OcmClientRequestResponse = await ocmClient.post<string>(\n '/api/accounts_mgmt/v1/access_token',\n );\n const data = response?.request?.response;\n setPullSecret(data || ''); // unmarshalled response as a string\n } else {\n setPullSecret('');\n }\n } catch (e) {\n handleApiError(e, (e) => {\n setPullSecret('');\n addAlert({ title: 'Failed to retrieve pull secret', message: getApiErrorMessage(e) });\n });\n }\n }, [addAlert]);\n\n React.useEffect(() => {\n if (!pullSecret) {\n void getPullSecret();\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return pullSecret;\n}\n", "import React from 'react';\nimport { alertsSlice } from '../../common/reducers';\nimport { Cluster, PreflightHardwareRequirements } from '../../common/api/types';\nimport { ClustersAPI } from '../services/apis';\nimport { getApiErrorMessage, handleApiError } from '../api';\nimport { getErrorMessage } from '../../common/utils';\n\nconst { addAlert } = alertsSlice.actions;\n\nconst useClusterPreflightRequirements = (clusterId: Cluster['id']) => {\n const [preflightRequirements, setPreflightRequirements] =\n React.useState<PreflightHardwareRequirements>();\n const [error, setError] = React.useState('');\n\n React.useEffect(() => {\n const fetchFunc = async () => {\n try {\n const { data } = await ClustersAPI.getPreflightRequirements(clusterId);\n setPreflightRequirements(data);\n } catch (e) {\n setError(getErrorMessage(e));\n // report error systematically at one place show defaults instead\n handleApiError(e, () =>\n addAlert({\n title: 'Failed to retrieve preflight cluster requirements',\n message: getApiErrorMessage(e),\n }),\n );\n }\n };\n void fetchFunc();\n }, [setPreflightRequirements, setError, clusterId]);\n\n return {\n preflightRequirements,\n error,\n isLoading: !error && !preflightRequirements,\n };\n};\n\nexport default useClusterPreflightRequirements;\n", "import {\n Cluster,\n CpuArchitecture,\n FeatureId,\n isArmArchitecture,\n isSNO,\n OpenshiftVersionOptionType,\n OperatorsValues,\n SupportLevel,\n} from '../../../common';\n\nconst CNV_OPERATOR_LABEL = 'Virtualization';\nconst LVM_OPERATOR_LABEL = 'OpenShift Data Foundation Logical Volume Manager';\n\nconst isArmSupported = (versionName: string, versionOptions: OpenshiftVersionOptionType[]) => {\n const versionOption = versionOptions.find((option) => option.value === versionName);\n return !!versionOption?.cpuArchitectures?.includes(CpuArchitecture.ARM);\n};\nexport const clusterExistsReason = 'This option is not editable after the draft cluster is created';\n\nexport const getCnvIncompatibleWithLvmReason = (\n operatorValues: OperatorsValues,\n versionName: string | undefined,\n lvmSupport: SupportLevel | undefined,\n) => {\n const mustDisableCnv =\n !operatorValues.useContainerNativeVirtualization &&\n operatorValues.useOdfLogicalVolumeManager &&\n lvmSupport !== 'supported';\n // In versions with none or limited support for LVM (< 4.12), it's no possible to select CNV + LVM\n return mustDisableCnv\n ? `Currently, you can not install ${CNV_OPERATOR_LABEL} operator at the same time as ${LVM_OPERATOR_LABEL} operator.`\n : undefined;\n};\n\nexport const getLvmIncompatibleWithCnvReason = (\n operatorValues: OperatorsValues,\n versionName: string | undefined,\n lvmSupport: SupportLevel | undefined,\n) => {\n const hasSelectedCnv = operatorValues.useContainerNativeVirtualization;\n if (hasSelectedCnv && operatorValues.useOdfLogicalVolumeManager) {\n return `${LVM_OPERATOR_LABEL} must be installed when ${CNV_OPERATOR_LABEL} operator is also installed`;\n }\n if (hasSelectedCnv && lvmSupport !== 'supported') {\n return `Currently, you can not install ${LVM_OPERATOR_LABEL} operator at the same time as ${CNV_OPERATOR_LABEL} operator.`;\n }\n return undefined;\n};\n\nconst getSNODisabledReason = (cluster: Cluster | undefined, isSupported: boolean) => {\n if (cluster) {\n return clusterExistsReason;\n }\n if (!isSupported) {\n return 'Single-Node OpenShift is not supported in this OpenShift version';\n }\n return '';\n};\n\nconst getArmDisabledReason = (\n cluster: Cluster | undefined,\n versionName: string,\n versionOptions: OpenshiftVersionOptionType[],\n) => {\n if (cluster) {\n return clusterExistsReason;\n }\n if (!isArmSupported(versionName, versionOptions)) {\n return 'arm64 is not supported in this OpenShift version';\n }\n return undefined;\n};\n\nconst getOdfDisabledReason = (cluster: Cluster | undefined, isSupported: boolean) => {\n if (!cluster) {\n return undefined;\n }\n if (isArmArchitecture(cluster) && isSNO(cluster)) {\n return 'OpenShift Data Foundation is not available when using Single Node OpenShift or ARM CPU architecture.';\n }\n if (isArmArchitecture(cluster)) {\n return 'OpenShift Data Foundation is not available when ARM CPU architecture is selected.';\n }\n if (isSNO(cluster)) {\n return 'OpenShift Data Foundation is not available when deploying a Single Node OpenShift.';\n }\n if (!isSupported) {\n return 'The installer cannot currently enable OpenShift Data Foundation with the selected OpenShift version, but it can be enabled later through the OpenShift Console once the installation is complete.';\n }\n return undefined;\n};\n\nconst getLvmDisabledReason = (cluster: Cluster | undefined, isSupported: boolean) => {\n if (!cluster) {\n return undefined;\n }\n if (!isSupported) {\n return 'OpenShift Data Foundation Logical Volume Manager is enabled only for OpenShift 4.11 and above.';\n }\n return undefined;\n};\n\nconst getCnvDisabledReason = (cluster: Cluster | undefined) => {\n if (!cluster) {\n return undefined;\n }\n if (isArmArchitecture(cluster)) {\n return 'OpenShift Virtualization is not available when ARM CPU architecture is selected.';\n }\n return undefined;\n};\n\nconst getNetworkTypeSelectionDisabledReason = (cluster: Cluster | undefined) => {\n if (!cluster) {\n return undefined;\n }\n if (isSNO(cluster)) {\n return 'Network management selection is not supported for Single-Node OpenShift';\n }\n return undefined;\n};\n\nexport const getFeatureDisabledReason = (\n featureId: FeatureId,\n cluster: Cluster | undefined,\n versionName: string,\n versionOptions: OpenshiftVersionOptionType[],\n isSupported: boolean,\n): string | undefined => {\n switch (featureId) {\n case 'SNO': {\n return getSNODisabledReason(cluster, isSupported);\n }\n case 'ARM64_ARCHITECTURE': {\n return getArmDisabledReason(cluster, versionName, versionOptions);\n }\n case 'CNV': {\n return getCnvDisabledReason(cluster);\n }\n case 'ODF': {\n return getOdfDisabledReason(cluster, isSupported);\n }\n case 'LVM': {\n return getLvmDisabledReason(cluster, isSupported);\n }\n case 'NETWORK_TYPE_SELECTION': {\n return getNetworkTypeSelectionDisabledReason(cluster);\n }\n case 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING': {\n return 'Network management selection is not supported for ARM architecture with this version of OpenShift.';\n }\n default: {\n return undefined;\n }\n }\n};\n\nexport const isFeatureSupported = (\n versionName: string,\n featureId: FeatureId,\n supportLevel: SupportLevel | undefined,\n versionOptions: OpenshiftVersionOptionType[],\n) => {\n if (featureId === 'ARM64_ARCHITECTURE') {\n return isArmSupported(versionName, versionOptions);\n } else {\n return supportLevel !== 'unsupported';\n }\n};\n", "import { CheckCircleIcon, InfoCircleIcon } from '@patternfly/react-icons';\nimport React from 'react';\nimport { global_success_color_100 as okColor } from '@patternfly/react-tokens';\nimport { Text, TextList, TextListItem, TextContent } from '@patternfly/react-core';\nimport {\n FeatureId,\n FeatureIdToSupportLevel,\n PreviewSupportLevel,\n isPreviewSupportLevel,\n} from '../../../common/types';\nimport { TECH_SUPPORT_LEVEL_LINK } from '../../../common/config/constants';\nimport ExternalLink from '../../../common/components/ui/ExternalLink';\nimport { Cluster } from '../../../common/api/types';\nimport { useFeatureSupportLevel } from '../../../common/components/featureSupportLevels';\nimport { DetailItem } from '../../../common';\nimport { getLimitedFeatureSupportLevels } from '../../../common/components/featureSupportLevels/utils';\nimport { WithErrorBoundary } from '../../../common/components/ErrorHandling/WithErrorBoundary';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport useOpenshiftVersions from '../../hooks/useOpenshiftVersions';\n\nconst getFeatureReviewText = (featureId: FeatureId): string => {\n switch (featureId) {\n case 'SNO':\n return 'Install single node OpenShift (SNO)';\n case 'VIP_AUTO_ALLOC':\n return 'Allocate IPs via DHCP server';\n case 'ARM64_ARCHITECTURE':\n return 'Use ARM architecture for the cluster';\n default:\n return featureId;\n }\n};\n\nconst getPreviewSupportLevelTitle = (supportLevel: PreviewSupportLevel) => {\n if (supportLevel === 'dev-preview') {\n return 'Developer Preview Features';\n }\n return <ExternalLink href={TECH_SUPPORT_LEVEL_LINK}>Technology Preview Features</ExternalLink>;\n};\n\nconst getPreviewFeatureList = (supportLevelMap: FeatureIdToSupportLevel) => {\n const previewSupportLevels: { [key in PreviewSupportLevel]: FeatureId[] } = {\n 'tech-preview': [],\n 'dev-preview': [],\n };\n for (const [featureId, supportLevel] of Object.entries(supportLevelMap)) {\n if (!isPreviewSupportLevel(supportLevel)) {\n continue;\n }\n previewSupportLevels[supportLevel].push(featureId as FeatureId);\n }\n let supportLevel: PreviewSupportLevel;\n //Show only one preview support level list, first priority to developer preview features\n if (previewSupportLevels['dev-preview'].length) {\n supportLevel = 'dev-preview';\n } else if (previewSupportLevels['tech-preview'].length) {\n supportLevel = 'tech-preview';\n } else {\n return null;\n }\n const featureList = previewSupportLevels[supportLevel].map((featureId: FeatureId) => (\n <TextListItem key={featureId}>{getFeatureReviewText(featureId)}</TextListItem>\n ));\n return (\n <>\n <TextListItem>\n {getPreviewSupportLevelTitle(supportLevel)}\n <TextList>{featureList}</TextList>\n </TextListItem>\n </>\n );\n};\n\nexport const LimitedSupportedCluster = ({\n clusterFeatureSupportLevels,\n showVersionWarning,\n}: {\n clusterFeatureSupportLevels: FeatureIdToSupportLevel;\n showVersionWarning: boolean;\n}) => (\n <TextContent>\n {showVersionWarning && (\n <Text>\n <InfoCircleIcon size=\"sm\" color=\"var(--pf-global--info-color--100)\" />\n &nbsp;The installed OpenShift version is not production-ready\n </Text>\n )}\n {Object.keys(clusterFeatureSupportLevels).length > 0 && (\n <>\n <InfoCircleIcon size=\"sm\" color=\"var(--pf-global--info-color--100)\" />\n &nbsp;Your cluster will be subject to support limitations because it includes:\n <TextList>\n {getPreviewFeatureList(clusterFeatureSupportLevels)}\n {clusterFeatureSupportLevels['CLUSTER_MANAGED_NETWORKING_WITH_VMS'] === 'unsupported' && (\n <TextListItem>\n Cluster-managed networking with some or all discovered hosts as virtual machines\n </TextListItem>\n )}\n </TextList>\n </>\n )}\n </TextContent>\n);\n\nexport const FullySupportedCluster = () => (\n <>\n <CheckCircleIcon color={okColor.value} />\n &nbsp;Your installed cluster will be fully supported\n </>\n);\n\nexport const getFeatureSupportLevelTitle = (fullySupported: boolean): string => {\n const supportLevel: string = fullySupported ? 'Full' : 'Limited';\n return `Cluster support level: ${supportLevel}`;\n};\n\ntype SupportLevelProps = { cluster: Cluster };\ntype SupportLevelMemo = {\n limitedClusterFeatures: FeatureIdToSupportLevel;\n hasSupportedVersion: boolean;\n isFullySupported: boolean;\n};\n\nconst SupportLevel = ({ cluster }: SupportLevelProps) => {\n const { t } = useTranslation();\n const featureSupportLevelData = useFeatureSupportLevel();\n const { isSupportedOpenShiftVersion } = useOpenshiftVersions();\n\n const { limitedClusterFeatures, hasSupportedVersion, isFullySupported } =\n React.useMemo<SupportLevelMemo>(() => {\n const limitedClusterFeatures = getLimitedFeatureSupportLevels(\n cluster,\n featureSupportLevelData,\n t,\n );\n const hasSupportedVersion: boolean = isSupportedOpenShiftVersion(cluster.openshiftVersion);\n return {\n limitedClusterFeatures,\n hasSupportedVersion,\n isFullySupported:\n hasSupportedVersion && Object.keys(limitedClusterFeatures || {}).length === 0,\n };\n }, [cluster, featureSupportLevelData, t, isSupportedOpenShiftVersion]);\n\n if (!limitedClusterFeatures) {\n return null;\n }\n\n return (\n <DetailItem\n title={getFeatureSupportLevelTitle(isFullySupported)}\n value={\n isFullySupported ? (\n <FullySupportedCluster />\n ) : (\n <LimitedSupportedCluster\n clusterFeatureSupportLevels={limitedClusterFeatures}\n showVersionWarning={!hasSupportedVersion}\n />\n )\n }\n testId=\"feature-support-levels\"\n />\n );\n};\n\nconst ClusterFeatureSupportLevelsDetailItem = ({ ...props }: SupportLevelProps) => (\n <WithErrorBoundary title=\"Failed to load feature support levels review\">\n <SupportLevel {...props} />\n </WithErrorBoundary>\n);\nexport default ClusterFeatureSupportLevelsDetailItem;\n", "import { Cluster, stringToJSON } from '../../api';\nimport { ClusterFeatureUsage, FeatureId, FeatureIdToSupportLevel } from '../../types';\nimport { FeatureSupportLevelData } from './FeatureSupportLevelContext';\nimport { TFunction } from 'i18next';\n\nexport const getLimitedFeatureSupportLevels = (\n cluster: Cluster,\n featureSupportLevelData: FeatureSupportLevelData,\n t: TFunction,\n): FeatureIdToSupportLevel => {\n if (!cluster.openshiftVersion) {\n throw t\n ? t(\"ai:cluster doesn't contain the openshift_version field\")\n : \"cluster doesn't contain the openshift_version field\";\n }\n if (!cluster.featureUsage) {\n throw t\n ? t(\"ai:cluster doesn't contain the feature_usage field\")\n : \"ai:cluster doesn't contain the feature_usage field\";\n }\n const ret: FeatureIdToSupportLevel = {};\n const featureUsage = stringToJSON<ClusterFeatureUsage>(cluster.featureUsage);\n if (featureUsage === undefined) {\n throw t\n ? t('ai:Error parsing cluster feature_usage field')\n : 'Error parsing cluster feature_usage field';\n }\n const usedFeatureIds: FeatureId[] = Object.values(featureUsage).map((item) => item.id);\n const versionSupportLevelsMap = featureSupportLevelData.getVersionSupportLevelsMap(\n cluster.openshiftVersion,\n );\n if (!versionSupportLevelsMap) {\n throw t\n ? t('ai:No support level data for version {{openshiftVersion}}', {\n openshiftVersion: cluster.openshiftVersion,\n })\n : `No support level data for version ${cluster.openshiftVersion}`;\n }\n for (const featureId of usedFeatureIds) {\n if (featureId in versionSupportLevelsMap) {\n const supportLevel = versionSupportLevelsMap[featureId];\n if (supportLevel === 'supported') {\n continue;\n }\n if (supportLevel === 'unsupported' && featureId !== 'CLUSTER_MANAGED_NETWORKING_WITH_VMS') {\n //since the UI doesn't address unsupported features that aren't CLUSTER_MANAGED_NETWORKING_WITH_VMS they should be ignored\n continue;\n }\n ret[featureId] = versionSupportLevelsMap[featureId];\n }\n }\n return ret;\n};\n", "import { Button, ButtonVariant } from '@patternfly/react-core';\nimport React, { PropsWithChildren } from 'react';\nimport { ErrorBoundary, FallbackProps } from 'react-error-boundary';\nimport { ErrorState } from '../ui';\nimport { useErrorMonitor } from './ErrorMonitorContext';\n\nconst getErrorFallbackComponent = ({ title }: WithErrorBoundaryProps) => {\n const FallbackComponent = ({ resetErrorBoundary }: FallbackProps) => {\n const content = 'There was an internal error';\n const primaryAction = [\n <Button\n onClick={resetErrorBoundary}\n variant={ButtonVariant.link}\n isInline\n key=\"reset-error-boundary\"\n >\n try again\n </Button>,\n ];\n return <ErrorState {...{ content, primaryAction, title }} />;\n };\n return FallbackComponent;\n};\n\nexport type WithErrorBoundaryProps = {\n title?: string;\n};\n\nexport const WithErrorBoundary = ({\n children,\n ...props\n}: PropsWithChildren<WithErrorBoundaryProps>) => {\n const { captureException } = useErrorMonitor();\n const errorHandler = (error: Error) => {\n captureException(error, props.title);\n };\n return (\n <ErrorBoundary FallbackComponent={getErrorFallbackComponent(props)} onError={errorHandler}>\n {children}\n </ErrorBoundary>\n );\n};\n", "import React, { PropsWithChildren } from 'react';\n\nexport type ErrorSeverity = 'error' | 'warning' | 'info';\n\nexport type ExceptionReporter = (\n error: unknown,\n message?: string,\n severity?: ErrorSeverity,\n) => void;\n\nexport const ErrorMonitorContext = React.createContext<{\n captureException: ExceptionReporter;\n}>({\n captureException: () => {\n return;\n },\n});\n\nexport const ErrorMonitorContextProvider = ({\n exceptionReporter,\n children,\n}: PropsWithChildren<{ exceptionReporter: ExceptionReporter }>) => {\n return (\n <ErrorMonitorContext.Provider value={{ captureException: exceptionReporter }}>\n {children}\n </ErrorMonitorContext.Provider>\n );\n};\n\nexport const useErrorMonitor = () => {\n return React.useContext(ErrorMonitorContext);\n};\n", "import React from 'react';\nimport { Cluster, DetailItem } from '../../../common';\nimport { useOpenshiftVersions } from '../../hooks';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\nimport { Popover, Text, TextContent, TextVariants } from '@patternfly/react-core';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst UnsupportedVersion = ({ version }: { version: string }) => {\n const { t } = useTranslation();\n\n const hint = (\n <TextContent>\n <Text component={TextVariants.p}>\n {t('ai:Please note that this version is not production-ready.')}\n </Text>\n </TextContent>\n );\n return (\n <Text component=\"p\">\n {version} &nbsp;\n <Popover bodyContent={hint}>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n </Popover>\n </Text>\n );\n};\n\nconst OpenShiftVersionDetail = ({ cluster }: { cluster: Cluster }) => {\n const { isSupportedOpenShiftVersion } = useOpenshiftVersions();\n const { t } = useTranslation();\n const { openshiftVersion: version } = cluster;\n const isSupported = isSupportedOpenShiftVersion(version);\n return (\n <DetailItem\n title={t('ai:OpenShift version')}\n value={isSupported ? version : <UnsupportedVersion version={version || ''} />}\n testId=\"openshift-version\"\n />\n );\n};\n\nexport default OpenShiftVersionDetail;\n", "import React from 'react';\nimport {\n Cluster,\n Credentials,\n selectOlmOperators,\n selectMonitoredOperators,\n MonitoredOperator,\n MonitoredOperatorsList,\n ClusterCredentials,\n} from '../../../common';\nimport { getClusterDetailId } from './utils';\nimport { ClustersAPI } from '../../services/apis';\nimport ClusterDetailStatusMessages from './ClusterDetailStatusMessages';\nimport { Grid } from '@patternfly/react-core';\nimport { getErrorMessage } from '../../../common/utils';\n\ntype ClusterStatusVarieties = {\n credentials?: Credentials;\n credentialsError: string;\n olmOperators: MonitoredOperatorsList;\n failedOlmOperators: MonitoredOperatorsList;\n consoleOperator?: MonitoredOperator;\n fetchCredentials: () => void;\n};\n\nexport const useClusterStatusVarieties = (cluster?: Cluster): ClusterStatusVarieties => {\n const [credentials, setCredentials] = React.useState<Credentials>();\n const [credentialsError, setCredentialsError] = React.useState('');\n\n const clusterId = cluster?.id;\n const clusterStatus = cluster?.status;\n const clusterMonitoredOperators = selectMonitoredOperators(cluster?.monitoredOperators);\n const olmOperators = selectOlmOperators(cluster);\n const failedOlmOperators = olmOperators.filter((o) => o.status === 'failed');\n const consoleOperator = React.useMemo(\n () => clusterMonitoredOperators.find((o) => o.name === 'console'),\n [clusterMonitoredOperators],\n );\n\n const fetchCredentials = React.useCallback(() => {\n const fetch = async () => {\n setCredentialsError('');\n if (!clusterId) {\n return;\n }\n try {\n const response = await ClustersAPI.getCredentials(clusterId);\n setCredentials(response.data);\n } catch (err) {\n setCredentialsError(getErrorMessage(err));\n }\n };\n void fetch();\n }, [clusterId]);\n\n const consoleOperatorStatus = consoleOperator?.status;\n React.useEffect(() => {\n if (\n (!consoleOperatorStatus && clusterStatus === 'installed') || // Retain backwards compatibility with clusters which don't have monitored clusters\n consoleOperatorStatus === 'available'\n ) {\n fetchCredentials();\n }\n }, [clusterStatus, consoleOperatorStatus, fetchCredentials]);\n\n return {\n credentials,\n credentialsError,\n olmOperators,\n failedOlmOperators,\n consoleOperator,\n fetchCredentials,\n };\n};\n\ntype ClusterDetailStatusVarietiesProps = {\n cluster: Cluster;\n clusterVarieties: ClusterStatusVarieties;\n showAddHostsInfo?: boolean;\n showKubeConfig?: boolean;\n};\n\nconst ClusterDetailStatusVarieties = ({\n cluster,\n clusterVarieties,\n showAddHostsInfo = true,\n showKubeConfig = true,\n}: ClusterDetailStatusVarietiesProps) => {\n const { credentials, credentialsError, consoleOperator, fetchCredentials } = clusterVarieties;\n\n const showClusterCredentials =\n consoleOperator?.status === 'available' || (!consoleOperator && cluster.status === 'installed'); // Retain backwards compatibility with clusters which don't have monitored clusters\n\n return (\n <Grid hasGutter>\n {showClusterCredentials && (\n <ClusterCredentials\n cluster={cluster}\n credentials={credentials}\n error={!!credentialsError}\n retry={fetchCredentials}\n idPrefix={getClusterDetailId('cluster-creds')}\n credentialsError={credentialsError}\n />\n )}\n <ClusterDetailStatusMessages\n cluster={cluster}\n showAddHostsInfo={showAddHostsInfo}\n showKubeConfig={showKubeConfig}\n />\n </Grid>\n );\n};\n\nexport default ClusterDetailStatusVarieties;\n", "import React from 'react';\nimport { Alert, GridItem } from '@patternfly/react-core';\nimport {\n RenderIf,\n KubeconfigDownload,\n REDHAT_CONSOLE_OPENSHIFT,\n canDownloadKubeconfig,\n useFeatureSupportLevel,\n isSNO,\n isClusterPlatformTypeVM,\n} from '../../../common';\nimport { Cluster } from '../../../common/api/types';\nimport { getClusterDetailId } from './utils';\n\nimport { useDefaultConfiguration } from '../clusterConfiguration/ClusterDefaultConfigurationContext';\nimport { VSPHERE_CONFIG_LINK } from '../../../common/config/constants';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { calculateClusterDateDiff } from '../../../common/sevices/DateAndTime';\nimport { ocmClient } from '../../api';\n\ntype ClusterDetailStatusMessagesProps = {\n cluster: Cluster;\n showAddHostsInfo: boolean;\n showKubeConfig: boolean;\n};\n\nconst ClusterDetailStatusMessages = ({\n cluster,\n showAddHostsInfo,\n showKubeConfig,\n}: ClusterDetailStatusMessagesProps) => {\n const featureSupportLevelContext = useFeatureSupportLevel();\n const { inactiveDeletionHours } = useDefaultConfiguration(['inactiveDeletionHours']);\n const inactiveDeletionDays = Math.round((inactiveDeletionHours || 0) / 24);\n const dateDifference = calculateClusterDateDiff(inactiveDeletionDays, cluster.installCompletedAt);\n const showAddHostsAlert = Boolean(\n showAddHostsInfo &&\n ocmClient &&\n cluster.status === 'installed' &&\n (!isSNO(cluster) ||\n (cluster.openshiftVersion &&\n featureSupportLevelContext.isFeatureSupported(\n cluster.openshiftVersion,\n 'SINGLE_NODE_EXPANSION',\n ))),\n );\n\n const showKubeConfigDownload =\n showKubeConfig && dateDifference > 0 && canDownloadKubeconfig(cluster.status);\n return (\n <>\n <RenderIf condition={showKubeConfigDownload}>\n <GridItem>\n <KubeconfigDownload\n status={cluster.status}\n clusterId={cluster.id}\n id={getClusterDetailId('button-download-kubeconfig')}\n />\n </GridItem>\n </RenderIf>\n <RenderIf\n condition={\n typeof inactiveDeletionHours === 'number' && canDownloadKubeconfig(cluster.status)\n }\n >\n <Alert\n variant=\"info\"\n isInline\n title={\n dateDifference > 0\n ? `Download and save your kubeconfig file in a safe place. This file will be automatically ` +\n `deleted from Assisted Installer's service in ${dateDifference} days.`\n : `Kubeconfig file was automatically deleted ${inactiveDeletionDays} days after installation.`\n }\n />\n </RenderIf>\n <RenderIf condition={showAddHostsAlert}>\n <Alert\n variant=\"info\"\n isInline\n data-testid=\"alert-add-hosts\"\n title={\n <p>\n {isClusterPlatformTypeVM(cluster)\n ? 'Add new hosts by using the platform auto-scale feature or manually generating a new Discovery ISO under the \"Add hosts\" tab on '\n : 'Add new hosts by generating a new Discovery ISO under your cluster\\'s \"Add hosts\" tab on '}\n <a href={REDHAT_CONSOLE_OPENSHIFT} target=\"_blank\" rel=\"noopener noreferrer\">\n console.redhat.com/openshift <ExternalLinkAltIcon />\n </a>\n .\n </p>\n }\n />\n </RenderIf>\n <RenderIf condition={isClusterPlatformTypeVM(cluster)}>\n <Alert\n variant=\"warning\"\n isInline\n data-testid=\"alert-modify-platform-config\"\n title={\n <p>\n Modify your platform configuration to access your platform's features directly in\n OpenShift.{' '}\n <a href={VSPHERE_CONFIG_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more about configuration <i className=\"fas fa-external-link-alt\" />\n </a>\n </p>\n }\n />\n </RenderIf>\n </>\n );\n};\n\nexport default ClusterDetailStatusMessages;\n", "import pick from 'lodash/pick';\nimport React, { PropsWithChildren, useContext, useEffect } from 'react';\nimport { ClusterDefaultConfig } from '../../../common';\nimport { ClustersAPI } from '../../services/apis';\n\ntype State<T> = { status: 'idle' | 'loading' | 'succeeded' | 'failed'; data: T };\ntype Actions<T> = { type: 'request' } | { type: 'failure' | 'success'; data: T };\n\nconst reducer: React.Reducer<State<ClusterDefaultConfig>, Actions<ClusterDefaultConfig>> = (\n state,\n action,\n) => {\n let newState: State<ClusterDefaultConfig>;\n switch (action.type) {\n case 'request':\n newState = { status: 'loading', data: {} };\n break;\n case 'success':\n newState = { status: 'succeeded', data: action.data };\n break;\n case 'failure':\n newState = { status: 'failed', data: action.data };\n break;\n default:\n newState = state;\n break;\n }\n\n return newState;\n};\n\nexport const ClusterDefaultConfigurationContext = React.createContext<ClusterDefaultConfig>({});\n\nexport const ClusterDefaultConfigurationProvider = ({\n children,\n errorUI,\n loadingUI,\n}: PropsWithChildren<{ errorUI: React.ReactNode; loadingUI: React.ReactNode }>) => {\n const [state, dispatch] = React.useReducer(reducer, { status: 'idle', data: {} });\n\n useEffect(() => {\n let mounted = true;\n const fetchAndSetDefaultConfiguration = async () => {\n try {\n if (mounted) dispatch({ type: 'request' });\n const { data } = await ClustersAPI.getDefaultConfig();\n if (mounted) dispatch({ type: 'success', data });\n } catch {\n if (mounted) dispatch({ type: 'failure', data: {} });\n }\n };\n void fetchAndSetDefaultConfiguration();\n\n return () => {\n mounted = false;\n };\n }, []);\n\n const render = (state: State<ClusterDefaultConfig>) => {\n let result: {\n ui: React.ReactNode;\n value: ClusterDefaultConfig;\n } = { ui: loadingUI, value: state.data };\n\n switch (state.status) {\n case 'idle':\n case 'loading':\n break;\n case 'failed':\n result = { ...result, ui: errorUI };\n break;\n case 'succeeded':\n result = { ...result, ui: children };\n break;\n }\n\n return result;\n };\n\n const { ui, value } = render(state);\n\n return (\n <ClusterDefaultConfigurationContext.Provider value={value}>\n {ui}\n </ClusterDefaultConfigurationContext.Provider>\n );\n};\n\nexport const useDefaultConfiguration = (keys: Array<keyof ClusterDefaultConfig>) => {\n // TODO(mlibra): There is no more the need to pick just selected values here, we can pass all the retrieved data\n return pick(useContext(ClusterDefaultConfigurationContext), keys);\n};\n", "import { getEnabledHosts } from '../hosts';\nimport { RenderIf } from '../ui';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport { ProgressBarTexts } from './ProgressBarTexts';\nimport { FinalizingProgress } from './FinalizingProgress';\nimport OperatorsProgressItem from './OperatorsProgressItem';\nimport React from 'react';\nimport { Cluster } from '../../api';\nimport { EventListFetchProps } from '../../types';\nimport { selectOlmOperators } from '../../../common';\n\ntype ClusterProgressItemsProps = {\n cluster: Cluster;\n minimizedView?: boolean;\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n totalPercentage?: number;\n fallbackEventsURL?: string;\n};\n\nconst ClusterProgressItems = ({\n cluster,\n minimizedView = false,\n onFetchEvents,\n fallbackEventsURL,\n}: ClusterProgressItemsProps) => {\n const enabledHosts = getEnabledHosts(cluster.hosts);\n const olmOperators = selectOlmOperators(cluster);\n\n const masterHosts = enabledHosts.filter((host) => host.role && 'master' === host.role);\n const workerHosts = enabledHosts.filter((host) => host.role && 'worker' === host.role);\n\n return (\n <>\n <RenderIf condition={!minimizedView}>\n <Grid hasGutter>\n <GridItem span={3}>\n <ProgressBarTexts hosts={masterHosts} hostRole=\"master\" />\n </GridItem>\n <RenderIf condition={workerHosts.length > 0}>\n <GridItem span={3}>\n <ProgressBarTexts hosts={workerHosts} hostRole=\"worker\" />\n </GridItem>\n </RenderIf>\n <GridItem span={3}>\n <FinalizingProgress\n cluster={cluster}\n onFetchEvents={onFetchEvents}\n fallbackEventsURL={fallbackEventsURL}\n />\n </GridItem>\n <RenderIf condition={olmOperators.length > 0}>\n <GridItem span={3}>\n <OperatorsProgressItem operators={olmOperators} />\n </GridItem>\n </RenderIf>\n </Grid>\n </RenderIf>\n </>\n );\n};\n\nexport default ClusterProgressItems;\n", "import React from 'react';\nimport { Host, HostRole } from '../../api/types';\nimport { CheckCircleIcon, ExclamationCircleIcon, InProgressIcon } from '@patternfly/react-icons';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens/dist/esm/global_danger_color_100';\nimport { global_success_color_100 as okColor } from '@patternfly/react-tokens/dist/esm/global_success_color_100';\nimport ClusterProgressItem from './ClusterProgressItem';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype HostProgressProps = {\n hosts: Host[];\n hostRole: HostRole;\n};\n\nexport const ProgressBarTexts = ({ hosts, hostRole }: HostProgressProps) => {\n const { t } = useTranslation();\n\n const hostRoleText =\n hostRole === 'master'\n ? t('ai:Control Plane', { count: hosts.length })\n : t('ai:Worker', { count: hosts.length });\n\n if (hosts.some((host) => ['cancelled', 'error'].includes(host.status))) {\n const failedHostsCount = hosts.filter((host) => host.status === 'error').length;\n return (\n <ClusterProgressItem icon={<ExclamationCircleIcon color={dangerColor.value} />}>\n <>\n {hostRoleText}\n <br />\n <small>\n {failedHostsCount}/\n {hostRole === 'master'\n ? t('ai:{{count}} control plane node failed', { count: hosts.length })\n : t('ai:{{count}} worker failed', { count: hosts.length })}\n </small>\n </>\n </ClusterProgressItem>\n );\n }\n\n const installedHosts = hosts.filter((host) =>\n ['installed', 'added-to-existing-cluster'].includes(host.status),\n );\n const beingInstalledHosts = hosts.filter((host) =>\n [\n 'preparing-for-installation',\n 'preparing-successful',\n 'pending-for-input',\n 'installing',\n 'installing-in-progress',\n 'installing-pending-user-action',\n 'resetting-pending-user-action',\n 'resetting',\n ].includes(host.status),\n );\n if (beingInstalledHosts.length > 0) {\n return (\n <ClusterProgressItem icon={<InProgressIcon />}>\n <>\n {hostRoleText}\n <br />\n <small>\n {hostRole === 'master'\n ? t('ai:Installing {{count}} control plane node', {\n count: beingInstalledHosts.length,\n })\n : t('ai:Installing {{count}} worker', { count: beingInstalledHosts.length })}\n </small>\n </>\n </ClusterProgressItem>\n );\n }\n\n return (\n <ClusterProgressItem icon={<CheckCircleIcon color={okColor.value} />}>\n <>\n {hostRoleText}\n <br />\n <small>\n {hostRole === 'master'\n ? t('ai:{{count}} control plane node installed', { count: installedHosts.length })\n : t('ai:{{count}} worker installed', { count: installedHosts.length })}\n </small>\n </>\n </ClusterProgressItem>\n );\n};\n", "import React from 'react';\nimport { Stack, StackItem, TextContent } from '@patternfly/react-core';\nimport BorderedIcon from '../ui/BorderedIcon/BorderedIcon';\n\nconst ClusterProgressItem = ({\n icon,\n children,\n}: {\n icon: React.ReactElement;\n children: React.ReactNode;\n}) => (\n <Stack>\n <StackItem>\n <BorderedIcon>{icon}</BorderedIcon>\n </StackItem>\n <StackItem>\n <TextContent>{children}</TextContent>\n </StackItem>\n </Stack>\n);\n\nexport default ClusterProgressItem;\n", "import React from 'react';\nimport { DownloadIcon, IconSize } from '@patternfly/react-icons';\n\nexport const getPadding = (size: IconSize | keyof typeof IconSize) => {\n switch (size) {\n case IconSize.sm:\n return '0.3em';\n case IconSize.md:\n return '1.5em';\n case IconSize.lg:\n return '2em';\n case IconSize.xl:\n return '3em';\n default:\n return '1em';\n }\n};\n\nexport const getVerticalAlign = (size: IconSize | keyof typeof IconSize) => {\n switch (size) {\n case IconSize.sm:\n return '-0.3em';\n case IconSize.md:\n return '-1.5em';\n case IconSize.lg:\n return '-2em';\n case IconSize.xl:\n return '-3em';\n default:\n return '-1em';\n }\n};\n\ntype BorderedIconProps = {\n children: React.ReactElement<React.ComponentProps<typeof DownloadIcon>>;\n iconSize?: IconSize;\n};\n\nconst BorderedIcon = ({ children, iconSize = IconSize.sm }: BorderedIconProps) => {\n const style: React.CSSProperties = {\n padding: `${getPadding(iconSize)}`,\n borderRadius: '50%',\n border: '2px solid',\n borderColor: '#D2D2D2',\n boxSizing: 'content-box',\n verticalAlign: `${getVerticalAlign(iconSize)}`,\n };\n return React.cloneElement(children, { style });\n};\n\nexport default BorderedIcon;\n", "import { Cluster } from '../../api/types';\nimport { EventListFetchProps } from '../../types';\nimport React from 'react';\nimport { EventsModal } from '../ui';\nimport { Button, ButtonVariant, Popover, Text, TextContent } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InProgressIcon,\n PendingIcon,\n} from '@patternfly/react-icons';\nimport { global_success_color_100 as okColor } from '@patternfly/react-tokens/dist/esm/global_success_color_100';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens/dist/esm/global_danger_color_100';\nimport ClusterProgressItem from './ClusterProgressItem';\nimport capitalize from 'lodash/capitalize';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype FinalizingProgressProps = {\n cluster: Cluster;\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n fallbackEventsURL?: string;\n};\n\nconst areAllBuiltInOperatorsAvailable = (\n monitoredOperators: Cluster['monitoredOperators'] = [],\n) => {\n return monitoredOperators.length\n ? monitoredOperators\n .filter((op) => op.operatorType === 'builtin')\n .every((op) => op.status === 'available')\n : false;\n};\n\nexport const getFinalizingStatus = (cluster: Cluster) => {\n let finalizingIcon, initializationStatus;\n if (areAllBuiltInOperatorsAvailable(cluster.monitoredOperators)) {\n finalizingIcon = <CheckCircleIcon color={okColor.value} />;\n initializationStatus = 'completed';\n } else {\n switch (cluster.status) {\n case 'finalizing':\n finalizingIcon = <InProgressIcon />;\n initializationStatus = 'finalizing';\n break;\n case 'error':\n case 'cancelled':\n finalizingIcon = <ExclamationCircleIcon color={dangerColor.value} />;\n initializationStatus = 'failed';\n break;\n case 'installed':\n case 'adding-hosts':\n finalizingIcon = <CheckCircleIcon color={okColor.value} />;\n initializationStatus = 'completed';\n break;\n default:\n finalizingIcon = <PendingIcon />;\n initializationStatus = 'pending';\n }\n }\n\n return { finalizingIcon, initializationStatus };\n};\n\nexport const FinalizingProgress: React.FC<FinalizingProgressProps> = ({\n cluster,\n onFetchEvents,\n fallbackEventsURL,\n}) => {\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { finalizingIcon, initializationStatus } = getFinalizingStatus(cluster);\n const closeModal = () => setIsModalOpen(false);\n const { t } = useTranslation();\n return (\n <>\n <EventsModal\n title={t('ai:Cluster Events')}\n isOpen={isModalOpen}\n onClose={closeModal}\n hostId={undefined}\n cluster={cluster}\n entityKind=\"cluster\"\n onFetchEvents={onFetchEvents}\n fallbackEventsURL={fallbackEventsURL}\n />\n <ClusterProgressItem icon={finalizingIcon}>\n <>\n {['finalizing', 'pending'].includes(initializationStatus) ? (\n <Popover\n zIndex={300} // set the zIndex below Cluster Events Modal\n headerContent={<>{t('ai:Initialization')}</>}\n bodyContent={\n <TextContent>\n <Text>\n {t(\n 'ai:This stage may take a while to finish. To view detailed information, click the events log link below.',\n )}\n </Text>\n </TextContent>\n }\n footerContent={\n <Button variant={ButtonVariant.link} isInline onClick={() => setIsModalOpen(true)}>\n {t('ai:Open Events Log')}\n </Button>\n }\n >\n <Button variant={ButtonVariant.link} isInline>\n {t('ai:Initialization')}\n </Button>\n </Popover>\n ) : (\n t('ai:Initialization')\n )}\n <small>{capitalize(initializationStatus)}</small>\n </>\n </ClusterProgressItem>\n </>\n );\n};\n", "import React from 'react';\nimport { Button, ButtonVariant, List, ListItem, Popover } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InProgressIcon,\n PendingIcon,\n} from '@patternfly/react-icons';\nimport {\n global_danger_color_100 as dangerColor,\n global_success_color_100 as okColor,\n} from '@patternfly/react-tokens';\nimport { pluralize } from 'humanize-plus';\nimport { MonitoredOperatorsList, OperatorStatus } from '../../api/types';\nimport { operatorLabels } from '../../config';\nimport ClusterProgressItem from './ClusterProgressItem';\n\nimport './OperatorsProgressItem.css';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nexport function getAggregatedStatus(operators: MonitoredOperatorsList) {\n const operatorStates: (OperatorStatus | 'pending')[] = operators.map(\n (operator) => operator.status || 'pending',\n );\n if (operatorStates.includes('failed')) return 'failed';\n if (operatorStates.includes('progressing')) return 'progressing';\n if (operatorStates.includes('pending')) return 'pending';\n return 'available';\n}\n\nexport const getOperatorCountString = (count: number) => `${count} ${pluralize(count, 'operator')}`;\n\nexport function getOperatorsLabel(operators: MonitoredOperatorsList, t: TFunction) {\n const failedOperatorsCount = operators.filter((o) => o.status === 'failed').length;\n const status = getAggregatedStatus(operators);\n const operatorsCountString = getOperatorCountString(operators.length);\n\n switch (status) {\n case 'available':\n return t('ai:{{operatorsCountString}} installed', {\n operatorsCountString: operatorsCountString,\n });\n case 'failed':\n return operators.length > 1\n ? `${failedOperatorsCount}/${operatorsCountString} failed`\n : `${getOperatorCountString(failedOperatorsCount)} failed`;\n case 'progressing':\n return t('ai:Installing {{operatorsCountString}}', {\n operatorsCountString: operatorsCountString,\n });\n\n default:\n return t('ai:Pending - {{operatorsCountString}}', {\n operatorsCountString: operatorsCountString,\n });\n }\n}\n\nexport function getOperatorsIcon(status: OperatorStatus | 'pending') {\n switch (status) {\n case 'available':\n return <CheckCircleIcon color={okColor.value} />;\n case 'failed':\n return <ExclamationCircleIcon color={dangerColor.value} />;\n case 'progressing':\n return <InProgressIcon />;\n default:\n return <PendingIcon />;\n }\n}\n\ntype OperatorsPopoverProps = {\n operators: MonitoredOperatorsList;\n children: React.ComponentProps<typeof Popover>['children'];\n};\n\nconst OperatorsPopover: React.FC<OperatorsPopoverProps> = ({ operators, children }) => {\n const { t } = useTranslation();\n return (\n <Popover\n headerContent={<div>{t('ai:Operators')}</div>}\n bodyContent={\n <List className=\"operators-progress-item__operators-list\">\n {operators.map((operator) => {\n let status = operator.status ?? 'pending';\n if (operator.status === 'available') {\n status = 'installed';\n }\n const name = operator.name && operatorLabels(t)[operator.name];\n return (\n <ListItem key={operator.name} title={operator.statusInfo}>\n {name} {status}\n </ListItem>\n );\n })}\n </List>\n }\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n >\n {children}\n </Popover>\n );\n};\n\ntype OperatorsProgressItemProps = {\n operators: MonitoredOperatorsList;\n};\n\nconst OperatorsProgressItem: React.FC<OperatorsProgressItemProps> = ({ operators }) => {\n const { t } = useTranslation();\n const icon = getOperatorsIcon(getAggregatedStatus(operators));\n const label = getOperatorsLabel(operators, t);\n return (\n <ClusterProgressItem icon={icon}>\n <>\n <OperatorsPopover operators={operators}>\n <Button variant={ButtonVariant.link} isInline data-testid=\"operators-progress-item\">\n {t('ai:Operators')}\n </Button>\n </OperatorsPopover>\n <small>{label}</small>\n </>\n </ClusterProgressItem>\n );\n};\n\nexport default OperatorsProgressItem;\n", "import { Cluster, Host, HostRole, MonitoredOperator, RenderIf } from '../../../common';\nimport React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport {\n HostsInstallationFailed,\n HostInstallationWarning,\n HostsInstallationSuccess,\n} from './ProgressBarAlerts';\n\nconst hostsStatus = (hosts: Host[], hostRole: HostRole) => {\n const totalHosts = hosts.filter((host) => host.role && host.role === hostRole);\n const failedHosts = totalHosts.filter((host) => ['cancelled', 'error'].includes(host.status));\n const pendingUserActionHosts = totalHosts.filter((host) =>\n ['installing-pending-user-action'].includes(host.status),\n );\n return [totalHosts.length, failedHosts.length, pendingUserActionHosts.length];\n};\n\nconst olmOperatorsStatus = (olmOperators: MonitoredOperator[]) => {\n return olmOperators.filter((operator) => operator.status && operator.status === 'failed');\n};\n\nexport const getClusterProgressAlerts = (\n hosts: Host[],\n cluster: Cluster,\n olmOperators: MonitoredOperator[],\n): React.ReactElement => {\n const [totalMasters, failedMasters, pendingUserActionMasters] = hostsStatus(hosts, 'master');\n const [totalWorkers, failedWorkers, pendingUserActionWorkers] = hostsStatus(hosts, 'worker');\n const failedOperators = olmOperatorsStatus(olmOperators);\n if (['error', 'cancelled'].includes(cluster.status)) {\n return (\n <Stack>\n <StackItem>\n <HostsInstallationFailed\n cluster={cluster}\n totalHosts={totalMasters}\n failedHosts={failedMasters}\n isCriticalNumberOfWorkersFailed={failedWorkers === 1}\n />\n </StackItem>\n </Stack>\n );\n } else {\n return (\n <Stack hasGutter>\n <RenderIf condition={cluster.status === 'installed'}>\n <StackItem>\n <HostsInstallationSuccess />\n </StackItem>\n </RenderIf>\n <RenderIf condition={failedWorkers > 0}>\n <StackItem>\n <HostInstallationWarning\n cluster={cluster}\n totalHosts={totalWorkers}\n failedHosts={failedWorkers}\n title={`Could not install ${failedWorkers} worker hosts`}\n hostsType={'worker'}\n message={'failed to install.'}\n />\n </StackItem>\n </RenderIf>\n <RenderIf condition={failedOperators.length > 0}>\n <StackItem>\n <HostInstallationWarning\n cluster={cluster}\n totalHosts={totalMasters}\n failedHosts={failedMasters}\n title={'Some operators failed to install'}\n failedOperators={failedOperators}\n message={'failed to install.'}\n />\n </StackItem>\n </RenderIf>\n <RenderIf condition={pendingUserActionMasters > 0}>\n <StackItem>\n <HostInstallationWarning\n cluster={cluster}\n totalHosts={totalMasters}\n failedHosts={failedMasters}\n title={'Some hosts are pending user action'}\n failedOperators={failedOperators}\n message={'are pending user action.'}\n />\n </StackItem>\n </RenderIf>\n <RenderIf condition={pendingUserActionWorkers > 0}>\n <StackItem>\n <HostInstallationWarning\n cluster={cluster}\n totalHosts={totalWorkers}\n failedHosts={failedWorkers}\n title={'Some hosts are pending user action'}\n message={'are pending user action.'}\n />\n </StackItem>\n </RenderIf>\n </Stack>\n );\n }\n};\n", "import React from 'react';\nimport { Alert, AlertActionLink, Text, TextContent } from '@patternfly/react-core';\nimport { pluralize } from 'humanize-plus';\nimport { TFunction } from 'i18next';\nimport {\n Cluster,\n MonitoredOperator,\n RenderIf,\n toSentence,\n canDownloadClusterLogs,\n getReportIssueLink,\n operatorLabels,\n useAlerts,\n} from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { downloadClusterInstallationLogs } from './utils';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport { ocmClient } from '../../api';\n\ntype InstallationProgressWarningProps = {\n cluster: Cluster;\n totalHosts: number;\n failedHosts: number;\n title?: string;\n hostsType?: string;\n failedOperators?: MonitoredOperator[];\n message?: string;\n isCriticalNumberOfWorkersFailed?: boolean;\n};\n\nconst getFailedOperatorsNames = (failedOperators: MonitoredOperator[], t: TFunction): string => {\n let failedOperatorsNames = '';\n\n for (let i = 0; i < failedOperators.length; i++) {\n const operatorName: string = failedOperators[i].name || '';\n if (i > 0) {\n if (i === failedOperators.length - 1) failedOperatorsNames += ' and ';\n else failedOperatorsNames += ', ';\n }\n failedOperatorsNames += `${operatorName && operatorLabels(t)[operatorName]} (${\n operatorName && operatorName.toUpperCase()\n })`;\n }\n return failedOperatorsNames;\n};\n\nconst getFailedHostsMessage = (\n failedHosts: number,\n totalHosts: number,\n message?: string,\n hostsType?: string,\n) => {\n if (hostsType === 'worker') {\n if (ocmClient) {\n return (\n <>\n Error information for each host can be found in the host inventory table. To retry adding\n failed hosts, navigate to the clusters list inside OpenShift Cluster Manager, click your\n cluster name, and select the <b>Add hosts</b> tab.\n </>\n );\n }\n return (\n <>\n Error information for each host can be found in the host inventory table. To retry adding\n failed hosts, press the <b>Add hosts</b> button.\n </>\n );\n }\n return (\n <>\n {failedHosts}/{totalHosts} {pluralize(totalHosts, hostsType)} {message} Due to this, the\n cluster will be degraded. Please check the installation log for more information.\n </>\n );\n};\n\nexport const HostInstallationWarning = ({\n cluster,\n failedHosts,\n totalHosts,\n title,\n hostsType,\n failedOperators = [],\n message,\n}: InstallationProgressWarningProps) => {\n const { addAlert } = useAlerts();\n const { t } = useTranslation();\n return (\n <>\n <Alert\n isInline\n variant=\"warning\"\n title={title}\n actionLinks={\n <>\n <AlertActionLink\n id=\"cluster-installation-logs-button\"\n onClick={() => downloadClusterInstallationLogs(addAlert, cluster.id)}\n isDisabled={!canDownloadClusterLogs(cluster)}\n >\n Download installation logs\n </AlertActionLink>\n </>\n }\n >\n <RenderIf condition={failedHosts !== 0}>\n <p>{getFailedHostsMessage(failedHosts, totalHosts, message, hostsType)}</p>\n </RenderIf>\n <RenderIf condition={failedOperators?.length > 0}>\n <p>\n {getFailedOperatorsNames(failedOperators, t)} failed to install. Due to this, the\n cluster will be degraded, but you can try to install the operator from the Operator Hub.\n Please check the installation log for more information.\n </p>\n </RenderIf>\n </Alert>\n </>\n );\n};\n\nexport const HostsInstallationFailed = ({\n cluster,\n failedHosts,\n totalHosts,\n isCriticalNumberOfWorkersFailed,\n}: InstallationProgressWarningProps) => {\n const { addAlert } = useAlerts();\n const { resetClusterDialog } = useModalDialogsContext();\n const getID = (suffix: string) => `cluster-install-error-${suffix}`;\n let title, message;\n if (cluster.highAvailabilityMode === 'None' || failedHosts > 0) {\n title = 'Control plane was not installed';\n message = `${failedHosts}/${totalHosts} control plane nodes failed to install. Please check the installation logs for more information.`;\n } else if (isCriticalNumberOfWorkersFailed) {\n title = 'Critical number of workers were not installed';\n message =\n 'Only one worker was able to be installed. Please check the installation logs for more information.';\n } else {\n title = 'Initialization failed';\n message = (\n <TextContent>\n <Text component=\"p\">\n {toSentence(cluster.statusInfo)}\n <br />\n Reset the installation process to return to the configuration and try again. Some hosts\n may need to be re-registered by rebooting into the Discovery ISO.\n </Text>\n </TextContent>\n );\n }\n\n return (\n <>\n <Alert\n isInline\n variant=\"danger\"\n title={title}\n actionLinks={\n <>\n <AlertActionLink\n id=\"button-reset-cluster\"\n onClick={() => resetClusterDialog.open({ cluster })}\n >\n Reset Cluster\n </AlertActionLink>\n <AlertActionLink\n id=\"cluster-installation-logs-button\"\n onClick={() => downloadClusterInstallationLogs(addAlert, cluster.id)}\n isDisabled={!canDownloadClusterLogs(cluster)}\n >\n Download installation logs\n </AlertActionLink>\n <AlertActionLink\n onClick={() => window.open(getReportIssueLink(), '_blank')}\n id={getID('button-report-bug')}\n >\n Report a bug\n </AlertActionLink>\n </>\n }\n >\n {message}\n </Alert>\n </>\n );\n};\n\nexport const HostsInstallationSuccess = () => {\n return (\n <>\n <Alert isInline variant=\"success\" title={'Installation completed successfully'}>\n {' '}\n </Alert>\n </>\n );\n};\n", "import React from 'react';\nimport {\n Card,\n Title,\n CardBody,\n CardHeader,\n CardExpandableContent,\n Grid,\n GridItem,\n} from '@patternfly/react-core';\nimport { Cluster, ClusterProgress } from '../../../common';\nimport ClusterHostsTable from '../hosts/ClusterHostsTable';\nimport ClusterDetailsButtonGroup from './ClusterDetailsButtonGroup';\nimport { ClusterStatusIcon } from '../clusters/ClusterStatus';\nimport ClusterDetailStatusVarieties, {\n useClusterStatusVarieties,\n} from './ClusterDetailStatusVarieties';\n\nconst ClusterInstallationProgressCard: React.FC<{ cluster: Cluster }> = ({ cluster }) => {\n const [isCardExpanded, setIsCardExpanded] = React.useState(cluster.status !== 'installed');\n const clusterVarieties = useClusterStatusVarieties(cluster);\n\n return (\n <Card data-testid=\"ai-cluster-details-card\" isExpanded={isCardExpanded}>\n <CardHeader\n onExpand={() => setIsCardExpanded(!isCardExpanded)}\n toggleButtonProps={{\n 'data-testid': 'toggle-ai-cluster-details',\n 'aria-label': 'AI Cluster Details',\n 'aria-labelledby': 'titleId toggle-button',\n 'aria-expanded': isCardExpanded,\n }}\n >\n <Title headingLevel=\"h1\" size=\"lg\" className=\"card-title\">\n Installation progress\n </Title>\n {!isCardExpanded && (\n <div className=\"pf-u-ml-md\">\n <ClusterStatusIcon status={cluster.status} />\n </div>\n )}\n </CardHeader>\n <CardBody>\n <ClusterProgress\n cluster={cluster}\n minimizedView={!isCardExpanded}\n totalPercentage={cluster.progress?.totalPercentage || 0}\n />\n <ClusterDetailsButtonGroup cluster={cluster} />\n </CardBody>\n <CardExpandableContent>\n <CardBody>\n <Grid hasGutter>\n <ClusterDetailStatusVarieties\n cluster={cluster}\n clusterVarieties={clusterVarieties}\n showAddHostsInfo={false}\n showKubeConfig={false}\n />\n <GridItem>\n <ClusterHostsTable cluster={cluster} skipDisabled />\n </GridItem>\n </Grid>\n </CardBody>\n </CardExpandableContent>\n </Card>\n );\n};\n\nexport default ClusterInstallationProgressCard;\n", "import { Flex, FlexItem, Button, ButtonVariant } from '@patternfly/react-core';\nimport React from 'react';\nimport { Cluster, canDownloadClusterLogs, useAlerts, KubeconfigDownload } from '../../../common';\nimport { downloadClusterInstallationLogs } from './utils';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport { canAbortInstallation } from '../clusters/utils';\nimport { onFetchEvents } from '../fetching/fetchEvents';\nimport ViewClusterEventsButton from '../../../common/components/ui/ViewClusterEventsButton';\n\ntype ClusterDetailsButtonGroupProps = {\n cluster: Cluster;\n};\n\nconst getID = (suffix: string) => `cluster-detail-${suffix}`;\n\nconst ClusterDetailsButtonGroup: React.FC<ClusterDetailsButtonGroupProps> = ({ cluster }) => {\n const { addAlert } = useAlerts();\n const { cancelInstallationDialog } = useModalDialogsContext();\n\n return (\n <Flex\n className=\"assisted-ui-vertical-margin\"\n spaceItems={{ default: 'spaceItemsSm' }}\n direction={{ default: 'row' }}\n justifyContent={{ default: 'justifyContentFlexStart' }}\n >\n <FlexItem>\n <Button\n data-testid=\"cluster-installation-abort-button\"\n variant={ButtonVariant.danger}\n onClick={() => cancelInstallationDialog.open({ clusterId: cluster.id })}\n isDisabled={!canAbortInstallation(cluster)}\n >\n Abort Installation\n </Button>\n </FlexItem>\n <FlexItem>\n <KubeconfigDownload\n status={cluster.status}\n clusterId={cluster.id}\n data-testid={getID('button-download-kubeconfig')}\n />\n </FlexItem>\n <FlexItem>\n <ViewClusterEventsButton cluster={cluster} onFetchEvents={onFetchEvents} />\n </FlexItem>\n <FlexItem>\n <Button\n data-testid=\"cluster-installation-logs-button\"\n variant={ButtonVariant.link}\n onClick={() => downloadClusterInstallationLogs(addAlert, cluster.id)}\n isDisabled={!canDownloadClusterLogs(cluster)}\n >\n Download Installation Logs\n </Button>\n </FlexItem>\n </Flex>\n );\n};\n\nexport default ClusterDetailsButtonGroup;\n", "import React from 'react';\nimport { Provider } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { Button, ButtonVariant, Card, CardBody, CardHeader, Title } from '@patternfly/react-core';\nimport { store } from '../../store';\nimport { isSingleClusterMode, OCM_CLUSTER_LIST_LINK } from '../../config';\nimport {\n AlertsContextProvider,\n AssistedInstallerOCMPermissionTypesListType,\n Cluster,\n CpuArchitecture,\n ErrorState,\n FeatureGateContextProvider,\n FeatureListType,\n LoadingState,\n ResourceUIState,\n} from '../../../common';\nimport { useClusterPolling, useFetchCluster } from '../clusters/clusterPolling';\nimport ClusterWizard from '../clusterWizard/ClusterWizard';\nimport { ClusterDefaultConfigurationProvider } from '../clusterConfiguration/ClusterDefaultConfigurationContext';\nimport { ModalDialogsContextProvider } from '../hosts/ModalDialogsContext';\nimport ClusterInstallationProgressCard from './ClusterInstallationProgressCard';\nimport { DiscoveryImageModal } from '../clusterConfiguration/DiscoveryImageModal';\nimport CancelInstallationModal from './CancelInstallationModal';\nimport ResetClusterModal from './ResetClusterModal';\nimport ClusterPollingErrorModal from './ClusterPollingErrorModal';\nimport { FeatureSupportLevelProvider } from '../featureSupportLevels';\nimport useInfraEnv from '../../hooks/useInfraEnv';\nimport { SentryErrorMonitorContextProvider } from '../SentryErrorMonitorContextProvider';\nimport ClusterWizardContextProvider from '../clusterWizard/ClusterWizardContextProvider';\n\ntype AssistedInstallerDetailCardProps = {\n aiClusterId: string;\n allEnabledFeatures: FeatureListType;\n permissions?: AssistedInstallerOCMPermissionTypesListType;\n};\n\nconst getErrorStateActions = () => {\n const errorStateActions: React.ReactNode[] = [];\n if (!isSingleClusterMode()) {\n errorStateActions.push(\n <Button\n key=\"cancel\"\n variant={ButtonVariant.secondary}\n component={(props) => <Link to={OCM_CLUSTER_LIST_LINK} {...props} />}\n >\n Back\n </Button>,\n );\n }\n return errorStateActions;\n};\n\nconst LoadingCard = () => (\n <Card data-testid=\"ai-cluster-details-card\">\n <CardHeader>\n <Title headingLevel=\"h1\" size=\"lg\" className=\"card-title\">\n Loading additional details\n </Title>\n </CardHeader>\n <CardBody>\n <LoadingState />\n </CardBody>\n </Card>\n);\n\nconst ClusterLoadFailed = ({ clusterId }: { clusterId: Cluster['id'] }) => {\n const fetchCluster = useFetchCluster(clusterId);\n return (\n <Card data-testid=\"ai-cluster-details-card\">\n <CardHeader>\n <Title headingLevel=\"h1\" size=\"lg\" className=\"card-title\">\n Loading additional details\n </Title>\n </CardHeader>\n <CardBody>\n <ErrorState\n title=\"Failed to fetch the cluster\"\n fetchData={fetchCluster}\n actions={getErrorStateActions()}\n />\n </CardBody>\n </Card>\n );\n};\n\nconst LoadingDefaultConfigFailedCard = () => (\n <Card data-testid=\"ai-cluster-details-card\">\n <CardHeader>\n <Title headingLevel=\"h1\" size=\"lg\" className=\"card-title\">\n Loading additional details\n </Title>\n </CardHeader>\n <CardBody>\n <ErrorState\n title=\"Failed to retrieve the default configuration\"\n actions={getErrorStateActions()}\n />\n </CardBody>\n </Card>\n);\n\nconst AssistedInstallerDetailCard = ({\n aiClusterId,\n allEnabledFeatures,\n permissions,\n}: AssistedInstallerDetailCardProps) => {\n const { cluster, uiState } = useClusterPolling(aiClusterId);\n const {\n infraEnv,\n isLoading: infraEnvLoading,\n error: infraEnvError,\n updateInfraEnv,\n } = useInfraEnv(aiClusterId, CpuArchitecture.USE_DAY1_ARCHITECTURE);\n if (uiState === ResourceUIState.LOADING || infraEnvLoading) {\n return <LoadingCard />;\n } else if ((uiState === ResourceUIState.ERROR && !cluster) || infraEnvError) {\n return <ClusterLoadFailed clusterId={aiClusterId} />;\n }\n\n if (!cluster || !infraEnv || cluster.status === 'adding-hosts') {\n // In OCM the Day 2 flow is rendered in a separate tab.\n return null;\n }\n\n const showWizard = ['insufficient', 'ready', 'pending-for-input'].includes(cluster.status);\n\n const content = (\n <ClusterWizardContextProvider cluster={cluster} infraEnv={infraEnv} permissions={permissions}>\n {showWizard ? (\n <ClusterWizard cluster={cluster} infraEnv={infraEnv} updateInfraEnv={updateInfraEnv} />\n ) : (\n <ClusterInstallationProgressCard cluster={cluster} />\n )}\n </ClusterWizardContextProvider>\n );\n\n const isOutdatedClusterData = uiState === ResourceUIState.ERROR;\n return (\n <FeatureGateContextProvider features={allEnabledFeatures}>\n <AlertsContextProvider>\n <SentryErrorMonitorContextProvider>\n <ModalDialogsContextProvider>\n <ClusterDefaultConfigurationProvider\n loadingUI={<LoadingCard />}\n errorUI={<LoadingDefaultConfigFailedCard />}\n >\n <FeatureSupportLevelProvider loadingUi={<LoadingCard />} cluster={cluster}>\n {content}\n </FeatureSupportLevelProvider>\n {isOutdatedClusterData && <ClusterPollingErrorModal />}\n <CancelInstallationModal />\n <ResetClusterModal />\n <DiscoveryImageModal />\n </ClusterDefaultConfigurationProvider>\n </ModalDialogsContextProvider>\n </SentryErrorMonitorContextProvider>\n </AlertsContextProvider>\n </FeatureGateContextProvider>\n );\n};\n\nconst Wrapper = (props: AssistedInstallerDetailCardProps) => (\n <Provider store={store}>\n <AssistedInstallerDetailCard {...props} />\n </Provider>\n);\n\n// TODO(mlibra): The provider should go higher within the OCM hierarchy otherwise we do not have multiple cards/tabs with redux.\nexport default Wrapper;\n", "import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Cluster, ResourceUIState, POLLING_INTERVAL } from '../../../common';\nimport {\n fetchClusterAsync,\n cleanCluster,\n forceReload,\n cancelForceReload,\n FetchErrorType,\n} from '../../reducers/clusters';\nimport { selectCurrentClusterState } from '../../selectors';\n\nconst shouldRefetch = (uiState: ResourceUIState, hasClusterData: boolean) => {\n if (uiState === ResourceUIState.ERROR) {\n return hasClusterData;\n }\n return ![ResourceUIState.LOADING, ResourceUIState.RELOADING].includes(uiState);\n};\n\nexport const useFetchCluster = (clusterId: string) => {\n const dispatch = useDispatch();\n return React.useCallback(() => dispatch(fetchClusterAsync(clusterId)), [clusterId, dispatch]);\n};\n\nexport const useClusterPolling = (\n clusterId: string,\n): {\n cluster: Cluster | undefined;\n uiState: ResourceUIState;\n errorDetail: FetchErrorType | undefined;\n} => {\n const { isReloadScheduled, uiState, data, errorDetail } = useSelector(selectCurrentClusterState);\n const dispatch = useDispatch();\n const fetchCluster = useFetchCluster(clusterId);\n const hasClusterData = !!data;\n\n React.useEffect(() => {\n if (isReloadScheduled && shouldRefetch(uiState, hasClusterData)) {\n fetchCluster();\n }\n dispatch(cancelForceReload());\n }, [fetchCluster, dispatch, isReloadScheduled, hasClusterData, uiState]);\n\n React.useEffect(() => {\n fetchCluster();\n const timer = window.setInterval(() => dispatch(forceReload()), POLLING_INTERVAL);\n return () => {\n clearInterval(timer);\n dispatch(cancelForceReload());\n dispatch(cleanCluster());\n };\n }, [dispatch, fetchCluster]);\n\n return { cluster: data, uiState, errorDetail };\n};\n", "import React from 'react';\nimport classNames from 'classnames';\nimport { Cluster, InfraEnv, InfraEnvUpdateParams, LoadingState } from '../../../common';\nimport NetworkConfigurationPage from '../clusterConfiguration/networkConfiguration/NetworkConfigurationForm';\nimport ReviewStep from '../clusterConfiguration/ReviewStep';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport ClusterDetails from './ClusterDetails';\nimport HostDiscovery from './HostDiscovery';\nimport Storage from './Storage';\nimport StaticIp from './StaticIp';\nimport Operators from './Operators';\nimport { WithErrorBoundary } from '../../../common/components/ErrorHandling/WithErrorBoundary';\n\ntype ClusterWizardProps = {\n cluster: Cluster;\n infraEnv: InfraEnv;\n updateInfraEnv: (infraEnvUpdateParams: InfraEnvUpdateParams) => Promise<InfraEnv>;\n};\n\nconst ClusterWizard = ({ cluster, infraEnv, updateInfraEnv }: ClusterWizardProps) => {\n const { currentStepId } = useClusterWizardContext();\n\n const renderCurrentStep = React.useCallback(() => {\n switch (currentStepId) {\n case 'host-discovery':\n return <HostDiscovery cluster={cluster} />;\n case 'networking':\n return <NetworkConfigurationPage cluster={cluster} />;\n case 'review':\n return <ReviewStep cluster={cluster} />;\n case 'operators':\n return <Operators cluster={cluster} />;\n case 'storage':\n return <Storage cluster={cluster} />;\n case 'static-ip-host-configurations':\n case 'static-ip-network-wide-configurations':\n case 'static-ip-yaml-view':\n return <StaticIp cluster={cluster} infraEnv={infraEnv} updateInfraEnv={updateInfraEnv} />;\n case 'cluster-details':\n default:\n return <ClusterDetails cluster={cluster} infraEnv={infraEnv} />;\n }\n }, [currentStepId, cluster, infraEnv, updateInfraEnv]);\n if (!currentStepId) {\n return <LoadingState />;\n }\n return (\n <WithErrorBoundary>\n <div className={classNames('pf-c-wizard', 'cluster-wizard')}>{renderCurrentStep()}</div>\n </WithErrorBoundary>\n );\n};\n\nexport default ClusterWizard;\n", "import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Formik, FormikConfig, useFormikContext } from 'formik';\nimport { Form, Grid, GridItem, Text, TextContent } from '@patternfly/react-core';\nimport {\n Cluster,\n ClusterDefaultConfig,\n ClusterWizardStep,\n ClusterWizardStepHeader,\n CpuArchitecture,\n getFormikErrorFields,\n getHostSubnets,\n HostSubnets,\n InfraEnv,\n IPV4_STACK,\n isSNO,\n LoadingState,\n NetworkConfigurationValues,\n SecurityFields,\n useAlerts,\n useFormikAutoSave,\n V2ClusterUpdateParams,\n} from '../../../../common';\nimport { useDefaultConfiguration } from '../ClusterDefaultConfigurationContext';\nimport { useClusterWizardContext } from '../../clusterWizard/ClusterWizardContext';\nimport ClusterWizardFooter from '../../clusterWizard/ClusterWizardFooter';\nimport { canNextNetwork } from '../../clusterWizard/wizardTransition';\nimport ClusterWizardNavigation from '../../clusterWizard/ClusterWizardNavigation';\nimport NetworkConfigurationTable from './NetworkConfigurationTable';\nimport useInfraEnv from '../../../hooks/useInfraEnv';\nimport { selectCurrentClusterPermissionsState } from '../../../selectors';\nimport {\n getNetworkConfigurationValidationSchema,\n getNetworkInitialValues,\n} from './networkConfigurationValidation';\nimport NetworkConfiguration from './NetworkConfiguration';\nimport { captureException } from '../../../sentry';\nimport { ClustersService } from '../../../services';\nimport { updateClusterBase } from '../../../reducers/clusters';\nimport { getApiErrorMessage, handleApiError } from '../../../api';\n\nconst NetworkConfigurationForm: React.FC<{\n cluster: Cluster;\n hostSubnets: HostSubnets;\n defaultNetworkSettings: Pick<\n ClusterDefaultConfig,\n | 'clusterNetworksIpv4'\n | 'clusterNetworksDualstack'\n | 'serviceNetworksIpv4'\n | 'serviceNetworksDualstack'\n >;\n infraEnv?: InfraEnv;\n}> = ({ cluster, hostSubnets, defaultNetworkSettings, infraEnv }) => {\n const { alerts } = useAlerts();\n const clusterWizardContext = useClusterWizardContext();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const { errors, touched, isSubmitting, isValid, setFieldValue, values } =\n useFormikContext<NetworkConfigurationValues>();\n const isAutoSaveRunning = useFormikAutoSave();\n const errorFields = getFormikErrorFields(errors, touched);\n\n // DHCP allocation is currently not supported with Nutanix\n // https://issues.redhat.com/browse/MGMT-12382\n const isClusterPlatformTypeNutanix = React.useMemo(\n () => cluster.platform?.type === 'nutanix',\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n React.useEffect(() => {\n if (isClusterPlatformTypeNutanix && values.vipDhcpAllocation) {\n setFieldValue('vipDhcpAllocation', false);\n }\n }, [isClusterPlatformTypeNutanix, setFieldValue, values.vipDhcpAllocation]);\n\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n errorFields={errorFields}\n isSubmitting={isSubmitting}\n isNextDisabled={\n isSubmitting ||\n isAutoSaveRunning ||\n !!alerts.length ||\n !isValid ||\n !canNextNetwork({ cluster })\n }\n onNext={() => clusterWizardContext.moveNext()}\n onBack={() => clusterWizardContext.moveBack()}\n />\n );\n\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />} footer={footer}>\n <Form>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Networking</ClusterWizardStepHeader>\n </GridItem>\n <GridItem span={12} lg={10} xl={9} xl2={7}>\n <Grid hasGutter>\n <NetworkConfiguration\n cluster={cluster}\n hostSubnets={hostSubnets}\n defaultNetworkSettings={defaultNetworkSettings}\n isVipDhcpAllocationDisabled={isClusterPlatformTypeNutanix}\n />\n <SecurityFields\n clusterSshKey={cluster.sshPublicKey}\n imageSshKey={infraEnv?.sshAuthorizedKey}\n isDisabled={isViewerMode}\n />\n </Grid>\n </GridItem>\n <GridItem>\n <TextContent>\n <Text component=\"h2\">Host inventory</Text>\n </TextContent>\n <NetworkConfigurationTable cluster={cluster} />\n </GridItem>\n </Grid>\n </Form>\n </ClusterWizardStep>\n );\n};\n\nconst NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {\n const {\n infraEnv,\n error: infraEnvError,\n isLoading,\n } = useInfraEnv(cluster.id, CpuArchitecture.USE_DAY1_ARCHITECTURE);\n const defaultNetworkValues = useDefaultConfiguration([\n 'clusterNetworksDualstack',\n 'clusterNetworksIpv4',\n 'serviceNetworksDualstack',\n 'serviceNetworksIpv4',\n ]);\n\n const { addAlert, clearAlerts, alerts } = useAlerts();\n const dispatch = useDispatch();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const hostSubnets = React.useMemo(() => getHostSubnets(cluster), [cluster]);\n const initialValues = React.useMemo(\n () => getNetworkInitialValues(cluster, defaultNetworkValues),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [], // just once, Formik does not reinitialize\n );\n\n const memoizedValidationSchema = React.useMemo(\n () => getNetworkConfigurationValidationSchema(initialValues, hostSubnets),\n [hostSubnets, initialValues],\n );\n\n React.useEffect(() => {\n if (infraEnvError) {\n const title = `Failed to retrieve infra env (clusterId: ${cluster.id})`;\n //TODO(brotman) add handling of existing errors to alerts context\n if (alerts.find((alert) => alert.title === title)) {\n return;\n }\n captureException(infraEnvError, title);\n addAlert({\n title,\n message: infraEnvError,\n });\n }\n //shouldn't respond to cluster polling. shouldn't respond to alerts changes so remove alert wouldn't trigger adding it back\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [infraEnvError]);\n\n const handleSubmit: FormikConfig<NetworkConfigurationValues>['onSubmit'] = async (values) => {\n clearAlerts();\n // update the cluster configuration\n try {\n const isMultiNodeCluster = !isSNO(cluster);\n const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';\n\n const params: V2ClusterUpdateParams = {\n apiVip: values.apiVip,\n ingressVip: values.ingressVip,\n sshPublicKey: values.sshPublicKey,\n vipDhcpAllocation: values.vipDhcpAllocation,\n networkType: values.networkType,\n machineNetworks: values.machineNetworks,\n clusterNetworks: values.clusterNetworks,\n serviceNetworks: values.serviceNetworks,\n userManagedNetworking: isUserManagedNetworking,\n };\n\n if (params.userManagedNetworking) {\n delete params.apiVip;\n delete params.ingressVip;\n if (isMultiNodeCluster) {\n delete params.machineNetworks;\n }\n } else {\n // cluster-managed can't be chosen in SNO, so this must be a multi-node cluster\n if (values.vipDhcpAllocation) {\n delete params.apiVip;\n delete params.ingressVip;\n } else if (values.stackType === IPV4_STACK) {\n // The API will rebuild the default machineNetwork\n params.machineNetworks = [];\n }\n }\n\n const { data } = await ClustersService.update(cluster.id, cluster.tags, params);\n dispatch(updateClusterBase(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to update the cluster', message: getApiErrorMessage(e) }),\n );\n }\n };\n\n if (isLoading) {\n return <LoadingState />;\n }\n\n const onSubmit = isViewerMode ? () => Promise.resolve() : handleSubmit;\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={memoizedValidationSchema}\n onSubmit={onSubmit}\n validateOnMount\n >\n <NetworkConfigurationForm\n cluster={cluster}\n hostSubnets={hostSubnets}\n defaultNetworkSettings={defaultNetworkValues}\n infraEnv={infraEnv}\n />\n </Formik>\n );\n};\n\nexport default NetworkConfigurationPage;\n", "import React from 'react';\nimport { HostsNetworkConfigurationType } from '../../services';\nimport { StaticIpView } from '../clusterConfiguration/staticIp/data/dataTypes';\nimport { ClusterWizardStepsType } from './wizardTransition';\n\nexport type ClusterWizardContextType = {\n currentStepId: ClusterWizardStepsType;\n setCurrentStepId(stepId: ClusterWizardStepsType): void;\n moveBack(): void;\n moveNext(): void;\n wizardStepIds: ClusterWizardStepsType[];\n onUpdateStaticIpView(view: StaticIpView): void;\n onUpdateHostNetworkConfigType(type: HostsNetworkConfigurationType): void;\n};\n\nconst ClusterWizardContext = React.createContext<ClusterWizardContextType | null>(null);\n\nexport const useClusterWizardContext = () => {\n const context = React.useContext(ClusterWizardContext);\n if (!context) {\n throw new Error('useClusterWizardContext must be used within ClusterWizardContextProvider');\n }\n return context;\n};\n\nexport default ClusterWizardContext;\n", "import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Alert, AlertGroup, AlertVariant } from '@patternfly/react-core';\nimport {\n Cluster,\n WizardFooter,\n WizardFooterGenericProps,\n Alerts,\n useAlerts,\n clusterFieldLabels,\n selectClusterValidationsInfo,\n} from '../../../common';\nimport { routeBasePath } from '../../config';\nimport { wizardStepsValidationsMap } from './wizardTransition';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport ClusterWizardStepValidationsAlert from '../../../common/components/clusterWizard/ClusterWizardStepValidationsAlert';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { ClusterPlatformIntegrationHint } from './ClusterPlatformIntegrationHint';\nimport { onFetchEvents } from '../fetching/fetchEvents';\n\ntype ClusterValidationSectionProps = {\n cluster?: Cluster;\n errorFields?: string[];\n alertTitle?: string;\n alertContent?: string | null;\n};\n\nconst defaultAlertTitle = 'Provided cluster configuration is not valid';\nconst ValidationSection = ({\n cluster,\n errorFields = [],\n alertTitle,\n alertContent,\n}: ClusterValidationSectionProps) => {\n const { currentStepId } = useClusterWizardContext();\n const validationsInfo = cluster && selectClusterValidationsInfo(cluster);\n const { t } = useTranslation();\n\n let _alertContent = alertContent;\n if (_alertContent === undefined) {\n _alertContent = `The following fields are invalid or missing: \n ${errorFields.map((field: string) => clusterFieldLabels(t)[field] || field).join(', ')}.`;\n }\n return (\n <AlertGroup>\n {!!errorFields.length && (\n <Alert variant={AlertVariant.danger} title={alertTitle || defaultAlertTitle} isInline>\n {_alertContent}\n </Alert>\n )}\n {currentStepId === 'host-discovery' && cluster && (\n <ClusterPlatformIntegrationHint\n clusterId={cluster.id}\n platformType={cluster.platform?.type || 'none'}\n />\n )}\n\n {cluster && (\n <ClusterWizardStepValidationsAlert\n currentStepId={currentStepId}\n clusterStatus={cluster.status}\n hosts={cluster?.hosts || []}\n validationsInfo={validationsInfo}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n )}\n </AlertGroup>\n );\n};\n\ntype ClusterWizardFooterProps = WizardFooterGenericProps & {\n cluster?: Cluster;\n additionalActions?: React.ReactNode;\n errorFields?: string[];\n alertTitle?: string;\n alertContent?: string | null;\n};\n\nconst ClusterWizardFooter = ({\n cluster,\n additionalActions,\n errorFields,\n alertTitle,\n alertContent,\n onCancel,\n ...rest\n}: ClusterWizardFooterProps) => {\n const { alerts } = useAlerts();\n const history = useHistory();\n\n const handleCancel = React.useCallback(\n () => history.push(`${routeBasePath}/clusters/`),\n [history],\n );\n\n const alertsSection = alerts.length ? <Alerts /> : undefined;\n\n const errorsSection = (\n <ValidationSection\n cluster={cluster}\n errorFields={errorFields}\n alertTitle={alertTitle}\n alertContent={alertContent}\n />\n );\n\n return (\n <WizardFooter\n alerts={alertsSection}\n errors={errorsSection}\n onCancel={onCancel || handleCancel}\n leftExtraActions={additionalActions}\n cluster={cluster}\n onFetchEvents={onFetchEvents}\n {...rest}\n />\n );\n};\n\nexport default ClusterWizardFooter;\n", "import React from 'react';\nimport { Alert, AlertVariant } from '@patternfly/react-core';\nimport { useClusterSupportedPlatforms } from '../../hooks';\nimport {\n isClusterPlatformTypeVM,\n NUTANIX_CONFIG_LINK,\n PlatformType,\n SupportedPlatformType,\n VSPHERE_CONFIG_LINK,\n} from '../../../common';\n\ntype ClusterPlatformIntegrationHintProps = {\n clusterId: string;\n platformType: PlatformType;\n};\n\nconst integrationBrands: Record<SupportedPlatformType, string> = {\n vsphere: 'vSphere',\n nutanix: 'Nutanix',\n};\n\nexport const integrationPlatformLinks: Record<SupportedPlatformType, string> = {\n vsphere: VSPHERE_CONFIG_LINK,\n nutanix: NUTANIX_CONFIG_LINK,\n};\n\nexport const ClusterPlatformIntegrationHint = ({\n clusterId,\n platformType,\n}: ClusterPlatformIntegrationHintProps) => {\n const { isPlatformIntegrationSupported, supportedPlatformIntegration } =\n useClusterSupportedPlatforms(clusterId);\n\n const canIntegrateWithPlatform =\n isPlatformIntegrationSupported &&\n !isClusterPlatformTypeVM({ platform: { type: platformType } });\n if (!canIntegrateWithPlatform) {\n return null;\n }\n\n const integrationBrand: string = integrationBrands[supportedPlatformIntegration] as string;\n\n return (\n <Alert\n title={`Discover the full potential of ${integrationBrand} integration`}\n variant={AlertVariant.info}\n isInline\n data-testid=\"discover-platform-integration-hosts\"\n >\n {`Since all of your hosts originated from the ${integrationBrand} platform, you now have the option to integrate with it.`}\n </Alert>\n );\n};\n", "import React, { ReactNode } from 'react';\nimport { WizardNav } from '@patternfly/react-core';\nimport { Cluster } from '../../../common';\nimport {\n canNextClusterDetails,\n canNextHostDiscovery,\n canNextNetwork,\n canNextStorage,\n ClusterWizardStepsType,\n isStaticIpStep,\n} from './wizardTransition';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport { staticIpFormViewSubSteps, wizardStepNames } from './constants';\nimport WizardNavItem from '../../../common/components/ui/WizardNavItem';\n\nconst isStepValid = (stepId: ClusterWizardStepsType, cluster?: Cluster): boolean => {\n if (!cluster) {\n return true;\n }\n switch (stepId) {\n case 'cluster-details':\n return !cluster.validationsInfo || canNextClusterDetails({ cluster });\n case 'static-ip-yaml-view':\n case 'static-ip-host-configurations':\n case 'static-ip-network-wide-configurations':\n return canNextClusterDetails({ cluster });\n case 'host-discovery':\n return canNextHostDiscovery({ cluster });\n case 'storage':\n return canNextStorage({ cluster });\n case 'networking':\n return canNextNetwork({ cluster });\n default:\n return true;\n }\n};\n\nconst ClusterWizardNavigation = ({ cluster }: { cluster?: Cluster }) => {\n const clusterWizardContext = useClusterWizardContext();\n\n const isStepIdxAfterCurrent = (idx: number) => {\n return !clusterWizardContext.wizardStepIds\n .slice(idx)\n .includes(clusterWizardContext.currentStepId);\n };\n\n const isStepDisabled = (idx: number, stepId: ClusterWizardStepsType) => {\n return stepId === 'cluster-details' ? false : isStepIdxAfterCurrent(idx);\n };\n\n const getNavItem = (idx: number, stepId: ClusterWizardStepsType): ReactNode => {\n return (\n <WizardNavItem\n step={idx}\n key={stepId}\n content={wizardStepNames[stepId]}\n onNavItemClick={() => clusterWizardContext.setCurrentStepId(stepId)}\n isCurrent={clusterWizardContext.currentStepId === stepId}\n isDisabled={isStepDisabled(idx, stepId)}\n isValid={() => isStepValid(stepId, cluster)}\n />\n );\n };\n\n const getStaticIpFormViewNavItem = (idx: number): ReactNode => {\n return (\n <WizardNavItem\n step={idx}\n isExpandable={true}\n content=\"Static network configurations\"\n key=\"static-network-configuration-form-view\"\n isCurrent={isStaticIpStep(clusterWizardContext.currentStepId)}\n isDisabled={isStepIdxAfterCurrent(idx)}\n >\n <WizardNav returnList>\n {staticIpFormViewSubSteps.map((stepId, subIdx) => {\n return getNavItem(idx + subIdx, stepId);\n })}\n </WizardNav>\n </WizardNavItem>\n );\n };\n\n const getWizardNavItems = (): ReactNode[] => {\n const navItems: ReactNode[] = [];\n let i = 0;\n while (i < clusterWizardContext.wizardStepIds.length) {\n const stepId = clusterWizardContext.wizardStepIds[i];\n if (stepId !== 'static-ip-network-wide-configurations') {\n navItems.push(getNavItem(i, stepId));\n i += 1;\n } else {\n navItems.push(getStaticIpFormViewNavItem(i));\n //skip iteration on form view sub steps\n i += 2;\n }\n }\n return navItems;\n };\n\n return <WizardNav>{getWizardNavItems()}</WizardNav>;\n};\n\nexport default ClusterWizardNavigation;\n", "import { ClusterWizardStepsType } from './wizardTransition';\n\nexport const wizardStepNames: { [key in ClusterWizardStepsType]: string } = {\n 'cluster-details': 'Cluster details',\n operators: 'Operators',\n 'host-discovery': 'Host discovery',\n 'static-ip-yaml-view': 'Static network configurations',\n 'static-ip-network-wide-configurations': 'Network-wide configurations',\n 'static-ip-host-configurations': 'Host specific configurations',\n storage: 'Storage',\n networking: 'Networking',\n review: 'Review and create',\n};\n\nexport const defaultWizardSteps: ClusterWizardStepsType[] = [\n 'cluster-details',\n 'operators',\n 'host-discovery',\n 'storage',\n 'networking',\n 'review',\n];\n\nexport const staticIpFormViewSubSteps: ClusterWizardStepsType[] = [\n 'static-ip-network-wide-configurations',\n 'static-ip-host-configurations',\n];\n", "import * as React from 'react';\nimport { HostsTableEmptyState } from '../../../../common/components/hosts/HostsTable';\nimport { ClusterHostsTableProps, isSNO } from '../../../../common';\nimport { AdditionalNTPSourcesDialogToggle } from '../../hosts/AdditionaNTPSourceDialogToggle';\nimport { HostsTableModals, useHostsTable } from '../../hosts/use-hosts-table';\nimport NetworkConfigurationTableBase from './NetworkConfigurationTableBase';\n\nconst NetworkConfigurationTable = ({ cluster }: ClusterHostsTableProps) => {\n const { actionChecks, onEditHost, actionResolver, ...modalProps } = useHostsTable(cluster);\n\n return (\n <>\n <NetworkConfigurationTableBase\n cluster={cluster}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n onEditHost={onEditHost}\n canEditHostname={actionChecks.canEditHostname}\n actionResolver={actionResolver}\n >\n <HostsTableEmptyState isSNO={isSNO(cluster)} />\n </NetworkConfigurationTableBase>\n <HostsTableModals cluster={cluster} {...modalProps} />\n </>\n );\n};\n\nexport default NetworkConfigurationTable;\n", "import * as React from 'react';\nimport { sortable } from '@patternfly/react-table';\nimport {\n Cluster,\n Host,\n HostsTableActions,\n selectSchedulableMasters,\n stringToJSON,\n} from '../../../../common';\nimport NetworkingStatus from '../../hosts/NetworkingStatus';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport {\n hostnameColumn,\n roleColumn,\n activeNICColumn,\n ipv4Column,\n ipv6Column,\n macAddressColumn,\n countColumn,\n} from '../../../../common/components/hosts/tableUtils';\nimport { ActionsResolver, TableRow } from '../../../../common/components/hosts/AITable';\nimport { usePagination } from '../../../../common/components/hosts/usePagination';\nimport { HostDetail } from '../../../../common/components/hosts/HostRowDetail';\nimport HostsTable from '../../../../common/components/hosts/HostsTable';\nimport { ValidationsInfo } from '../../../../common/types/hosts';\n\nexport const networkingStatusColumn = (\n onEditHostname?: HostsTableActions['onEditHost'],\n): TableRow<Host> => ({\n header: { title: 'Status', transforms: [sortable] },\n cell: (host) => {\n const editHostname = onEditHostname ? () => onEditHostname(host) : undefined;\n const validationsInfo = stringToJSON<ValidationsInfo>(host.validationsInfo) || {};\n return {\n title: (\n <NetworkingStatus\n host={host}\n onEditHostname={editHostname}\n validationsInfo={validationsInfo}\n />\n ),\n props: { 'data-testid': 'nic-status' },\n sortableValue: status,\n };\n },\n});\n\ntype NetworkConfigurationTableProps = {\n cluster: Cluster;\n AdditionalNTPSourcesDialogToggleComponent: React.FC;\n actionResolver: ActionsResolver<Host>;\n children: React.ReactNode;\n onEditHost?: HostsTableActions['onEditHost'];\n onEditRole?: HostsTableActions['onEditRole'];\n canEditRole?: HostsTableActions['canEditRole'];\n canEditHostname?: HostsTableActions['canEditHostname'];\n onSelect?: (obj: Host, isSelected: boolean) => void;\n selectedIDs?: string[];\n};\n\nconst NetworkConfigurationTableBase = ({\n cluster,\n AdditionalNTPSourcesDialogToggleComponent,\n onEditHost,\n onEditRole,\n canEditRole,\n canEditHostname,\n actionResolver,\n children,\n onSelect,\n selectedIDs,\n}: NetworkConfigurationTableProps) => {\n const { t } = useTranslation();\n const content = React.useMemo(\n () => [\n hostnameColumn(t, onEditHost, undefined, canEditHostname),\n roleColumn(t, canEditRole, onEditRole, selectSchedulableMasters(cluster)),\n networkingStatusColumn(onEditHost),\n activeNICColumn(cluster),\n ipv4Column(cluster),\n ipv6Column(cluster),\n macAddressColumn(cluster),\n countColumn(cluster),\n ],\n [t, onEditHost, onEditRole, canEditHostname, canEditRole, cluster],\n );\n\n const hosts = cluster.hosts || [];\n\n const paginationProps = usePagination(hosts.length);\n\n const ExpandComponent = React.useCallback(\n ({ obj }: { obj: Host }) => {\n return (\n <HostDetail\n host={obj}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggleComponent}\n />\n );\n },\n [AdditionalNTPSourcesDialogToggleComponent],\n );\n\n return (\n <HostsTable\n testId=\"networking-host-table\"\n hosts={hosts}\n ExpandComponent={ExpandComponent}\n content={content}\n actionResolver={actionResolver}\n onSelect={onSelect}\n selectedIDs={selectedIDs}\n {...paginationProps}\n >\n {children}\n </HostsTable>\n );\n};\n\nexport default NetworkConfigurationTableBase;\n", "import React from 'react';\nimport {\n areOnlySoftValidationsOfWizardStepFailing,\n getWizardStepHostStatus,\n getWizardStepHostValidationsInfo,\n HostNetworkingStatusComponentProps,\n hostStatus,\n HostStatus,\n} from '../../../common';\nimport { wizardStepsValidationsMap } from '../clusterWizard/wizardTransition';\nimport { AdditionalNTPSourcesDialogToggle } from './AdditionaNTPSourceDialogToggle';\n\nconst NetworkingStatus: React.FC<HostNetworkingStatusComponentProps> = (props) => {\n const networkingStatus = getWizardStepHostStatus(\n 'networking',\n wizardStepsValidationsMap,\n props.host,\n );\n const status = hostStatus[networkingStatus];\n const validationsInfo = getWizardStepHostValidationsInfo(\n props.validationsInfo,\n 'networking',\n wizardStepsValidationsMap,\n );\n const sublabel = areOnlySoftValidationsOfWizardStepFailing(\n validationsInfo,\n 'networking',\n wizardStepsValidationsMap,\n )\n ? 'Some validations failed'\n : undefined;\n\n return (\n <HostStatus\n {...props}\n status={{ ...status, sublabel }}\n validationsInfo={validationsInfo}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n />\n );\n};\n\nexport default NetworkingStatus;\n", "import React from 'react';\nimport { useInfraEnvId } from '.';\nimport { Cluster, CpuArchitecture, InfraEnv, InfraEnvUpdateParams } from '../../common';\nimport { getErrorMessage } from '../../common/utils';\nimport { InfraEnvsAPI } from '../services/apis';\n\nexport default function useInfraEnv(clusterId: Cluster['id'], cpuArchitecture: CpuArchitecture) {\n const [infraEnv, setInfraEnv] = React.useState<InfraEnv>();\n const [error, setError] = React.useState('');\n const { infraEnvId, error: infraEnvIdError } = useInfraEnvId(clusterId, cpuArchitecture);\n\n const getInfraEnv = React.useCallback(async () => {\n try {\n if (infraEnvId) {\n const { data: infraEnv } = await InfraEnvsAPI.get(infraEnvId);\n setInfraEnv(infraEnv);\n }\n } catch (e) {\n setError(getErrorMessage(e));\n }\n }, [infraEnvId]);\n\n const updateInfraEnv = React.useCallback(\n async (infraEnvUpdateParams: InfraEnvUpdateParams) => {\n if (!infraEnvId) {\n throw 'updateInfraEnv should not be called before infra env was loaded';\n }\n InfraEnvsAPI.abortLastGetRequest();\n const { data } = await InfraEnvsAPI.update(infraEnvId, infraEnvUpdateParams);\n setInfraEnv(data);\n return data;\n },\n [infraEnvId],\n );\n\n React.useEffect(() => {\n if (infraEnvIdError) {\n setError(infraEnvIdError);\n } else {\n if (!infraEnv) {\n void getInfraEnv();\n }\n }\n }, [getInfraEnv, infraEnv, infraEnvId, infraEnvIdError]);\n\n return { infraEnv, error, isLoading: !infraEnv && !error, updateInfraEnv };\n}\n", "import * as Yup from 'yup';\nimport {\n Cluster,\n clusterNetworksValidationSchema,\n dualStackValidationSchema,\n getDefaultNetworkType,\n HostSubnets,\n isDualStack,\n isSNO,\n machineNetworksValidationSchema,\n NetworkConfigurationValues,\n serviceNetworkValidationSchema,\n IPv4ValidationSchema,\n sshPublicKeyValidationSchema,\n vipValidationSchema,\n IPV4_STACK,\n DUAL_STACK,\n ClusterDefaultConfig,\n} from '../../../../common';\n\nexport const getNetworkInitialValues = (\n cluster: Cluster,\n defaultNetworkValues: Pick<\n ClusterDefaultConfig,\n | 'clusterNetworksIpv4'\n | 'clusterNetworksDualstack'\n | 'serviceNetworksIpv4'\n | 'serviceNetworksDualstack'\n >,\n): NetworkConfigurationValues => {\n const isSNOCluster = isSNO(cluster);\n const isDualStackType = isDualStack(cluster);\n\n return {\n apiVip: cluster.apiVip || '',\n ingressVip: cluster.ingressVip || '',\n sshPublicKey: cluster.sshPublicKey || '',\n vipDhcpAllocation: cluster.vipDhcpAllocation,\n managedNetworkingType: cluster.userManagedNetworking ? 'userManaged' : 'clusterManaged',\n networkType: cluster.networkType || getDefaultNetworkType(isSNOCluster, isDualStackType),\n machineNetworks: cluster.machineNetworks || [],\n stackType: isDualStackType ? DUAL_STACK : IPV4_STACK,\n clusterNetworks:\n cluster.clusterNetworks ||\n (isDualStackType\n ? defaultNetworkValues.clusterNetworksDualstack\n : defaultNetworkValues.clusterNetworksIpv4),\n serviceNetworks:\n cluster.serviceNetworks ||\n (isDualStackType\n ? defaultNetworkValues.serviceNetworksDualstack\n : defaultNetworkValues.serviceNetworksIpv4),\n };\n};\n\nexport const getNetworkConfigurationValidationSchema = (\n initialValues: NetworkConfigurationValues,\n hostSubnets: HostSubnets,\n) =>\n Yup.lazy<NetworkConfigurationValues>((values) =>\n Yup.object<NetworkConfigurationValues>().shape({\n apiVip: vipValidationSchema(hostSubnets, values, initialValues.apiVip),\n ingressVip: vipValidationSchema(hostSubnets, values, initialValues.ingressVip),\n sshPublicKey: sshPublicKeyValidationSchema,\n machineNetworks:\n values.managedNetworkingType === 'userManaged'\n ? Yup.array()\n : machineNetworksValidationSchema.when('stackType', {\n is: IPV4_STACK,\n then: IPv4ValidationSchema,\n otherwise:\n values.machineNetworks &&\n values.machineNetworks?.length >= 2 &&\n dualStackValidationSchema('machine networks'),\n }),\n clusterNetworks: clusterNetworksValidationSchema.when('stackType', {\n is: IPV4_STACK,\n then: IPv4ValidationSchema,\n otherwise:\n values.clusterNetworks &&\n values.clusterNetworks?.length >= 2 &&\n dualStackValidationSchema('cluster network'),\n }),\n serviceNetworks: serviceNetworkValidationSchema.when('stackType', {\n is: IPV4_STACK,\n then: IPv4ValidationSchema,\n otherwise:\n values.serviceNetworks &&\n values.serviceNetworks?.length >= 2 &&\n dualStackValidationSchema('service network'),\n }),\n }),\n );\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { useSelector } from 'react-redux';\nimport { Alert, AlertVariant, Grid, Tooltip } from '@patternfly/react-core';\nimport { VirtualIPControlGroup, VirtualIPControlGroupProps } from './VirtualIPControlGroup';\nimport {\n CpuArchitecture,\n HostSubnets,\n NetworkConfigurationValues,\n Cluster,\n ClusterDefaultConfig,\n FeatureSupportLevelData,\n useFeatureSupportLevel,\n isSNO,\n canBeDualStack,\n canSelectNetworkTypeSDN,\n clusterNetworksEqual,\n DUAL_STACK,\n serviceNetworksEqual,\n} from '../../../../common';\nimport { getLimitedFeatureSupportLevels } from '../../../../common/components/featureSupportLevels/utils';\nimport {\n ManagedNetworkingControlGroup,\n UserManagedNetworkingTextContent,\n} from '../../../../common/components/clusterWizard/networkingSteps';\nimport { StackTypeControlGroup } from './StackTypeControl';\nimport { AvailableSubnetsControl } from './AvailableSubnetsControl';\nimport AdvancedNetworkFields from './AdvancedNetworkFields';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { selectCurrentClusterPermissionsState } from '../../../selectors';\nimport { OcmCheckbox } from '../../ui/OcmFormFields';\nimport { NetworkTypeControlGroup } from '../../../../common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup';\n\nexport type NetworkConfigurationProps = VirtualIPControlGroupProps & {\n hostSubnets: HostSubnets;\n defaultNetworkSettings: Pick<\n ClusterDefaultConfig,\n | 'clusterNetworksIpv4'\n | 'clusterNetworksDualstack'\n | 'serviceNetworksIpv4'\n | 'serviceNetworksDualstack'\n >;\n hideManagedNetworking?: boolean;\n};\n\nconst vmsAlert = (\n <Alert\n title=\"Your cluster will be subject to support limitations\"\n variant={AlertVariant.info}\n isInline={true}\n data-testid=\"networking-vms-alert\"\n >\n Some or all of your discovered hosts are virtual machines, so selecting the cluster-managed\n networking option will limit your installed cluster's support.\n </Alert>\n);\n\nconst isAdvNetworkConf = (\n cluster: Cluster,\n defaultNetworkValues: Pick<ClusterDefaultConfig, 'clusterNetworksIpv4' | 'serviceNetworksIpv4'>,\n) =>\n !(\n serviceNetworksEqual(\n cluster.serviceNetworks || [],\n defaultNetworkValues.serviceNetworksIpv4 || [],\n ) &&\n clusterNetworksEqual(\n cluster.clusterNetworks || [],\n defaultNetworkValues.clusterNetworksIpv4 || [],\n )\n );\n\nconst isManagedNetworkingDisabled = (\n isDualStack: boolean,\n openshiftVersion: Cluster['openshiftVersion'],\n cpuArchitecture: Cluster['cpuArchitecture'],\n featureSupportLevelData: FeatureSupportLevelData,\n) => {\n if (isDualStack) {\n return {\n isNetworkManagementDisabled: true,\n networkManagementDisabledReason:\n 'Network management selection is not supported with dual-stack',\n };\n } else if (\n openshiftVersion &&\n cpuArchitecture === CpuArchitecture.ARM &&\n !featureSupportLevelData.isFeatureSupported(\n openshiftVersion,\n 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n )\n ) {\n return {\n isNetworkManagementDisabled: true,\n networkManagementDisabledReason: featureSupportLevelData.getFeatureDisabledReason(\n openshiftVersion,\n 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n ),\n };\n } else if (\n !!openshiftVersion &&\n featureSupportLevelData.isFeatureDisabled(openshiftVersion, 'NETWORK_TYPE_SELECTION')\n ) {\n return {\n isNetworkManagementDisabled: true,\n networkManagementDisabledReason: featureSupportLevelData.getFeatureDisabledReason(\n openshiftVersion,\n 'NETWORK_TYPE_SELECTION',\n ),\n };\n } else {\n return { isNetworkManagementDisabled: false, networkManagementDisabledReason: undefined };\n }\n};\n\nconst NetworkConfiguration = ({\n cluster,\n hostSubnets,\n isVipDhcpAllocationDisabled,\n defaultNetworkSettings,\n hideManagedNetworking,\n}: NetworkConfigurationProps) => {\n const { t } = useTranslation();\n const featureSupportLevelData = useFeatureSupportLevel();\n const { setFieldValue, values, validateField } = useFormikContext<NetworkConfigurationValues>();\n\n const clusterFeatureSupportLevels = React.useMemo(() => {\n return getLimitedFeatureSupportLevels(cluster, featureSupportLevelData, t);\n }, [cluster, featureSupportLevelData, t]);\n const isSNOCluster = isSNO(cluster);\n const isMultiNodeCluster = !isSNOCluster;\n const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';\n const isDualStack = values.stackType === DUAL_STACK;\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const shouldUpdateAdvConf = !isViewerMode && isDualStack && !isUserManagedNetworking;\n const isDualStackSelectable = React.useMemo(() => canBeDualStack(hostSubnets), [hostSubnets]);\n\n const isSDNSelectable = React.useMemo(() => {\n return canSelectNetworkTypeSDN(isSNOCluster, isDualStack);\n }, [isSNOCluster, isDualStack]);\n\n const [isAdvanced, setAdvanced] = React.useState(\n isDualStack || isAdvNetworkConf(cluster, defaultNetworkSettings),\n );\n\n React.useEffect(() => {\n if (isUserManagedNetworking) {\n // We need to reset these fields' values in order to align with the values the server sends\n setFieldValue('vipDhcpAllocation', false);\n setFieldValue('ingressVip', '', false);\n setFieldValue('apiVip', '', false);\n\n if (isMultiNodeCluster) {\n setFieldValue('machineNetworks', [], false);\n }\n } else {\n if (!values.vipDhcpAllocation) {\n validateField('ingressVip');\n validateField('apiVip');\n }\n }\n }, [\n isMultiNodeCluster,\n isUserManagedNetworking,\n values.vipDhcpAllocation,\n setFieldValue,\n validateField,\n ]);\n\n const toggleAdvConfiguration = React.useCallback(\n (checked: boolean) => {\n setAdvanced(checked);\n\n if (!checked) {\n setFieldValue(\n 'clusterNetworks',\n isDualStack\n ? defaultNetworkSettings.clusterNetworksDualstack\n : defaultNetworkSettings.clusterNetworksIpv4,\n true,\n );\n setFieldValue(\n 'serviceNetworks',\n isDualStack\n ? defaultNetworkSettings.serviceNetworksDualstack\n : defaultNetworkSettings.serviceNetworksIpv4,\n true,\n );\n }\n },\n [\n setFieldValue,\n isDualStack,\n defaultNetworkSettings.clusterNetworksDualstack,\n defaultNetworkSettings.clusterNetworksIpv4,\n defaultNetworkSettings.serviceNetworksDualstack,\n defaultNetworkSettings.serviceNetworksIpv4,\n ],\n );\n\n React.useEffect(() => {\n if (shouldUpdateAdvConf) {\n toggleAdvConfiguration(true);\n }\n }, [shouldUpdateAdvConf, toggleAdvConfiguration]);\n\n const { isNetworkManagementDisabled, networkManagementDisabledReason } = React.useMemo(\n () =>\n isManagedNetworkingDisabled(\n isDualStack,\n cluster.openshiftVersion,\n cluster.cpuArchitecture,\n featureSupportLevelData,\n ),\n [cluster.cpuArchitecture, cluster.openshiftVersion, featureSupportLevelData, isDualStack],\n );\n\n return (\n <Grid hasGutter>\n {!hideManagedNetworking && (\n <ManagedNetworkingControlGroup\n disabled={isViewerMode || isNetworkManagementDisabled}\n tooltip={networkManagementDisabledReason}\n />\n )}\n\n {isUserManagedNetworking && (\n <UserManagedNetworkingTextContent shouldDisplayLoadBalancersBullet={isMultiNodeCluster} />\n )}\n\n {!isUserManagedNetworking &&\n !!clusterFeatureSupportLevels &&\n clusterFeatureSupportLevels['CLUSTER_MANAGED_NETWORKING_WITH_VMS'] === 'unsupported' &&\n vmsAlert}\n\n {(isSNOCluster || !isUserManagedNetworking) && (\n <StackTypeControlGroup\n clusterId={cluster.id}\n isDualStackSelectable={isDualStackSelectable}\n hostSubnets={hostSubnets}\n />\n )}\n <NetworkTypeControlGroup isDisabled={isViewerMode} isSDNSelectable={isSDNSelectable} />\n\n {!(isUserManagedNetworking && isMultiNodeCluster) && (\n <AvailableSubnetsControl\n clusterId={cluster.id}\n hostSubnets={hostSubnets}\n isRequired={!isUserManagedNetworking}\n isDisabled={\n (cluster.vipDhcpAllocation &&\n cluster.apiVip === undefined &&\n cluster.ingressVip === undefined) ||\n false\n }\n />\n )}\n\n {!isUserManagedNetworking && (\n <VirtualIPControlGroup\n cluster={cluster}\n isVipDhcpAllocationDisabled={isVipDhcpAllocationDisabled}\n />\n )}\n\n <Tooltip\n content={'Advanced networking properties must be configured in dual-stack'}\n hidden={!isDualStack}\n position={'top-start'}\n >\n <OcmCheckbox\n id=\"useAdvancedNetworking\"\n label=\"Use advanced networking\"\n description=\"Configure advanced networking properties (e.g. CIDR ranges).\"\n isChecked={isAdvanced}\n onChange={toggleAdvConfiguration}\n isDisabled={isDualStack}\n />\n </Tooltip>\n\n {isAdvanced && <AdvancedNetworkFields />}\n </Grid>\n );\n};\n\nexport default NetworkConfiguration;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useFormikContext } from 'formik';\nimport { Spinner, Alert, AlertVariant, Tooltip } from '@patternfly/react-core';\nimport {\n Cluster,\n NetworkConfigurationValues,\n ValidationsInfo,\n FormikStaticField,\n FeatureSupportLevelBadge,\n NETWORK_TYPE_SDN,\n stringToJSON,\n selectMachineNetworkCIDR,\n} from '../../../../common';\nimport { selectCurrentClusterPermissionsState } from '../../../selectors';\nimport { OcmCheckboxField, OcmInputField } from '../../ui/OcmFormFields';\n\ninterface VipStaticValueProps {\n vipName: string;\n cluster: Cluster;\n validationErrorMessage?: string;\n}\n\nconst VipStaticValue = ({ vipName, cluster, validationErrorMessage }: VipStaticValueProps) => {\n const { vipDhcpAllocation } = cluster;\n const machineNetworkCidr = selectMachineNetworkCIDR(cluster);\n\n if (vipDhcpAllocation && cluster[vipName]) {\n return <>{cluster[vipName]}</>;\n }\n if (vipDhcpAllocation && validationErrorMessage) {\n return (\n <Alert\n variant={AlertVariant.danger}\n title=\"The DHCP server failed to allocate the IP\"\n isInline\n >\n {validationErrorMessage}\n </Alert>\n );\n }\n if (vipDhcpAllocation && machineNetworkCidr) {\n return (\n <>\n <Spinner size=\"md\" />\n <i> This IP is being allocated by the DHCP server</i>\n </>\n );\n }\n return <i>This IP will be allocated by the DHCP server</i>;\n};\n\nconst getVipHelperSuffix = (\n vip?: string,\n vipDhcpAllocation?: boolean,\n vipDhcpAllocationFormValue?: boolean,\n): string => {\n if (!vipDhcpAllocationFormValue) {\n return 'Make sure that the VIP is unique and not used by any other device on your network.';\n }\n if (vipDhcpAllocation && vip) {\n return 'This IP was allocated by the DHCP server.';\n }\n return '';\n};\n\nconst getVipValidationsById = (\n validationsInfoString?: Cluster['validationsInfo'],\n): { [key: string]: string | undefined } => {\n const validationsInfo = stringToJSON<ValidationsInfo>(validationsInfoString) || {};\n const failedDhcpAllocationMessageStubs = [\n 'VIP IP allocation from DHCP server has been timed out', // TODO(jtomasek): remove this one once it is no longer in backend\n 'IP allocation from the DHCP server timed out.',\n ];\n return (validationsInfo.network || []).reduce((lookup, validation) => {\n if (['api-vip-defined', 'ingress-vip-defined'].includes(validation.id)) {\n lookup[validation.id] =\n validation.status === 'failure' &&\n failedDhcpAllocationMessageStubs.find((stub) => validation.message.match(stub))\n ? validation.message\n : undefined;\n }\n return lookup;\n }, {});\n};\n\nexport type VirtualIPControlGroupProps = {\n cluster: Cluster;\n isVipDhcpAllocationDisabled?: boolean;\n};\n\nexport const VirtualIPControlGroup = ({\n cluster,\n isVipDhcpAllocationDisabled,\n}: VirtualIPControlGroupProps) => {\n const { values, setFieldValue } = useFormikContext<NetworkConfigurationValues>();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const apiVipHelperText = `Provide an endpoint for users, both human and machine, to interact with and configure the platform. If needed, contact your IT manager for more information. ${getVipHelperSuffix(\n cluster.apiVip,\n cluster.vipDhcpAllocation,\n values.vipDhcpAllocation,\n )}`;\n const ingressVipHelperText = `Provide an endpoint for application traffic flowing in from outside the cluster. If needed, contact your IT manager for more information. ${getVipHelperSuffix(\n cluster.ingressVip,\n cluster.vipDhcpAllocation,\n values.vipDhcpAllocation,\n )}`;\n\n const {\n 'api-vip-defined': apiVipFailedValidationMessage,\n 'ingress-vip-defined': ingressVipFailedValidationMessage,\n } = React.useMemo(\n () => getVipValidationsById(cluster.validationsInfo),\n [cluster.validationsInfo],\n );\n\n const enableAllocation = values.networkType === NETWORK_TYPE_SDN;\n\n React.useEffect(() => {\n if (!isViewerMode && !enableAllocation) {\n setFieldValue('vipDhcpAllocation', false);\n }\n }, [enableAllocation, isViewerMode, setFieldValue]);\n\n const onChangeDhcp = React.useCallback(\n (hasDhcp: boolean) => {\n // We need to sync the values back to the form\n setFieldValue('apiVip', hasDhcp ? '' : cluster.apiVip);\n setFieldValue('ingressVip', hasDhcp ? '' : cluster.ingressVip);\n },\n [cluster.apiVip, cluster.ingressVip, setFieldValue],\n );\n\n return (\n <>\n {!isVipDhcpAllocationDisabled && (\n <OcmCheckboxField\n onChange={onChangeDhcp}\n label={\n <>\n <Tooltip\n hidden={enableAllocation}\n content={\n \"A cluster with OVN networking type cannot use 'allocate IPs via DHCP server'\"\n }\n >\n <span>Allocate IPs via DHCP server</span>\n </Tooltip>\n <FeatureSupportLevelBadge\n featureId=\"VIP_AUTO_ALLOC\"\n openshiftVersion={cluster.openshiftVersion}\n />\n </>\n }\n name=\"vipDhcpAllocation\"\n isDisabled={!enableAllocation}\n />\n )}\n {values.vipDhcpAllocation ? (\n <>\n <FormikStaticField\n label=\"API IP\"\n name=\"apiVip\"\n helperText={apiVipHelperText}\n value={values.apiVip || ''}\n isValid={!apiVipFailedValidationMessage}\n isRequired\n >\n <VipStaticValue\n vipName=\"apiVip\"\n cluster={cluster}\n validationErrorMessage={apiVipFailedValidationMessage}\n />\n </FormikStaticField>\n <FormikStaticField\n label=\"Ingress IP\"\n name=\"ingressVip\"\n helperText={ingressVipHelperText}\n value={values.ingressVip || ''}\n isValid={!ingressVipFailedValidationMessage}\n isRequired\n >\n <VipStaticValue\n vipName=\"ingressVip\"\n cluster={cluster}\n validationErrorMessage={ingressVipFailedValidationMessage}\n />\n </FormikStaticField>\n </>\n ) : (\n <>\n <OcmInputField label=\"API IP\" name=\"apiVip\" helperText={apiVipHelperText} isRequired />\n <OcmInputField\n name=\"ingressVip\"\n label=\"Ingress IP\"\n helperText={ingressVipHelperText}\n isRequired\n />\n </>\n )}\n </>\n );\n};\n", "import * as React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Checkbox, CheckboxProps, Radio, RadioProps } from '@patternfly/react-core';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\nimport {\n CheckboxField,\n CodeField,\n InputField,\n RadioField,\n RichInputField,\n SelectField,\n SwitchField,\n} from '../../../common';\nimport {\n CheckboxFieldProps,\n CodeFieldProps,\n RadioFieldProps,\n SelectFieldProps,\n SwitchFieldProps,\n} from '../../../common/components/ui/formik/types';\nimport { RichInputFieldPropsProps } from '../../../common/components/ui/formik/RichInputField';\n\ntype DisableableField = {\n isDisabled?: boolean;\n};\n\nfunction FormFieldDisabler<T extends DisableableField>(FormComponent: React.ComponentType<T>) {\n return function WrapperHoc(props: T) {\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const isDisabled = props.isDisabled || isViewerMode;\n return <FormComponent {...props} isDisabled={isDisabled} />;\n };\n}\n\nexport function RefFormFieldDisabler<T extends DisableableField>(\n FormComponent: React.ComponentType<T>,\n) {\n return React.forwardRef(function useInputRef(props: T, ref) {\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const isDisabled: boolean = props.isDisabled || isViewerMode;\n return <FormComponent ref={ref} {...props} isDisabled={isDisabled} />;\n });\n}\n\n// Formik Fields\nconst OcmInputField = FormFieldDisabler<React.ComponentProps<typeof InputField>>(InputField);\nconst OcmSelectField = FormFieldDisabler<SelectFieldProps>(SelectField);\nconst OcmCheckboxField = FormFieldDisabler<CheckboxFieldProps>(CheckboxField);\nconst OcmSwitchField = FormFieldDisabler<SwitchFieldProps>(SwitchField);\nconst OcmRadioField = FormFieldDisabler<RadioFieldProps>(RadioField);\nconst OcmCodeField = FormFieldDisabler<CodeFieldProps>(CodeField);\n\n// Patternfly components\nconst OcmCheckbox = FormFieldDisabler<CheckboxProps>(Checkbox);\nconst OcmRadio = FormFieldDisabler<RadioProps>(Radio);\n\n// With forwardRef\nconst OcmRichInputField = RefFormFieldDisabler<RichInputFieldPropsProps>(RichInputField);\n\nexport {\n OcmInputField,\n OcmRichInputField,\n OcmSelectField,\n OcmCheckbox,\n OcmCheckboxField,\n OcmCodeField,\n OcmSwitchField,\n OcmRadioField,\n OcmRadio,\n};\n", "import React from 'react';\nimport { Alert, AlertActionLink, AlertVariant, Popover } from '@patternfly/react-core';\nimport { HostSubnet, HostSubnets } from '../../../types/clusters';\nimport { Cluster, Host } from '../../../api';\nimport { SelectField } from '../../ui';\nimport { NO_SUBNET_SET } from '../../../config';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\ninterface SubnetHelperTextProps {\n matchingSubnet: HostSubnet;\n hosts: Cluster['hosts'];\n}\n\nconst SubnetHelperText = ({ matchingSubnet, hosts }: SubnetHelperTextProps) => {\n const { t } = useTranslation();\n const excludedHosts =\n hosts?.filter(\n (host) =>\n !['disabled', 'disconnected'].includes(host.status) &&\n !matchingSubnet.hostIDs.includes(host.requestedHostname || ''),\n ) || [];\n\n // Workaround for bug in CIM backend. hostIDs are empty\n if (excludedHosts.length === 0 || !matchingSubnet.hostIDs.length) {\n return null;\n }\n\n const actionLinks = (\n <Popover\n position=\"right\"\n bodyContent={\n <ul>\n {excludedHosts\n .sort(\n (hostA, hostB) =>\n hostA.requestedHostname?.localeCompare(hostB.requestedHostname || '') || 0,\n )\n .map((host) => (\n <li key={host.id}>{host.requestedHostname || host.id}</li>\n ))}\n </ul>\n }\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n >\n <AlertActionLink id=\"form-input-hostSubnet-field-helper-view-excluded\">\n {t('ai:View {{count}} affected host', {\n count: excludedHosts.length,\n })}\n </AlertActionLink>\n </Popover>\n );\n\n return (\n <Alert\n title={t('ai:This subnet range is not available on all hosts')}\n variant={AlertVariant.warning}\n actionLinks={actionLinks}\n isInline\n >\n {t('ai:Hosts outside of this range will not be included in the new cluster.')}\n </Alert>\n );\n};\n\nexport interface AvailableSubnetsControlProps {\n hostSubnets: HostSubnets;\n hosts: Host[];\n isRequired: boolean;\n isMultiNodeCluster: boolean;\n}\n\nexport const AvailableSubnetsControl = ({\n hostSubnets,\n hosts,\n isRequired = false,\n isMultiNodeCluster,\n}: AvailableSubnetsControlProps) => {\n const { t } = useTranslation();\n const getHelperText = (value: string) => {\n const matchingSubnet = hostSubnets.find((hn) => hn.subnet === value);\n if (matchingSubnet) {\n return (\n isMultiNodeCluster && <SubnetHelperText matchingSubnet={matchingSubnet} hosts={hosts} />\n );\n }\n\n return undefined;\n };\n const hostSubnetLength = hostSubnets.length;\n return (\n <SelectField\n name=\"hostSubnet\"\n label={t('ai:Available subnets')}\n options={\n hostSubnets.length\n ? [\n {\n label: t('ai:Please select a subnet. ({{hostSubnetLength}} available)', {\n hostSubnetLength,\n }),\n value: NO_SUBNET_SET,\n isDisabled: true,\n id: 'form-input-hostSubnet-field-option-no-subnet',\n },\n ...hostSubnets\n .sort((subA, subB) => subA.humanized.localeCompare(subB.humanized))\n .map((hn, index) => ({\n label: hn.humanized,\n value: hn.subnet,\n id: `form-input-hostSubnet-field-option-${index}`,\n })),\n ]\n : [\n {\n label: t('ai:No subnets are currently available'),\n value: NO_SUBNET_SET,\n },\n ]\n }\n getHelperText={getHelperText}\n isDisabled={!hostSubnets.length}\n isRequired={isRequired}\n />\n );\n};\n", "import React from 'react';\nimport { List, ListItem, Text, TextContent } from '@patternfly/react-core';\nimport { RenderIf, ExternalLink } from '../../ui';\nimport { OPENSHIFT_NETWORKING_DOCS_LINK } from '../../../config';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\nexport interface UserManagedNetworkingTextContentProps {\n shouldDisplayLoadBalancersBullet?: boolean;\n}\n\nexport const UserManagedNetworkingTextContent = ({\n shouldDisplayLoadBalancersBullet = false,\n}: UserManagedNetworkingTextContentProps) => {\n const { t } = useTranslation();\n return (\n <TextContent>\n <Text component={'p'}>\n <Trans t={t}>\n ai:Please refer to the{' '}\n <ExternalLink href={OPENSHIFT_NETWORKING_DOCS_LINK}>\n OpenShift networking documentation\n </ExternalLink>{' '}\n to configure your cluster's networking, including:\n </Trans>\n </Text>\n <List>\n <ListItem>{t('ai:DHCP or static IP Addresses')}</ListItem>\n <RenderIf condition={shouldDisplayLoadBalancersBullet}>\n <ListItem>{t('ai:Load balancers')}</ListItem>\n </RenderIf>\n <ListItem>{t('ai:Network ports')}</ListItem>\n <ListItem>{t('ai:DNS')}</ListItem>\n </List>\n </TextContent>\n );\n};\n", "import React from 'react';\nimport { FormGroup, TooltipProps } from '@patternfly/react-core';\nimport { getFieldId } from '../../ui';\nimport RadioFieldWithTooltip from '../../ui/formik/RadioFieldWithTooltip';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nexport interface ManagedNetworkingControlGroupProps {\n disabled: boolean;\n tooltip?: string;\n}\n\nconst GROUP_NAME = 'managedNetworkingType';\nexport const ManagedNetworkingControlGroup = ({\n disabled = false,\n tooltip,\n}: ManagedNetworkingControlGroupProps) => {\n const tooltipProps: TooltipProps = {\n hidden: !tooltip || !disabled,\n content: tooltip,\n position: 'top',\n };\n const { t } = useTranslation();\n return (\n <FormGroup\n label={t('ai:Network Management')}\n fieldId={getFieldId(GROUP_NAME, 'radio')}\n isInline\n >\n <RadioFieldWithTooltip\n tooltipProps={tooltipProps}\n name={GROUP_NAME}\n isDisabled={disabled}\n value={'clusterManaged'}\n label={t('ai:Cluster-Managed Networking')}\n />\n <RadioFieldWithTooltip\n tooltipProps={tooltipProps}\n name={GROUP_NAME}\n isDisabled={disabled}\n value={'userManaged'}\n label={t('ai:User-Managed Networking')}\n />\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport { Tooltip, RadioProps, TooltipProps } from '@patternfly/react-core';\nimport RadioField from './RadioField';\nimport { Optional } from '../../../types/typescriptExtensions';\n\ntype RadioFieldWithTooltipProps = Optional<RadioProps, 'id'> & { tooltipProps: TooltipProps };\n\nconst RadioFieldWithTooltip = ({\n tooltipProps,\n ...radioFieldProps\n}: RadioFieldWithTooltipProps) => {\n return (\n <Tooltip {...tooltipProps}>\n <RadioField {...radioFieldProps} />\n </Tooltip>\n );\n};\n\nexport default RadioFieldWithTooltip;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Spinner, Alert, AlertVariant } from '@patternfly/react-core';\nimport { Cluster, stringToJSON } from '../../../api';\nimport { HostSubnets, NetworkConfigurationValues, ValidationsInfo } from '../../../types/clusters';\nimport { CheckboxField, FormikStaticField, InputField } from '../../ui';\nimport { NO_SUBNET_SET } from '../../../config';\nimport { FeatureSupportLevelBadge } from '../../featureSupportLevels';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\ninterface VipStaticValueProps {\n vipName: string;\n cluster: Cluster;\n validationErrorMessage?: string;\n}\n\nconst VipStaticValue = ({ vipName, cluster, validationErrorMessage }: VipStaticValueProps) => {\n const { vipDhcpAllocation, machineNetworkCidr } = cluster;\n const { t } = useTranslation();\n if (vipDhcpAllocation && cluster[vipName]) {\n return cluster[vipName];\n }\n if (vipDhcpAllocation && validationErrorMessage) {\n return (\n <Alert\n variant={AlertVariant.danger}\n title={t('ai:The DHCP server failed to allocate the IP')}\n isInline\n >\n {validationErrorMessage}\n </Alert>\n );\n }\n if (vipDhcpAllocation && machineNetworkCidr) {\n return (\n <>\n <Spinner size=\"md\" />\n <i>{t('ai:This IP is being allocated by the DHCP server')}</i>\n </>\n );\n }\n return t('ai:<i>This IP will be allocated by the DHCP server</i>');\n};\n\nconst getVipHelperSuffix = (\n t: TFunction,\n vip?: string,\n vipDhcpAllocation?: boolean,\n vipDhcpAllocationFormValue?: boolean,\n): string => {\n if (!vipDhcpAllocationFormValue) {\n return t(\n 'ai:Make sure that the VIP is unique and not used by any other device on your network.',\n );\n }\n if (vipDhcpAllocation && vip) {\n return t('ai:This IP was allocated by the DHCP server.');\n }\n return '';\n};\n\nconst getVipValidationsById = (\n t: TFunction,\n validationsInfoString?: Cluster['validationsInfo'],\n): { [key: string]: string | undefined } => {\n const validationsInfo = stringToJSON<ValidationsInfo>(validationsInfoString) || {};\n const failedDhcpAllocationMessageStubs = [\n t('ai:VIP IP allocation from DHCP server has been timed out'), // TODO(jtomasek): remove this one once it is no longer in backend\n t('ai:IP allocation from the DHCP server timed out.'),\n ];\n return (validationsInfo.network || []).reduce((lookup, validation) => {\n if (['api-vip-defined', 'ingress-vip-defined'].includes(validation.id)) {\n lookup[validation.id] =\n validation.status === 'failure' &&\n failedDhcpAllocationMessageStubs.find((stub) => validation.message.match(stub))\n ? validation.message\n : undefined;\n }\n return lookup;\n }, {});\n};\n\nexport type VirtualIPControlGroupProps = {\n cluster: Cluster;\n hostSubnets: HostSubnets;\n isVipDhcpAllocationDisabled?: boolean;\n};\n\nexport const VirtualIPControlGroup = ({\n cluster,\n hostSubnets,\n isVipDhcpAllocationDisabled,\n}: VirtualIPControlGroupProps) => {\n const { values } = useFormikContext<NetworkConfigurationValues>();\n const { t } = useTranslation();\n const vipHelperSuffix = getVipHelperSuffix(\n t,\n cluster.apiVip,\n cluster.vipDhcpAllocation,\n values.vipDhcpAllocation,\n );\n const apiVipHelperText = t(\n 'ai:Provide an endpoint for users, both human and machine, to interact with and configure the platform. If needed, contact your IT manager for more information. {{vipHelperSufix}}',\n {\n vipHelperSuffix: vipHelperSuffix,\n },\n );\n const ingressVipHelperText = t(\n 'ai:Provide an endpoint for application traffic flowing in from outside the cluster. If needed, contact your IT manager for more information. {{vipHelperSufix}}',\n {\n vipHelperSuffix: vipHelperSuffix,\n },\n );\n\n const {\n 'api-vip-defined': apiVipFailedValidationMessage,\n 'ingress-vip-defined': ingressVipFailedValidationMessage,\n } = React.useMemo(\n () => getVipValidationsById(t, cluster.validationsInfo),\n [t, cluster.validationsInfo],\n );\n\n return (\n <>\n {!isVipDhcpAllocationDisabled && (\n <CheckboxField\n label={\n <>\n {t('ai:Allocate IPs via DHCP server')}\n <FeatureSupportLevelBadge\n featureId=\"VIP_AUTO_ALLOC\"\n openshiftVersion={cluster.openshiftVersion}\n />\n </>\n }\n name=\"vipDhcpAllocation\"\n />\n )}\n {values.vipDhcpAllocation ? (\n <>\n <FormikStaticField\n label={t('ai:API IP')}\n name=\"apiVip\"\n helperText={apiVipHelperText}\n value={cluster.apiVip || ''}\n isValid={!apiVipFailedValidationMessage}\n isRequired\n >\n <VipStaticValue\n vipName=\"apiVip\"\n cluster={cluster}\n validationErrorMessage={apiVipFailedValidationMessage}\n />\n </FormikStaticField>\n <FormikStaticField\n label={t('ai:Ingress IP')}\n name=\"ingressVip\"\n helperText={ingressVipHelperText}\n value={cluster.ingressVip || ''}\n isValid={!ingressVipFailedValidationMessage}\n isRequired\n >\n <VipStaticValue\n vipName=\"ingressVip\"\n cluster={cluster}\n validationErrorMessage={ingressVipFailedValidationMessage}\n />\n </FormikStaticField>\n </>\n ) : (\n <>\n <InputField\n label={t('ai:API IP')}\n name=\"apiVip\"\n helperText={apiVipHelperText}\n isRequired\n isDisabled={!hostSubnets.length || values.hostSubnet === NO_SUBNET_SET}\n />\n <InputField\n name=\"ingressVip\"\n label={t('ai:Ingress IP')}\n helperText={ingressVipHelperText}\n isRequired\n isDisabled={!hostSubnets.length || values.hostSubnet === NO_SUBNET_SET}\n />\n </>\n )}\n </>\n );\n};\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { ButtonVariant, FormGroup, Tooltip } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport { Address6 } from 'ip-address';\n\nimport {\n HostSubnets,\n NetworkConfigurationValues,\n getFieldId,\n DUAL_STACK,\n IPV4_STACK,\n NETWORK_TYPE_OVN,\n NETWORK_TYPE_SDN,\n NO_SUBNET_SET,\n Cluster,\n ClusterNetwork,\n MachineNetwork,\n ServiceNetwork,\n} from '../../../../common';\nimport { ConfirmationModal, PopoverIcon } from '../../../../common/components/ui';\nimport { useDefaultConfiguration } from '../ClusterDefaultConfigurationContext';\nimport { selectCurrentClusterPermissionsState } from '../../../selectors';\nimport { OcmRadioField } from '../../ui/OcmFormFields';\n\ntype StackTypeControlGroupProps = {\n clusterId: Cluster['id'];\n isDualStackSelectable: boolean;\n hostSubnets: HostSubnets;\n};\n\nconst hasDualStackConfigurationChanged = (\n clusterNetworks: ClusterNetwork[],\n serviceNetworks: ServiceNetwork[],\n cidrIPv6: MachineNetwork['cidr'],\n values: NetworkConfigurationValues,\n) =>\n clusterNetworks &&\n serviceNetworks &&\n ((values.machineNetworks && values.machineNetworks[1].cidr !== cidrIPv6) ||\n (values.clusterNetworks && values.clusterNetworks[1].cidr !== clusterNetworks[1].cidr) ||\n (values.clusterNetworks &&\n values.clusterNetworks[1].hostPrefix !== clusterNetworks[1].hostPrefix) ||\n (values.serviceNetworks && values.serviceNetworks[1].cidr !== serviceNetworks[1].cidr));\n\nexport const StackTypeControlGroup = ({\n clusterId,\n isDualStackSelectable,\n hostSubnets,\n}: StackTypeControlGroupProps) => {\n const { setFieldValue, values, validateForm } = useFormikContext<NetworkConfigurationValues>();\n const [openConfirmModal, setConfirmModal] = React.useState(false);\n const defaultNetworkValues = useDefaultConfiguration([\n 'clusterNetworksDualstack',\n 'clusterNetworksIpv4',\n 'serviceNetworksDualstack',\n 'serviceNetworksIpv4',\n ]);\n\n const IPv6Subnets = hostSubnets.filter((subnet) => Address6.isValid(subnet.subnet));\n const cidrIPv6 = IPv6Subnets.length >= 1 ? IPv6Subnets[0].subnet : NO_SUBNET_SET;\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const shouldSetSingleStack =\n !isViewerMode && !isDualStackSelectable && values.stackType === DUAL_STACK;\n\n const setSingleStack = React.useCallback(() => {\n setFieldValue('stackType', IPV4_STACK);\n\n if (values.machineNetworks && values.machineNetworks?.length >= 2) {\n setFieldValue('machineNetworks', values.machineNetworks.slice(0, 1));\n }\n if (values.clusterNetworks && values.clusterNetworks?.length >= 2) {\n setFieldValue('clusterNetworks', values.clusterNetworks.slice(0, 1));\n }\n if (values.serviceNetworks && values.serviceNetworks?.length >= 2) {\n setFieldValue('serviceNetworks', values.serviceNetworks.slice(0, 1));\n }\n\n void validateForm();\n }, [\n setFieldValue,\n validateForm,\n values.clusterNetworks,\n values.machineNetworks,\n values.serviceNetworks,\n ]);\n\n const setDualStack = () => {\n setFieldValue('stackType', DUAL_STACK);\n setFieldValue('vipDhcpAllocation', false);\n\n if (values.networkType === NETWORK_TYPE_SDN) {\n setFieldValue('networkType', NETWORK_TYPE_OVN);\n }\n\n if (values.machineNetworks && values.machineNetworks?.length < 2) {\n setFieldValue(\n 'machineNetworks',\n [...values.machineNetworks, { cidr: cidrIPv6, clusterId: clusterId }],\n false,\n );\n }\n if (values.clusterNetworks && values.clusterNetworks?.length < 2) {\n setFieldValue(\n 'clusterNetworks',\n [\n ...values.clusterNetworks,\n defaultNetworkValues.clusterNetworksDualstack?.length\n ? defaultNetworkValues.clusterNetworksDualstack[1]\n : { cidr: '', hostPrefix: '', clusterId: clusterId },\n ],\n false,\n );\n }\n if (values.serviceNetworks && values.serviceNetworks?.length < 2) {\n setFieldValue(\n 'serviceNetworks',\n [\n ...values.serviceNetworks,\n defaultNetworkValues.serviceNetworksDualstack?.length\n ? defaultNetworkValues.serviceNetworksDualstack[1]\n : { cidr: '', clusterId: clusterId },\n ],\n false,\n );\n }\n };\n\n const setStackType = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.value === DUAL_STACK) {\n setDualStack();\n } else if (\n hasDualStackConfigurationChanged(\n defaultNetworkValues.clusterNetworksDualstack || [],\n defaultNetworkValues.serviceNetworksDualstack || [],\n cidrIPv6,\n values,\n )\n ) {\n setConfirmModal(true);\n } else {\n setSingleStack();\n }\n };\n\n React.useEffect(() => {\n if (shouldSetSingleStack) {\n setSingleStack();\n }\n }, [shouldSetSingleStack, setSingleStack]);\n\n return (\n <Tooltip\n content={'Dual-stack is only available when your hosts are using IPV4 together with IPV6.'}\n hidden={isDualStackSelectable}\n position={'top-start'}\n >\n <>\n <FormGroup\n label=\"Networking stack type\"\n fieldId={getFieldId('stackType', 'radio')}\n isInline\n onChange={setStackType}\n >\n <OcmRadioField\n name={'stackType'}\n value={IPV4_STACK}\n isDisabled={!isDualStackSelectable}\n label={\n <>\n {'IPv4'}{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent=\"Select this when your hosts are using only IPv4.\"\n />\n </>\n }\n />\n <OcmRadioField\n name={'stackType'}\n value={DUAL_STACK}\n isDisabled={!isDualStackSelectable}\n label={\n <>\n {'Dual-stack'}{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent=\"Select dual-stack when your hosts are using IPV4 together with IPV6.\"\n />\n </>\n }\n />\n </FormGroup>\n {openConfirmModal && (\n <ConfirmationModal\n title={'Change stack type?'}\n titleIconVariant={'warning'}\n confirmationButtonText={'Change'}\n confirmationButtonVariant={ButtonVariant.primary}\n content={\n <>\n <p>All data and configuration done for 'Dual-stack' will be lost.</p>\n </>\n }\n onClose={() => {\n setConfirmModal(false);\n setDualStack();\n }}\n onConfirm={() => {\n setConfirmModal(false);\n setSingleStack();\n }}\n />\n )}\n </>\n </Tooltip>\n );\n};\n", "import React, { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Alert, AlertVariant, FormGroup, Stack, StackItem } from '@patternfly/react-core';\nimport { FieldArray, useFormikContext, FormikHelpers } from 'formik';\nimport { Address4, Address6 } from 'ip-address';\n\nimport {\n Cluster,\n MachineNetwork,\n HostSubnet,\n NetworkConfigurationValues,\n DUAL_STACK,\n NO_SUBNET_SET,\n} from '../../../../common';\nimport { selectCurrentClusterPermissionsState } from '../../../selectors';\nimport { OcmSelectField } from '../../ui/OcmFormFields';\n\nconst subnetSort = (subA: HostSubnet, subB: HostSubnet) =>\n subA.humanized.localeCompare(subB.humanized);\n\nconst toFormSelectOptions = (subnets: HostSubnet[]) => {\n return subnets.map((hn, index) => ({\n label: hn.humanized,\n value: hn.subnet,\n isDisabled: false,\n id: `form-input-hostSubnet-field-option-${index}`,\n }));\n};\n\nconst makeNoSubnetSelectedOption = (availableSubnets: number) => ({\n label: `Please select a subnet. (${availableSubnets} available)`,\n value: NO_SUBNET_SET,\n isDisabled: true,\n id: 'form-input-hostSubnet-field-option-no-subnet-selected',\n});\n\nconst noSubnetAvailableOption = {\n label: 'No subnets are currently available',\n value: NO_SUBNET_SET,\n id: 'form-input-hostSubnet-field-option-no-subnet-available',\n};\n\nconst useAutoSelectSingleAvailableSubnet = (\n autoSelectNetwork: boolean,\n setFieldValue: FormikHelpers<NetworkConfigurationValues>['setFieldValue'],\n cidr: MachineNetwork['cidr'],\n clusterId: string,\n) => {\n useEffect(() => {\n if (autoSelectNetwork) {\n setFieldValue('machineNetworks', [{ cidr, clusterId }], true);\n }\n }, [autoSelectNetwork, cidr, clusterId, setFieldValue]);\n};\n\nexport interface AvailableSubnetsControlProps {\n clusterId: Cluster['id'];\n hostSubnets: HostSubnet[];\n isRequired: boolean;\n isDisabled: boolean;\n}\n\nexport const AvailableSubnetsControl = ({\n clusterId,\n hostSubnets,\n isRequired = false,\n isDisabled,\n}: AvailableSubnetsControlProps) => {\n const { values, errors, setFieldValue } = useFormikContext<NetworkConfigurationValues>();\n const isDualStack = values.stackType === DUAL_STACK;\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n const IPv4Subnets = hostSubnets\n .filter((subnet) => Address4.isValid(subnet.subnet))\n .sort(subnetSort);\n const IPv6Subnets = hostSubnets\n .filter((subnet) => Address6.isValid(subnet.subnet))\n .sort(subnetSort);\n\n const cidr = IPv4Subnets.length >= 1 ? IPv4Subnets[0].subnet : NO_SUBNET_SET;\n const hasEmptySelection = (values.machineNetworks ?? []).length === 0;\n const autoSelectNetwork = !isViewerMode && hasEmptySelection;\n useAutoSelectSingleAvailableSubnet(autoSelectNetwork, setFieldValue, cidr, clusterId);\n\n const buildOptions = React.useMemo(\n () => (machineSubnets: HostSubnet[]) => {\n return machineSubnets.length === 0\n ? [noSubnetAvailableOption]\n : [makeNoSubnetSelectedOption(machineSubnets.length)].concat(\n toFormSelectOptions(machineSubnets),\n );\n },\n [],\n );\n return (\n <FormGroup\n label=\"Machine network\"\n labelInfo={isDualStack && 'Primary'}\n fieldId=\"machine-networks\"\n isRequired\n >\n <FieldArray name=\"machineNetworks\">\n {() => (\n <Stack>\n {isDualStack ? (\n values.machineNetworks?.map((_machineNetwork, index) => {\n const machineSubnets = index === 1 ? IPv6Subnets : IPv4Subnets;\n return (\n <StackItem key={index}>\n <OcmSelectField\n name={`machineNetworks.${index}.cidr`}\n options={buildOptions(machineSubnets)}\n isRequired={isRequired}\n isDisabled={isDisabled}\n />\n </StackItem>\n );\n })\n ) : (\n <StackItem>\n <OcmSelectField\n name={`machineNetworks.0.cidr`}\n options={buildOptions(IPv4Subnets)}\n isRequired={isRequired}\n isDisabled={isDisabled}\n />\n </StackItem>\n )}\n </Stack>\n )}\n </FieldArray>\n\n {typeof errors.machineNetworks === 'string' && (\n <Alert variant={AlertVariant.warning} title={errors.machineNetworks} isInline />\n )}\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport {\n Alert,\n AlertVariant,\n FormGroup,\n StackItem,\n TextInputTypes,\n Grid,\n Stack,\n} from '@patternfly/react-core';\nimport { FieldArray, useFormikContext } from 'formik';\nimport { DUAL_STACK, PREFIX_MAX_RESTRICTION, NetworkConfigurationValues } from '../../../../common';\nimport { OcmInputField } from '../../ui/OcmFormFields';\n\nconst getNetworkLabelSuffix = (index: number, isDualStack: boolean) => {\n return isDualStack ? ` (${index === 0 ? 'IPv4' : 'IPv6'})` : '';\n};\n\nconst IPv4PrefixHelperText =\n 'The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 23, then each node is assigned a /23 subnet out of the given cidr (clusterNetworkCIDR), which allows for 510 (2^(32 - 23) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.';\n\nconst IPv6PrefixHelperText =\n 'The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 116, then each node is assigned a /116 subnet out of the given cidr (clusterNetworkCIDR), which allows for 4,094 (2^(128 - 116) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.';\n\nconst clusterCidrHelperText =\n 'IP address block from which Pod IPs are allocated. This block must not overlap with existing physical networks. These IP addresses are used for the Pod network, and if you need to access the Pods from an external network, configure load balancers and routers to manage the traffic.';\n\nconst serviceCidrHelperText =\n 'The IP address pool to use for service IP addresses. You can enter only one IP address pool. If you need to access the services from an external network, configure load balancers and routers to manage the traffic.';\n\nconst AdvancedNetworkFields = () => {\n const { setFieldValue, values, errors } = useFormikContext<NetworkConfigurationValues>();\n\n const isDualStack = values.stackType === DUAL_STACK;\n\n const clusterNetworkCidrPrefix = (index: number) =>\n parseInt(\n ((values.clusterNetworks && values.clusterNetworks[index].cidr) || '').split('/')[1],\n ) || 1;\n\n const formatClusterNetworkHostPrefix = (\n e: React.ChangeEvent<HTMLInputElement>,\n index: number,\n ) => {\n if (isNaN(parseInt(e.target.value))) {\n setFieldValue(`clusterNetworks.${index}.hostPrefix`, clusterNetworkCidrPrefix(index));\n }\n };\n\n const isSubnetIPv6 = (index: number) => (isDualStack ? !!index : false);\n\n const clusterNetworkHostPrefixHelperText = (index: number) =>\n isSubnetIPv6(index) ? IPv6PrefixHelperText : IPv4PrefixHelperText;\n\n return (\n <Grid hasGutter className=\"pf-u-ml-lg\">\n <FieldArray name=\"clusterNetworks\">\n {() => (\n <FormGroup fieldId=\"clusterNetworks\" labelInfo={isDualStack && 'Primary'}>\n {values.clusterNetworks?.map((_, index) => {\n const networkSuffix = getNetworkLabelSuffix(index, isDualStack);\n return (\n <Stack key={index}>\n <StackItem className={'network-field-group pf-u-pb-md'}>\n <OcmInputField\n name={`clusterNetworks.${index}.cidr`}\n label={`Cluster network CIDR${networkSuffix}`}\n helperText={clusterCidrHelperText}\n isRequired\n labelInfo={index === 0 && isDualStack ? 'Primary' : ''}\n />\n </StackItem>\n <StackItem className={'network-field-group pf-u-pb-md'}>\n <OcmInputField\n name={`clusterNetworks.${index}.hostPrefix`}\n label={`Cluster network host prefix${networkSuffix}`}\n type={TextInputTypes.number}\n min={clusterNetworkCidrPrefix(index)}\n max={\n isSubnetIPv6(index)\n ? PREFIX_MAX_RESTRICTION.IPv6\n : PREFIX_MAX_RESTRICTION.IPv4\n }\n onBlur={(e: React.ChangeEvent<HTMLInputElement>) =>\n formatClusterNetworkHostPrefix(e, index)\n }\n helperText={clusterNetworkHostPrefixHelperText(index)}\n isRequired\n />\n </StackItem>\n </Stack>\n );\n })}\n </FormGroup>\n )}\n </FieldArray>\n\n {typeof errors.clusterNetworks === 'string' && (\n <Alert variant={AlertVariant.warning} title={errors.clusterNetworks} isInline />\n )}\n\n <FieldArray name=\"serviceNetworks\">\n {() => (\n <FormGroup fieldId=\"serviceNetworks\" labelInfo={isDualStack && 'Primary'}>\n {values.serviceNetworks?.map((_, index) => (\n <StackItem key={index} className={'network-field-group pf-u-pb-md'}>\n <OcmInputField\n name={`serviceNetworks.${index}.cidr`}\n label={`Service network CIDR${getNetworkLabelSuffix(index, isDualStack)}`}\n helperText={serviceCidrHelperText}\n isRequired\n labelInfo={index === 0 && isDualStack ? 'Primary' : ''}\n />\n </StackItem>\n ))}\n </FormGroup>\n )}\n </FieldArray>\n\n {typeof errors.serviceNetworks === 'string' && (\n <Alert variant={AlertVariant.warning} title={errors.serviceNetworks} isInline />\n )}\n </Grid>\n );\n};\n\nexport default AdvancedNetworkFields;\n", "import React from 'react';\nimport { Split, SplitItem, Tooltip, FormGroup } from '@patternfly/react-core';\nimport { RadioField } from '../../ui/formik';\nimport { PopoverIcon } from '../../../components/ui';\nimport { NETWORK_TYPE_OVN, NETWORK_TYPE_SDN } from '../../../config';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nconst GROUP_NAME = 'networkType';\n\nexport interface NetworkTypeControlGroupProps {\n isDisabled?: boolean;\n isSDNSelectable: boolean;\n}\n\nexport const NetworkTypeControlGroup = ({\n isDisabled = false,\n isSDNSelectable,\n}: NetworkTypeControlGroupProps) => {\n const { t } = useTranslation();\n return (\n <FormGroup fieldId={GROUP_NAME} label=\"Network type\">\n <Split hasGutter>\n <SplitItem>\n <Tooltip\n hidden={isSDNSelectable}\n content={t(\n 'ai:Software-Defined Networking (SDN) cannot be selected for SNO clusters or when IPv6 is detected.',\n )}\n >\n <RadioField\n id={GROUP_NAME}\n name={GROUP_NAME}\n isDisabled={isDisabled || !isSDNSelectable}\n value={NETWORK_TYPE_SDN}\n label={\n <>\n {t('ai:Software-Defined Networking (SDN)')}{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent={'The classic bullet-proof networking type'}\n />\n </>\n }\n />\n </Tooltip>\n </SplitItem>\n <SplitItem />\n <SplitItem>\n <RadioField\n id={GROUP_NAME}\n name={GROUP_NAME}\n isDisabled={isDisabled}\n value={NETWORK_TYPE_OVN}\n label={\n <>\n {t('ai:Open Virtual Networking (OVN)')}{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n \"The next generation networking type, select this when you're using new features and telco features\"\n }\n />\n </>\n }\n />\n </SplitItem>\n </Split>\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { ActionListItem, Button, ButtonVariant, Grid, GridItem } from '@patternfly/react-core';\nimport { Cluster, ClusterWizardStepHeader, useAlerts, ClusterWizardStep } from '../../../common';\nimport { useClusterWizardContext } from '../clusterWizard/ClusterWizardContext';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport { updateCluster } from '../../reducers/clusters';\nimport ClusterWizardFooter from '../clusterWizard/ClusterWizardFooter';\nimport ClusterWizardNavigation from '../clusterWizard/ClusterWizardNavigation';\nimport ReviewCluster from './ReviewCluster';\nimport { ClustersService } from '../../services';\nimport { useStateSafely } from '../../../common/hooks';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\n\nconst ReviewStep: React.FC<{ cluster: Cluster }> = ({ cluster }) => {\n const { addAlert } = useAlerts();\n const clusterWizardContext = useClusterWizardContext();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const [isStartingInstallation, setIsStartingInstallation] = useStateSafely(false);\n const dispatch = useDispatch();\n\n const handleClusterInstall = async () => {\n setIsStartingInstallation(true);\n try {\n const { data } = await ClustersService.install(cluster.id, cluster.tags);\n dispatch(updateCluster(data));\n setIsStartingInstallation(false);\n // If successful, backend changes cluster state which leads to unmounting the Wizard\n // If validation fails, the wizard stays on this step and shows alerts\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: 'Failed to start cluster installation',\n message: getApiErrorMessage(e),\n }),\n );\n setIsStartingInstallation(false);\n }\n };\n\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n onBack={() => clusterWizardContext.moveBack()}\n isSubmitting={isStartingInstallation}\n submittingText=\"Starting installation...\"\n additionalActions={\n <ActionListItem>\n <Button\n variant={ButtonVariant.primary}\n name=\"install\"\n onClick={handleClusterInstall}\n isDisabled={isViewerMode || isStartingInstallation || cluster.status !== 'ready'}\n >\n Install cluster\n </Button>\n </ActionListItem>\n }\n />\n );\n\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />} footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Review and create</ClusterWizardStepHeader>\n </GridItem>\n <GridItem>\n <ReviewCluster cluster={cluster} />\n </GridItem>\n </Grid>\n </ClusterWizardStep>\n );\n};\n\nexport default ReviewStep;\n", "import React from 'react';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens';\nimport { ClusterFeatureSupportLevelsDetailItem } from '../featureSupportLevels';\nimport { useClusterWizardContext } from '../clusterWizard/ClusterWizardContext';\nimport {\n allClusterWizardSoftValidationIds,\n ClusterWizardStepsType,\n wizardStepsValidationsMap,\n} from '../clusterWizard/wizardTransition';\nimport {\n Cluster,\n DetailList,\n DetailItem,\n RenderIf,\n ReviewHostsInventory,\n ClusterValidations,\n HostsValidations,\n isDualStack,\n isClusterPlatformTypeVM,\n PlatformType,\n} from '../../../common';\nimport { wizardStepNames } from '../clusterWizard/constants';\nimport './ReviewCluster.css';\nimport OpenShiftVersionDetail from '../clusterDetail/OpenShiftVersionDetail';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { integrationPlatformLinks } from '../clusterWizard/ClusterPlatformIntegrationHint';\n\nconst PlatformIntegrationNote = ({ platformType }: { platformType: PlatformType | undefined }) => {\n const integrationPlatformLink: string = platformType\n ? (integrationPlatformLinks[platformType] as string)\n : '';\n\n return (\n <p>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" /> You will need to modify your\n platform configuration after cluster installation is completed.{' '}\n <a\n href={integrationPlatformLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-ouia-component-id=\"vm-integration-kb-page\"\n >\n Learn more <i className=\"fas fa-external-link-alt\" />\n </a>\n </p>\n );\n};\n\nconst ReviewCluster = ({ cluster }: { cluster: Cluster }) => {\n const clusterWizardContext = useClusterWizardContext();\n const { t } = useTranslation();\n return (\n <DetailList>\n <DetailItem\n title=\"Cluster address\"\n value={`${cluster.name || ''}.${cluster.baseDnsDomain || ''}`}\n testId=\"cluster-address\"\n />\n <OpenShiftVersionDetail cluster={cluster} />\n <DetailItem\n title={t('ai:Stack type')}\n value={isDualStack(cluster) ? 'Dual-stack' : 'IPv4'}\n testId=\"stack-type\"\n />\n <DetailItem\n title=\"CPU architecture\"\n value={cluster.cpuArchitecture}\n testId=\"cpu-architecture\"\n />\n {cluster.machineNetworks?.length && (\n <DetailItem\n title=\"Cluster network CIDR\"\n value={\n <>\n {cluster.clusterNetworks?.map((network) => (\n <span key={network.cidr}>\n {network.cidr}\n <br />\n </span>\n ))}\n </>\n }\n testId=\"network-cidr\"\n />\n )}\n <DetailItem\n title=\"Cluster summary\"\n testId=\"cluster-summary\"\n value={<ReviewHostsInventory hosts={cluster.hosts} />}\n />\n <DetailItem\n title=\"Cluster validations\"\n value={\n <ClusterValidations<ClusterWizardStepsType>\n validationsInfo={cluster.validationsInfo}\n setCurrentStepId={(stepId) => clusterWizardContext.setCurrentStepId(stepId)}\n wizardStepNames={wizardStepNames}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n }\n testId=\"cluster-validations\"\n />\n <DetailItem\n title=\"Host validations\"\n value={\n <HostsValidations<ClusterWizardStepsType, typeof allClusterWizardSoftValidationIds>\n hosts={cluster.hosts}\n setCurrentStepId={(stepId) => clusterWizardContext.setCurrentStepId(stepId)}\n wizardStepNames={wizardStepNames}\n allClusterWizardSoftValidationIds={allClusterWizardSoftValidationIds}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n }\n testId=\"host-validations\"\n />\n <RenderIf condition={isClusterPlatformTypeVM(cluster)}>\n <DetailItem\n title=\"Platform integration\"\n value={<PlatformIntegrationNote platformType={cluster.platform?.type} />}\n testId=\"platform-integration\"\n />\n </RenderIf>\n <ClusterFeatureSupportLevelsDetailItem cluster={cluster} />\n </DetailList>\n );\n};\n\nexport default ReviewCluster;\n", "import React from 'react';\nimport omit from 'lodash/omit';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport {\n Cluster,\n V2ClusterUpdateParams,\n useAlerts,\n LoadingState,\n ClusterWizardStep,\n InfraEnv,\n} from '../../../common';\nimport { usePullSecret } from '../../hooks';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport { updateCluster } from '../../reducers/clusters';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport { canNextClusterDetails, ClusterWizardFlowStateNew } from './wizardTransition';\nimport { useOpenshiftVersions, useManagedDomains, useUsedClusterNames } from '../../hooks';\nimport ClusterDetailsForm from './ClusterDetailsForm';\nimport ClusterWizardNavigation from './ClusterWizardNavigation';\nimport { routeBasePath } from '../../config';\nimport { ClustersService } from '../../services';\nimport { ClusterCreateParamsWithStaticNetworking } from '../../services/types';\n\ntype ClusterDetailsProps = {\n cluster?: Cluster;\n infraEnv?: InfraEnv;\n};\n\nconst ClusterDetails: React.FC<ClusterDetailsProps> = ({ cluster, infraEnv }) => {\n const clusterWizardContext = useClusterWizardContext();\n const managedDomains = useManagedDomains();\n const { addAlert, clearAlerts } = useAlerts();\n const history = useHistory();\n const dispatch = useDispatch();\n const { usedClusterNames } = useUsedClusterNames(cluster?.id || '');\n const pullSecret = usePullSecret();\n const { error: errorOCPVersions, loading: loadingOCPVersions, versions } = useOpenshiftVersions();\n React.useEffect(() => {\n errorOCPVersions && addAlert(errorOCPVersions);\n }, [errorOCPVersions, addAlert]);\n\n const handleClusterUpdate = React.useCallback(\n async (clusterId: Cluster['id'], values: V2ClusterUpdateParams) => {\n clearAlerts();\n const params: V2ClusterUpdateParams = omit(values, [\n 'highAvailabilityMode',\n 'pullSecret',\n 'openshiftVersion',\n ]);\n try {\n const { data: updatedCluster } = await ClustersService.update(\n clusterId,\n cluster?.tags,\n params,\n );\n dispatch(updateCluster(updatedCluster));\n canNextClusterDetails({ cluster: updatedCluster }) && clusterWizardContext.moveNext();\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to update the cluster', message: getApiErrorMessage(e) }),\n );\n }\n },\n [clearAlerts, cluster?.tags, dispatch, clusterWizardContext, addAlert],\n );\n\n const handleClusterCreate = React.useCallback(\n async (params: ClusterCreateParamsWithStaticNetworking) => {\n clearAlerts();\n try {\n const cluster = await ClustersService.create(params);\n history.push(`${routeBasePath}/clusters/${cluster.id}`, ClusterWizardFlowStateNew);\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to create new cluster', message: getApiErrorMessage(e) }),\n );\n }\n },\n [addAlert, clearAlerts, history],\n );\n\n if (pullSecret === undefined || !managedDomains || loadingOCPVersions || !usedClusterNames) {\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />}>\n <LoadingState />\n </ClusterWizardStep>\n );\n }\n const navigation = <ClusterWizardNavigation cluster={cluster} />;\n\n return (\n <ClusterDetailsForm\n cluster={cluster}\n pullSecret={pullSecret}\n managedDomains={managedDomains}\n ocpVersions={versions}\n usedClusterNames={usedClusterNames}\n moveNext={() => clusterWizardContext.moveNext()}\n handleClusterUpdate={handleClusterUpdate}\n handleClusterCreate={handleClusterCreate}\n navigation={navigation}\n infraEnv={infraEnv}\n />\n );\n};\n\nexport default ClusterDetails;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport isUndefined from 'lodash/isUndefined';\nimport { Formik, FormikHelpers } from 'formik';\nimport {\n Cluster,\n ClusterCreateParams,\n V2ClusterUpdateParams,\n ManagedDomain,\n ClusterWizardStep,\n ClusterWizardStepHeader,\n getClusterDetailsValidationSchema,\n InfraEnv,\n getRichTextValidation,\n useFeatureSupportLevel,\n} from '../../../common';\nimport { canNextClusterDetails } from './wizardTransition';\nimport { OpenshiftVersionOptionType, getFormikErrorFields } from '../../../common';\nimport ClusterWizardFooter from './ClusterWizardFooter';\nimport { ocmClient } from '../../api';\nimport { ClusterDetailsService } from '../../services';\nimport { OcmClusterDetailsValues } from '../../services/types';\nimport { OcmClusterDetailsFormFields } from '../clusterConfiguration/OcmClusterDetailsFormFields';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\n\ntype ClusterDetailsFormProps = {\n cluster?: Cluster;\n infraEnv?: InfraEnv;\n pullSecret: string;\n managedDomains: ManagedDomain[];\n ocpVersions: OpenshiftVersionOptionType[];\n usedClusterNames: string[];\n navigation: React.ReactNode;\n moveNext: () => void;\n handleClusterCreate: (params: ClusterCreateParams) => Promise<void>;\n handleClusterUpdate: (clusterId: Cluster['id'], params: V2ClusterUpdateParams) => Promise<void>;\n};\n\nconst ClusterDetailsForm = (props: ClusterDetailsFormProps) => {\n const {\n cluster,\n infraEnv,\n pullSecret,\n managedDomains,\n ocpVersions,\n usedClusterNames = [],\n moveNext,\n handleClusterUpdate,\n handleClusterCreate,\n navigation,\n } = props;\n\n const { search } = useLocation();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const featureSupportLevels = useFeatureSupportLevel();\n const handleSubmit = React.useCallback(\n async (values: OcmClusterDetailsValues) => {\n const params = ClusterDetailsService.getClusterCreateParams(values);\n if (cluster) {\n await handleClusterUpdate(cluster.id, params);\n } else {\n await handleClusterCreate(params);\n }\n },\n [cluster, handleClusterCreate, handleClusterUpdate],\n );\n\n const handleOnNext = (\n dirty: boolean,\n submitForm: FormikHelpers<unknown>['submitForm'],\n cluster?: Cluster,\n ): (() => Promise<void> | void) => {\n if (isViewerMode || (!dirty && !isUndefined(cluster) && canNextClusterDetails({ cluster }))) {\n return moveNext;\n }\n return submitForm;\n };\n\n const initialValues = React.useMemo(\n () =>\n ClusterDetailsService.getClusterDetailsInitialValues({\n infraEnv,\n cluster,\n pullSecret,\n managedDomains,\n ocpVersions,\n urlSearchParams: search,\n }),\n [infraEnv, cluster, pullSecret, managedDomains, ocpVersions, search],\n );\n\n const { t } = useTranslation();\n const validationSchema = getClusterDetailsValidationSchema({\n usedClusterNames,\n featureSupportLevels,\n pullSecretSet: cluster?.pullSecretSet,\n ocpVersions,\n isOcm: true,\n t,\n });\n\n return (\n <Formik\n initialValues={initialValues}\n validate={getRichTextValidation(validationSchema)}\n onSubmit={handleSubmit}\n >\n {({ submitForm, isSubmitting, isValid, dirty, setFieldValue, errors, touched }) => {\n const errorFields = getFormikErrorFields(errors, touched);\n const toggleRedHatDnsService = (checked: boolean) =>\n setFieldValue('baseDnsDomain', checked ? managedDomains.map((d) => d.domain)[0] : '');\n\n const form = (\n <>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Cluster details</ClusterWizardStepHeader>\n </GridItem>\n <GridItem span={12} lg={10} xl={9} xl2={7}>\n <OcmClusterDetailsFormFields\n toggleRedHatDnsService={toggleRedHatDnsService}\n versions={ocpVersions}\n forceOpenshiftVersion={cluster?.openshiftVersion}\n isPullSecretSet={!!cluster?.pullSecretSet}\n defaultPullSecret={pullSecret}\n isOcm={!!ocmClient}\n managedDomains={managedDomains}\n clusterExists={!!cluster}\n />\n </GridItem>\n </Grid>\n </>\n );\n\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n errorFields={errorFields}\n isSubmitting={isSubmitting}\n isNextDisabled={\n !(\n !isSubmitting &&\n isValid &&\n (dirty || (cluster && canNextClusterDetails({ cluster })))\n )\n }\n onNext={handleOnNext(dirty, submitForm, cluster)}\n />\n );\n return (\n <ClusterWizardStep navigation={navigation} footer={footer}>\n {form}\n </ClusterWizardStep>\n );\n }}\n </Formik>\n );\n};\n\nexport default ClusterDetailsForm;\n", "import * as React from 'react';\nimport { Form } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\n\nimport ArmCheckbox from './ArmCheckbox';\nimport { HostsNetworkConfigurationControlGroup } from './HostsNetworkConfigurationControlGroup';\nimport {\n ClusterDetailsValues,\n isSNO,\n ManagedDomain,\n OpenshiftVersionOptionType,\n PullSecret,\n SNOControlGroup,\n StaticTextField,\n ocmClusterNameValidationMessages,\n uniqueOcmClusterNameValidationMessages,\n} from '../../../common';\nimport DiskEncryptionControlGroup from '../../../common/components/clusterConfiguration/DiskEncryptionFields/DiskEncryptionControlGroup';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport {\n OcmCheckboxField,\n OcmInputField,\n OcmRichInputField,\n OcmSelectField,\n} from '../ui/OcmFormFields';\nimport OcmOpenShiftVersionSelect from './OcmOpenShiftVersionSelect';\n\nexport type OcmClusterDetailsFormFieldsProps = {\n forceOpenshiftVersion?: string;\n isBaseDnsDomainDisabled?: boolean;\n defaultPullSecret?: string;\n isOcm: boolean;\n managedDomains?: ManagedDomain[];\n versions: OpenshiftVersionOptionType[];\n toggleRedHatDnsService?: (checked: boolean) => void;\n isPullSecretSet: boolean;\n clusterExists: boolean;\n};\n\nconst BaseDnsHelperText = ({ name, baseDnsDomain }: { name?: string; baseDnsDomain?: string }) => (\n <>\n All DNS records must be subdomains of this base and include the cluster name. This cannot be\n changed after cluster installation. The full cluster address will be: <br />\n <strong>\n {name || '[Cluster Name]'}.{baseDnsDomain || '[example.com]'}\n </strong>\n </>\n);\n\nexport const OcmClusterDetailsFormFields = ({\n managedDomains = [],\n toggleRedHatDnsService,\n isBaseDnsDomainDisabled,\n versions,\n isPullSecretSet,\n defaultPullSecret,\n forceOpenshiftVersion,\n isOcm,\n clusterExists,\n}: OcmClusterDetailsFormFieldsProps) => {\n const { values } = useFormikContext<ClusterDetailsValues>();\n const { name, baseDnsDomain, highAvailabilityMode, useRedHatDnsService } = values;\n const nameInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n nameInputRef.current?.focus();\n }, []);\n\n const { t } = useTranslation();\n\n return (\n <Form id=\"wizard-cluster-details__form\">\n <OcmRichInputField\n ref={nameInputRef}\n label=\"Cluster name\"\n name=\"name\"\n placeholder={isOcm ? '' : 'Enter cluster name'}\n isRequired\n richValidationMessages={\n useRedHatDnsService\n ? uniqueOcmClusterNameValidationMessages(t)\n : ocmClusterNameValidationMessages(t)\n }\n />\n {!!managedDomains.length && toggleRedHatDnsService && (\n <OcmCheckboxField\n name=\"useRedHatDnsService\"\n label=\"Use a temporary 60-day domain\"\n helperText=\"A base domain will be provided for temporary, non-production clusters.\"\n onChange={toggleRedHatDnsService}\n />\n )}\n {useRedHatDnsService ? (\n <OcmSelectField\n label=\"Base domain\"\n name=\"baseDnsDomain\"\n helperText={<BaseDnsHelperText name={name} baseDnsDomain={baseDnsDomain} />}\n options={managedDomains.map((d) => ({\n label: `${d.domain || ''} (${d.provider || ''})`,\n value: d.domain,\n }))}\n isRequired\n />\n ) : (\n <OcmInputField\n label=\"Base domain\"\n name=\"baseDnsDomain\"\n helperText={<BaseDnsHelperText name={name} baseDnsDomain={baseDnsDomain} />}\n placeholder=\"example.com\"\n isDisabled={isBaseDnsDomainDisabled || useRedHatDnsService}\n isRequired\n />\n )}\n {forceOpenshiftVersion ? (\n <StaticTextField name=\"openshiftVersion\" label=\"OpenShift version\" isRequired>\n OpenShift {forceOpenshiftVersion}{' '}\n {getDeveloperPreviewText(forceOpenshiftVersion, versions)}\n </StaticTextField>\n ) : (\n <OcmOpenShiftVersionSelect versions={versions} />\n )}\n <SNOControlGroup versions={versions} highAvailabilityMode={highAvailabilityMode} />\n\n {!isPullSecretSet && <PullSecret isOcm={isOcm} defaultPullSecret={defaultPullSecret} />}\n <ArmCheckbox versions={versions} />\n <HostsNetworkConfigurationControlGroup clusterExists={clusterExists} />\n <DiskEncryptionControlGroup\n values={values}\n isDisabled={isPullSecretSet}\n isSNO={isSNO({ highAvailabilityMode })}\n />\n </Form>\n );\n};\nfunction getDeveloperPreviewText(\n forceOpenshiftVersion: string,\n versions: OpenshiftVersionOptionType[],\n): string {\n const versionSelected = versions.find((version) => version.version === forceOpenshiftVersion);\n return versionSelected?.supportLevel === 'beta' ? '- Developer preview release' : '';\n}\n", "import * as React from 'react';\nimport { FormGroup, Tooltip } from '@patternfly/react-core';\nimport { useField, useFormikContext } from 'formik';\nimport {\n getFieldId,\n isArmArchitecture,\n ClusterCreateParams,\n HelperText,\n PopoverIcon,\n CpuArchitecture,\n OpenshiftVersionOptionType,\n} from '../../../common';\nimport {\n FeatureSupportLevelBadge,\n useFeatureSupportLevel,\n} from '../../../common/components/featureSupportLevels';\nimport { OcmCheckbox } from '../ui/OcmFormFields';\n\nconst getLabel = (openshiftVersion: string) => {\n return (\n <>\n Use arm64 CPU architecture{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <p>\n Check this option if you want to use the arm64 CPU architecture instead of the default\n x86_64 CPU architecture. Please note that some features will not be available.\n </p>\n }\n />\n <FeatureSupportLevelBadge\n featureId=\"ARM64_ARCHITECTURE\"\n openshiftVersion={openshiftVersion}\n />\n </>\n );\n};\n\ntype ArmCheckboxProps = { versions: OpenshiftVersionOptionType[] };\n\nconst ArmCheckbox: React.FC<ArmCheckboxProps> = ({ versions }) => {\n const {\n values: { openshiftVersion },\n } = useFormikContext<ClusterCreateParams>();\n const [{ name, value }, , { setValue }] = useField<CpuArchitecture>('cpuArchitecture');\n const featureSupportLevelContext = useFeatureSupportLevel();\n const isSupportedVersionAvailable = !!versions.find((version) =>\n featureSupportLevelContext.isFeatureSupported(version.value, 'ARM64_ARCHITECTURE'),\n );\n const prevVersionRef = React.useRef(openshiftVersion);\n const fieldId = getFieldId(name, 'input');\n const onChanged = React.useCallback(\n (checked: boolean) => setValue(checked ? CpuArchitecture.ARM : CpuArchitecture.x86),\n [setValue],\n );\n\n React.useEffect(() => {\n if (\n prevVersionRef.current !== openshiftVersion &&\n !featureSupportLevelContext.isFeatureSupported(openshiftVersion, 'ARM64_ARCHITECTURE')\n ) {\n //invoke updating cpu architecture value only if the version changed to not be in danger of touching existing clusters\n onChanged(false);\n }\n prevVersionRef.current = openshiftVersion;\n }, [openshiftVersion, onChanged, featureSupportLevelContext]);\n if (!isSupportedVersionAvailable) {\n return null;\n }\n const disabledReason = featureSupportLevelContext.getFeatureDisabledReason(\n openshiftVersion,\n 'ARM64_ARCHITECTURE',\n );\n return (\n <FormGroup isInline fieldId={fieldId}>\n <Tooltip hidden={!disabledReason} content={disabledReason}>\n <OcmCheckbox\n id={fieldId}\n name={name}\n isDisabled={featureSupportLevelContext.isFeatureDisabled(\n openshiftVersion,\n 'ARM64_ARCHITECTURE',\n )}\n label={getLabel(openshiftVersion)}\n aria-describedby={`${fieldId}-helper`}\n description={\n <HelperText fieldId={fieldId}>\n Make sure all the hosts are using arm64 CPU architecture.\n </HelperText>\n }\n isChecked={isArmArchitecture({ cpuArchitecture: value })}\n onChange={onChanged}\n className=\"with-tooltip\"\n />\n </Tooltip>\n </FormGroup>\n );\n};\n\nexport default ArmCheckbox;\n", "import React from 'react';\nimport { FormGroup, TooltipProps } from '@patternfly/react-core';\nimport { getFieldId } from '../../../common/components/ui';\nimport { HostsNetworkConfigurationType } from '../../services/types';\nimport { useField } from 'formik';\nimport { useClusterWizardContext } from '../clusterWizard/ClusterWizardContext';\nimport RadioFieldWithTooltip from '../../../common/components/ui/formik/RadioFieldWithTooltip';\nimport { clusterExistsReason } from '../featureSupportLevels/featureStateUtils';\n\nexport interface HostsNetworkConfigurationControlGroupProps {\n clusterExists: boolean;\n}\n\nexport const HostsNetworkConfigurationControlGroup = ({\n clusterExists,\n}: HostsNetworkConfigurationControlGroupProps) => {\n const GROUP_NAME = 'hostsNetworkConfigurationType';\n const clusterWizardContext = useClusterWizardContext();\n const [{ value }, ,] = useField(GROUP_NAME);\n\n const tooltipProps: TooltipProps = {\n hidden: !clusterExists,\n content: clusterExistsReason,\n position: 'top',\n };\n\n React.useEffect(() => {\n if (clusterExists) {\n return;\n }\n clusterWizardContext.onUpdateHostNetworkConfigType(value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clusterExists]);\n return (\n <FormGroup\n label=\"Hosts' network configuration\"\n fieldId={getFieldId(GROUP_NAME, 'radio')}\n isInline\n >\n <RadioFieldWithTooltip\n name={GROUP_NAME}\n isDisabled={clusterExists}\n value={HostsNetworkConfigurationType.DHCP}\n label=\"DHCP only\"\n tooltipProps={tooltipProps}\n />\n <RadioFieldWithTooltip\n name={GROUP_NAME}\n isDisabled={clusterExists}\n value={HostsNetworkConfigurationType.STATIC}\n label=\"Static IP, bridges, and bonds\"\n tooltipProps={tooltipProps}\n />\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { Alert, AlertVariant, FlexItem, FormGroup, Stack, StackItem } from '@patternfly/react-core';\nimport SwitchField from '../../ui/formik/SwitchField';\nimport { DiskEncryptionMode } from './DiskEncryptionMode';\nimport { RenderIf } from '../../ui';\nimport { DiskEncryptionValues, TangServer } from './DiskEncryptionValues';\nimport { useFormikContext } from 'formik';\nimport { ClusterDetailsValues } from '../../clusterWizard/types';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nconst hasFilledTangServers = (tangServers: TangServer[]): boolean => {\n if (!tangServers || tangServers.length === 0) {\n return false;\n }\n\n const emptyServer = {\n url: '',\n thumbprint: '',\n };\n return (\n tangServers.find(\n (server: typeof tangServers[number]) => !isEqual(server, emptyServer) && !isEqual(server, {}),\n ) !== undefined\n );\n};\n\nexport interface DiskEncryptionControlGroupProps {\n values: DiskEncryptionValues;\n isSNO: boolean;\n isDisabled?: boolean;\n}\n\nconst DiskEncryptionControlGroup = ({\n values,\n isSNO = false,\n isDisabled = false,\n}: DiskEncryptionControlGroupProps) => {\n const {\n enableDiskEncryptionOnMasters,\n enableDiskEncryptionOnWorkers,\n diskEncryptionMode,\n diskEncryptionTangServers,\n } = values;\n\n const hasEnabledDiskEncryption = enableDiskEncryptionOnMasters || enableDiskEncryptionOnWorkers;\n const { setFieldValue, setFieldTouched } = useFormikContext<ClusterDetailsValues>();\n\n React.useEffect(() => {\n if (!enableDiskEncryptionOnWorkers && !enableDiskEncryptionOnMasters) {\n if (diskEncryptionMode !== 'tpmv2') {\n setFieldValue('diskEncryptionMode', 'tpmv2');\n }\n if (hasFilledTangServers(diskEncryptionTangServers)) {\n setFieldTouched('diskEncryptionTangServers', false, false);\n setFieldValue('diskEncryptionTangServers', [{}], false);\n }\n }\n }, [\n enableDiskEncryptionOnMasters,\n enableDiskEncryptionOnWorkers,\n diskEncryptionMode,\n diskEncryptionTangServers,\n setFieldTouched,\n setFieldValue,\n ]);\n\n React.useEffect(() => {\n if (isSNO) {\n setFieldValue('enableDiskEncryptionOnWorkers', false);\n }\n }, [isSNO, setFieldValue]);\n const { t } = useTranslation();\n const disableMessage = t('ai:This option is not editable after the draft cluster is created');\n const tooltipProps = {\n hidden: !isDisabled,\n content: disableMessage,\n };\n\n return (\n <FormGroup label=\"Encryption of installation disks\">\n <Stack hasGutter>\n <StackItem>\n <SwitchField\n tooltipProps={tooltipProps}\n name=\"enableDiskEncryptionOnMasters\"\n label={isSNO ? t('ai:Control plane node, worker') : t('ai:Control plane nodes')}\n isDisabled={isDisabled}\n />\n </StackItem>\n <RenderIf condition={!isSNO}>\n <StackItem>\n <SwitchField\n tooltipProps={tooltipProps}\n name=\"enableDiskEncryptionOnWorkers\"\n isDisabled={isDisabled}\n label={t('ai:Workers')}\n />\n </StackItem>\n </RenderIf>\n <RenderIf\n condition={enableDiskEncryptionOnMasters || (enableDiskEncryptionOnWorkers && !isSNO)}\n >\n <StackItem>\n <DiskEncryptionMode diskEncryptionMode={diskEncryptionMode} isDisabled={isDisabled} />\n </StackItem>\n </RenderIf>\n </Stack>\n {hasEnabledDiskEncryption && (\n <Alert\n variant={AlertVariant.warning}\n isInline\n title={\n <FlexItem>\n {diskEncryptionMode === 'tpmv2' && (\n <>\n To use this encryption method, enable TPMv2 encryption in the BIOS of each\n selected host.\n </>\n )}\n {diskEncryptionMode === 'tang' && (\n <>\n The use of Tang encryption mode to encrypt your disks is only supported for bare\n metal or vSphere installations on user-provisioned infrastructure.\n </>\n )}\n </FlexItem>\n }\n />\n )}\n </FormGroup>\n );\n};\n\nexport default DiskEncryptionControlGroup;\n", "import React from 'react';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport {\n Flex,\n FlexItem,\n Stack,\n StackItem,\n Text,\n TextVariants,\n TextContent,\n} from '@patternfly/react-core';\nimport { ENCRYPTING_DISK_DURING_INSTALLATION } from '../../../config';\nimport PopoverIcon from '../../ui/PopoverIcon';\nimport { RadioField } from '../../ui/formik';\nimport { TangServers } from './TangServers';\nimport { DiskEncryption } from '../../../api';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nconst DiskEncryptionModeTPMv2 = () => {\n const { t } = useTranslation();\n return (\n <>\n TPM v2{' '}\n <PopoverIcon\n component={'a'}\n minWidth=\"22rem\"\n bodyContent={\n <p>\n {t(\n 'ai:TPM v2 stores passphrases in a secure cryptoprocessor contained within as server.',\n )}\n &nbsp;\n <a href={ENCRYPTING_DISK_DURING_INSTALLATION} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Learn more')} <ExternalLinkAltIcon />\n </a>\n </p>\n }\n />\n </>\n );\n};\n\nconst DiskEncryptionModeTang = () => {\n const { t } = useTranslation();\n return (\n <>\n Tang{' '}\n <PopoverIcon\n component={'a'}\n minWidth=\"25rem\"\n bodyContent={\n <p>\n {t('ai:Tang server component that enable network-bound disk encryption (NBDE).')} &nbsp;\n <a href={ENCRYPTING_DISK_DURING_INSTALLATION} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Learn more')} <ExternalLinkAltIcon />\n </a>\n </p>\n }\n />\n </>\n );\n};\n\nexport interface DiskEncryptionModeProps {\n isDisabled: boolean;\n diskEncryptionMode: DiskEncryption['mode'];\n}\n\nexport const DiskEncryptionMode = ({ diskEncryptionMode, isDisabled }: DiskEncryptionModeProps) => {\n const { t } = useTranslation();\n return (\n <Stack>\n <StackItem>\n <Flex>\n <FlexItem spacer={{ default: 'spacer3xl' }}>\n <RadioField\n isDisabled={isDisabled}\n name=\"diskEncryptionMode\"\n label={<DiskEncryptionModeTPMv2 />}\n id=\"TPMV2-button\"\n value=\"tpmv2\"\n />\n </FlexItem>\n <FlexItem spacer={{ default: 'spacer3xl' }}>\n <RadioField\n isDisabled={isDisabled}\n name=\"diskEncryptionMode\"\n label={<DiskEncryptionModeTang />}\n id=\"tang-button\"\n value=\"tang\"\n />\n </FlexItem>\n </Flex>\n </StackItem>\n {diskEncryptionMode === 'tang' && (\n <Stack>\n &nbsp;\n <StackItem>\n <TextContent>\n <Text component={TextVariants.h6}>{t('ai:Tang servers')}</Text>\n </TextContent>\n </StackItem>\n &nbsp;\n <TangServers isDisabled={isDisabled} />\n </Stack>\n )}\n </Stack>\n );\n};\n", "import React from 'react';\nimport { FieldArray, useFormikContext } from 'formik';\nimport { Stack, StackItem, TextInputTypes } from '@patternfly/react-core';\nimport { ClusterDetailsValues } from '../../clusterWizard';\nimport { InputField } from '../../ui';\nimport { AddButton, RemovableField } from '../../ui/formik';\nimport { useTranslation } from '../../../hooks/use-translation-wrapper';\n\nexport const TangServers = ({ isDisabled = false }: { isDisabled: boolean }) => {\n const { values } = useFormikContext<ClusterDetailsValues>();\n const { t } = useTranslation();\n return (\n <FieldArray name=\"diskEncryptionTangServers\">\n {({ remove, push }) => (\n <Stack hasGutter>\n {values.diskEncryptionTangServers.map((tang, index) => (\n <StackItem key={index}>\n <RemovableField\n hideRemoveButton={index === 0 || isDisabled}\n onRemove={() => remove(index)}\n >\n <div>\n <InputField\n type={TextInputTypes.url}\n name={`diskEncryptionTangServers.${index}.url`}\n helperText={`Must start with \"http://\" or \"https://\". Optionally, end with \":<port>\"`}\n label=\"Server URL\"\n isRequired\n isDisabled={isDisabled}\n />\n &thinsp;\n <InputField\n type={TextInputTypes.text}\n name={`diskEncryptionTangServers.${index}.thumbprint`}\n label=\"Server Thumbprint\"\n isRequired\n isDisabled={isDisabled}\n />\n </div>\n </RemovableField>{' '}\n </StackItem>\n ))}\n\n {!isDisabled && (\n <StackItem>\n <AddButton onAdd={() => push({ url: '', thumbprint: '' })} isInline>\n {t('ai:Add another Tang server')}\n </AddButton>\n </StackItem>\n )}\n </Stack>\n )}\n </FieldArray>\n );\n};\n", "import React from 'react';\nimport { OpenshiftVersionOptionType } from '../../../common/types';\nimport { OpenShiftVersionDropdown } from '../../../common/components/ui/OpenShiftVersionDropown';\nimport {\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n ExternalLinkAltIcon,\n} from '@patternfly/react-icons';\nimport {\n global_warning_color_100 as warningColor,\n global_danger_color_100 as dangerColor,\n} from '@patternfly/react-tokens';\nimport openshiftVersionData from '../../data/openshiftVersionsData.json';\nimport { diffInDaysBetweenDates } from '../../../common/sevices/DateAndTime';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { OPENSHIFT_LIFE_CYCLE_DATES_LINK } from '../../../common/config';\nimport { TFunction } from 'i18next';\nimport { ocmClient } from '../../api';\n\nconst OpenShiftLifeCycleDatesLink = () => {\n const { t } = useTranslation();\n return (\n <a href={OPENSHIFT_LIFE_CYCLE_DATES_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Learn more')} <ExternalLinkAltIcon />\n </a>\n );\n};\n\nconst getOpenshiftVersionHelperText = (\n versions: OpenshiftVersionOptionType[],\n selectedVersionValue: string | undefined,\n t: TFunction,\n) => {\n if (!versions.length) {\n return (\n <>\n <ExclamationCircleIcon color={dangerColor.value} size=\"sm\" />\n &nbsp; {t('ai:No release image is available.')}\n </>\n );\n }\n let helperTextComponent = null;\n const selectedVersion = versions.find((version) => version.label === selectedVersionValue);\n if (selectedVersion?.supportLevel !== 'production') {\n helperTextComponent = (\n <>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n &nbsp;{t('ai:Please note that this version is not production-ready.')}&nbsp;\n <OpenShiftLifeCycleDatesLink />\n </>\n );\n } else if (\n selectedVersionValue &&\n selectedVersionValue in openshiftVersionData['versions'] &&\n diffInDaysBetweenDates(openshiftVersionData['versions'][selectedVersionValue] as string) <= 30\n ) {\n helperTextComponent = (\n <>\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n &nbsp;\n {t(\n \"ai:Full support for this version ends on {{openshiftversion}} and won't be available as an installation option afterwards.\",\n { openshiftversion: openshiftVersionData['versions'][selectedVersionValue] as string },\n )}\n &nbsp;\n <OpenShiftLifeCycleDatesLink />\n </>\n );\n }\n return helperTextComponent;\n};\n\ntype OcmOpenShiftVersionSelectProps = {\n versions: OpenshiftVersionOptionType[];\n};\nconst OcmOpenShiftVersionSelect: React.FC<OcmOpenShiftVersionSelectProps> = ({ versions }) => {\n const { t } = useTranslation();\n const selectOptions = React.useMemo(\n () =>\n versions\n .filter((version) => version.supportLevel !== 'maintenance')\n .map((version) => ({\n label:\n version.supportLevel === 'beta'\n ? version.label + ' - ' + t('ai:Developer preview release')\n : version.label,\n // This is the \"key\" from openshift-versions API response\n // It can either be in the long or short (for default versions) form\n value: version.value,\n })),\n [versions, t],\n );\n const defaultVersion = versions.find((v) => v.default)?.label || versions[0]?.label || '';\n\n return (\n <OpenShiftVersionDropdown\n name=\"openshiftVersion\"\n defaultValue={defaultVersion}\n items={selectOptions}\n isDisabled={versions.length === 0}\n versions={versions}\n getHelperText={getOpenshiftVersionHelperText}\n showReleasesLink={ocmClient !== undefined}\n />\n );\n};\n\nexport default OcmOpenShiftVersionSelect;\n", "import React from 'react';\nimport {\n DropdownItem,\n DropdownToggle,\n Dropdown,\n HelperText,\n FormGroup,\n} from '@patternfly/react-core';\nimport { CaretDownIcon } from '@patternfly/react-icons';\n\nimport { OpenshiftVersionOptionType } from '../../types';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { useField } from 'formik';\nimport { getFieldId } from './formik';\nimport ExternalLink from './ExternalLink';\nimport { OCP_RELEASES_PAGE } from '../../config';\n\nexport type HelperTextType = (\n versions: OpenshiftVersionOptionType[],\n value: string | undefined,\n t: TFunction,\n) => JSX.Element | null;\n\ntype OpenShiftVersionDropdownProps = {\n name: string;\n defaultValue: string | undefined;\n items: {\n label: string;\n value: string;\n }[];\n isDisabled: boolean;\n versions: OpenshiftVersionOptionType[];\n getHelperText: HelperTextType;\n showReleasesLink: boolean;\n};\n\nexport const OpenShiftVersionDropdown = ({\n name,\n defaultValue,\n items,\n isDisabled,\n versions,\n getHelperText,\n showReleasesLink,\n}: OpenShiftVersionDropdownProps) => {\n const [field, , { setValue }] = useField(name);\n const [isOpen, setOpen] = React.useState(false);\n const [current, setCurrent] = React.useState(defaultValue);\n const { t } = useTranslation();\n const [helperText, setHelperText] = React.useState(getHelperText(versions, defaultValue, t));\n const fieldId = getFieldId(name, 'input');\n const dropdownItems = items.map(({ value, label }) => (\n <DropdownItem key={value} id={value}>\n {label}\n </DropdownItem>\n ));\n\n const onSelect = React.useCallback(\n (event?: React.SyntheticEvent<HTMLDivElement>) => {\n const currentValue = event?.currentTarget.innerText\n ? event?.currentTarget.innerText\n : defaultValue;\n setCurrent(currentValue ? currentValue : '');\n setValue(event?.currentTarget.id);\n setHelperText(getHelperText(versions, currentValue, t));\n setOpen(false);\n },\n [setCurrent, setHelperText, setOpen, defaultValue, getHelperText, t, versions, setValue],\n );\n\n const toggle = React.useMemo(\n () => (\n <DropdownToggle\n onToggle={(val) => setOpen(!isDisabled && val)}\n toggleIndicator={CaretDownIcon}\n isDisabled={isDisabled}\n isText\n className=\"pf-u-w-100\"\n >\n {current}\n </DropdownToggle>\n ),\n [setOpen, current, isDisabled],\n );\n\n return (\n <FormGroup fieldId={fieldId} label={t('ai:OpenShift version')} isRequired>\n <Dropdown\n {...field}\n name={name}\n id={fieldId}\n onSelect={onSelect}\n dropdownItems={dropdownItems}\n toggle={toggle}\n isOpen={isOpen}\n className=\"pf-u-w-100\"\n />\n <HelperText style={{ display: 'inherit' }}>{helperText}</HelperText>\n {showReleasesLink && (\n <ExternalLink href={`${window.location.origin}/${OCP_RELEASES_PAGE}`}>\n {t('ai:Learn more about OpenShift releases')}\n </ExternalLink>\n )}\n </FormGroup>\n );\n};\n", "import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Formik, FormikConfig, useFormikContext } from 'formik';\nimport {\n Cluster,\n V2ClusterUpdateParams,\n getFormikErrorFields,\n ClusterWizardStep,\n HostDiscoveryValues,\n useAlerts,\n getHostDiscoveryInitialValues,\n useFormikAutoSave,\n SupportedPlatformType,\n} from '../../../common';\nimport HostInventory from '../clusterConfiguration/HostInventory';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport { canNextHostDiscovery } from './wizardTransition';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport { updateCluster } from '../../reducers/clusters';\nimport ClusterWizardFooter from './ClusterWizardFooter';\nimport ClusterWizardNavigation from './ClusterWizardNavigation';\nimport { ClustersService, HostDiscoveryService } from '../../services';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\nimport useClusterSupportedPlatforms from '../../hooks/useClusterSupportedPlatforms';\n\nconst HostDiscoveryForm = ({ cluster }: { cluster: Cluster }) => {\n const { alerts } = useAlerts();\n const { errors, touched, isSubmitting, isValid } = useFormikContext<HostDiscoveryValues>();\n const clusterWizardContext = useClusterWizardContext();\n const isAutoSaveRunning = useFormikAutoSave();\n const errorFields = getFormikErrorFields(errors, touched);\n\n const isNextDisabled =\n !isValid ||\n !!alerts.length ||\n isAutoSaveRunning ||\n isSubmitting ||\n !canNextHostDiscovery({ cluster });\n\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n errorFields={errorFields}\n isSubmitting={isSubmitting}\n isNextDisabled={isNextDisabled}\n onNext={() => clusterWizardContext.moveNext()}\n onBack={() => clusterWizardContext.moveBack()}\n />\n );\n\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />} footer={footer}>\n <HostInventory cluster={cluster} />\n </ClusterWizardStep>\n );\n};\n\nconst HostDiscovery = ({ cluster }: { cluster: Cluster }) => {\n const dispatch = useDispatch();\n const { addAlert, clearAlerts } = useAlerts();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const initialValues = React.useMemo(\n () => getHostDiscoveryInitialValues(cluster),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [], // just once, Formik does not reinitialize\n );\n const { supportedPlatformIntegration } = useClusterSupportedPlatforms(cluster.id);\n\n const onSubmit: FormikConfig<HostDiscoveryValues>['onSubmit'] = async (values) => {\n clearAlerts();\n\n const platformToIntegrate = values.usePlatformIntegration\n ? supportedPlatformIntegration === 'no-active-integrations'\n ? undefined\n : supportedPlatformIntegration\n : undefined;\n\n const params: V2ClusterUpdateParams = {};\n\n HostDiscoveryService.setPlatform(\n params,\n platformToIntegrate as SupportedPlatformType,\n cluster.userManagedNetworking,\n );\n HostDiscoveryService.setSchedulableMasters(params, values, cluster);\n\n try {\n const { data } = await ClustersService.update(cluster.id, cluster.tags, params);\n dispatch(updateCluster(data));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to update the cluster', message: getApiErrorMessage(e) }),\n );\n }\n };\n\n const handleSubmit = isViewerMode ? () => Promise.resolve() : onSubmit;\n return (\n <Formik initialValues={initialValues} onSubmit={handleSubmit}>\n <HostDiscoveryForm cluster={cluster} />\n </Formik>\n );\n};\n\nexport default HostDiscovery;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport {\n Text,\n TextContent,\n Button,\n Stack,\n StackItem,\n Split,\n SplitItem,\n} from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport {\n Cluster,\n HostDiscoveryValues,\n PopoverIcon,\n useFeature,\n ClusterWizardStepHeader,\n selectMastersMustRunWorkloads,\n selectSchedulableMasters,\n} from '../../../common';\nimport HostsDiscoveryTable from '../hosts/HostsDiscoveryTable';\nimport { DiscoveryImageModalButton } from './DiscoveryImageModal';\nimport InformationAndAlerts from './InformationAndAlerts';\nimport { OcmSwitchField } from '../ui/OcmFormFields';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\nimport PlatformIntegration from './platformIntegration/PlatformIntegration';\n\nconst SchedulableMastersLabel = () => (\n <>\n <span>Run workloads on control plane nodes</span>{' '}\n <PopoverIcon\n bodyContent={<p>Enables your control plane nodes to be used for running applications.</p>}\n />\n </>\n);\n\nconst schedulableMastersTooltip =\n 'This toggle will be \"On\" and not editable when less than 5 hosts were discovered';\n\nconst HostInventory = ({ cluster }: { cluster: Cluster }) => {\n const isPlatformIntegrationFeatureEnabled = useFeature(\n 'ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE',\n );\n const mastersMustRunWorkloads = selectMastersMustRunWorkloads(cluster);\n const { setFieldValue } = useFormikContext<HostDiscoveryValues>();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n React.useEffect(() => {\n setFieldValue('schedulableMasters', selectSchedulableMasters(cluster));\n }, [cluster, mastersMustRunWorkloads, setFieldValue]); // Schedulable masters need to be recalculated only when forced status changes\n\n return (\n <Stack hasGutter>\n <StackItem>\n <ClusterWizardStepHeader>Host discovery</ClusterWizardStepHeader>\n </StackItem>\n <StackItem>\n {!isViewerMode && (\n <TextContent>\n <Text component=\"p\">\n <DiscoveryImageModalButton\n ButtonComponent={Button}\n cluster={cluster}\n idPrefix=\"host-inventory\"\n />\n </Text>\n </TextContent>\n )}\n </StackItem>\n {isPlatformIntegrationFeatureEnabled && (\n <StackItem>\n <Split hasGutter>\n <SplitItem>\n <PlatformIntegration clusterId={cluster.id} />\n </SplitItem>\n </Split>\n </StackItem>\n )}\n <StackItem>\n <OcmSwitchField\n tooltipProps={{\n hidden: !mastersMustRunWorkloads,\n content: schedulableMastersTooltip,\n }}\n isDisabled={mastersMustRunWorkloads}\n name={'schedulableMasters'}\n label={<SchedulableMastersLabel />}\n />\n </StackItem>\n <StackItem>\n <TextContent>\n <InformationAndAlerts cluster={cluster} />\n </TextContent>\n </StackItem>\n <StackItem>\n <TextContent>\n <Text component=\"h3\">Host Inventory</Text>\n </TextContent>\n </StackItem>\n <StackItem>\n <HostsDiscoveryTable cluster={cluster} />\n </StackItem>\n </Stack>\n );\n};\nexport default HostInventory;\n", "import React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport {\n ChangeHostnameAction,\n selectSchedulableMasters,\n Cluster,\n Host,\n isSNO,\n DeleteHostAction,\n TableToolbar,\n} from '../../../common';\nimport { HostsTableModals, useHostsTable } from './use-hosts-table';\nimport {\n countColumn,\n cpuCoresColumn,\n discoveredAtColumn,\n disksColumn,\n hostnameColumn,\n memoryColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport { HostDetail } from '../../../common/components/hosts/HostRowDetail';\nimport { ExpandComponentProps } from '../../../common/components/hosts/AITable';\nimport { AdditionalNTPSourcesDialogToggle } from './AdditionaNTPSourceDialogToggle';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { hardwareStatusColumn } from './HardwareStatus';\nimport HostsTableEmptyState from '../hosts/HostsTableEmptyState';\nimport { useSelector } from 'react-redux';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\n\nconst HostRowDetailExpand = ({ obj: host }: ExpandComponentProps<Host>) => (\n <HostDetail\n key={host.id}\n host={host}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n />\n);\n\ntype HostsDiscoveryTableProps = {\n cluster: Cluster;\n};\n\nconst HostsDiscoveryTable = ({ cluster }: HostsDiscoveryTableProps) => {\n const {\n onEditHost,\n actionChecks,\n onEditRole,\n actionResolver,\n onSelect,\n selectedHostIDs,\n setSelectedHostIDs,\n onMassChangeHostname,\n onMassDeleteHost,\n ...modalProps\n } = useHostsTable(cluster);\n\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const isSNOCluster = isSNO(cluster);\n const { t } = useTranslation();\n const content = React.useMemo(\n () => [\n hostnameColumn(t, onEditHost, undefined, actionChecks.canEditHostname),\n roleColumn(t, actionChecks.canEditRole, onEditRole, selectSchedulableMasters(cluster)),\n hardwareStatusColumn({ onEditHostname: onEditHost }),\n discoveredAtColumn,\n cpuCoresColumn,\n memoryColumn,\n disksColumn,\n countColumn(cluster),\n ],\n [t, onEditHost, actionChecks.canEditHostname, actionChecks.canEditRole, onEditRole, cluster],\n );\n\n const hosts = cluster.hosts || [];\n const paginationProps = usePagination(hosts.length);\n const itemIDs = hosts.map((h) => h.id);\n const showBulkActions = !(isViewerMode || isSNOCluster);\n\n return (\n <>\n <Stack hasGutter>\n {showBulkActions && (\n <StackItem>\n <TableToolbar\n selectedIDs={selectedHostIDs || []}\n itemIDs={itemIDs}\n setSelectedIDs={setSelectedHostIDs}\n actions={[\n <ChangeHostnameAction key=\"hostname\" onChangeHostname={onMassChangeHostname} />,\n <DeleteHostAction key=\"delete\" onDeleteHost={onMassDeleteHost} />,\n ]}\n {...paginationProps}\n />\n </StackItem>\n )}\n <StackItem>\n <HostsTable\n testId=\"hosts-discovery-table\"\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n ExpandComponent={HostRowDetailExpand}\n onSelect={showBulkActions ? onSelect : undefined}\n selectedIDs={selectedHostIDs}\n setSelectedIDs={setSelectedHostIDs}\n {...paginationProps}\n >\n <HostsTableEmptyState isSingleNode={isSNOCluster} />\n </HostsTable>\n </StackItem>\n </Stack>\n <HostsTableModals cluster={cluster} {...modalProps} />\n </>\n );\n};\n\nexport default HostsDiscoveryTable;\n", "import React from 'react';\nimport { Button, ButtonVariant, Modal, ModalVariant } from '@patternfly/react-core';\nimport { pluralize } from 'humanize-plus';\nimport { Cluster, CpuArchitecture, ErrorState, isSNO, ToolbarButton } from '../../../common';\nimport DiscoveryImageForm from './DiscoveryImageForm';\nimport DiscoveryImageSummary from './DiscoveryImageSummary';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport useInfraEnvImageUrl from '../../hooks/useInfraEnvImageUrl';\n\ntype DiscoveryImageModalButtonProps = {\n ButtonComponent?: typeof Button | typeof ToolbarButton;\n cluster: Cluster;\n idPrefix: string;\n};\n\nexport const DiscoveryImageModalButton: React.FC<DiscoveryImageModalButtonProps> = ({\n ButtonComponent = Button,\n cluster,\n idPrefix,\n}) => {\n const { discoveryImageDialog } = useModalDialogsContext();\n const { open } = discoveryImageDialog;\n const isSNOCluster = isSNO(cluster);\n\n return (\n <ButtonComponent\n variant={ButtonVariant.secondary}\n onClick={() => open({ cluster })}\n id={`${idPrefix}-button-download-discovery-iso`}\n >\n Add {pluralize(+isSNOCluster, 'host')}\n </ButtonComponent>\n );\n};\n\nexport const DiscoveryImageModal = () => {\n const [isoDownloadUrl, setIsoDownloadUrl] = React.useState<string>('');\n const [isoDownloadError, setIsoDownloadError] = React.useState<string>('');\n\n const { discoveryImageDialog } = useModalDialogsContext();\n const { data, isOpen, close } = discoveryImageDialog;\n const cluster = data?.cluster;\n const { getIsoImageUrl } = useInfraEnvImageUrl();\n\n const onImageReady = React.useCallback(async () => {\n // We need to retrieve the Iso for the only infraEnv on Day1, hence we don't specify the architecture\n const { url, error } = await getIsoImageUrl(cluster.id, CpuArchitecture.USE_DAY1_ARCHITECTURE);\n setIsoDownloadUrl(url);\n setIsoDownloadError(error);\n }, [getIsoImageUrl, cluster?.id]);\n\n const onReset = React.useCallback(() => {\n setIsoDownloadUrl('');\n }, []);\n\n if (!cluster) {\n return null;\n }\n\n const isSNOCluster = isSNO(cluster);\n\n return (\n <Modal\n aria-label=\"Add hosts dialog\"\n title={`Add ${pluralize(+isSNOCluster, 'host')}`}\n isOpen={isOpen}\n onClose={close}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"generate-discovery-iso-modal\"\n >\n {isoDownloadError && <ErrorState />}\n {isoDownloadUrl ? (\n <DiscoveryImageSummary\n clusterName={cluster.name || ''}\n isSNO={isSNOCluster}\n onClose={close}\n onReset={onReset}\n isoDownloadUrl={isoDownloadUrl}\n cpuArchitecture={CpuArchitecture.USE_DAY1_ARCHITECTURE}\n />\n ) : (\n <DiscoveryImageForm\n cluster={cluster}\n onCancel={close}\n onSuccess={onImageReady}\n cpuArchitecture={CpuArchitecture.USE_DAY1_ARCHITECTURE}\n />\n )}\n </Modal>\n );\n};\n", "import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport Axios, { CancelTokenSource } from 'axios';\nimport { FormikHelpers } from 'formik';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport {\n Cluster,\n CpuArchitecture,\n DiscoveryImageConfigForm,\n DiscoveryImageFormValues,\n ErrorState,\n LoadingState,\n} from '../../../common';\nimport { forceReload, updateCluster } from '../../reducers/clusters';\nimport useInfraEnv from '../../hooks/useInfraEnv';\nimport { DiscoveryImageFormService } from '../../services';\n\ntype DiscoveryImageFormProps = {\n cluster: Cluster;\n onCancel: () => void;\n onSuccess: () => Promise<void>;\n cpuArchitecture: CpuArchitecture;\n};\n\nconst DiscoveryImageForm = ({\n cluster,\n onCancel,\n onSuccess,\n cpuArchitecture,\n}: DiscoveryImageFormProps) => {\n const { infraEnv, error: infraEnvError } = useInfraEnv(cluster.id, cpuArchitecture);\n const cancelSourceRef = React.useRef<CancelTokenSource>();\n const dispatch = useDispatch();\n\n React.useEffect(() => {\n cancelSourceRef.current = Axios.CancelToken.source();\n return () => cancelSourceRef.current?.cancel('Image generation cancelled by user.');\n }, []);\n\n const handleCancel = () => {\n dispatch(forceReload());\n onCancel();\n };\n\n const handleSubmit = async (\n formValues: DiscoveryImageFormValues,\n formikActions: FormikHelpers<DiscoveryImageFormValues>,\n ) => {\n if (cluster.id && infraEnv?.id) {\n try {\n const { updatedCluster } = await DiscoveryImageFormService.update(\n cluster.id,\n cluster.tags,\n infraEnv.id,\n formValues,\n );\n await onSuccess();\n dispatch(updateCluster(updatedCluster));\n } catch (error) {\n handleApiError(error, () => {\n formikActions.setStatus({\n error: {\n title: 'Failed to download the discovery Image',\n message: getApiErrorMessage(error),\n },\n });\n });\n }\n }\n };\n\n if (infraEnvError) {\n return <ErrorState />;\n }\n if (!infraEnv) {\n return <LoadingState />;\n }\n\n return (\n <DiscoveryImageConfigForm\n onCancel={handleCancel}\n handleSubmit={handleSubmit}\n sshPublicKey={infraEnv.sshAuthorizedKey}\n httpProxy={infraEnv.proxy?.httpProxy}\n httpsProxy={infraEnv.proxy?.httpsProxy}\n noProxy={infraEnv.proxy?.noProxy}\n imageType={infraEnv.type}\n />\n );\n};\n\nexport default DiscoveryImageForm;\n", "import React from 'react';\nimport DownloadIso from '../../../common/components/clusterConfiguration/DownloadIso';\nimport { CpuArchitecture } from '../../../common';\n\ntype DiscoveryImageSummaryProps = {\n clusterName: string;\n isSNO: boolean;\n isoDownloadUrl: string;\n onClose: () => void;\n onReset: () => void;\n cpuArchitecture: CpuArchitecture;\n};\n\nconst DiscoveryImageSummary = ({\n clusterName,\n isSNO,\n isoDownloadUrl,\n cpuArchitecture,\n ...restProps\n}: DiscoveryImageSummaryProps) => {\n const nameSuffix =\n cpuArchitecture === CpuArchitecture.USE_DAY1_ARCHITECTURE\n ? clusterName\n : `${clusterName}_${cpuArchitecture}`;\n return (\n <DownloadIso\n fileName={`discovery_image_${nameSuffix}.iso`}\n downloadUrl={isoDownloadUrl}\n isSNO={isSNO}\n {...restProps}\n />\n );\n};\n\nexport default DiscoveryImageSummary;\n", "import React from 'react';\nimport { Cluster, CpuArchitecture, PresignedUrl } from '../../common';\nimport { InfraEnvsAPI } from '../services/apis';\nimport { getErrorMessage } from '../../common/utils';\nimport { InfraEnvsService } from '../services';\n\ntype ImgUrl = {\n url: PresignedUrl['url'];\n error: string;\n};\n\nexport default function useInfraEnvImageUrl() {\n const getIsoImageUrl = React.useCallback(\n async (clusterId: Cluster['id'], cpuArchitecture: CpuArchitecture): Promise<ImgUrl> => {\n try {\n const infraEnvId = await InfraEnvsService.getInfraEnvId(clusterId, cpuArchitecture);\n if (!infraEnvId) {\n return { url: '', error: `Failed to retrieve the infraEnv for ${clusterId}` };\n }\n\n const {\n data: { url },\n } = await InfraEnvsAPI.getImageUrl(infraEnvId);\n return {\n url,\n error: url ? '' : 'Failed to retrieve the image URL, the API returned an invalid URL',\n };\n } catch (e) {\n return { url: '', error: getErrorMessage(e) };\n }\n },\n [],\n );\n\n return { getIsoImageUrl };\n}\n", "import React from 'react';\nimport { Text } from '@patternfly/react-core';\nimport { Cluster, VMRebootConfigurationInfo, isSNO } from '../../../common';\nimport { isAddHostsCluster } from '../clusters/utils';\nimport { isAHostVM } from '../hosts/utils';\nimport InfoLinkWithModal from '../ui/InfoLinkWithModal';\nimport HostRequirementsContent from '../hosts/HostRequirementsContent';\nimport HostsDiscoveryTroubleshootingInfoLinkWithModal from '../hosts/HostsDiscoveryTroubleshootingInfoLinkWithModal';\n\nconst InformationAndAlerts = ({ cluster }: { cluster: Cluster }) => {\n const isVM = React.useMemo(() => isAHostVM(cluster.hosts || []), [cluster.hosts]);\n const isSNOCluster = isSNO(cluster);\n\n return (\n <>\n <Text component=\"h3\">Information and warnings</Text>\n <Text component=\"p\">\n <InfoLinkWithModal\n linkText={'Minimum hardware requirements'}\n modalTitle={'Minimum hardware requirements'}\n >\n <HostRequirementsContent\n clusterId={cluster.id}\n isSingleNode={isSNOCluster}\n isAddingHosts={isAddHostsCluster(cluster)}\n />\n </InfoLinkWithModal>\n <span className={'pf-u-mr-md'}>&nbsp;</span>\n <HostsDiscoveryTroubleshootingInfoLinkWithModal isSingleNode={isSNOCluster} />\n </Text>\n {isVM && <VMRebootConfigurationInfo />}\n </>\n );\n};\nexport default InformationAndAlerts;\n", "import React from 'react';\nimport { List, ListItem, Text, TextContent } from '@patternfly/react-core';\nimport { Cluster, ErrorState, ExternalLink, LoadingState, fileSize } from '../../../common';\nimport { useClusterPreflightRequirements } from '../../hooks';\n\nconst DISK_WRITE_SPEED_LINK = 'https://access.redhat.com/solutions/4885641';\n\nconst parseRAM = (ramMib: number) => fileSize(ramMib * 1024 * 1024, 2, 'iec');\n\ntype PreflightRequirementsContentProps = {\n clusterId: Cluster['id'];\n isSingleNode: boolean;\n isAddingHosts: boolean;\n};\n\nconst HostRequirementsContent = ({\n clusterId,\n isSingleNode,\n isAddingHosts,\n}: PreflightRequirementsContentProps) => {\n const { preflightRequirements, error, isLoading } = useClusterPreflightRequirements(clusterId);\n\n if (isLoading) {\n return <LoadingState content=\"Loading hardware requirements ...\" />;\n }\n if (error) {\n return <ErrorState />;\n }\n\n const masterQuantitativeData = preflightRequirements?.ocp?.master?.quantitative;\n const masterCpuCores = masterQuantitativeData?.cpuCores || 4;\n const masterRam = parseRAM(masterQuantitativeData?.ramMib || 16 * 1024);\n const masterDiskSizeGb = masterQuantitativeData?.diskSizeGb || 100;\n const contentForControlPlaneNodes = `${masterCpuCores} CPU cores, ${masterRam} RAM, and ${masterDiskSizeGb} GB disk size.`;\n\n const workerQuantitativeData = preflightRequirements?.ocp?.worker?.quantitative;\n const workerCpuCores = workerQuantitativeData?.cpuCores || 2;\n const workerRam = parseRAM(workerQuantitativeData?.ramMib || 16 * 1024);\n const workerDiskSizeGb = workerQuantitativeData?.diskSizeGb || 100;\n const contentForWorkerNodes = `${workerCpuCores} CPU cores, ${workerRam} RAM, and ${workerDiskSizeGb} GB disk size.`;\n\n if (isAddingHosts) {\n return (\n <TextContent>\n <Text component={'p'}>{`Worker hosts must have at least ${contentForWorkerNodes}`}</Text>\n </TextContent>\n );\n }\n\n let content: JSX.Element;\n if (isSingleNode) {\n content = (\n <TextContent>\n <Text component=\"p\">\n {`One host is required with at least ${contentForControlPlaneNodes}`}\n </Text>\n </TextContent>\n );\n } else {\n content = (\n <List>\n <ListItem>{`Control plane nodes: At least ${contentForControlPlaneNodes}`}</ListItem>\n <ListItem>{`Workers: At least ${contentForWorkerNodes}`}</ListItem>\n <ListItem>\n Also note that each host's disk write speed should meet the minimum requirements to run\n OpenShift.\n <br />\n <ExternalLink href={DISK_WRITE_SPEED_LINK}>Learn more</ExternalLink>\n </ListItem>\n <ListItem>Operators might require additional resources.</ListItem>\n </List>\n );\n }\n\n return content;\n};\n\nexport default HostRequirementsContent;\n", "import React from 'react';\n\nimport { OcmSwitchField } from '../../ui/OcmFormFields';\nimport { Cluster, PopoverIcon } from '../../../../common';\nimport useClusterSupportedPlatforms, {\n SupportedPlatformIntegrationType,\n} from '../../../hooks/useClusterSupportedPlatforms';\nimport PlatformIntegrationVsphere from './PlatformIntegrationVsphere';\n\ntype KeyType = Record<SupportedPlatformIntegrationType, string>;\n\nconst undeterminedPlatformMessage =\n 'Enable platform integration to access features directly in OpenShift, like vSphere node auto-scaling and persistent storage or Nutanix node auto-scaling.';\nconst vspherePlatformMessage =\n \"Enable vSphere platform integration to access features directly inside OpenShift, like node auto-scaling and persistent storage. You'll need to set vSphere configuration after cluster installation is complete.\";\n\nconst nutanixPlatformMessage =\n 'Enable Nutanix platform integration to access features like node auto-scaling directly inside OpenShift.';\n\nconst platformIntegrationTooltip =\n 'Platform integration is only applicable on non-SNO deployments and when all discovered hosts originated from the same platform.';\n\nconst messages: KeyType = {\n 'no-active-integrations': undeterminedPlatformMessage,\n vsphere: vspherePlatformMessage,\n nutanix: nutanixPlatformMessage,\n};\n\nconst PlatformIntegrationLabel = ({\n supportedPlatformIntegration,\n}: {\n supportedPlatformIntegration: SupportedPlatformIntegrationType;\n}) => {\n return (\n <>\n <span>Integrate with platform (vSphere/Nutanix)</span>{' '}\n <PopoverIcon\n bodyContent={messages[supportedPlatformIntegration]}\n footerContent={supportedPlatformIntegration === 'vsphere' && <PlatformIntegrationVsphere />}\n buttonOuiaId=\"platform-integration-vSphere-popover\"\n />\n </>\n );\n};\n\nconst PlatformIntegration = ({ clusterId }: { clusterId: Cluster['id'] }) => {\n const { isPlatformIntegrationSupported, supportedPlatformIntegration } =\n useClusterSupportedPlatforms(clusterId);\n\n return (\n <OcmSwitchField\n tooltipProps={{\n hidden: isPlatformIntegrationSupported,\n content: platformIntegrationTooltip,\n }}\n isDisabled={!isPlatformIntegrationSupported}\n name={'usePlatformIntegration'}\n label={\n <PlatformIntegrationLabel supportedPlatformIntegration={supportedPlatformIntegration} />\n }\n switchOuiaId=\"platform-integration-vSphere-switch\"\n />\n );\n};\n\nexport default PlatformIntegration;\n", "import React from 'react';\nimport { List, ListItem, Title } from '@patternfly/react-core';\nimport { VSPHERE_CONFIG_LINK } from '../../../../common';\n\nconst PlatformIntegrationVsphere = () => {\n return (\n <>\n <Title headingLevel=\"h6\">Requirements</Title>\n <List>\n <ListItem>A network connection between vSphere and the installed OCP.</ListItem>\n <ListItem>\n Ensure clusterSet <code>disk.enableUUID</code> is set to <code>true</code> inside of\n vSphere\n </ListItem>\n </List>\n <a href={VSPHERE_CONFIG_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {'Learn more about vSphere platform integration'}\n </a>\n </>\n );\n};\n\nexport default PlatformIntegrationVsphere;\n", "import React from 'react';\nimport { StackItem } from '@patternfly/react-core';\nimport { Formik, FormikConfig, useFormikContext } from 'formik';\nimport {\n Cluster,\n getFormikErrorFields,\n FormikAutoSave,\n ClusterWizardStep,\n useAlerts,\n getStorageInitialValues,\n StorageValues,\n useFormikAutoSave,\n ClusterWizardStepHeader,\n} from '../../../common';\nimport ClusterWizardFooter from './ClusterWizardFooter';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport ClusterWizardNavigation from './ClusterWizardNavigation';\nimport { canNextStorage } from './wizardTransition';\nimport HostsStorageTable from '../hosts/HostsStorageTable';\n\nconst StorageForm = ({ cluster }: { cluster: Cluster }) => {\n const { alerts } = useAlerts();\n const clusterWizardContext = useClusterWizardContext();\n const { isSubmitting, touched, errors } = useFormikContext<StorageValues>();\n const isAutoSaveRunning = useFormikAutoSave();\n const errorFields = getFormikErrorFields<StorageValues>(errors, touched);\n const isNextDisabled =\n !canNextStorage({ cluster }) || isAutoSaveRunning || !!alerts.length || isSubmitting;\n\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n errorFields={errorFields}\n isSubmitting={isSubmitting}\n isNextDisabled={isNextDisabled}\n onNext={() => clusterWizardContext.moveNext()}\n onBack={() => clusterWizardContext.moveBack()}\n />\n );\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />} footer={footer}>\n <StackItem>\n <ClusterWizardStepHeader>Storage</ClusterWizardStepHeader>\n </StackItem>\n <StackItem>\n <HostsStorageTable cluster={cluster} />\n </StackItem>\n <FormikAutoSave />\n </ClusterWizardStep>\n );\n};\n\nconst Storage = ({ cluster }: { cluster: Cluster }) => {\n const { clearAlerts } = useAlerts();\n const initialValues = React.useMemo(\n () => getStorageInitialValues(),\n [], // just once, Formik does not reinitialize\n );\n const handleSubmit: FormikConfig<StorageValues>['onSubmit'] = () => {\n clearAlerts();\n };\n\n return (\n <Formik onSubmit={handleSubmit} initialValues={initialValues}>\n <StorageForm cluster={cluster} />\n </Formik>\n );\n};\n\nexport default Storage;\n", "import React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport {\n countColumn,\n disksColumn,\n hostnameColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport {\n numberOfDisksColumn,\n odfUsageColumn,\n} from '../../../common/components/storage/StorageUtils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport {\n Cluster,\n Host,\n hasEnabledOperators,\n isCompact,\n selectSchedulableMasters,\n OPERATOR_NAME_ODF,\n} from '../../../common';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { ExpandComponentProps } from '../../../common/components/hosts/AITable';\nimport CommonStorageTable from '../../../common/components/storage/StorageTable';\nimport StorageDetail from '../../../common/components/storage/StorageDetail';\nimport StorageAlerts from './StorageAlerts';\nimport { HostsTableModals, useHostsTable } from './use-hosts-table';\nimport {\n HostsTableDetailContextProvider,\n useHostsTableDetailContext,\n} from '../../../common/components/hosts/HostsTableDetailContext';\nimport { hardwareStatusColumn } from './HardwareStatus';\n\nexport function ExpandComponent({ obj: host }: ExpandComponentProps<Host>) {\n const { onDiskRole, canEditDisks, updateDiskSkipFormatting } = useHostsTableDetailContext();\n return (\n <StorageDetail\n key={host.id}\n host={host}\n onDiskRole={onDiskRole}\n canEditDisks={canEditDisks}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n />\n );\n}\n\nconst HostsStorageTable = ({ cluster }: { cluster: Cluster }) => {\n const { t } = useTranslation();\n const {\n onEditHost,\n actionChecks,\n onDiskRole,\n actionResolver,\n updateDiskSkipFormatting,\n ...modalProps\n } = useHostsTable(cluster);\n\n const content = React.useMemo(() => {\n const columns = [\n hostnameColumn(t, onEditHost, undefined, actionChecks.canEditHostname),\n roleColumn(t, undefined, undefined, selectSchedulableMasters(cluster)),\n hardwareStatusColumn({}),\n disksColumn,\n numberOfDisksColumn,\n ];\n if (hasEnabledOperators(cluster.monitoredOperators, OPERATOR_NAME_ODF)) {\n const excludeODfForMasters = !isCompact(cluster);\n columns.push(odfUsageColumn(excludeODfForMasters));\n }\n columns.push(countColumn(cluster));\n return columns;\n }, [actionChecks.canEditHostname, cluster, onEditHost, t]);\n\n const hosts = cluster.hosts || [];\n const paginationProps = usePagination(hosts.length);\n\n return (\n <>\n <Stack hasGutter>\n <StackItem>\n <HostsTableDetailContextProvider\n canEditDisks={actionChecks.canEditDisks}\n onDiskRole={onDiskRole}\n updateDiskSkipFormatting={updateDiskSkipFormatting}\n >\n <CommonStorageTable\n testId=\"storage-table\"\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n ExpandComponent={ExpandComponent}\n {...paginationProps}\n />\n </HostsTableDetailContextProvider>\n </StackItem>\n <StackItem>\n <StorageAlerts cluster={cluster} />\n </StackItem>\n </Stack>\n <HostsTableModals cluster={cluster} {...modalProps} />\n </>\n );\n};\n\nexport default HostsStorageTable;\n", "import * as React from 'react';\nimport { sortable } from '@patternfly/react-table';\nimport { TFunction } from 'i18next';\nimport { getHostRole, getInventory, Host, RoleCell } from '../../index';\nimport { TableRow } from '../hosts/AITable';\nimport { Popover, Text, TextContent, TextVariants } from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\n\nconst SkipFormattingDisks = () => (\n <TextContent>\n <Text component={TextVariants.p}>Some bootable disks will skip formatting</Text>\n </TextContent>\n);\n\nexport const roleColumn = (t: TFunction, schedulableMasters: boolean): TableRow<Host> => {\n return {\n header: {\n title: 'Role',\n props: {\n id: 'col-header-role',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const hostRole = getHostRole(host, t, schedulableMasters);\n return {\n title: <RoleCell host={host} role={hostRole} />,\n props: { 'data-testid': 'host-role' },\n sortableValue: hostRole,\n };\n },\n };\n};\n\nexport const numberOfDisksColumn: TableRow<Host> = {\n header: {\n title: 'Number of disks',\n props: {\n id: 'col-header-num-disks',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const inventory = getInventory(host);\n const disks = inventory.disks || [];\n return {\n title: (\n <>\n {' '}\n {disks.length}\n {' '}\n {host.skipFormattingDisks && (\n <Popover bodyContent={<SkipFormattingDisks />} minWidth=\"20rem\" maxWidth=\"30rem\">\n <ExclamationTriangleIcon color={warningColor.value} size=\"sm\" />\n </Popover>\n )}\n </>\n ),\n props: { 'data-testid': 'disk-number' },\n sortableValue: disks.length,\n };\n },\n};\n\nexport const odfUsageColumn = (excludeMasters: boolean): TableRow<Host> => {\n return {\n header: {\n title: 'ODF Usage',\n props: {\n id: 'col-header-odf',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const isMaster = host.role === 'master' || host.suggestedRole === 'master';\n const isExcluded = excludeMasters && isMaster;\n return {\n title: isExcluded ? (\n <div style={{ color: 'var(--pf-global--disabled-color--100)' }}>Excluded for ODF</div>\n ) : (\n 'Use ODF'\n ),\n props: { 'data-testid': 'use-odf' },\n sortableValue: Number(isExcluded),\n };\n },\n };\n};\n", "import * as React from 'react';\nimport { Host, WithTestID } from '../../index';\nimport { usePagination } from '../hosts/usePagination';\nimport AITable, { AITableProps } from '../hosts/AITable';\n\nconst getHostId = (host: Host) => host.id;\n\ntype StorageTableProps = ReturnType<typeof usePagination> & {\n hosts: Host[];\n content: AITableProps<Host>['content'];\n actionResolver?: AITableProps<Host>['actionResolver'];\n ExpandComponent?: AITableProps<Host>['ExpandComponent'];\n};\n\nconst StorageTable = ({ hosts, ...rest }: StorageTableProps & WithTestID) => {\n return (\n <AITable<Host> getDataId={getHostId} data={hosts} {...rest}>\n {''}\n </AITable>\n );\n};\n\nexport default StorageTable;\n", "import * as React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport {\n Cluster,\n FormatDiskWarning,\n hasEnabledOperators,\n OPERATOR_NAME_ODF,\n} from '../../../common';\nimport { isAddHostsCluster, isSomeDisksSkipFormatting } from '../clusters/utils';\nimport OdfDisksManualFormattingHint from './OdfDisksManualFormattingHint';\n\nconst StorageAlerts = ({ cluster }: { cluster: Cluster }) => {\n const showFormattingHint =\n hasEnabledOperators(cluster.monitoredOperators, OPERATOR_NAME_ODF) &&\n !isAddHostsCluster(cluster);\n const someDisksAreSkipFormatting = isSomeDisksSkipFormatting(cluster);\n\n return (\n <Stack hasGutter>\n {showFormattingHint && (\n <StackItem>\n <OdfDisksManualFormattingHint />\n </StackItem>\n )}\n <StackItem>\n <FormatDiskWarning someDisksAreSkipFormatting={someDisksAreSkipFormatting} />\n </StackItem>\n </Stack>\n );\n};\n\nexport default StorageAlerts;\n", "import React from 'react';\nimport {\n Button,\n ButtonVariant,\n Popover,\n Text,\n TextContent,\n TextVariants,\n} from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\n\nconst Hint = () => (\n <TextContent>\n <Text component={TextVariants.p}>\n All non-installation disks will be used for local storage. To view available disks, expand\n each host row in the table\n </Text>\n </TextContent>\n);\n\nconst OdfDisksManualFormattingHint = () => {\n return (\n <Text component=\"p\">\n <Popover bodyContent={<Hint />} minWidth=\"30rem\">\n <Button variant={ButtonVariant.link} isInline>\n <ExclamationTriangleIcon className=\"status-icon\" color={warningColor.value} size=\"sm\" />\n &nbsp;Format all non-installation disks\n </Button>\n </Popover>\n </Text>\n );\n};\n\nexport default OdfDisksManualFormattingHint;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Cluster, ClusterWizardStep, getFormikErrorFields, useAlerts } from '../../../common';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport ClusterWizardFooter from './ClusterWizardFooter';\nimport ClusterWizardNavigation from './ClusterWizardNavigation';\nimport {\n StaticIpFormState,\n StaticIpProps,\n} from '../clusterConfiguration/staticIp/components/propTypes';\nimport { StaticIpPage } from '../clusterConfiguration/staticIp/components/StaticIpPage';\nimport { WithErrorBoundary } from '../../../common/components/ErrorHandling/WithErrorBoundary';\nimport { selectCurrentClusterPermissionsState } from '../../selectors';\n\nconst getInitialFormStateProps = () => {\n return {\n isValid: true,\n isSubmitting: false,\n isAutoSaveRunning: false,\n errors: {},\n touched: {},\n isEmpty: true,\n };\n};\nconst StaticIp: React.FC<StaticIpProps & { cluster: Cluster }> = ({\n cluster,\n infraEnv,\n updateInfraEnv,\n}) => {\n const clusterWizardContext = useClusterWizardContext();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const { alerts } = useAlerts();\n const [formState, setFormStateProps] = React.useState<StaticIpFormState>(\n getInitialFormStateProps(),\n );\n\n const onFormStateChange = (formState: StaticIpFormState) => {\n if (!isViewerMode) {\n setFormStateProps(formState);\n }\n };\n\n const isNextDisabled =\n formState.isAutoSaveRunning || !formState.isValid || !!alerts.length || formState.isSubmitting;\n const errorFields = getFormikErrorFields<object>(formState.errors, formState.touched);\n const footer = (\n <ClusterWizardFooter\n cluster={cluster}\n alertTitle=\"Static IP configuration contains missing or invalid fields\"\n alertContent={null}\n errorFields={errorFields}\n isSubmitting={formState.isSubmitting}\n onNext={() => clusterWizardContext.moveNext()}\n onBack={() => clusterWizardContext.moveBack()}\n isNextDisabled={isNextDisabled}\n />\n );\n\n return (\n <ClusterWizardStep navigation={<ClusterWizardNavigation cluster={cluster} />} footer={footer}>\n <WithErrorBoundary title=\"Failed to load Static IP step\">\n <StaticIpPage {...{ infraEnv, updateInfraEnv, onFormStateChange }} />\n </WithErrorBoundary>\n </ClusterWizardStep>\n );\n};\n\nexport default StaticIp;\n", "import React from 'react';\nimport { Text, TextContent, TextVariants, Alert, AlertVariant, Grid } from '@patternfly/react-core';\nimport { StaticIpInfo, StaticIpView } from '../data/dataTypes';\nimport StaticIpViewRadioGroup from './StaticIpViewRadioGroup';\nimport { getStaticIpInfo } from '../data/fromInfraEnv';\nimport { StaticIpFormState, StaticIpPageProps, StaticIpViewProps } from './propTypes';\nimport { YamlView } from './YamlView/YamlView';\nimport { useClusterWizardContext } from '../../../clusterWizard/ClusterWizardContext';\nimport { FormViewHosts } from './FormViewHosts/FormViewHosts';\nimport { FormViewNetworkWide } from './FormViewNetworkWide/FormViewNetworkWide';\nimport './staticIp.css';\n\nconst isoRegenerationAlert = (\n <Alert\n variant={AlertVariant.warning}\n isInline={true}\n data-testid=\"regenerate-iso-alert\"\n title=\"To add new hosts that will use the new or edited configurations, you'll need to regenerate the\n Discovery ISO in the 'Host discovery' step and boot your new hosts from it.\"\n />\n);\n\nexport const StaticIpPage: React.FC<StaticIpPageProps> = ({\n infraEnv,\n updateInfraEnv,\n onFormStateChange: onFormStateChangeParent,\n}) => {\n const clusterWizardContext = useClusterWizardContext();\n const [confirmOnChangeView, setConfirmOnChangeView] = React.useState<boolean>(false);\n const [viewChanged, setViewChanged] = React.useState<boolean>(false);\n\n const onChangeView = React.useCallback((view: StaticIpView) => {\n clusterWizardContext.onUpdateStaticIpView(view);\n setViewChanged(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const initialStaticIpInfo = React.useMemo<StaticIpInfo | undefined>(() => {\n return getStaticIpInfo(infraEnv);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n if (!initialStaticIpInfo) {\n return null;\n }\n const onFormStateChange = (formState: StaticIpFormState) => {\n const hasFilledData =\n clusterWizardContext.currentStepId === 'static-ip-host-configurations' || !formState.isEmpty;\n setConfirmOnChangeView(hasFilledData);\n onFormStateChangeParent(formState);\n };\n\n const viewProps: StaticIpViewProps = {\n onFormStateChange,\n infraEnv,\n updateInfraEnv,\n showEmptyValues: viewChanged,\n };\n\n const getContent = () => {\n switch (clusterWizardContext.currentStepId) {\n case 'static-ip-yaml-view':\n return <YamlView {...viewProps} />;\n case 'static-ip-host-configurations':\n return <FormViewHosts {...viewProps} />;\n case 'static-ip-network-wide-configurations':\n return <FormViewNetworkWide {...viewProps} />;\n default:\n throw `Unexpected wizard step id ${clusterWizardContext.currentStepId} when entering static ip page`;\n }\n };\n\n const content = getContent();\n if (!content) {\n return null;\n }\n return (\n <Grid hasGutter>\n <TextContent>\n <Text component={TextVariants.h2}>Static network configurations</Text>\n <Text component={TextVariants.small}>\n Network configuration can be done using either the form view or YAML view. Configurations\n done in this step are for discovering hosts.\n </Text>\n </TextContent>\n\n <StaticIpViewRadioGroup\n initialView={initialStaticIpInfo.view}\n confirmOnChangeView={confirmOnChangeView}\n onChangeView={onChangeView}\n />\n {initialStaticIpInfo.isDataComplete && isoRegenerationAlert}\n {content}\n </Grid>\n );\n};\n", "import React from 'react';\nimport { Alert, AlertVariant, ButtonVariant, Form, FormGroup } from '@patternfly/react-core';\nimport { StaticIpView } from '../data/dataTypes';\nimport { getFieldId } from '../../../../../common';\nimport ConfirmationModal from '../../../../../common/components/ui/ConfirmationModal';\nimport { OcmRadio } from '../../../ui/OcmFormFields';\n\nexport type StaticIpViewRadioGroupProps = {\n initialView: StaticIpView;\n confirmOnChangeView: boolean;\n onChangeView(view: StaticIpView): void;\n};\n\nconst StaticIpViewRadioGroup = ({\n initialView,\n confirmOnChangeView,\n onChangeView,\n}: StaticIpViewRadioGroupProps) => {\n const GROUP_NAME = 'select-static-ip-view';\n const [confirmView, setConfirmView] = React.useState<StaticIpView>();\n const [view, setView] = React.useState<StaticIpView>(initialView);\n const handleChange = (_checked: boolean, event: React.FormEvent<HTMLInputElement>) => {\n const selectedView = event.currentTarget.value as StaticIpView;\n if (confirmOnChangeView) {\n setConfirmView(selectedView);\n } else {\n setView(selectedView);\n onChangeView(selectedView);\n }\n };\n\n const onConfirm = (selectedView: StaticIpView) => {\n setView(selectedView);\n setConfirmView(undefined);\n onChangeView(selectedView);\n };\n\n const onCancel = () => {\n setConfirmView(undefined);\n };\n\n const getCurrentViewText = () => {\n return view === StaticIpView.YAML ? 'YAML' : 'form';\n };\n\n const isFormViewSelected = view === StaticIpView.FORM;\n\n return (\n <>\n <Form isHorizontal>\n <FormGroup\n fieldId={getFieldId(GROUP_NAME, 'radio')}\n isInline\n label=\"Configure via :\"\n className=\"static-config-type-label\"\n >\n <OcmRadio\n label=\"Form view\"\n name={GROUP_NAME}\n data-testid=\"select-form-view\"\n id=\"select-form-view\"\n value={StaticIpView.FORM}\n isChecked={isFormViewSelected}\n onChange={handleChange}\n />\n <OcmRadio\n label=\"YAML view\"\n name={GROUP_NAME}\n data-testid=\"select-yaml-view\"\n id=\"select-yaml-view\"\n value={StaticIpView.YAML}\n isChecked={!isFormViewSelected}\n onChange={handleChange}\n />\n </FormGroup>\n </Form>\n {isFormViewSelected && (\n <Alert\n variant={AlertVariant.info}\n isInline\n title={\n 'Form view supports basic configurations. Select YAML view for advanced configurations.'\n }\n />\n )}\n {confirmView && (\n <ConfirmationModal\n title={'Change configuration option?'}\n titleIconVariant={'warning'}\n confirmationButtonText={'Change'}\n confirmationButtonVariant={ButtonVariant.primary}\n content={\n <>\n <p>{`All data and configuration done in ${getCurrentViewText()} view will be lost.`}</p>\n </>\n }\n onClose={onCancel}\n onConfirm={() => onConfirm(confirmView)}\n />\n )}\n </>\n );\n};\n\nexport default StaticIpViewRadioGroup;\n", "import { HostStaticNetworkConfig } from '../../../../../common';\n\nimport {\n FormViewHost,\n FormViewNetworkWideValues,\n ProtocolVersion,\n StaticFormData,\n StaticProtocolType,\n} from './dataTypes';\nimport findLastIndex from 'lodash/findLastIndex';\nimport {\n getProtocolVersionIdx,\n YAML_COMMENT_CHAR,\n getMachineNetworks,\n getProtocolType,\n yamlToNmstateObject,\n} from './nmstateYaml';\n\nimport { getShownProtocolVersions } from './protocolVersion';\nimport { getEmptyNetworkWideConfigurations } from './emptyData';\nimport {\n Nmstate,\n NmstateInterface,\n isVlanInterface,\n NmstateEthernetInterface,\n NmstateVlanInterface,\n} from './nmstateTypes';\nimport { isDummyInterface } from './dummyData';\n\n/* handle four cases:\n 1. right after create, there are no network wide configurations - yaml contains a dummy ipv4 interface and no machine network fields in the comments\n 2. only network wide configurations - yaml contains only dummy interfaces and does contain machine network fileds in the comments\n 3. fully configured, yaml contains one real interfaces\n 4. user switched from ipv4 to dual stack - yaml contains one dummy interface for ipv6 (needed for routes section to work) and one real one for ipv4\n */\ntype ParsedFormViewYaml = {\n comments: string[];\n nmstate: Nmstate;\n};\n\nconst findFirstRealInterface = (interfaces: NmstateInterface[]): NmstateInterface | undefined => {\n return interfaces.find(\n (currentInterface) => !isDummyInterface(currentInterface.name),\n ) as unknown as NmstateInterface | undefined;\n};\n\nconst parseYaml = (yaml: string): ParsedFormViewYaml => {\n const lines = yaml.split('\\n');\n const lastCommentIdx = findLastIndex(lines, (line) => line.startsWith(YAML_COMMENT_CHAR));\n const comments = lines.slice(0, lastCommentIdx + 1).map((line) => line.slice(1));\n return {\n comments: comments,\n nmstate: yamlToNmstateObject(yaml),\n };\n};\n\nconst getVlanId = (interfaces: NmstateInterface[]): number | null => {\n for (const nmstateInterface of interfaces) {\n if (isVlanInterface(nmstateInterface)) {\n return nmstateInterface.vlan.id;\n }\n }\n return null;\n};\n\nconst getIpAddress = (\n networkInterface: NmstateEthernetInterface | NmstateVlanInterface,\n protocolVersion: ProtocolVersion,\n): string => {\n const ipAddressData = networkInterface[protocolVersion];\n if (ipAddressData === undefined) {\n return ''; //handle case 4\n }\n if (!ipAddressData.address || !ipAddressData.address.length) {\n throw `Nmstate yaml doesn't contain an address for protocol version ${protocolVersion}`;\n }\n return ipAddressData.address[0].ip;\n};\n\nconst getDns = (nmstate: Nmstate): string => {\n const dnsServers = nmstate['dns-resolver']?.config.server;\n if (!dnsServers || !dnsServers.length) {\n throw `Nmstate YAML doesn't contain dns-resolver section`;\n }\n return dnsServers.join(',');\n};\n\nconst getGateway = (nmstate: Nmstate, protocolVersion: ProtocolVersion): string => {\n const routesConfig = nmstate['routes']?.config;\n if (!routesConfig) {\n throw `Nmstate yaml doesn't contain routes section`;\n }\n return routesConfig[getProtocolVersionIdx(protocolVersion)]['next-hop-address'];\n};\n\nconst getNetworkWideConfigurations = (\n nmstate: Nmstate,\n protocolType: StaticProtocolType,\n machineNetworks: { [protocolVersion in ProtocolVersion]: string },\n): FormViewNetworkWideValues => {\n const vlanId = getVlanId(nmstate.interfaces);\n const networkWide = getEmptyNetworkWideConfigurations();\n networkWide.dns = getDns(nmstate);\n networkWide.protocolType = protocolType;\n if (vlanId) {\n networkWide.useVlan = true;\n networkWide.vlanId = vlanId;\n }\n for (const protocolVersion of getShownProtocolVersions(protocolType)) {\n networkWide.ipConfigs[protocolVersion].gateway = getGateway(nmstate, protocolVersion);\n const [ip, prefixLength] = machineNetworks[protocolVersion].split('/');\n networkWide.ipConfigs[protocolVersion].machineNetwork = {\n ip: ip,\n prefixLength: parseInt(prefixLength),\n };\n }\n return networkWide;\n};\n\nconst getFormViewHost = (\n infraEnvHost: HostStaticNetworkConfig,\n protocolType: StaticProtocolType,\n): FormViewHost | null => {\n if (!infraEnvHost.macInterfaceMap || !infraEnvHost.networkYaml) {\n throw `Static network config is missing information`;\n }\n\n const macAddress = infraEnvHost.macInterfaceMap[0].macAddress;\n if (!macAddress) {\n throw `Static network config is missing mac address`;\n }\n\n const { nmstate } = parseYaml(infraEnvHost.networkYaml);\n const realInterface = findFirstRealInterface(nmstate.interfaces);\n\n if (!realInterface) {\n //handle case 2\n return null;\n }\n\n //handle cases 3 and 4\n const ret: FormViewHost = {\n macAddress,\n ips: {\n ipv4: '',\n ipv6: '',\n },\n };\n\n for (const protocolVersion of getShownProtocolVersions(protocolType)) {\n ret.ips[protocolVersion] = getIpAddress(realInterface, protocolVersion);\n }\n return ret;\n};\n\nexport const formDataFromInfraEnvField = (\n staticHostConfigs: HostStaticNetworkConfig[],\n): StaticFormData => {\n if (!staticHostConfigs.length) {\n throw `Static network config is empty`;\n }\n const firstHostConfig = staticHostConfigs[0];\n if (!firstHostConfig.macInterfaceMap || !firstHostConfig.networkYaml) {\n throw 'Static network config first host is missing fields';\n }\n const { comments, nmstate } = parseYaml(firstHostConfig.networkYaml);\n const protocolType = getProtocolType(comments);\n if (!protocolType) {\n //handle case 1\n return {\n networkWide: getEmptyNetworkWideConfigurations(),\n hosts: [],\n };\n }\n const machineNetworks = getMachineNetworks(comments);\n const networkWide = getNetworkWideConfigurations(nmstate, protocolType, machineNetworks);\n //handles cases 2 - 4\n const hosts: FormViewHost[] = [];\n for (const hostConfig of staticHostConfigs) {\n const formViewHost = getFormViewHost(hostConfig, protocolType);\n if (formViewHost) {\n //in case 2 - formViewHost will be null and won't be added to hosts\n //in case 3 - formViewHost will contain all required data\n //in case 4 - host will contain ipv4 address and user will need to configure ipv6. the static ip wizard step will be recognized as incomplete\n hosts.push(formViewHost);\n }\n }\n return {\n networkWide: networkWide,\n hosts: hosts,\n };\n};\n", "import { Address4, Address6 } from 'ip-address';\nimport { ProtocolVersion, StaticProtocolType } from './dataTypes';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const showIpv4 = (protocolType: StaticProtocolType) => {\n //always true untill we allow only ipv6\n return true;\n};\n\nexport const showIpv6 = (protocolType: StaticProtocolType) => {\n return protocolType === 'dualStack';\n};\n\nexport const showProtocolVersion = (\n protocolType: StaticProtocolType,\n protocolVersion: ProtocolVersion,\n) => {\n if (protocolVersion === ProtocolVersion.ipv4) {\n return showIpv4(protocolType);\n }\n return showIpv6(protocolType);\n};\n\nexport const getShownProtocolVersions = (protocolType: StaticProtocolType): ProtocolVersion[] => {\n return protocolType === 'dualStack'\n ? [ProtocolVersion.ipv4, ProtocolVersion.ipv6]\n : [ProtocolVersion.ipv4];\n};\n\nexport const getProtocolVersionLabel = (protocolVersion: ProtocolVersion) =>\n protocolVersion === ProtocolVersion.ipv4 ? 'IPv4' : 'IPv6';\n\nexport const getAddressObject = (\n ip: string,\n protocolVersion: ProtocolVersion,\n): Address4 | Address6 | null => {\n if (protocolVersion === ProtocolVersion.ipv4 && Address4.isValid(ip)) {\n return new Address4(ip);\n }\n if (protocolVersion === ProtocolVersion.ipv6 && Address6.isValid(ip)) {\n return new Address6(ip);\n }\n return null;\n};\n", "import { HostStaticNetworkConfig } from '../../../../../common';\nimport {\n FormViewHost,\n IpConfig,\n FormViewNetworkWideValues,\n FormViewHostsValues,\n YamlViewValues,\n HostIps,\n} from './dataTypes';\n\nexport const getEmptyHostIps = (): HostIps => {\n return {\n ipv4: '',\n ipv6: '',\n };\n};\n\nexport const getEmptyFormViewHost = (): FormViewHost => {\n return {\n macAddress: '',\n ips: getEmptyHostIps(),\n };\n};\n\nexport const getEmptyIpConfig = (): IpConfig => {\n return {\n machineNetwork: {\n ip: '',\n prefixLength: '',\n },\n gateway: '',\n };\n};\n\nexport const getEmptyYamlHost = (): HostStaticNetworkConfig => {\n return {\n networkYaml: '',\n macInterfaceMap: [{ macAddress: '', logicalNicName: '' }],\n };\n};\n\nexport const getEmptyNetworkWideConfigurations = (): FormViewNetworkWideValues => {\n return {\n ipConfigs: {\n ipv4: getEmptyIpConfig(),\n ipv6: getEmptyIpConfig(),\n },\n protocolType: 'ipv4',\n useVlan: false,\n vlanId: '',\n dns: '',\n };\n};\n\nexport const getEmptyFormViewHostsValues = (): FormViewHostsValues => {\n return { hosts: [getEmptyFormViewHost()] };\n};\n\nexport const getEmptyYamlValues = (): YamlViewValues => {\n return { hosts: [getEmptyYamlHost()] };\n};\n", "import { HostStaticNetworkConfig, InfraEnv, stringToJSON } from '../../../../../common';\nimport { FORM_VIEW_PREFIX, getProtocolType, getYamlComments } from './nmstateYaml';\nimport {\n StaticIpInfo,\n StaticIpView,\n StaticFormData,\n FormViewHostsValues,\n FormViewNetworkWideValues,\n YamlViewValues,\n} from './dataTypes';\nimport { isDummyYaml } from './dummyData';\nimport { formDataFromInfraEnvField } from './formDataFromInfraEnvField';\nimport { getEmptyFormViewHost } from './emptyData';\n\nexport const getStaticNetworkConfig = (\n infraEnv: InfraEnv,\n): HostStaticNetworkConfig[] | undefined => {\n if (!infraEnv.staticNetworkConfig || !infraEnv.staticNetworkConfig.length) {\n return undefined;\n }\n const staticNetworkConfig = stringToJSON<HostStaticNetworkConfig[]>(infraEnv.staticNetworkConfig);\n if (!staticNetworkConfig) {\n throw `Failed to parse static network config`;\n }\n if (!staticNetworkConfig.length) {\n return undefined;\n }\n return staticNetworkConfig;\n};\n\nconst getView = (yamlComments: string[]): StaticIpView => {\n return yamlComments.includes(FORM_VIEW_PREFIX) ? StaticIpView.FORM : StaticIpView.YAML;\n};\n\nexport const getStaticIpInfoFromInfraEnvField = (\n staticNetworkConfig: HostStaticNetworkConfig[],\n) => {\n const firstNetworkYaml = staticNetworkConfig[0].networkYaml;\n if (!firstNetworkYaml) {\n throw `Static Network Config doesn't contain a network yaml`;\n }\n const comments = getYamlComments(firstNetworkYaml);\n return {\n view: getView(comments),\n isDataComplete: !isDummyYaml(firstNetworkYaml),\n formViewProtocolType: getProtocolType(comments),\n };\n};\n\nexport const getStaticIpInfo = (infraEnv: InfraEnv): StaticIpInfo | undefined => {\n const staticNetworkConfig = getStaticNetworkConfig(infraEnv);\n if (!staticNetworkConfig || !staticNetworkConfig[0]) {\n return undefined;\n }\n return getStaticIpInfoFromInfraEnvField(staticNetworkConfig);\n};\n\n//Fails if form data doesn't exist\nexport const getFormData = (infraEnv: InfraEnv): StaticFormData => {\n const staticNetworkConfig = getStaticNetworkConfig(infraEnv);\n if (!staticNetworkConfig) {\n throw `Infra env doesn't contain static ip data`;\n }\n const formData = formDataFromInfraEnvField(staticNetworkConfig);\n if (!formData) {\n throw `Failed to get static ip form data from infra env ${infraEnv.id}`;\n }\n return formData;\n};\n\nexport const getFormViewHostsValues = (infraEnv: InfraEnv): FormViewHostsValues => {\n const formData = getFormData(infraEnv);\n if (!formData.hosts.length) {\n return { hosts: [getEmptyFormViewHost()] };\n }\n return { hosts: formData.hosts };\n};\n\nexport const getFormViewNetworkWideValues = (infraEnv: InfraEnv): FormViewNetworkWideValues => {\n return getFormData(infraEnv).networkWide;\n};\n\nexport const getYamlViewValues = (infraEnv: InfraEnv): YamlViewValues => {\n const staticNetworkConfig = getStaticNetworkConfig(infraEnv);\n if (!staticNetworkConfig) {\n throw `Infra env doesn't contain static ip data`;\n }\n return { hosts: staticNetworkConfig };\n};\n", "import React from 'react';\nimport { StaticIpForm } from '../StaticIpForm';\nimport { StaticIpFormProps, StaticIpViewProps } from '../propTypes';\nimport { yamlViewValidationSchema } from './yamlViewValidationSchema';\nimport { YamlViewValues } from '../../data/dataTypes';\nimport { YamlViewFields } from './YamlViewFields';\nimport { getEmptyYamlValues } from '../../data/emptyData';\nimport { InfraEnv } from '../../../../../../common';\nimport { getYamlViewValues } from '../../data/fromInfraEnv';\n\nexport const YamlView: React.FC<StaticIpViewProps> = ({ ...props }) => {\n const formProps: StaticIpFormProps<YamlViewValues> = {\n ...props,\n validationSchema: yamlViewValidationSchema,\n getInitialValues: (infraEnv: InfraEnv) => {\n return getYamlViewValues(infraEnv);\n },\n getUpdateParams: (currentInfraEnv: InfraEnv, values: YamlViewValues) => values.hosts,\n getEmptyValues: () => getEmptyYamlValues(),\n };\n return (\n <StaticIpForm<YamlViewValues> {...formProps}>\n <YamlViewFields />\n </StaticIpForm>\n );\n};\n", "import React, { PropsWithChildren } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Form } from '@patternfly/react-core';\nimport { Formik, FormikConfig, useFormikContext, yupToFormErrors } from 'formik';\nimport isEqual from 'lodash/isEqual';\nimport { useAlerts, useFormikAutoSave } from '../../../../../common';\nimport { useErrorMonitor } from '../../../../../common/components/ErrorHandling/ErrorMonitorContext';\nimport { getApiErrorMessage } from '../../../../api';\nimport { StaticIpFormProps } from './propTypes';\nimport { selectCurrentClusterPermissionsState } from '../../../../selectors';\n\nconst AutosaveWithParentUpdate = <StaticIpFormValues extends object>({\n onFormStateChange,\n getEmptyValues,\n}: {\n onFormStateChange: StaticIpFormProps<StaticIpFormValues>['onFormStateChange'];\n getEmptyValues: StaticIpFormProps<StaticIpFormValues>['getEmptyValues'];\n}) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const emptyValues = React.useMemo(() => getEmptyValues(), []);\n const { isSubmitting, isValid, touched, errors, values } = useFormikContext<StaticIpFormValues>();\n const isEmpty = React.useMemo<boolean>(() => {\n return isEqual(values, emptyValues);\n }, [values, emptyValues]);\n const isAutoSaveRunning = useFormikAutoSave();\n React.useEffect(() => {\n onFormStateChange({ isSubmitting, isAutoSaveRunning, isValid, touched, errors, isEmpty });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isSubmitting, isValid, isAutoSaveRunning, touched, errors]);\n return null;\n};\n\nexport const StaticIpForm = <StaticIpFormValues extends object>({\n infraEnv,\n updateInfraEnv,\n getInitialValues,\n getUpdateParams,\n validationSchema,\n onFormStateChange,\n getEmptyValues,\n children,\n showEmptyValues,\n}: PropsWithChildren<StaticIpFormProps<StaticIpFormValues>>) => {\n const { clearAlerts, addAlert } = useAlerts();\n const { captureException } = useErrorMonitor();\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const [initialValues, setInitialValues] = React.useState<StaticIpFormValues | undefined>();\n React.useEffect(() => {\n if (showEmptyValues) {\n //after view changed the formik should be rendered with empty values\n setInitialValues(getEmptyValues());\n } else {\n setInitialValues(getInitialValues(infraEnv));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!initialValues) {\n return null;\n }\n\n const handleSubmit: FormikConfig<StaticIpFormValues>['onSubmit'] = async (values) => {\n clearAlerts();\n try {\n const staticNetworkConfig = getUpdateParams(infraEnv, values);\n await updateInfraEnv({\n staticNetworkConfig: staticNetworkConfig,\n });\n } catch (error) {\n captureException(error);\n addAlert({ title: getApiErrorMessage(error) });\n }\n };\n\n const validate = (values: StaticIpFormValues) => {\n try {\n validationSchema.validateSync(values, { abortEarly: false, context: { values } });\n return {};\n } catch (error) {\n return yupToFormErrors(error);\n }\n };\n\n const onSubmit = isViewerMode ? () => Promise.resolve() : handleSubmit;\n return (\n <Formik\n initialValues={initialValues}\n onSubmit={onSubmit}\n validate={validate}\n validateOnMount\n enableReinitialize\n >\n <Form>\n {children}\n <AutosaveWithParentUpdate<StaticIpFormValues>\n onFormStateChange={onFormStateChange}\n getEmptyValues={getEmptyValues}\n />\n </Form>\n </Formik>\n );\n};\n", "import * as Yup from 'yup';\nimport {\n ArrayElementType,\n HostStaticNetworkConfig,\n macAddressValidationSchema,\n MacInterfaceMap,\n} from '../../../../../../common';\nimport { YamlViewValues } from '../../data/dataTypes';\nimport {\n getUniqueValidationSchema,\n UniqueStringArrayExtractor,\n} from '../../commonValidationSchemas';\n\nconst requiredMsg = 'A value is required';\nconst networkYamlValidationSchema = Yup.string().required(requiredMsg);\n\nconst getAllMacAddresses: UniqueStringArrayExtractor<YamlViewValues> = (\n values: YamlViewValues,\n): string[] => {\n const allMacAddresses: string[] = [];\n for (const host of values.hosts) {\n if (!host.macInterfaceMap) {\n continue;\n }\n for (const mapItem of host.macInterfaceMap) {\n if (mapItem.macAddress) {\n allMacAddresses.push(mapItem.macAddress);\n }\n }\n }\n return allMacAddresses;\n};\n\nconst getInterfaceNamesInCurrentHost: UniqueStringArrayExtractor<YamlViewValues> = (\n values: YamlViewValues,\n context: Yup.TestContext,\n) => {\n const currentMacInterfaceObject: ArrayElementType<MacInterfaceMap> =\n context.parent as unknown as ArrayElementType<MacInterfaceMap>;\n const currentHost = values.hosts.find(\n (currentHost) =>\n currentHost.macInterfaceMap &&\n currentHost.macInterfaceMap.indexOf(currentMacInterfaceObject) > -1,\n );\n if (!currentHost || !currentHost.macInterfaceMap) {\n return undefined;\n }\n return currentHost.macInterfaceMap.map((currentItem) => {\n return currentItem.logicalNicName ? currentItem.logicalNicName : '';\n });\n};\n\nconst macInterfaceMapValidationSchema = Yup.array<MacInterfaceMap>().of(\n Yup.object().shape({\n macAddress: macAddressValidationSchema\n .required(requiredMsg)\n .concat(getUniqueValidationSchema(getAllMacAddresses)),\n logicalNicName: Yup.string()\n .required(requiredMsg)\n .concat(getUniqueValidationSchema(getInterfaceNamesInCurrentHost))\n .max(15, 'Interface name must be 15 characters at most.')\n .matches(/^\\S+$/, 'Interface name can not contain spaces.'),\n }),\n);\n\nexport const yamlViewValidationSchema = Yup.object().shape<YamlViewValues>({\n hosts: Yup.array<HostStaticNetworkConfig>().of(\n Yup.object().shape({\n networkYaml: networkYamlValidationSchema,\n macInterfaceMap: macInterfaceMapValidationSchema,\n }),\n ),\n});\n", "import { Address4, Address6 } from 'ip-address';\nimport { isInSubnet } from 'is-in-subnet';\nimport * as Yup from 'yup';\nimport { getAddressObject } from './data/protocolVersion';\nimport { ProtocolVersion } from './data/dataTypes';\nimport { getDuplicates } from '../../../../common';\n\nconst RESERVED_LOCAL_HOST_IPS = {\n ipv4: '127.0.0.0',\n ipv6: '::1',\n};\n\nconst RESERVED_CATCH_ALL_IPS = {\n ipv4: '0.0.0.0',\n ipv6: '0000::',\n};\n\nexport type UniqueStringArrayExtractor<FormValues> = (\n values: FormValues,\n context: Yup.TestContext,\n value: string,\n) => string[] | undefined;\n\nexport const getUniqueValidationSchema = <FormValues,>(\n uniqueStringArrayExtractor: UniqueStringArrayExtractor<FormValues>,\n) => {\n return Yup.string().test('unique', 'Value must be unique', function (value: string) {\n if (!this.options.context || !('values' in this.options.context)) {\n return this.createError({\n message: 'Unexpected error: Yup test context should contain form values',\n });\n }\n const values = uniqueStringArrayExtractor(this.options.context['values'], this, value);\n if (!values) {\n return this.createError({\n message: 'Unexpected error: Failed to get values to test uniqueness',\n });\n }\n return values.filter((currentValue) => currentValue === value).length === 1;\n });\n};\n\nconst isValidAddress = (protocolVersion: ProtocolVersion, addressStr: string) => {\n try {\n const address =\n protocolVersion === ProtocolVersion.ipv4\n ? new Address4(addressStr)\n : new Address6(addressStr);\n // ip-address package treats cidr addresses as valid so need to verify it isn't a cidr\n return !address.parsedSubnet;\n } catch (e) {\n return false;\n }\n};\n\nconst isReservedAddress = (ip: string, protocolVersion: ProtocolVersion) => {\n try {\n if (protocolVersion === ProtocolVersion.ipv4) {\n return ip === RESERVED_LOCAL_HOST_IPS.ipv4 || ip === RESERVED_CATCH_ALL_IPS.ipv4;\n } else {\n const ipv6Address = new Address6(ip);\n return (\n compareIPV6Addresses(new Address6(RESERVED_LOCAL_HOST_IPS.ipv6), ipv6Address) ||\n compareIPV6Addresses(new Address6(RESERVED_CATCH_ALL_IPS.ipv6), ipv6Address)\n );\n }\n } catch (e) {\n return false;\n }\n};\n\nexport const getIpAddressValidationSchema = (protocolVersion: ProtocolVersion) => {\n const protocolVersionLabel = protocolVersion === ProtocolVersion.ipv4 ? 'IPv4' : 'IPv6';\n return Yup.string().test(\n protocolVersion,\n `Value \\${value} is not a valid ${protocolVersionLabel} address`,\n function (value: string) {\n if (!value) {\n return true;\n }\n return isValidAddress(protocolVersion, value);\n },\n );\n};\n\nexport const getMultipleIpAddressValidationSchema = (protocolVersion: ProtocolVersion) => {\n const protocolVersionLabel = protocolVersion === ProtocolVersion.ipv4 ? 'IPv4' : 'IPv6';\n return Yup.string().test(\n protocolVersion,\n ({ value }) => {\n const addresses = (value as string).split(',');\n const invalidAddresses = addresses.filter(\n (address) => !isValidAddress(protocolVersion, address),\n );\n const displayValue = invalidAddresses.join(', ');\n if (invalidAddresses.length === 1) {\n return `Value ${displayValue} is not a valid ${protocolVersionLabel} address`;\n } else if (invalidAddresses.length > 1) {\n return `The values ${displayValue} are not valid ${protocolVersionLabel} addresses`;\n }\n // If all addresses are valid, then there must be duplicated addresses\n const duplicates = getDuplicates(addresses);\n return `The following IP addresses are duplicated: ${duplicates.join(',')}`;\n },\n function (value: string) {\n if (!value) {\n return true;\n }\n const addresses: string[] = value.split(',');\n const duplicates = getDuplicates(addresses);\n if (duplicates.length !== 0) {\n return false;\n }\n\n return addresses.every((address) => isValidAddress(protocolVersion, address));\n },\n );\n};\n\nexport const compareIPV6Addresses = (address1: Address6, address2: Address6) => {\n return JSON.stringify(address1.toByteArray()) === JSON.stringify(address2.toByteArray());\n};\n\nexport const isNotReservedHostIPAddress = (protocolVersion: ProtocolVersion) => {\n return Yup.string().test(\n 'is-not-reserved-address',\n ({ value }) => {\n const addresses = (value as string).split(',');\n if (addresses.length === 1) {\n return 'Provided IP address is not a correct address for an interface.';\n }\n\n const reservedAddresses = addresses.filter((address) => {\n return isReservedAddress(address, protocolVersion);\n });\n return `Provided IP addresses ${reservedAddresses.join(\n ', ',\n )} are not correct addresses for an interface.`;\n },\n function (value) {\n if (!value) {\n return true;\n }\n // The field may admit multiple values as a comma-separated string\n const addresses = (value as string).split(',');\n return addresses.every((address) => !isReservedAddress(address, protocolVersion));\n },\n );\n};\n\nexport const getIpAddressInSubnetValidationSchema = (\n protocolVersion: ProtocolVersion,\n subnet: string,\n) => {\n return Yup.string().test(\n 'is-in-subnet',\n `IP Address is outside of the machine network ${subnet}`,\n function (value) {\n if (!value) {\n return true;\n }\n const ipValidationSchema = getIpAddressValidationSchema(protocolVersion);\n try {\n ipValidationSchema.validateSync(value);\n } catch (err) {\n const error = err as { message: string };\n return this.createError({ message: error.message });\n }\n try {\n const inSubnet = isInSubnet(value, subnet);\n return inSubnet;\n } catch (err) {\n //if isInSubnet fails it means the machine network cidr isn't valid and this validation is irrelevant\n return true;\n }\n },\n );\n};\n\nexport const getIpIsNotNetworkOrBroadcastAddressSchema = (\n protocolVersion: ProtocolVersion,\n subnet: string,\n) => {\n return Yup.string().test(\n 'is-not-network-or-broadcast',\n `The IP address must not match the network or broadcast address`,\n (value) => {\n const subnetAddr = getAddressObject(subnet, protocolVersion);\n if (!subnetAddr) {\n return false;\n } else {\n const subnetStart = subnetAddr?.startAddress().correctForm();\n const subnetEnd = subnetAddr?.endAddress().correctForm();\n return !(value === subnetStart || value === subnetEnd);\n }\n },\n );\n};\n", "import React from 'react';\nimport { TextVariants, TextContent, Text, FormGroup, Grid } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { Language } from '@patternfly/react-code-editor';\nimport { useField } from 'formik';\nimport {\n getFieldId,\n HostStaticNetworkConfig,\n NMSTATE_EXAMPLES_LINK,\n PopoverIcon,\n} from '../../../../../../common';\nimport StaticIpHostsArray, { HostComponentProps } from '../StaticIpHostsArray';\nimport HostSummary from '../CollapsedHost';\nimport { MacIpMapping } from './MacIpMapping';\nimport { getEmptyYamlHost } from '../../data/emptyData';\nimport { OcmCodeField } from '../../../../ui/OcmFormFields';\n\nconst CollapsedHost: React.FC<HostComponentProps> = ({ fieldName, hostIdx }) => {\n const mapFieldName = `${fieldName}.macInterfaceMap`;\n const [mapField, { error }] = useField<HostStaticNetworkConfig['macInterfaceMap']>({\n name: mapFieldName,\n });\n const macInterfaceMap = mapField.value ? mapField.value : [];\n let hasError = !!error;\n let macAddress = '';\n let mapValue = '';\n if (!macInterfaceMap.length) {\n hasError = true;\n } else {\n macAddress = macInterfaceMap[0].macAddress || '';\n mapValue = macInterfaceMap[0].logicalNicName || '';\n }\n return (\n <HostSummary\n title=\"MAC to Interface name mapping\"\n numInterfaces={macInterfaceMap.length}\n macAddress={macAddress}\n mappingValue={mapValue}\n hostIdx={hostIdx}\n hasError={hasError}\n />\n );\n};\n\nconst ExpandedHost: React.FC<HostComponentProps> = ({ fieldName, hostIdx }) => {\n const mapFieldName = `${fieldName}.macInterfaceMap`;\n const [mapField] = useField<HostStaticNetworkConfig['macInterfaceMap']>({\n name: mapFieldName,\n });\n const macInterfaceMap = mapField.value ? mapField.value : [];\n\n return (\n <>\n <FormGroup label=\"\" fieldId={getFieldId('nmstateYaml', 'inputs')}>\n <OcmCodeField\n language={Language.yaml}\n name={`${fieldName}.networkYaml`}\n data-testid={`yaml-${hostIdx}`}\n />\n </FormGroup>\n <FormGroup\n label={\n <>\n MAC to interface name mapping{' '}\n <PopoverIcon\n bodyContent={\n 'MAC address and interface name are needed in order to execute the above nmstate YAML on the right machine.'\n }\n />\n </>\n }\n fieldId={getFieldId('macNicMaping', 'inputs')}\n >\n <MacIpMapping\n fieldName={mapFieldName}\n macInterfaceMap={macInterfaceMap}\n hostIdx={hostIdx}\n />\n </FormGroup>\n </>\n );\n};\n\nexport const YamlViewFields = () => {\n const emptyHostData = getEmptyYamlHost();\n return (\n <Grid hasGutter>\n <TextContent>\n <Text component={TextVariants.small}>\n Upload, drag and drop, or copy and paste a YAML file that contains NMState into the editor\n for network configurations. Each host also needs the MAC to interface name mapping.{' '}\n <a href={NMSTATE_EXAMPLES_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more about NMState <ExternalLinkAltIcon />\n </a>\n </Text>\n </TextContent>\n\n <StaticIpHostsArray<HostStaticNetworkConfig>\n ExpandedHostComponent={ExpandedHost}\n CollapsedHostComponent={CollapsedHost}\n emptyHostData={emptyHostData}\n enableCopyAboveConfiguration={true}\n />\n </Grid>\n );\n};\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport {\n Button,\n ButtonVariant,\n Checkbox,\n Divider,\n ExpandableSection,\n ExpandableSectionToggle,\n Flex,\n FlexItem,\n Grid,\n} from '@patternfly/react-core';\nimport { MinusCircleIcon } from '@patternfly/react-icons';\nimport { FieldArray, FieldArrayRenderProps, useField } from 'formik';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { getFormikArrayItemFieldName, LoadingState } from '../../../../../common';\nimport ConfirmationModal from '../../../../../common/components/ui/ConfirmationModal';\nimport {\n selectIsCurrentClusterSNO,\n selectCurrentClusterPermissionsState,\n} from '../../../../selectors';\n\nconst fieldName = 'hosts';\n\nexport type HostComponentProps = {\n fieldName: string;\n hostIdx: number;\n isDisabled: boolean;\n};\n\nexport type HostArrayProps<HostFieldType> = {\n emptyHostData: HostFieldType;\n enableCopyAboveConfiguration?: boolean;\n CollapsedHostComponent: React.FC<HostComponentProps>;\n ExpandedHostComponent: React.FC<HostComponentProps>;\n};\n\ntype HostsProps<HostFieldType> = HostArrayProps<HostFieldType> & FieldArrayRenderProps;\n\ntype SingleHostProps<HostFieldType> = {\n hostIdx: number;\n onRemove: () => void;\n onToggleExpand: (isExpanded: boolean) => void;\n isExpanded: boolean;\n isDisabled: boolean;\n emptyHostData: HostFieldType;\n CollapsedHostComponent: React.FC<HostComponentProps>;\n ExpandedHostComponent: React.FC<HostComponentProps>;\n fieldName: string;\n enableRemoveHost: boolean;\n};\n\nexport const RemoveItemButton: React.FC<{\n onRemove: () => void;\n showRemoveButton: boolean;\n dataTestId: string;\n}> = ({ onRemove, showRemoveButton, dataTestId }) => (\n //use css visibility instead of conditional rendering to avoid button jumping when hovering\n <Button\n aria-label=\"remove host\"\n style={{ visibility: showRemoveButton ? 'visible' : 'hidden' }}\n variant=\"plain\"\n >\n <MinusCircleIcon onClick={onRemove} data-testid={dataTestId} />\n </Button>\n);\n\nconst getHostName = (hostIdx: number) => `Host ${hostIdx + 1}`;\n\nconst SingleHost = <HostFieldType,>({\n fieldName,\n hostIdx,\n onRemove,\n onToggleExpand,\n isExpanded,\n isDisabled,\n CollapsedHostComponent,\n ExpandedHostComponent,\n enableRemoveHost,\n}: SingleHostProps<HostFieldType>) => {\n //TODO: fix RemovableField reusable component to support this use case\n const [showRemoveButton, setShowRemoveButton] = React.useState(false);\n const updateShowRemoveButton = (value: boolean) => {\n if (isDisabled) {\n return;\n }\n if (!enableRemoveHost) {\n setShowRemoveButton(false);\n } else {\n setShowRemoveButton(value);\n }\n };\n const hostFieldName = getFormikArrayItemFieldName(fieldName, hostIdx);\n return (\n <Grid\n onMouseEnter={() => updateShowRemoveButton(true)}\n onMouseLeave={() => updateShowRemoveButton(false)}\n hasGutter\n >\n <Flex>\n <FlexItem>\n <ExpandableSectionToggle\n isExpanded={isExpanded}\n onToggle={onToggleExpand}\n direction=\"down\"\n data-testid={`toggle-host-${hostIdx}`}\n >\n {getHostName(hostIdx)}\n </ExpandableSectionToggle>\n </FlexItem>\n {!isDisabled && hostIdx > 0 && (\n <FlexItem align={{ default: 'alignRight' }}>\n <RemoveItemButton\n onRemove={onRemove}\n showRemoveButton={showRemoveButton}\n dataTestId={`remove-host-${hostIdx}`}\n />\n </FlexItem>\n )}\n </Flex>\n\n {isExpanded ? (\n <ExpandableSection isDetached key={hostIdx} isExpanded>\n <ExpandedHostComponent\n fieldName={hostFieldName}\n hostIdx={hostIdx}\n isDisabled={isDisabled}\n />\n </ExpandableSection>\n ) : (\n <CollapsedHostComponent\n fieldName={hostFieldName}\n hostIdx={hostIdx}\n isDisabled={isDisabled}\n />\n )}\n </Grid>\n );\n};\n\ntype ExpandedHosts = { [hostIdx: number]: boolean };\n\nconst getExpandedHostsInitialValue = (numHosts: number): ExpandedHosts => {\n const ret = {};\n for (let i = 0; i < numHosts; ++i) {\n ret[i] = false;\n }\n return ret;\n};\n\nconst getExpandedHostsDefaultValue = (numHosts: number): ExpandedHosts => {\n const ret = getExpandedHostsInitialValue(numHosts);\n if (numHosts === 1) {\n ret[0] = true;\n }\n return ret;\n};\n\nconst Hosts = <HostFieldType,>({\n push,\n remove,\n enableCopyAboveConfiguration,\n emptyHostData,\n ...props\n}: HostsProps<HostFieldType>) => {\n const [field, { error }] = useField<HostFieldType[]>({\n name: fieldName,\n });\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n const canAddHosts = !useSelector(selectIsCurrentClusterSNO) && !isViewerMode;\n const [expandedHosts, setExpandedHosts] = React.useState<ExpandedHosts>(\n getExpandedHostsDefaultValue(field.value.length),\n );\n const [copyConfiguration, setCopyConfiguration] = React.useState<boolean>(false);\n const [hostIdxToRemove, setHostIdxToRemove] = React.useState<number | null>(null);\n\n if (field.value === undefined) {\n return <LoadingState />;\n }\n\n const onAddHost = () => {\n let newHostData: HostFieldType;\n if (copyConfiguration) {\n newHostData = cloneDeep(field.value[field.value.length - 1]);\n } else {\n newHostData = cloneDeep(emptyHostData);\n }\n const newExpandedHosts = getExpandedHostsInitialValue(field.value.length + 1);\n newExpandedHosts[field.value.length] = true;\n setExpandedHosts(newExpandedHosts);\n push(newHostData);\n };\n\n return (\n <>\n {field.value.map((_data, hostIdx) => {\n const onToggleExpand = (isExpanded: boolean) => {\n const newExpandedHosts = cloneDeep(expandedHosts);\n newExpandedHosts[hostIdx] = isExpanded;\n setExpandedHosts(newExpandedHosts);\n };\n return (\n <React.Fragment key={hostIdx}>\n <SingleHost\n hostIdx={hostIdx}\n onToggleExpand={onToggleExpand}\n isExpanded={expandedHosts[hostIdx]}\n isDisabled={isViewerMode}\n onRemove={() => setHostIdxToRemove(hostIdx)}\n fieldName={fieldName}\n emptyHostData={emptyHostData}\n enableRemoveHost={field.value.length > 1}\n {...props}\n />\n\n <Divider />\n </React.Fragment>\n );\n })}\n\n {canAddHosts && (\n <Flex>\n <FlexItem>\n <Button\n variant=\"secondary\"\n onClick={onAddHost}\n data-testid=\"add-host\"\n isDisabled={!!error}\n >\n Add another host configuration\n </Button>\n </FlexItem>\n {enableCopyAboveConfiguration && (\n <FlexItem alignSelf={{ default: 'alignSelfCenter' }}>\n <Checkbox\n label=\"Copy the above configuration\"\n isChecked={copyConfiguration}\n onChange={setCopyConfiguration}\n aria-label=\"copy host configuration\"\n name=\"copy-host-configuration\"\n id=\"copy-host-configuration\"\n data-testid=\"copy-host-configuration\"\n />\n </FlexItem>\n )}\n </Flex>\n )}\n\n {hostIdxToRemove && (\n <ConfirmationModal\n title={`Delete ${getHostName(hostIdxToRemove)}?`}\n titleIconVariant=\"warning\"\n confirmationButtonText=\"Delete\"\n confirmationButtonVariant={ButtonVariant.danger}\n content={\n <>\n <p>{`All the network configurations of ${getHostName(\n hostIdxToRemove,\n )} will be lost`}</p>\n </>\n }\n onClose={() => setHostIdxToRemove(null)}\n onConfirm={() => {\n remove(hostIdxToRemove);\n setHostIdxToRemove(null);\n }}\n />\n )}\n </>\n );\n};\n\nconst StaticIpHostsArray = <HostFieldType,>({ ...props }: HostArrayProps<HostFieldType>) => {\n const renderHosts = React.useCallback(\n (arrayRenderProps: FieldArrayRenderProps) => (\n <Hosts {...Object.assign(props, arrayRenderProps)} />\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n return <FieldArray name={fieldName} render={renderHosts} />;\n};\n\nexport default StaticIpHostsArray;\n", "import {\n Flex,\n FlexItem,\n Label,\n StackItem,\n TextContent,\n TextVariants,\n Text,\n} from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport React from 'react';\n\nexport type HostSummaryProps = {\n title: string;\n macAddress: string;\n mappingValue: string;\n numInterfaces: number;\n hostIdx: number;\n hasError: boolean;\n};\n\nconst HostSummary: React.FC<HostSummaryProps> = ({\n title,\n macAddress,\n mappingValue,\n numInterfaces,\n hasError,\n hostIdx,\n}) => {\n return (\n <>\n <StackItem data-testid={`collapsed-host-${hostIdx}`}>\n <Flex>\n <FlexItem>\n <TextContent>\n <Text component={TextVariants.small}>{title}</Text>\n </TextContent>\n </FlexItem>\n {hasError && (\n <Label\n variant=\"outline\"\n color=\"red\"\n icon={<InfoCircleIcon />}\n data-testid=\"host-errors-label\"\n >\n Missing Information\n </Label>\n )}\n {!hasError && (\n <>\n <FlexItem>\n <Label\n variant=\"outline\"\n data-testid=\"first-mapping-label\"\n >{`${macAddress} -> ${mappingValue}`}</Label>{' '}\n </FlexItem>\n {numInterfaces > 1 && (\n <FlexItem>\n <Label variant=\"outline\" data-testid=\"remaining-mapping-label\">{`${\n numInterfaces - 1\n } left`}</Label>\n </FlexItem>\n )}\n </>\n )}\n </Flex>\n </StackItem>\n </>\n );\n};\n\nexport default HostSummary;\n", "import React from 'react';\nimport { GridItem, Grid, Button } from '@patternfly/react-core';\nimport { ArrayHelpers, FieldArray } from 'formik';\nimport { PlusCircleIcon } from '@patternfly/react-icons';\nimport {\n getFormikArrayItemFieldName,\n MacInterfaceMap,\n RemovableField,\n} from '../../../../../../common';\nimport { OcmInputField } from '../../../../ui/OcmFormFields';\nimport { useSelector } from 'react-redux';\nimport { selectCurrentClusterPermissionsState } from '../../../../../selectors';\n\nconst AddMapping: React.FC<{\n onPush: ArrayHelpers['push'];\n}> = ({ onPush }) => {\n return (\n <Button\n icon={<PlusCircleIcon />}\n isInline\n onClick={() => onPush({ macAddress: '', logicalNicName: '' })}\n data-testid=\"add-mapping\"\n variant=\"link\"\n >\n Add another MAC to interface name mapping\n </Button>\n );\n};\n\nconst MacMappingItem = ({\n fieldName,\n onRemove,\n mapIdx,\n enableRemove,\n hostIdx,\n}: {\n fieldName: string;\n onRemove: () => void;\n mapIdx: number;\n hostIdx: number;\n enableRemove: boolean;\n}) => {\n return (\n <RemovableField hideRemoveButton={!enableRemove} onRemove={onRemove}>\n <Grid hasGutter>\n <GridItem span={6}>\n <OcmInputField\n label=\"MAC address\"\n isRequired\n name={`${fieldName}.macAddress`}\n data-testid={`mac-address-${hostIdx}-${mapIdx}`}\n />\n </GridItem>\n <GridItem span={6}>\n <OcmInputField\n label=\"Interface name\"\n isRequired\n name={`${fieldName}.logicalNicName`}\n data-testid={`interface-name-${hostIdx}-${mapIdx}`}\n />\n </GridItem>\n </Grid>\n </RemovableField>\n );\n};\n\nexport const MacIpMapping = ({\n fieldName,\n macInterfaceMap,\n hostIdx,\n}: {\n fieldName: string;\n macInterfaceMap: MacInterfaceMap;\n hostIdx: number;\n}) => {\n const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState);\n\n return (\n <Grid className=\"mac-ip-mapping\">\n <GridItem span={6}>\n <FieldArray\n name={fieldName}\n validateOnChange={false}\n render={({ push, remove }) => (\n <Grid hasGutter>\n {macInterfaceMap.map((_, idx) => (\n <MacMappingItem\n key={getFormikArrayItemFieldName(fieldName, idx)}\n fieldName={getFormikArrayItemFieldName(fieldName, idx)}\n onRemove={() => remove(idx)}\n mapIdx={idx}\n enableRemove={!isViewerMode && idx > 0}\n hostIdx={hostIdx}\n />\n ))}\n\n {!isViewerMode && <AddMapping onPush={push} />}\n </Grid>\n )}\n />\n </GridItem>\n </Grid>\n );\n};\n", "import React from 'react';\nimport { StaticIpForm } from '../StaticIpForm';\nimport { StaticIpFormProps, StaticIpViewProps } from '../propTypes';\n\nimport { FormViewHostsValues, StaticProtocolType } from '../../data/dataTypes';\nimport { FormViewHostsFields } from './FormViewHostsFields';\nimport { getFormViewHostsValidationSchema } from './formViewHostsValidationSchema';\nimport { formViewHostsToInfraEnvField } from '../../data/formDataToInfraEnvField';\nimport { getEmptyFormViewHostsValues } from '../../data/emptyData';\nimport { getFormViewHostsValues, getFormViewNetworkWideValues } from '../../data/fromInfraEnv';\nimport { InfraEnv } from '../../../../../../common/api';\n\nexport const FormViewHosts: React.FC<StaticIpViewProps> = ({ infraEnv, ...props }) => {\n const [protocolType, setProtocolType] = React.useState<StaticProtocolType>();\n const [formProps, setFormProps] = React.useState<StaticIpFormProps<FormViewHostsValues>>();\n React.useEffect(() => {\n const networkWideValues = getFormViewNetworkWideValues(infraEnv);\n setProtocolType(networkWideValues.protocolType);\n\n if (networkWideValues) {\n setFormProps({\n infraEnv,\n validationSchema: getFormViewHostsValidationSchema(networkWideValues),\n getInitialValues: (infraEnv: InfraEnv) => {\n return getFormViewHostsValues(infraEnv);\n },\n getUpdateParams: (currentInfraEnv: InfraEnv, values: FormViewHostsValues) =>\n formViewHostsToInfraEnvField(currentInfraEnv, values.hosts),\n getEmptyValues: () => getEmptyFormViewHostsValues(),\n ...props,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n if (!formProps || !protocolType) {\n return null;\n }\n return (\n <StaticIpForm<FormViewHostsValues> {...formProps}>\n <FormViewHostsFields protocolType={protocolType} />\n </StaticIpForm>\n );\n};\n", "import React from 'react';\nimport { FormGroup, Grid } from '@patternfly/react-core';\nimport { useField } from 'formik';\nimport StaticIpHostsArray, { HostComponentProps } from '../StaticIpHostsArray';\nimport { getFieldId } from '../../../../../../common';\nimport HostSummary from '../CollapsedHost';\nimport { FormViewHost, StaticProtocolType } from '../../data/dataTypes';\nimport { getProtocolVersionLabel, getShownProtocolVersions } from '../../data/protocolVersion';\nimport { getEmptyFormViewHost } from '../../data/emptyData';\nimport { OcmInputField } from '../../../../ui/OcmFormFields';\n\nconst getExpandedHostComponent = (protocolType: StaticProtocolType) => {\n const Component: React.FC<HostComponentProps> = ({ fieldName, hostIdx }) => {\n return (\n <Grid hasGutter>\n <OcmInputField\n name={`${fieldName}.macAddress`}\n label=\"MAC Address\"\n isRequired\n data-testid={`mac-address-${hostIdx}`}\n />\n {getShownProtocolVersions(protocolType).map((protocolVersion) => (\n <FormGroup\n label={`IP address (${getProtocolVersionLabel(protocolVersion)})`}\n fieldId={getFieldId(`${fieldName}.ips.${protocolVersion}`, 'input')}\n key={protocolVersion}\n >\n <OcmInputField\n name={`${fieldName}.ips.${protocolVersion}`}\n isRequired\n data-testid={`${protocolVersion}-address-${hostIdx}`}\n />{' '}\n </FormGroup>\n ))}\n </Grid>\n );\n };\n return Component;\n};\n\nconst getCollapsedHostComponent = (protocolType: StaticProtocolType) => {\n const Component: React.FC<HostComponentProps> = ({ fieldName, hostIdx }) => {\n const [{ value }, { error }] = useField<FormViewHost>({\n name: fieldName,\n });\n const ipAddresses = getShownProtocolVersions(protocolType).map(\n (protocolVersion) => value.ips[protocolVersion],\n );\n const mapValue = ipAddresses.join(', ');\n return (\n <HostSummary\n title=\"MAC to IP mapping\"\n numInterfaces={1}\n macAddress={value.macAddress}\n mappingValue={mapValue}\n hostIdx={hostIdx}\n hasError={!!error}\n />\n );\n };\n return Component;\n};\n\nexport const FormViewHostsFields: React.FC<{ protocolType: StaticProtocolType }> = ({\n protocolType,\n}) => {\n const emptyHost = getEmptyFormViewHost();\n const CollapsedHostComponent = getCollapsedHostComponent(protocolType);\n const ExpandedHostComponent = getExpandedHostComponent(protocolType);\n return (\n <StaticIpHostsArray<FormViewHost>\n CollapsedHostComponent={CollapsedHostComponent}\n ExpandedHostComponent={ExpandedHostComponent}\n emptyHostData={emptyHost}\n />\n );\n};\n", "import * as Yup from 'yup';\n\nimport {\n FormViewHost,\n HostIps,\n FormViewNetworkWideValues,\n FormViewHostsValues,\n ProtocolVersion,\n} from '../../data/dataTypes';\nimport { macAddressValidationSchema } from '../../../../../../common';\nimport { showIpv4, showIpv6 } from '../../data/protocolVersion';\nimport { getInMachineNetworkValidationSchema } from '../FormViewNetworkWide/formViewNetworkWideValidationSchema';\nimport {\n getUniqueValidationSchema,\n UniqueStringArrayExtractor,\n getIpIsNotNetworkOrBroadcastAddressSchema,\n} from '../../commonValidationSchemas';\nimport { getMachineNetworkCidr } from '../../data/machineNetwork';\nconst requiredMsg = 'A value is required';\n\nconst getAllIpv4Addresses: UniqueStringArrayExtractor<FormViewHostsValues> = (\n values: FormViewHostsValues,\n) => values.hosts.map((host) => host.ips.ipv4);\n\nconst getAllIpv6Addresses: UniqueStringArrayExtractor<FormViewHostsValues> = (\n values: FormViewHostsValues,\n) => values.hosts.map((host) => host.ips.ipv6);\n\nconst getAllMacAddresses: UniqueStringArrayExtractor<FormViewHostsValues> = (\n values: FormViewHostsValues,\n) => values.hosts.map((host) => host.macAddress);\n\nconst getHostValidationSchema = (networkWideValues: FormViewNetworkWideValues) =>\n Yup.object().shape<FormViewHost>({\n macAddress: macAddressValidationSchema\n .required(requiredMsg)\n .concat(getUniqueValidationSchema(getAllMacAddresses)),\n ips: Yup.object().shape<HostIps>({\n ipv4: showIpv4(networkWideValues.protocolType)\n ? getInMachineNetworkValidationSchema(\n ProtocolVersion.ipv4,\n networkWideValues.ipConfigs['ipv4'].machineNetwork,\n )\n .required(requiredMsg)\n .concat(getUniqueValidationSchema(getAllIpv4Addresses))\n .concat(\n getIpIsNotNetworkOrBroadcastAddressSchema(\n ProtocolVersion.ipv4,\n getMachineNetworkCidr(networkWideValues.ipConfigs['ipv4'].machineNetwork),\n ),\n )\n : Yup.string(),\n ipv6: showIpv6(networkWideValues.protocolType)\n ? getInMachineNetworkValidationSchema(\n ProtocolVersion.ipv6,\n networkWideValues.ipConfigs['ipv6'].machineNetwork,\n )\n .required(requiredMsg)\n .concat(getUniqueValidationSchema(getAllIpv6Addresses))\n .concat(\n getIpIsNotNetworkOrBroadcastAddressSchema(\n ProtocolVersion.ipv6,\n getMachineNetworkCidr(networkWideValues.ipConfigs['ipv6'].machineNetwork),\n ),\n )\n : Yup.string(),\n }),\n });\n\nexport const getFormViewHostsValidationSchema = (networkWideValues: FormViewNetworkWideValues) => {\n return Yup.object().shape({\n hosts: Yup.array<FormViewHost>().of(getHostValidationSchema(networkWideValues)),\n });\n};\n", "import * as Yup from 'yup';\n\nimport { IpConfig, ProtocolVersion, FormViewNetworkWideValues, Cidr } from '../../data/dataTypes';\n\nimport { showProtocolVersion } from '../../data/protocolVersion';\nimport { getMachineNetworkCidr } from '../../data/machineNetwork';\nimport {\n getIpAddressInSubnetValidationSchema,\n getIpAddressValidationSchema,\n getIpIsNotNetworkOrBroadcastAddressSchema,\n getMultipleIpAddressValidationSchema,\n isNotReservedHostIPAddress,\n} from '../../commonValidationSchemas';\n\nconst REQUIRED_MESSAGE = 'A value is required';\nconst MUST_BE_A_NUMBER = 'Must be a number';\nconst ONLY_DIGITS_REGEX = /^\\d+$/;\n\nexport const MIN_PREFIX_LENGTH = 1;\nexport const MAX_PREFIX_LENGTH = {\n ipv4: 32,\n ipv6: 128,\n};\n\nexport const MIN_VLAN_ID = 1;\nexport const MAX_VLAN_ID = 4094;\n\nconst transformNumber = (originalValue: number) => {\n return isNaN(originalValue) ? null : originalValue;\n};\n\nexport const getInMachineNetworkValidationSchema = (\n protocolVersion: ProtocolVersion,\n machineNetwork: Cidr,\n) => {\n return getIpAddressInSubnetValidationSchema(\n protocolVersion,\n getMachineNetworkCidr(machineNetwork),\n );\n};\n\nexport const getIsNotNetworkOrBroadcastAddressSchema = (\n protocolVersion: ProtocolVersion,\n machineNetwork: Cidr,\n) => {\n return getIpIsNotNetworkOrBroadcastAddressSchema(\n protocolVersion,\n getMachineNetworkCidr(machineNetwork),\n );\n};\n\nconst getMachineNetworkValidationSchema = (protocolVersion: ProtocolVersion) =>\n Yup.object<Cidr>().shape({\n ip: getIPValidationSchema(protocolVersion),\n prefixLength: Yup.number()\n .required('Prefix length is required')\n .min(1, `Prefix length must be more than or equal to 1`)\n .max(\n MAX_PREFIX_LENGTH[protocolVersion],\n `Prefix length must be less than or equal to ${MAX_PREFIX_LENGTH[protocolVersion]}`,\n )\n .nullable()\n .transform(transformNumber) as Yup.NumberSchema, //add casting to not get typescript error caused by nullable\n });\n\nconst getIPValidationSchema = (protocolVersion: ProtocolVersion, allowsMultiple = false) => {\n const baseValidation = allowsMultiple\n ? getMultipleIpAddressValidationSchema\n : getIpAddressValidationSchema;\n return baseValidation(protocolVersion)\n .required(REQUIRED_MESSAGE)\n .concat(isNotReservedHostIPAddress(protocolVersion));\n};\n\nconst getAddressDataValidationSchema = (protocolVersion: ProtocolVersion, ipConfig: IpConfig) => {\n return Yup.object().shape<IpConfig>({\n machineNetwork: getMachineNetworkValidationSchema(protocolVersion),\n gateway: getIPValidationSchema(protocolVersion)\n .concat(getInMachineNetworkValidationSchema(protocolVersion, ipConfig.machineNetwork))\n .concat(getIsNotNetworkOrBroadcastAddressSchema(protocolVersion, ipConfig.machineNetwork)),\n });\n};\n\nexport const networkWideValidationSchema = Yup.lazy<FormViewNetworkWideValues>(\n (values: FormViewNetworkWideValues) => {\n const ipConfigsValidationSchemas = Yup.object().shape({\n ipv4: getAddressDataValidationSchema(ProtocolVersion.ipv4, values.ipConfigs.ipv4),\n ipv6: showProtocolVersion(values.protocolType, ProtocolVersion.ipv6)\n ? getAddressDataValidationSchema(ProtocolVersion.ipv6, values.ipConfigs.ipv6)\n : Yup.object<IpConfig>(),\n });\n return Yup.object().shape({\n useVlan: Yup.boolean(),\n vlanId: Yup.mixed().when('useVlan', {\n is: true,\n then: Yup.number()\n .required(MUST_BE_A_NUMBER)\n .min(1, `Must be more than or equal to 1`)\n .max(MAX_VLAN_ID, `Must be less than or equal to ${MAX_VLAN_ID}`)\n .test('not-number', MUST_BE_A_NUMBER, () => validateNumber(values.vlanId))\n .nullable()\n .transform(transformNumber) as Yup.NumberSchema,\n }),\n protocolType: Yup.string(),\n dns: getIPValidationSchema(ProtocolVersion.ipv4, true),\n ipConfigs: ipConfigsValidationSchemas,\n });\n },\n);\n\nexport const validateNumber = (vlanId: FormViewNetworkWideValues['vlanId']) => {\n //We need to validate that value is a number(without letters) and is not an exponential number (ex: 1e2)\n return new RegExp(ONLY_DIGITS_REGEX).test((vlanId || '').toString());\n};\n", "import { Cidr } from './dataTypes';\n\nexport const getMachineNetworkCidr = (machineNetwork: Cidr) => {\n return `${machineNetwork.ip}/${machineNetwork.prefixLength}`;\n};\n", "import { dump } from 'js-yaml';\nimport { HostStaticNetworkConfig, InfraEnv } from '../../../../../common';\nimport {\n ProtocolVersion,\n FormViewHost,\n FormViewNetworkWideValues,\n StaticFormData,\n HostIps,\n} from './dataTypes';\nimport {\n FORM_VIEW_PREFIX,\n getDnsSection,\n getInterface,\n getMachineNetworkFieldName,\n getNmstateProtocolConfig,\n getRouteConfig,\n getVlanNicName,\n YAML_COMMENT_CHAR,\n} from './nmstateYaml';\nimport { getShownProtocolVersions } from './protocolVersion';\nimport {\n Nmstate,\n NmstateInterface,\n NmstateProtocolConfigs,\n NmstateRoutesConfig,\n} from './nmstateTypes';\nimport { formDataFromInfraEnvField } from './formDataFromInfraEnvField';\nimport { getStaticNetworkConfig } from './fromInfraEnv';\nimport { DUMMY_NMSTATE_ADDRESSES, getDummyMacInterfaceMap, getDummyNicName } from './dummyData';\nimport { getMachineNetworkCidr } from './machineNetwork';\nimport { getEmptyHostIps } from './emptyData';\n\nconst REAL_NIC_NAME = 'eth0';\n\nconst getPrefixLength = (\n networkWide: FormViewNetworkWideValues,\n protocolVersion: ProtocolVersion,\n): number => {\n const machineNetwork = networkWide.ipConfigs[protocolVersion].machineNetwork;\n if (machineNetwork.prefixLength === '') {\n throw 'Machine network prefix length not configured';\n }\n return machineNetwork.prefixLength;\n};\n\nconst toYamlWithComments = (json: object, comments: string[]) => {\n const yamlComments = comments.map((comment) => `${YAML_COMMENT_CHAR}${comment}`);\n return `${yamlComments.join('\\n')}\\n${dump(json, { noRefs: true })}`;\n};\n\nconst getNmstateObject = (\n networkWide: FormViewNetworkWideValues,\n hostIps: Partial<HostIps>,\n): Nmstate => {\n const interfaces: NmstateInterface[] = [];\n const routeConfigs: NmstateRoutesConfig[] = [];\n const dns = getDnsSection(networkWide.dns);\n const realProtocolConfigs: NmstateProtocolConfigs = {};\n\n for (const protocolVersion of getShownProtocolVersions(networkWide.protocolType)) {\n const hostIp = hostIps[protocolVersion];\n let nicName = '';\n\n if (hostIp) {\n nicName = REAL_NIC_NAME;\n realProtocolConfigs[protocolVersion] = getNmstateProtocolConfig(\n hostIp,\n getPrefixLength(networkWide, protocolVersion),\n );\n } else {\n //this happens when a host was particall configured, or not configured at all\n const protocolConfigs = {\n [protocolVersion]: getNmstateProtocolConfig(\n DUMMY_NMSTATE_ADDRESSES[protocolVersion].ip,\n DUMMY_NMSTATE_ADDRESSES[protocolVersion].prefixLength,\n ),\n };\n nicName = getDummyNicName(protocolVersion);\n interfaces.push(getInterface(nicName, protocolConfigs, networkWide));\n }\n\n routeConfigs.push(\n getRouteConfig(\n protocolVersion,\n networkWide.ipConfigs[protocolVersion].gateway,\n networkWide.useVlan && networkWide.vlanId\n ? getVlanNicName(nicName, networkWide.vlanId)\n : nicName,\n ),\n );\n }\n\n if (Object.keys(realProtocolConfigs).length > 0) {\n interfaces.unshift(getInterface(REAL_NIC_NAME, realProtocolConfigs, networkWide));\n }\n\n const nmstate = {\n interfaces,\n 'dns-resolver': dns,\n routes: { config: routeConfigs },\n };\n\n return nmstate;\n};\n\nconst toYaml = (\n networkWideConfiguration: FormViewNetworkWideValues,\n formHostData?: FormViewHost,\n): string => {\n const comments = [FORM_VIEW_PREFIX];\n for (const protocolVersion of getShownProtocolVersions(networkWideConfiguration.protocolType)) {\n comments.push(\n `${getMachineNetworkFieldName(protocolVersion)} ${getMachineNetworkCidr(\n networkWideConfiguration.ipConfigs[protocolVersion].machineNetwork,\n )}`,\n );\n }\n const hostIps = formHostData ? formHostData.ips : getEmptyHostIps();\n const nmstate = getNmstateObject(networkWideConfiguration, hostIps);\n return toYamlWithComments(nmstate, comments);\n};\n\nconst formDataToInfraEnvField = (formData: StaticFormData): HostStaticNetworkConfig[] => {\n let ret: HostStaticNetworkConfig[] = [];\n if (formData.hosts.length === 0) {\n //user only filled in network wide configuration and didn't fill in host specific configurations\n ret = [\n {\n networkYaml: toYaml(formData.networkWide),\n macInterfaceMap: getDummyMacInterfaceMap(),\n },\n ];\n } else {\n for (const host of formData.hosts) {\n ret.push({\n networkYaml: toYaml(formData.networkWide, host),\n macInterfaceMap: [\n {\n macAddress: host.macAddress,\n logicalNicName: REAL_NIC_NAME,\n },\n ],\n });\n }\n }\n return ret;\n};\n\nexport const formViewHostsToInfraEnvField = (\n currentInfraEnv: InfraEnv,\n formViewHosts: FormViewHost[],\n): HostStaticNetworkConfig[] => {\n const staticNetworkConfig = getStaticNetworkConfig(currentInfraEnv);\n if (!staticNetworkConfig) {\n throw `Infra env doesn't contain static ip values`;\n }\n const currentFormData = formDataFromInfraEnvField(staticNetworkConfig);\n const networkWide = currentFormData.networkWide;\n return formDataToInfraEnvField({\n networkWide: networkWide,\n hosts: formViewHosts,\n });\n};\n\nconst fixHostIps = (networkWide: FormViewNetworkWideValues, hosts: FormViewHost[]) => {\n //fix host ips following changes in network wide configuration protocol type\n for (const host of hosts) {\n const newHostIps = getEmptyHostIps();\n for (const protocolVersion of getShownProtocolVersions(networkWide.protocolType)) {\n newHostIps[protocolVersion] = host.ips[protocolVersion];\n }\n host.ips = newHostIps;\n }\n};\n\nexport const networkWideToInfraEnvField = (\n currentInfraEnv: InfraEnv,\n networkWide: FormViewNetworkWideValues,\n): HostStaticNetworkConfig[] => {\n const staticNetworkConfig = getStaticNetworkConfig(currentInfraEnv);\n if (!staticNetworkConfig) {\n throw `Infra env doesn't contain static ip values`;\n }\n const currentFormData = formDataFromInfraEnvField(staticNetworkConfig);\n fixHostIps(networkWide, currentFormData.hosts);\n //Transform vlanId to number\n if (networkWide.vlanId !== '') {\n networkWide.vlanId = Number(networkWide.vlanId);\n }\n return formDataToInfraEnvField({ networkWide, hosts: currentFormData.hosts });\n};\n", "import React from 'react';\nimport { StaticIpForm } from '../StaticIpForm';\nimport { StaticIpFormProps, StaticIpViewProps } from '../propTypes';\nimport { FormViewHost, FormViewNetworkWideValues } from '../../data/dataTypes';\nimport { networkWideValidationSchema } from './formViewNetworkWideValidationSchema';\nimport { networkWideToInfraEnvField } from '../../data/formDataToInfraEnvField';\nimport { FormViewNetworkWideFields } from './FormViewNetworkWideFields';\nimport { getFormData, getFormViewNetworkWideValues } from '../../data/fromInfraEnv';\nimport { getEmptyNetworkWideConfigurations } from '../../data/emptyData';\nimport { InfraEnv } from '../../../../../../common';\n\nexport const FormViewNetworkWide: React.FC<StaticIpViewProps> = ({ infraEnv, ...props }) => {\n const [formProps, setFormProps] = React.useState<StaticIpFormProps<FormViewNetworkWideValues>>();\n const [hosts, setHosts] = React.useState<FormViewHost[]>();\n\n React.useEffect(() => {\n const _hosts = getFormData(infraEnv).hosts;\n setHosts(_hosts);\n if (!_hosts) {\n return;\n }\n setFormProps({\n infraEnv,\n ...props,\n validationSchema: networkWideValidationSchema,\n getInitialValues: (infraEnv: InfraEnv) => {\n return getFormViewNetworkWideValues(infraEnv);\n },\n getUpdateParams: (currentInfraEnv: InfraEnv, values: FormViewNetworkWideValues) =>\n networkWideToInfraEnvField(currentInfraEnv, values),\n getEmptyValues: () => getEmptyNetworkWideConfigurations(),\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n if (!hosts || !formProps) {\n return null;\n }\n return (\n <StaticIpForm<FormViewNetworkWideValues> {...formProps}>\n <FormViewNetworkWideFields hosts={hosts} />\n </StaticIpForm>\n );\n};\n", "import React from 'react';\nimport {\n Text,\n TextVariants,\n FormSelectOptionProps,\n Grid,\n FormGroup,\n TextInputTypes,\n Alert,\n AlertVariant,\n TextContent,\n Flex,\n FlexItem,\n} from '@patternfly/react-core';\nimport { useField, useFormikContext } from 'formik';\nimport { getFieldId, getHumanizedSubnetRange, PopoverIcon } from '../../../../../../common';\nimport {\n getAddressObject,\n getProtocolVersionLabel,\n getShownProtocolVersions,\n} from '../../data/protocolVersion';\nimport * as types from '../../data/dataTypes';\nimport { getEmptyIpConfig } from '../../data/emptyData';\nimport {\n Cidr,\n FormViewHost,\n FormViewNetworkWideValues,\n IpConfig,\n ProtocolVersion,\n StaticProtocolType,\n} from '../../data/dataTypes';\nimport { getMachineNetworkCidr } from '../../data/machineNetwork';\nimport useFieldErrorMsg from '../../../../../../common/hooks/useFieldErrorMsg';\nimport {\n MIN_PREFIX_LENGTH,\n MAX_PREFIX_LENGTH,\n MAX_VLAN_ID,\n MIN_VLAN_ID,\n} from './formViewNetworkWideValidationSchema';\nimport { OcmCheckboxField, OcmInputField, OcmSelectField } from '../../../../ui/OcmFormFields';\n\nimport '../staticIp.css';\n\nconst hostsConfiguredAlert = (\n <Alert\n variant={AlertVariant.warning}\n isInline={true}\n data-testid=\"hosts-configured-alert\"\n title=\"If you edit the values and click Next, the earlier configurations will be replaced with the new values for all of the hosts.\"\n />\n);\n\nconst MachineNetwork: React.FC<{ fieldName: string; protocolVersion: ProtocolVersion }> = ({\n fieldName,\n protocolVersion,\n}) => {\n const [{ value }] = useField<Cidr>(fieldName);\n const ipFieldName = `${fieldName}.ip`;\n const prefixLengthFieldName = `${fieldName}.prefixLength`;\n const ipErrorMessage = useFieldErrorMsg({ name: ipFieldName });\n const prefixLengthErrorMessage = useFieldErrorMsg({ name: prefixLengthFieldName });\n const errorMessage = ipErrorMessage || prefixLengthErrorMessage;\n const machineNetworkHelptext = React.useMemo(() => {\n if (errorMessage) {\n return '';\n }\n const cidr = getMachineNetworkCidr(value);\n return getHumanizedSubnetRange(getAddressObject(cidr, protocolVersion));\n }, [value, protocolVersion, errorMessage]);\n return (\n <FormGroup\n labelIcon={\n <PopoverIcon noVerticalAlign bodyContent=\"The range of IP addresses of the hosts.\" />\n }\n label=\"Machine Network\"\n fieldId={getFieldId(`${fieldName}`, 'input')}\n isRequired\n helperTextInvalid={errorMessage}\n validated={errorMessage ? 'error' : 'default'}\n helperText={machineNetworkHelptext}\n className=\"machine-network\"\n >\n <Flex>\n <FlexItem spacer={{ default: 'spacerSm' }}>\n <OcmInputField\n name={`${fieldName}.ip`}\n isRequired={true}\n data-testid={`${protocolVersion}-machine-network-ip`}\n showErrorMessage={false}\n />\n </FlexItem>\n <FlexItem spacer={{ default: 'spacerSm' }}>{'/'}</FlexItem>\n <FlexItem>\n <OcmInputField\n name={`${fieldName}.prefixLength`}\n isRequired={true}\n data-testid={`${protocolVersion}-machine-network-prefix-length`}\n type={TextInputTypes.number}\n showErrorMessage={false}\n min={MIN_PREFIX_LENGTH}\n max={\n protocolVersion === ProtocolVersion.ipv4\n ? MAX_PREFIX_LENGTH.ipv4\n : MAX_PREFIX_LENGTH.ipv6\n }\n />\n </FlexItem>\n </Flex>\n </FormGroup>\n );\n};\n\nconst IpConfigFields: React.FC<{\n fieldName: string;\n protocolVersion: ProtocolVersion;\n}> = ({ protocolVersion, fieldName }) => {\n return (\n <Grid hasGutter>\n <MachineNetwork fieldName={`${fieldName}.machineNetwork`} protocolVersion={protocolVersion} />\n <OcmInputField\n isRequired\n label=\"Default gateway\"\n labelIcon={\n <PopoverIcon\n noVerticalAlign\n bodyContent=\"An IP address to where any IP packet should be forwarded in case there is no other routing rule configured for a destination IP.\"\n />\n }\n name={`${fieldName}.gateway`}\n data-testid={`${protocolVersion}-gateway`}\n />\n </Grid>\n );\n};\n\nconst protocolVersionOptions: FormSelectOptionProps[] = [\n {\n label: getProtocolVersionLabel(ProtocolVersion.ipv4),\n value: 'ipv4',\n },\n {\n label: 'Dual Stack',\n value: 'dualStack',\n },\n];\n\nexport const ProtocolTypeSelect = () => {\n const selectFieldName = 'protocolType';\n const [{ value: protocolType }, , { setValue: setProtocolType }] =\n useField<StaticProtocolType>(selectFieldName);\n const [, , { setValue: setIpv6 }] = useField<IpConfig>(`ipConfigs.ipv6`);\n const onChange = (e: React.FormEvent<HTMLSelectElement>) => {\n const newProtocolType = e.currentTarget.value as types.StaticProtocolType;\n if (newProtocolType === protocolType) {\n return;\n }\n //no need to empty ipv4, when switching back dual stack ipv4 remains as is\n setIpv6(getEmptyIpConfig());\n setProtocolType(newProtocolType);\n };\n return (\n <OcmSelectField\n label=\"Internet protocol version\"\n options={protocolVersionOptions}\n name={selectFieldName}\n callFormikOnChange={false}\n onChange={onChange}\n data-testid=\"select-protocol-version\"\n />\n );\n};\nexport const FormViewNetworkWideFields = ({ hosts }: { hosts: FormViewHost[] }) => {\n const { values, setFieldValue } = useFormikContext<FormViewNetworkWideValues>();\n return (\n <>\n <TextContent>\n <Text component={TextVariants.h3}>Network-wide configurations</Text>\n <Text component={TextVariants.small}>\n The following configurations are applicable to all the hosts.\n </Text>\n </TextContent>\n\n {hosts.length > 0 && hostsConfiguredAlert}\n\n <ProtocolTypeSelect />\n\n <OcmCheckboxField\n label={\n <>\n {'Use VLAN '}\n <PopoverIcon\n noVerticalAlign\n bodyContent=\"If the hosts are in a sub network, enter the VLAN ID.\"\n />\n </>\n }\n name=\"useVlan\"\n data-testid=\"use-vlan\"\n onChange={() => setFieldValue('vlanId', '')}\n />\n\n {values.useVlan && (\n <div className=\"vlan-id\">\n <OcmInputField\n label=\"VLAN ID\"\n name=\"vlanId\"\n isRequired\n data-testid=\"vlan-id\"\n min={MIN_VLAN_ID}\n max={MAX_VLAN_ID}\n />\n </div>\n )}\n\n <OcmInputField isRequired label=\"DNS\" name={`dns`} data-testid={`dns`} />\n\n {getShownProtocolVersions(values.protocolType).map((protocolVersion) => (\n <FormGroup\n key={protocolVersion}\n label={getProtocolVersionLabel(protocolVersion)}\n fieldId={getFieldId(`ip-configs-${protocolVersion}`, 'input')}\n >\n <IpConfigFields\n fieldName={`ipConfigs.${protocolVersion}`}\n protocolVersion={protocolVersion}\n />\n </FormGroup>\n ))}\n </>\n );\n};\n", "import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Formik, FormikConfig, useFormikContext } from 'formik';\nimport {\n Cluster,\n ClusterWizardStep,\n getFormikErrorFields,\n MonitoredOperator,\n OPERATOR_NAME_CNV,\n OPERATOR_NAME_LVM,\n OPERATOR_NAME_ODF,\n OperatorsValues,\n selectMonitoredOperators,\n useAlerts,\n useFormikAutoSave,\n} from '../../../common';\nimport { useClusterWizardContext } from './ClusterWizardContext';\nimport ClusterWizardFooter from '../clusterWizard/ClusterWizardFooter';\nimport ClusterWizardNavigation from '../clusterWizard/ClusterWizardNavigation';\nimport { OperatorsStep } from './OperatorsStep';\nimport { ClustersService, OperatorsService } from '../../services';\nimport { updateCluster } from '../../reducers/clusters';\nimport { handleApiError } from '../../api';\nimport { canNextOperators } from './wizardTransition';\nimport { getErrorMessage } from '../../../common/utils';\n\nexport const getOperatorsInitialValues = (\n monitoredOperators: MonitoredOperator[],\n): OperatorsValues => {\n const isOperatorEnabled = (operatorNames: string[]) =>\n !!monitoredOperators.find((operator) => operatorNames.includes(operator.name || ''));\n return {\n useOpenShiftDataFoundation: isOperatorEnabled([OPERATOR_NAME_ODF]),\n useOdfLogicalVolumeManager: isOperatorEnabled([OPERATOR_NAME_LVM]),\n useContainerNativeVirtualization: isOperatorEnabled([OPERATOR_NAME_CNV]),\n };\n};\n\nconst OperatorsForm = ({ cluster }: { cluster: Cluster }) => {\n const { alerts } = useAlerts();\n const clusterWizardContext = useClusterWizardContext();\n const isAutoSaveRunning = useFormikAutoSave();\n const { errors, touched, isSubmitting, isValid } = useFormikContext<OperatorsValues>();\n\n const isNextDisabled =\n isAutoSaveRunning ||\n !isValid ||\n !!alerts.length ||\n isSubmitting ||\n !canNextOperators({ cluster });\n\n return (\n <ClusterWizardStep\n navigation={<ClusterWizardNavigation cluster={cluster} />}\n footer={\n <ClusterWizardFooter\n cluster={cluster}\n errorFields={getFormikErrorFields(errors, touched)}\n isSubmitting={isSubmitting}\n isNextDisabled={isNextDisabled}\n onNext={() => clusterWizardContext.moveNext()}\n onBack={() => clusterWizardContext.moveBack()}\n />\n }\n >\n <OperatorsStep clusterId={cluster.id} openshiftVersion={cluster.openshiftVersion} />\n </ClusterWizardStep>\n );\n};\n\nconst Operators = ({ cluster }: { cluster: Cluster }) => {\n const dispatch = useDispatch();\n const { addAlert, clearAlerts } = useAlerts();\n\n const olmOperators = selectMonitoredOperators(cluster.monitoredOperators);\n\n const initialValues = React.useMemo(\n () => getOperatorsInitialValues(olmOperators),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [], // just once, Formik does not reinitialize\n );\n\n const handleSubmit: FormikConfig<OperatorsValues>['onSubmit'] = async (\n values,\n { setFieldValue },\n ) => {\n clearAlerts();\n\n const enabledOperators = OperatorsService.getOLMOperators(values, cluster);\n\n try {\n const { data: updatedCluster } = await ClustersService.update(cluster.id, cluster.tags, {\n olmOperators: enabledOperators,\n });\n\n const needSyncOperators = OperatorsService.syncOperators(\n enabledOperators,\n updatedCluster.monitoredOperators,\n );\n Object.keys(needSyncOperators).forEach((operatorName) => {\n setFieldValue(operatorName, true);\n });\n\n dispatch(updateCluster(updatedCluster));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({ title: 'Failed to update the cluster', message: getErrorMessage(e) }),\n );\n }\n };\n\n return (\n <Formik initialValues={initialValues} onSubmit={handleSubmit}>\n <OperatorsForm cluster={cluster} />\n </Formik>\n );\n};\n\nexport default Operators;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { ClusterOperatorProps, ClusterWizardStepHeader, useFeature } from '../../../common';\nimport { selectIsCurrentClusterSNO } from '../../selectors';\nimport CnvCheckbox from '../clusterConfiguration/operators/CnvCheckbox';\nimport OdfCheckbox from '../clusterConfiguration/operators/OdfCheckbox';\nimport LvmCheckbox from '../clusterConfiguration/operators/LvmCheckbox';\n\nexport const OperatorsStep = (props: ClusterOperatorProps) => {\n const isSNO = useSelector(selectIsCurrentClusterSNO);\n const isOpenshiftDataFoundationEnabled = useFeature('ASSISTED_INSTALLER_OCS_FEATURE') && !isSNO;\n const isContainerNativeVirtualizationEnabled = useFeature('ASSISTED_INSTALLER_CNV_FEATURE');\n\n return (\n <Stack hasGutter>\n <StackItem>\n <ClusterWizardStepHeader>Operators</ClusterWizardStepHeader>\n </StackItem>\n {isContainerNativeVirtualizationEnabled && (\n <StackItem>\n <CnvCheckbox {...props} />\n </StackItem>\n )}\n {isOpenshiftDataFoundationEnabled && (\n <StackItem>\n <OdfCheckbox openshiftVersion={props.openshiftVersion} />\n </StackItem>\n )}\n {isSNO && (\n <StackItem>\n <LvmCheckbox {...props} />\n </StackItem>\n )}\n </Stack>\n );\n};\n", "import React, { useState } from 'react';\nimport { FormGroup, Tooltip } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { useFormikContext } from 'formik';\nimport {\n ClusterOperatorProps,\n CNV_LINK,\n getFieldId,\n OperatorsValues,\n PopoverIcon,\n useFeatureSupportLevel,\n} from '../../../../common';\nimport CnvHostRequirements from './CnvHostRequirements';\nimport { getCnvIncompatibleWithLvmReason } from '../../featureSupportLevels/featureStateUtils';\nimport { OcmCheckboxField } from '../../ui/OcmFormFields';\n\nconst CNV_FIELD_NAME = 'useContainerNativeVirtualization';\n\nconst CnvLabel = ({ clusterId }: { clusterId: ClusterOperatorProps['clusterId'] }) => {\n return (\n <>\n Install OpenShift Virtualization{' '}\n <PopoverIcon\n component={'a'}\n headerContent=\"Additional Requirements\"\n bodyContent={<CnvHostRequirements clusterId={clusterId} />}\n />\n </>\n );\n};\n\nconst CnvHelperText = () => {\n return (\n <>\n Run virtual machines alongside containers on one platform.{' '}\n <a href={CNV_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {'Learn more'} <ExternalLinkAltIcon />\n </a>\n </>\n );\n};\n\nconst CnvCheckbox = ({ clusterId, openshiftVersion }: ClusterOperatorProps) => {\n const fieldId = getFieldId(CNV_FIELD_NAME, 'input');\n\n const featureSupportLevel = useFeatureSupportLevel();\n const { values } = useFormikContext<OperatorsValues>();\n const [disabledReason, setDisabledReason] = useState<string | undefined>();\n\n React.useEffect(() => {\n let reason = undefined;\n if (openshiftVersion) {\n reason = featureSupportLevel.getFeatureDisabledReason(openshiftVersion, 'CNV');\n if (!reason) {\n const lvmSupport = featureSupportLevel.getFeatureSupportLevel(openshiftVersion, 'LVM');\n reason = getCnvIncompatibleWithLvmReason(values, openshiftVersion, lvmSupport);\n }\n }\n setDisabledReason(reason);\n }, [values, openshiftVersion, featureSupportLevel]);\n\n return (\n <FormGroup isInline fieldId={fieldId}>\n <Tooltip hidden={!disabledReason} content={disabledReason}>\n <OcmCheckboxField\n name={CNV_FIELD_NAME}\n label={<CnvLabel clusterId={clusterId} />}\n helperText={<CnvHelperText />}\n isDisabled={!!disabledReason}\n />\n </Tooltip>\n </FormGroup>\n );\n};\n\nexport default CnvCheckbox;\n", "import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { List, ListItem } from '@patternfly/react-core';\nimport { useClusterPreflightRequirements } from '../../../hooks';\nimport { Cluster, ErrorState, LoadingState, OPERATOR_NAME_CNV, RenderIf } from '../../../../common';\nimport { selectIsCurrentClusterSNO } from '../../../selectors';\n\nconst CnvHostRequirements = ({ clusterId }: { clusterId: Cluster['id'] }) => {\n const { preflightRequirements, error, isLoading } = useClusterPreflightRequirements(clusterId);\n const isSingleNode = useSelector(selectIsCurrentClusterSNO);\n\n if (isLoading) {\n return <LoadingState content=\"Loading hardware requirements ...\" />;\n }\n if (error) {\n return <ErrorState />;\n }\n\n const cnvRequirements = preflightRequirements?.operators?.find(\n (operatorRequirements) => operatorRequirements.operatorName === OPERATOR_NAME_CNV,\n );\n\n const workerRequirements = cnvRequirements?.requirements?.worker?.quantitative;\n const masterRequirements = cnvRequirements?.requirements?.master?.quantitative;\n\n return (\n <>\n <List>\n <ListItem>\n Enabled CPU virtualization support in BIOS (Intel-VT / AMD-V) on all nodes\n </ListItem>\n <RenderIf condition={!isSingleNode}>\n <ListItem>\n Each worker node requires an additional {workerRequirements?.ramMib || 360} MiB of\n memory {workerRequirements?.diskSizeGb ? ',' : ' and'}{' '}\n {workerRequirements?.cpuCores || 2} CPUs\n {workerRequirements?.diskSizeGb\n ? ` and ${workerRequirements?.diskSizeGb} storage space`\n : ''}\n </ListItem>\n </RenderIf>\n <ListItem>\n Each control plane node requires an additional {masterRequirements?.ramMib || 150} MiB of\n memory {masterRequirements?.diskSizeGb ? ',' : ' and'} {masterRequirements?.cpuCores || 4}{' '}\n CPUs\n {masterRequirements?.diskSizeGb\n ? ` and ${masterRequirements?.diskSizeGb} storage space`\n : ''}\n </ListItem>\n <RenderIf condition={!isSingleNode}>\n <ListItem>\n OpenShift Data Foundation (recommended for full functionality) or another persistent\n storage service\n </ListItem>\n </RenderIf>\n </List>\n </>\n );\n};\n\nexport default CnvHostRequirements;\n", "import React from 'react';\nimport { FormGroup, Tooltip } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport {\n getFieldId,\n useFeatureSupportLevel,\n PopoverIcon,\n ODF_REQUIREMENTS_LINK,\n ODF_LINK,\n} from '../../../../common';\nimport { OcmCheckboxField } from '../../ui/OcmFormFields';\n\nconst ODF_FIELD_NAME = 'useOpenShiftDataFoundation';\n\nconst OdfLabel = () => (\n <>\n Install OpenShift Data Foundation{' '}\n <PopoverIcon\n component={'a'}\n headerContent=\"Additional Requirements\"\n bodyContent={\n <a href={ODF_REQUIREMENTS_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more about the requirements for OpenShift Data Foundation <ExternalLinkAltIcon />.\n </a>\n }\n />\n </>\n);\n\nconst OdfHelperText = () => {\n return (\n <>\n Persistent software-defined storage for hybrid applications.{' '}\n <a href={ODF_LINK} target=\"_blank\" rel=\"noopener noreferrer\">\n {'Learn more'} <ExternalLinkAltIcon />\n </a>\n </>\n );\n};\n\nconst OdfCheckbox = ({ openshiftVersion }: { openshiftVersion?: string }) => {\n const featureSupportLevelContext = useFeatureSupportLevel();\n const fieldId = getFieldId(ODF_FIELD_NAME, 'input');\n const disabledReason = openshiftVersion\n ? featureSupportLevelContext.getFeatureDisabledReason(openshiftVersion, 'ODF')\n : undefined;\n return (\n <FormGroup isInline fieldId={fieldId}>\n <Tooltip hidden={!disabledReason} content={disabledReason}>\n <OcmCheckboxField\n name={ODF_FIELD_NAME}\n label={<OdfLabel />}\n isDisabled={!!disabledReason}\n helperText={<OdfHelperText />}\n />\n </Tooltip>\n </FormGroup>\n );\n};\n\nexport default OdfCheckbox;\n", "import React, { useState } from 'react';\nimport { FormGroup, Tooltip } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport {\n ClusterOperatorProps,\n FeatureSupportLevelBadge,\n getFieldId,\n OperatorsValues,\n PopoverIcon,\n useFeatureSupportLevel,\n} from '../../../../common';\nimport LvmHostRequirements from './LvmHostRequirements';\nimport { getLvmIncompatibleWithCnvReason } from '../../featureSupportLevels/featureStateUtils';\nimport { OcmCheckboxField } from '../../ui/OcmFormFields';\n\nconst LVM_FIELD_NAME = 'useOdfLogicalVolumeManager';\n\nconst LvmLabel = (props: ClusterOperatorProps) => (\n <>\n Install OpenShift Data Foundation Logical Volume Manager{' '}\n <PopoverIcon\n component={'a'}\n headerContent=\"Additional Requirements\"\n bodyContent={<LvmHostRequirements clusterId={props.clusterId} />}\n />\n <FeatureSupportLevelBadge featureId=\"LVM\" openshiftVersion={props.openshiftVersion} />\n </>\n);\n\nconst LvmCheckbox = ({ clusterId, openshiftVersion }: ClusterOperatorProps) => {\n const fieldId = getFieldId(LVM_FIELD_NAME, 'input');\n\n const featureSupportLevel = useFeatureSupportLevel();\n const { values } = useFormikContext<OperatorsValues>();\n const [disabledReason, setDisabledReason] = useState<string | undefined>();\n\n React.useEffect(() => {\n let reason = undefined;\n if (openshiftVersion) {\n reason = featureSupportLevel.getFeatureDisabledReason(openshiftVersion, 'LVM');\n if (!reason) {\n const lvmSupport = featureSupportLevel.getFeatureSupportLevel(openshiftVersion, 'LVM');\n reason = getLvmIncompatibleWithCnvReason(values, openshiftVersion, lvmSupport);\n }\n }\n setDisabledReason(reason);\n }, [values, openshiftVersion, featureSupportLevel]);\n\n return (\n <FormGroup isInline fieldId={fieldId}>\n <Tooltip hidden={!disabledReason} content={disabledReason}>\n <OcmCheckboxField\n name={LVM_FIELD_NAME}\n label={<LvmLabel clusterId={clusterId} openshiftVersion={openshiftVersion} />}\n helperText={\n 'Storage virtualization that offers a more flexible approach for disk space management.'\n }\n isDisabled={!!disabledReason}\n />\n </Tooltip>\n </FormGroup>\n );\n};\n\nexport default LvmCheckbox;\n", "import React from 'react';\nimport { List, ListItem } from '@patternfly/react-core';\nimport { useClusterPreflightRequirements } from '../../../hooks';\nimport {\n HostTypeHardwareRequirements,\n ClusterOperatorProps,\n ErrorState,\n LoadingState,\n OPERATOR_NAME_LVM,\n} from '../../../../common';\n\nconst LvmHostRequirements = ({ clusterId }: { clusterId: ClusterOperatorProps['clusterId'] }) => {\n const { preflightRequirements, error, isLoading } = useClusterPreflightRequirements(clusterId);\n\n if (isLoading) {\n return <LoadingState content=\"Loading hardware requirements ...\" />;\n }\n if (error) {\n return <ErrorState />;\n }\n\n const lvmRequirements = preflightRequirements?.operators?.find(\n (operatorRequirements) => operatorRequirements.operatorName === OPERATOR_NAME_LVM,\n );\n\n const { qualitative = [], quantitative } = lvmRequirements?.requirements\n ?.master as HostTypeHardwareRequirements;\n\n return (\n <List>\n {quantitative && (\n <ListItem>\n The host node requires an additional {quantitative.ramMib} MiB of memory{' '}\n {quantitative.diskSizeGb ? ',' : ' and'} {quantitative.cpuCores} CPUs\n {quantitative?.diskSizeGb ? ` and ${quantitative?.diskSizeGb} storage space` : ''}\n </ListItem>\n )}\n {qualitative.map((qualitativeItem, index) => (\n <ListItem key={index}>{qualitativeItem}</ListItem>\n ))}\n </List>\n );\n};\n\nexport default LvmHostRequirements;\n", "import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Button,\n Modal,\n ModalVariant,\n ButtonVariant,\n Text,\n TextContent,\n} from '@patternfly/react-core';\nimport { getApiErrorMessage, handleApiError } from '../../api/utils';\nimport { updateCluster } from '../../reducers/clusters/currentClusterSlice';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport { ErrorState, LoadingState } from '../../../common';\nimport { ClustersAPI } from '../../services/apis';\n\nconst CancelInstallationModal: React.FC = () => {\n const dispatch = useDispatch();\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const [error, setError] = React.useState<{ title: string; message: string } | null>(null);\n const { cancelInstallationDialog } = useModalDialogsContext();\n const { data, isOpen, close: onClose } = cancelInstallationDialog;\n const clusterId = data?.clusterId;\n\n if (!clusterId) {\n return null;\n }\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n setError(null);\n const { data } = await ClustersAPI.cancel(clusterId);\n dispatch(updateCluster(data));\n onClose();\n } catch (e) {\n handleApiError(e, () => {\n setError({ title: 'Failed to abort cluster installation', message: getApiErrorMessage(e) });\n });\n }\n setIsSubmitting(false);\n };\n\n const getModalContent = () => {\n if (isSubmitting) {\n return <LoadingState content=\"Aborting cluster installation...\" />;\n }\n if (error) {\n return <ErrorState title={error.title} content={error.message} />;\n }\n return (\n <TextContent>\n <Text component=\"p\">\n This will abort cluster installation. Are you sure you want to proceed?\n </Text>\n </TextContent>\n );\n };\n\n return (\n <Modal\n title=\"Abort Cluster Installation\"\n isOpen={isOpen}\n variant={ModalVariant.small}\n actions={[\n <Button\n key=\"submit\"\n variant={ButtonVariant.danger}\n onClick={handleSubmit}\n isDisabled={isSubmitting}\n >\n Abort Installation\n </Button>,\n <Button\n key=\"cancel\"\n variant={ButtonVariant.link}\n onClick={onClose}\n isDisabled={isSubmitting}\n >\n Cancel\n </Button>,\n ]}\n onClose={onClose}\n >\n {getModalContent()}\n </Modal>\n );\n};\n\nexport default CancelInstallationModal;\n", "import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Button,\n Modal,\n ModalVariant,\n ButtonVariant,\n Text,\n TextContent,\n} from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens';\n\nimport { getApiErrorMessage, handleApiError } from '../../api/utils';\nimport { updateCluster } from '../../reducers/clusters/currentClusterSlice';\nimport { calculateCollectedLogsCount } from '../clusters/utils';\nimport { useModalDialogsContext } from '../hosts/ModalDialogsContext';\nimport { ErrorState, LoadingState } from '../../../common';\nimport { ClustersAPI } from '../../services/apis';\n\nconst ResetClusterModal: React.FC = () => {\n const dispatch = useDispatch();\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const [error, setError] = React.useState<{ title: string; message: string } | null>(null);\n const { resetClusterDialog } = useModalDialogsContext();\n const { data, isOpen, close: onClose } = resetClusterDialog;\n const cluster = data?.cluster;\n\n if (!cluster) {\n return null;\n }\n\n const handleClose = () => {\n setIsSubmitting(false);\n setError(null);\n onClose();\n };\n\n const handleReset = async () => {\n setIsSubmitting(true);\n try {\n setError(null);\n const { data } = await ClustersAPI.reset(cluster.id);\n dispatch(updateCluster(data));\n onClose();\n } catch (e) {\n handleApiError(e, () => {\n setError({ title: 'Failed to reset cluster installation', message: getApiErrorMessage(e) });\n });\n }\n setIsSubmitting(false);\n };\n\n const collectedLogsPercentage = `${Math.round(\n (calculateCollectedLogsCount(cluster) / ((cluster.hosts?.length || 0) + 1)) * 100,\n )} `;\n\n const getModalContent = () => {\n if (isSubmitting) {\n return <LoadingState content=\"Resetting cluster installation...\" />;\n }\n\n if (error) {\n return <ErrorState title={error.title} content={error.message} />;\n }\n\n return (\n <TextContent>\n <Text component=\"p\">\n This will reset the installation and return to the cluster configuration. Some hosts may\n need to be re-registered by rebooting into the Discovery ISO.\n </Text>\n\n <Text component=\"p\">\n <strong>Download the installation logs</strong> to troubleshoot or report a bug.\n <br />\n Currently, {collectedLogsPercentage}% of the installation logs were collected and are\n ready for download.\n </Text>\n\n <Text component=\"p\">\n <ExclamationTriangleIcon className=\"status-icon\" color={warningColor.value} size=\"sm\" />{' '}\n Logs won't be available after the installation is reset.\n </Text>\n\n <Text component=\"p\">Are you sure you want to reset the cluster?</Text>\n </TextContent>\n );\n };\n\n const actions = [\n <Button\n key=\"reset\"\n variant={ButtonVariant.danger}\n onClick={handleReset}\n isDisabled={isSubmitting}\n >\n Reset Cluster\n </Button>,\n ];\n\n actions.push(\n <Button\n key=\"cancel\"\n variant={ButtonVariant.link}\n onClick={handleClose}\n isDisabled={isSubmitting}\n >\n Cancel\n </Button>,\n );\n\n return (\n <Modal\n title=\"Reset Cluster Installation\"\n isOpen={isOpen}\n variant={ModalVariant.small}\n actions={actions}\n onClose={handleClose}\n >\n {getModalContent()}\n </Modal>\n );\n};\n\nexport default ResetClusterModal;\n", "import React from 'react';\nimport { Button, ButtonVariant, Modal, ModalVariant } from '@patternfly/react-core';\n\nconst ClusterPollingErrorModal = () => {\n return (\n <Modal\n title=\"Unable to fetch the latest data\"\n isOpen\n variant={ModalVariant.small}\n showClose={false}\n titleIconVariant=\"danger\"\n actions={[\n <Button\n key=\"refresh\"\n variant={ButtonVariant.primary}\n onClick={() => window.location.reload()}\n >\n Refresh page\n </Button>,\n ]}\n >\n There was an error fetching the latest data from the API. We'll try again, but if the data\n does not update in a few minutes, try refreshing the page.\n </Modal>\n );\n};\n\nexport default ClusterPollingErrorModal;\n", "import React from 'react';\nimport {\n ErrorMonitorContextProvider,\n ErrorSeverity,\n ExceptionReporter,\n} from '../../common/components/ErrorHandling/ErrorMonitorContext';\nimport { handleApiError } from '../api';\nimport { isApiError } from '../api/types';\nimport { captureException } from '../sentry';\nimport * as Sentry from '@sentry/browser';\n\nexport const SentryErrorMonitorContextProvider: React.FC = ({ children }) => {\n const exceptionReporter: ExceptionReporter = (\n error: unknown,\n message?: string,\n severity?: ErrorSeverity,\n ) => {\n if (isApiError(error)) {\n handleApiError(error);\n } else {\n captureException(error, message, severity as Sentry.Severity);\n }\n };\n return (\n <ErrorMonitorContextProvider {...{ exceptionReporter }}>{children}</ErrorMonitorContextProvider>\n );\n};\n", "import React, { PropsWithChildren } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport isEqual from 'lodash/isEqual';\nimport ClusterWizardContext, { ClusterWizardContextType } from './ClusterWizardContext';\nimport {\n ClusterWizardFlowStateType,\n ClusterWizardStepsType,\n getClusterWizardFirstStep,\n isStaticIpStep,\n} from './wizardTransition';\nimport { HostsNetworkConfigurationType } from '../../services';\nimport { defaultWizardSteps, staticIpFormViewSubSteps } from './constants';\nimport { StaticIpView } from '../clusterConfiguration/staticIp/data/dataTypes';\nimport { getStaticIpInfo } from '../clusterConfiguration/staticIp/data/fromInfraEnv';\nimport { Cluster, InfraEnv, AssistedInstallerOCMPermissionTypesListType } from '../../../common';\nimport useSetClusterPermissions from '../../hooks/useSetClusterPermissions';\n\nconst getWizardStepIds = (staticIpView?: StaticIpView): ClusterWizardStepsType[] => {\n const stepIds: ClusterWizardStepsType[] = [...defaultWizardSteps];\n if (staticIpView === StaticIpView.YAML) {\n stepIds.splice(1, 0, 'static-ip-yaml-view');\n } else if (staticIpView === StaticIpView.FORM) {\n stepIds.splice(1, 0, ...staticIpFormViewSubSteps);\n }\n return stepIds;\n};\n\nconst ClusterWizardContextProvider: React.FC<\n PropsWithChildren<{\n cluster?: Cluster;\n infraEnv?: InfraEnv;\n permissions?: AssistedInstallerOCMPermissionTypesListType;\n }>\n> = ({ children, cluster, infraEnv, permissions }) => {\n const [currentStepId, setCurrentStepId] = React.useState<ClusterWizardStepsType>();\n const [wizardStepIds, setWizardStepIds] = React.useState<ClusterWizardStepsType[]>();\n const { state: locationState } = useLocation<ClusterWizardFlowStateType>();\n const setClusterPermissions = useSetClusterPermissions();\n\n React.useEffect(() => {\n const staticIpInfo = infraEnv ? getStaticIpInfo(infraEnv) : undefined;\n const firstStep = getClusterWizardFirstStep(\n locationState,\n staticIpInfo,\n cluster?.status,\n cluster?.hosts,\n );\n const firstStepIds = getWizardStepIds(staticIpInfo?.view);\n setCurrentStepId(firstStep);\n setWizardStepIds(firstStepIds);\n setClusterPermissions(cluster, permissions);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const contextValue = React.useMemo<ClusterWizardContextType | null>(() => {\n if (!wizardStepIds || !currentStepId) {\n return null;\n }\n\n const handleMoveFromStaticIp = () => {\n //if static ip view change wasn't persisted, moving from static ip step should change the wizard steps to match the view in the infra env\n const staticIpInfo = infraEnv ? getStaticIpInfo(infraEnv) : undefined;\n if (!staticIpInfo) {\n throw `Wizard step is currently ${currentStepId}, but no static ip info is defined`;\n }\n const newStepIds = getWizardStepIds(staticIpInfo.view);\n if (!isEqual(newStepIds, wizardStepIds)) {\n setWizardStepIds(newStepIds);\n }\n };\n\n const onSetCurrentStepId = (stepId: ClusterWizardStepsType) => {\n if (isStaticIpStep(currentStepId) && !isStaticIpStep(stepId)) {\n handleMoveFromStaticIp();\n }\n setCurrentStepId(stepId);\n };\n\n return {\n moveBack(): void {\n const currentStepIdx = wizardStepIds.indexOf(currentStepId);\n let nextStepId = wizardStepIds[currentStepIdx - 1];\n if (nextStepId === 'static-ip-host-configurations') {\n //when moving back to static ip form view, it should go to network wide configurations\n nextStepId = 'static-ip-network-wide-configurations';\n }\n onSetCurrentStepId(nextStepId);\n },\n moveNext(): void {\n const currentStepIdx = wizardStepIds.indexOf(currentStepId);\n onSetCurrentStepId(wizardStepIds[currentStepIdx + 1]);\n },\n onUpdateStaticIpView(view: StaticIpView): void {\n setWizardStepIds(getWizardStepIds(view));\n if (view === StaticIpView.YAML) {\n setCurrentStepId('static-ip-yaml-view');\n } else {\n setCurrentStepId('static-ip-network-wide-configurations');\n }\n },\n onUpdateHostNetworkConfigType(type: HostsNetworkConfigurationType): void {\n if (type === HostsNetworkConfigurationType.STATIC) {\n setWizardStepIds(getWizardStepIds(StaticIpView.FORM));\n } else {\n setWizardStepIds(getWizardStepIds());\n }\n },\n wizardStepIds,\n currentStepId,\n setCurrentStepId: onSetCurrentStepId,\n };\n }, [wizardStepIds, currentStepId, infraEnv]);\n if (!contextValue) {\n return null;\n }\n return (\n <>\n <ClusterWizardContext.Provider value={contextValue}>{children}</ClusterWizardContext.Provider>\n </>\n );\n};\n\nexport default ClusterWizardContextProvider;\n", "import { useDispatch } from 'react-redux';\nimport { AssistedInstallerOCMPermissionTypesListType, Cluster } from '../../common';\nimport { ExtendedCluster, getBasePermissions, ocmPermissionsToAIPermissions } from '../config';\nimport { updateClusterPermissions } from '../reducers/clusters';\n\nexport default function useSetClusterPermissions() {\n const dispatch = useDispatch();\n\n return (cluster?: Cluster, ocmPermissions?: AssistedInstallerOCMPermissionTypesListType) => {\n if (!cluster) {\n // We must not update the permissions, the state is reset when the cluster is cleaned\n return;\n }\n let newPermissions = getBasePermissions(cluster as ExtendedCluster);\n if (ocmPermissions) {\n newPermissions = {\n ...newPermissions,\n ...ocmPermissionsToAIPermissions(ocmPermissions || {}),\n };\n }\n dispatch(updateClusterPermissions(newPermissions));\n };\n}\n", "import React from 'react';\nimport { Provider } from 'react-redux';\nimport { store } from '../../store';\nimport { useSelector } from 'react-redux';\n\nimport { FeatureGateContextProvider, FeatureListType } from '../../../common';\nimport { FeatureSupportLevelProvider } from '../featureSupportLevels';\nimport ClusterProperties from './ClusterProperties';\nimport { selectCurrentClusterState } from '../../selectors';\nimport { Grid } from '@patternfly/react-core';\n\ntype AssistedInstallerExtraDetailCardProps = {\n allEnabledFeatures: FeatureListType;\n};\n\nconst AssistedInstallerExtraDetailCard: React.FC<AssistedInstallerExtraDetailCardProps> = ({\n allEnabledFeatures,\n}) => {\n const { data: cluster } = useSelector(selectCurrentClusterState);\n\n if (!cluster || cluster.status === 'adding-hosts') {\n return null;\n }\n\n return (\n <FeatureGateContextProvider features={allEnabledFeatures}>\n <FeatureSupportLevelProvider loadingUi={<div />} cluster={cluster}>\n <Grid className=\"pf-u-mt-md\">\n <ClusterProperties cluster={cluster} externalMode />\n </Grid>\n </FeatureSupportLevelProvider>\n </FeatureGateContextProvider>\n );\n};\n\nconst Wrapper: React.FC<AssistedInstallerExtraDetailCardProps> = (props) => (\n <Provider store={store}>\n <AssistedInstallerExtraDetailCard {...props} />\n </Provider>\n);\n\nexport default Wrapper;\n", "import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { RouteComponentProps } from 'react-router-dom';\nimport {\n Button,\n ButtonVariant,\n PageSectionVariants,\n TextContent,\n Text,\n PageSection,\n} from '@patternfly/react-core';\nimport { AddCircleOIcon } from '@patternfly/react-icons';\n\nimport { selectClusterTableRows, selectClustersUIState } from '../../selectors/clusters';\nimport {\n ResourceUIState,\n Alerts,\n LoadingState,\n ErrorState,\n EmptyState,\n useAlerts,\n AlertsContextProvider,\n Cluster,\n} from '../../../common';\nimport ClustersTable from './ClustersTable';\nimport { fetchClustersAsync, deleteCluster } from '../../reducers/clusters/clustersSlice';\nimport { handleApiError, getApiErrorMessage } from '../../api/utils';\nimport ClusterBreadcrumbs from './ClusterBreadcrumbs';\nimport { routeBasePath } from '../../config';\nimport { ClustersService } from '../../services';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClustersProps = RouteComponentProps;\n\nconst Clusters: React.FC<ClustersProps> = ({ history }) => {\n const { LOADING, EMPTY, ERROR, RELOADING } = ResourceUIState;\n const { addAlert } = useAlerts();\n const { t } = useTranslation();\n const clusterRows = useSelector(selectClusterTableRows(t));\n const clustersUIState = useSelector(selectClustersUIState);\n const uiState = React.useRef(clustersUIState);\n if (clustersUIState !== RELOADING) {\n uiState.current = clustersUIState;\n }\n const dispatch = useDispatch();\n const deleteClusterAsync = React.useCallback(\n async (clusterId: Cluster['id']) => {\n try {\n await ClustersService.remove(clusterId);\n dispatch(deleteCluster(clusterId));\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: 'Cluster could not be deleted',\n message: getApiErrorMessage(e),\n }),\n );\n }\n },\n [dispatch, addAlert],\n );\n\n const fetchClusters = React.useCallback(() => dispatch(fetchClustersAsync()), [dispatch]);\n React.useEffect(() => {\n fetchClusters();\n }, [fetchClusters]);\n\n switch (uiState.current) {\n case LOADING:\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <LoadingState />\n </PageSection>\n );\n case ERROR:\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState title=\"Failed to fetch clusters.\" fetchData={fetchClusters} />\n </PageSection>\n );\n case EMPTY:\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <EmptyState\n icon={AddCircleOIcon}\n title=\"Create new assisted cluster\"\n content=\"There are no clusters yet. This wizard is going to guide you through the OpenShift cluster deployment.\"\n primaryAction={\n <Button\n variant={ButtonVariant.primary}\n onClick={() => history.push(`${routeBasePath}/clusters/~new`)}\n id=\"empty-state-new-cluster-button\"\n data-ouia-id=\"button-create-new-cluster\"\n >\n Create New Cluster\n </Button>\n }\n />\n </PageSection>\n );\n default:\n return (\n <>\n <ClusterBreadcrumbs />\n <PageSection variant={PageSectionVariants.light}>\n <TextContent>\n <Text component=\"h1\">Assisted Clusters</Text>\n </TextContent>\n </PageSection>\n <PageSection variant={PageSectionVariants.light} isFilled>\n <Alerts />\n <ClustersTable\n rows={clusterRows}\n deleteCluster={(clusterId) => void deleteClusterAsync(clusterId)}\n />\n </PageSection>\n </>\n );\n }\n};\n\nconst ClustersPage: React.FC<RouteComponentProps> = (props) => (\n <AlertsContextProvider>\n <Clusters {...props} />\n </AlertsContextProvider>\n);\n\nexport default ClustersPage;\n", "import React from 'react';\nimport {\n Table,\n TableProps,\n TableHeader,\n TableBody,\n RowWrapper,\n RowWrapperProps,\n IRowData,\n SortByDirection,\n ISortBy,\n OnSort,\n IRow,\n IActionsResolver,\n cellWidth,\n breakWord,\n sortable,\n} from '@patternfly/react-table';\nimport { ExtraParamsType } from '@patternfly/react-table/dist/js/components/Table/base/types';\nimport { ClusterTableRows } from '../../../common/types/clusters';\nimport DeleteClusterModal from './DeleteClusterModal';\nimport { getClusterTableStatusCell } from '../../selectors/clusters';\nimport { clusterStatusLabels, rowSorter, HumanizedSortable } from '../../../common';\nimport ClustersListToolbar, { ClusterFiltersType } from './ClustersListToolbar';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst rowKey = ({ rowData }: ExtraParamsType) => rowData?.props.id;\n\nconst STORAGE_KEY_CLUSTERS_FILTER = 'assisted-installer-cluster-list-filters';\n\ninterface ClustersTableProps {\n rows: ClusterTableRows;\n deleteCluster: (id: string) => void;\n}\n\ntype TablePropsCellType = TableProps['cells'][0];\n\nconst columnConfig: TablePropsCellType = {\n transforms: [sortable],\n cellTransforms: [],\n formatters: [],\n cellFormatters: [],\n props: {},\n};\n\nconst columns: TablePropsCellType[] = [\n {\n title: 'Name',\n dataLabel: 'Name',\n ...columnConfig,\n transforms: columnConfig?.transforms?.concat(cellWidth(20)),\n cellTransforms: columnConfig?.cellTransforms?.concat(breakWord),\n },\n {\n title: 'Base domain',\n dataLabel: 'Base domain',\n ...columnConfig,\n transforms: columnConfig?.transforms?.concat(cellWidth(40)),\n cellTransforms: columnConfig?.cellTransforms?.concat(breakWord),\n },\n { title: 'Version', dataLabel: 'Version', ...columnConfig },\n { title: 'Status', dataLabel: 'Status', ...columnConfig },\n { title: 'Hosts', dataLabel: 'Hosts', ...columnConfig },\n { title: 'Created at', dataLabel: 'Created at', ...columnConfig },\n];\n\nconst getStatusCell = (row: IRow) => row.cells?.[3] as HumanizedSortable | undefined;\n\nconst ClusterRowWrapper = (props: RowWrapperProps) => {\n /* eslint-disable @typescript-eslint/ban-ts-comment */\n return (\n <RowWrapper\n {...props}\n // @ts-ignore\n data-testid={`cluster-row-${props.row?.props?.name}`}\n // @ts-ignore\n id={`cluster-row-${props.row?.props?.name}`}\n />\n );\n /* eslint-enable @typescript-eslint/ban-ts-comment */\n};\n\nconst ClustersTable: React.FC<ClustersTableProps> = ({ rows, deleteCluster }) => {\n const [deleteClusterID, setDeleteClusterID] = React.useState<DeleteClusterID>();\n const [sortBy, setSortBy] = React.useState<ISortBy>({\n index: 0, // Name-column\n direction: SortByDirection.asc,\n });\n\n const [searchString, setSearchString] = React.useState('');\n const [filters, setFilters] = React.useState<ClusterFiltersType>({\n status: [],\n });\n\n const { t } = useTranslation();\n\n React.useEffect(() => {\n const marshalled = window.sessionStorage.getItem(STORAGE_KEY_CLUSTERS_FILTER);\n if (marshalled) {\n try {\n const parsed = JSON.parse(marshalled);\n parsed.filters && setFilters(parsed.filters);\n parsed.sortBy && setSortBy(parsed.sortBy);\n parsed.searchString && setSearchString(parsed.searchString);\n } catch (e) {\n console.info('Failed to restore clusters filter: ', e);\n }\n }\n }, []);\n\n React.useEffect(() => {\n window.sessionStorage.setItem(\n STORAGE_KEY_CLUSTERS_FILTER,\n JSON.stringify({ filters, sortBy, searchString }),\n );\n }, [filters, sortBy, searchString]);\n\n const actionResolver: IActionsResolver = React.useCallback(\n (rowData) => [\n {\n title: 'Delete',\n id: `button-delete-${rowData.props.name}`,\n isDisabled:\n getClusterTableStatusCell(rowData).sortableValue === clusterStatusLabels(t).installing,\n onClick: (event: React.MouseEvent, rowIndex: number, rowData: IRowData) => {\n setDeleteClusterID({ id: rowData.props.id, name: rowData.props.name });\n },\n },\n ],\n [setDeleteClusterID],\n );\n\n const onSort: OnSort = React.useCallback(\n (_event, index, direction) => {\n setSortBy({\n index,\n direction,\n });\n },\n [setSortBy],\n );\n\n const rowFilter = React.useCallback(\n (row: IRow) => {\n const searchableProps: string[] = [row.props.name, row.props.id, row.props.baseDnsDomain].map(\n (prop: string) => (prop || '').toLowerCase(),\n );\n if (\n searchString &&\n !searchableProps.find((prop) => prop.includes(searchString.toLowerCase()))\n ) {\n return false;\n }\n\n const value = getStatusCell(row)?.sortableValue as string;\n if (filters.status.length > 0 && value && !filters.status.includes(value)) {\n return false;\n }\n\n return true;\n },\n [searchString, filters],\n );\n\n const sortedRows = React.useMemo(() => {\n return rows\n .filter(rowFilter)\n .sort(\n rowSorter(\n sortBy,\n (row: IRow, index = 0) => row.cells?.[index] as string | HumanizedSortable,\n ),\n );\n }, [rows, sortBy, rowFilter]);\n\n return (\n <>\n <ClustersListToolbar\n searchString={searchString}\n setSearchString={setSearchString}\n filters={filters}\n setFilters={setFilters}\n />\n <Table\n rows={sortedRows}\n cells={columns}\n actionResolver={actionResolver}\n aria-label=\"Clusters table\"\n sortBy={sortBy}\n onSort={onSort}\n rowWrapper={ClusterRowWrapper}\n data-testid={'clusters-table'}\n >\n <TableHeader />\n <TableBody rowKey={rowKey} />\n </Table>\n {deleteClusterID && (\n <DeleteClusterModal\n name={deleteClusterID.name}\n onClose={() => setDeleteClusterID(undefined)}\n onDelete={() => {\n deleteCluster(deleteClusterID.id);\n setDeleteClusterID(undefined);\n }}\n />\n )}\n </>\n );\n};\n\ntype DeleteClusterID = {\n id: string;\n name: string;\n};\n\nexport default ClustersTable;\n", "import * as React from 'react';\nimport { Modal, Button, ModalVariant } from '@patternfly/react-core';\n\ntype DeleteClusterModalProps = {\n name: string;\n onClose: () => void;\n onDelete: () => void;\n};\n\nconst DeleteClusterModal: React.FC<DeleteClusterModalProps> = ({ name, onClose, onDelete }) => (\n <Modal\n title=\"Delete cluster\"\n isOpen={true}\n onClose={onClose}\n variant={ModalVariant.small}\n actions={[\n <Button data-testid=\"delete-cluster-submit\" key=\"confirm\" variant=\"danger\" onClick={onDelete}>\n Delete\n </Button>,\n <Button key=\"cancel\" variant=\"link\" onClick={onClose}>\n Cancel\n </Button>,\n ]}\n >\n Are you sure you want to delete cluster {name} ?\n </Modal>\n);\n\nexport default DeleteClusterModal;\n", "import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport {\n Toolbar,\n ToolbarItem,\n ToolbarContent,\n ToolbarFilter,\n InputGroup,\n Select,\n SelectOption,\n TextInput,\n ToolbarProps,\n ToolbarFilterProps,\n SelectProps,\n TextInputProps,\n ButtonVariant,\n Spinner,\n ToolbarGroup,\n Tooltip,\n} from '@patternfly/react-core';\nimport { FilterIcon, SyncIcon } from '@patternfly/react-icons';\nimport { Cluster, clusterStatusLabels, ToolbarButton } from '../../../common';\nimport { ResourceUIState } from '../../../common';\nimport { selectClustersUIState } from '../../selectors/clusters';\nimport { fetchClustersAsync } from '../../reducers/clusters/clustersSlice';\nimport { routeBasePath } from '../../config';\nimport omit from 'lodash/omit';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type ClusterFiltersType = {\n [key: string]: string[]; // value from clusterStatusLabels\n};\n\ntype ClustersListToolbarProps = {\n searchString: string;\n setSearchString: (value: string) => void;\n filters: ClusterFiltersType;\n setFilters: (filters: ClusterFiltersType) => void;\n};\n\nconst clusterStatusFilterLabels = (t: TFunction) =>\n Array.from(new Set(Object.values(omit(clusterStatusLabels(t), 'adding-hosts'))));\n\nconst ClustersListToolbar: React.FC<ClustersListToolbarProps> = ({\n searchString,\n setSearchString,\n filters,\n setFilters,\n}) => {\n const [isStatusExpanded, setStatusExpanded] = React.useState(false);\n const history = useHistory();\n const clustersUIState = useSelector(selectClustersUIState);\n const dispatch = useDispatch();\n const fetchClusters = React.useCallback(() => dispatch(fetchClustersAsync()), [dispatch]);\n\n const onClearAllFilters: ToolbarProps['clearAllFilters'] = () => {\n setFilters({\n status: [],\n });\n };\n\n const onSearchNameChanged: TextInputProps['onChange'] = setSearchString;\n\n const onSelect = (type: string, isChecked: boolean, value: Cluster['status']) => {\n setFilters({\n ...filters,\n [type]: isChecked\n ? [...filters[type], value]\n : filters[type].filter((v: string) => v !== value),\n });\n };\n\n const onStatusToggle: SelectProps['onToggle'] = () => setStatusExpanded(!isStatusExpanded);\n const onStatusSelect: SelectProps['onSelect'] = (event, value) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n onSelect('status', event.target.checked, value as string);\n };\n\n const onDeleteChip: ToolbarFilterProps['deleteChip'] = (type, id) => {\n if (type) {\n setFilters({\n ...filters,\n [type as string]: filters[type as string].filter((v: string) => v !== id),\n });\n } else {\n onClearAllFilters();\n }\n };\n\n const onDeleteChipGroup: ToolbarFilterProps['deleteChipGroup'] = (type) => {\n setFilters({\n ...filters,\n [type as string]: [],\n });\n };\n\n const statusPlaceholder = (\n <>\n <FilterIcon /> Status\n </>\n );\n const { t } = useTranslation();\n return (\n <Toolbar\n id=\"clusters-list-toolbar\"\n className=\"pf-m-toggle-group-container\"\n collapseListedFiltersBreakpoint=\"xl\"\n clearAllFilters={onClearAllFilters}\n >\n <ToolbarContent>\n <ToolbarItem>\n <InputGroup>\n <TextInput\n name=\"search-string\"\n id=\"search-string\"\n type=\"search\"\n aria-label=\"string to be searched in cluster names or ids\"\n onChange={onSearchNameChanged}\n value={searchString}\n placeholder=\"Filter by Name, ID or Base domain\"\n title=\"Filter by Name, ID or Base domain\"\n />\n </InputGroup>\n </ToolbarItem>\n <ToolbarFilter\n chips={filters.status}\n deleteChip={onDeleteChip}\n deleteChipGroup={onDeleteChipGroup}\n categoryName=\"status\"\n >\n <Select\n variant=\"checkbox\"\n aria-label=\"status\"\n onToggle={onStatusToggle}\n onSelect={onStatusSelect}\n selections={filters.status}\n isOpen={isStatusExpanded}\n placeholderText={statusPlaceholder}\n toggleId=\"cluster-list-filter-status\"\n >\n {clusterStatusFilterLabels(t).map((label) => (\n <SelectOption\n key={label}\n value={label}\n inputId={`cluster-list-filter-status-${label}`}\n />\n ))}\n </Select>\n </ToolbarFilter>\n <ToolbarButton\n variant={ButtonVariant.primary}\n onClick={() => history.push(`${routeBasePath}/clusters/~new`)}\n id=\"button-create-new-cluster\"\n data-ouia-id=\"button-create-new-cluster\"\n >\n Create Cluster\n </ToolbarButton>\n {clustersUIState === ResourceUIState.RELOADING && <Spinner size=\"lg\" />}\n <ToolbarGroup alignment={{ lg: 'alignRight' }}>\n <ToolbarButton\n variant={ButtonVariant.plain}\n onClick={() => fetchClusters()}\n isDisabled={clustersUIState === ResourceUIState.RELOADING}\n >\n <Tooltip content=\"Refresh\">\n <SyncIcon />\n </Tooltip>\n </ToolbarButton>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n );\n};\n\nexport default ClustersListToolbar;\n", "import React from 'react';\nimport {\n PageSectionVariants,\n Breadcrumb,\n BreadcrumbItem,\n PageSection,\n} from '@patternfly/react-core';\nimport { Link } from 'react-router-dom';\nimport { isSingleClusterMode, routeBasePath } from '../../config';\nimport { ocmClient } from '../../api';\n\ntype Props = {\n clusterName?: string;\n isHidden?: boolean;\n};\n\nconst ClusterBreadcrumbs: React.FC<Props> = ({ clusterName, isHidden = isSingleClusterMode() }) =>\n isHidden ? null : (\n <PageSection variant={PageSectionVariants.light}>\n {(clusterName || ocmClient) && (\n <Breadcrumb>\n <BreadcrumbItem>\n <Link to={'/'}>Clusters</Link>\n </BreadcrumbItem>\n {clusterName ? (\n <BreadcrumbItem>\n <Link to={`${routeBasePath}/clusters`}>Assisted Clusters</Link>\n </BreadcrumbItem>\n ) : (\n <BreadcrumbItem isActive>Assisted Clusters</BreadcrumbItem>\n )}\n {clusterName && <BreadcrumbItem isActive>{clusterName}</BreadcrumbItem>}\n </Breadcrumb>\n )}\n </PageSection>\n );\n\nexport default ClusterBreadcrumbs;\n", "import React from 'react';\nimport { PageSectionVariants, TextContent, Text, PageSection } from '@patternfly/react-core';\nimport { AlertsContextProvider } from '../../../common';\nimport ClusterBreadcrumbs from './ClusterBreadcrumbs';\nimport { ClusterDefaultConfigurationProvider } from '../clusterConfiguration/ClusterDefaultConfigurationContext';\nimport NewClusterWizard from '../clusterWizard/NewClusterWizard';\nimport { FeatureSupportLevelProvider } from '../featureSupportLevels';\nimport ClusterWizardContextProvider from '../clusterWizard/ClusterWizardContextProvider';\nimport { SentryErrorMonitorContextProvider } from '../SentryErrorMonitorContextProvider';\nimport ClusterLoading from './ClusterLoading';\nimport { ClusterUiError } from './ClusterPageErrors';\n\nconst NewClusterPage = () => {\n return (\n <AlertsContextProvider>\n <SentryErrorMonitorContextProvider>\n <ClusterDefaultConfigurationProvider\n loadingUI={<ClusterLoading />}\n errorUI={<ClusterUiError />}\n >\n <FeatureSupportLevelProvider loadingUi={<ClusterLoading />}>\n <ClusterBreadcrumbs clusterName=\"New cluster\" />\n <PageSection variant={PageSectionVariants.light}>\n <TextContent>\n <Text component=\"h1\" className=\"pf-u-display-inline\">\n Install OpenShift with the Assisted Installer\n </Text>\n </TextContent>\n </PageSection>\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ClusterWizardContextProvider>\n <NewClusterWizard />\n </ClusterWizardContextProvider>\n </PageSection>\n </FeatureSupportLevelProvider>\n </ClusterDefaultConfigurationProvider>\n </SentryErrorMonitorContextProvider>\n </AlertsContextProvider>\n );\n};\n\nexport default NewClusterPage;\n", "import classNames from 'classnames';\nimport React from 'react';\nimport ClusterDetails from './ClusterDetails';\n\nconst NewClusterWizard: React.FC = () => {\n return (\n <div className={classNames('pf-c-wizard', 'cluster-wizard')}>\n <ClusterDetails />\n </div>\n );\n};\n\nexport default NewClusterWizard;\n", "import { PageSection, PageSectionVariants } from '@patternfly/react-core';\nimport { LoadingState } from '../../../common';\nimport React from 'react';\n\nconst ClusterLoading = () => (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <LoadingState />\n </PageSection>\n);\n\nexport default ClusterLoading;\n", "import React from 'react';\nimport { Button, ButtonVariant, PageSection, PageSectionVariants } from '@patternfly/react-core';\nimport { Link } from 'react-router-dom';\nimport { ErrorState } from '../../../common';\nimport { isSingleClusterMode, routeBasePath } from '../../config';\n\nexport const getErrorStateActions = () => {\n if (isSingleClusterMode()) {\n return [];\n }\n\n return [\n <Button\n key=\"cancel\"\n variant={ButtonVariant.secondary}\n component={(props) => <Link to={`${routeBasePath}/clusters`} {...props} />}\n >\n Back\n </Button>,\n ];\n};\n\nexport const ClusterUiError = () => (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState\n title=\"Failed to retrieve the default configuration\"\n actions={getErrorStateActions()}\n />\n </PageSection>\n);\n", "import React from 'react';\nimport { Redirect, RouteComponentProps } from 'react-router-dom';\nimport { PageSection, PageSectionVariants, Text, TextContent } from '@patternfly/react-core';\nimport {\n AddHostsContextProvider,\n AlertsContextProvider,\n Cluster,\n CpuArchitecture,\n ErrorState,\n InfraEnv,\n ResourceUIState,\n} from '../../../common';\nimport ClusterDetail from '../clusterDetail/ClusterDetail';\nimport CancelInstallationModal from '../clusterDetail/CancelInstallationModal';\nimport ResetClusterModal from '../clusterDetail/ResetClusterModal';\nimport { AddHosts } from '../AddHosts';\nimport { ClusterDefaultConfigurationProvider } from '../clusterConfiguration/ClusterDefaultConfigurationContext';\nimport ClusterBreadcrumbs from './ClusterBreadcrumbs';\nimport ClusterWizard from '../clusterWizard/ClusterWizard';\nimport { ModalDialogsContextProvider } from '../hosts/ModalDialogsContext';\nimport { useClusterPolling, useFetchCluster } from './clusterPolling';\nimport { DiscoveryImageModal } from '../clusterConfiguration/DiscoveryImageModal';\nimport { routeBasePath } from '../../config';\nimport { FeatureSupportLevelProvider } from '../featureSupportLevels';\nimport ClusterWizardContextProvider from '../clusterWizard/ClusterWizardContextProvider';\nimport useInfraEnv from '../../hooks/useInfraEnv';\nimport { SentryErrorMonitorContextProvider } from '../SentryErrorMonitorContextProvider';\nimport { forceReload } from '../../reducers/clusters';\nimport { getErrorStateActions, ClusterUiError } from './ClusterPageErrors';\nimport ClusterLoading from './ClusterLoading';\nimport ClusterPollingErrorModal from '../clusterDetail/ClusterPollingErrorModal';\n\ntype MatchParams = {\n clusterId: string;\n};\n\nconst ClusterPage: React.FC<RouteComponentProps<MatchParams>> = ({ match }) => {\n const { clusterId } = match.params;\n const fetchCluster = useFetchCluster(clusterId);\n const { cluster, uiState, errorDetail } = useClusterPolling(clusterId);\n const {\n infraEnv,\n isLoading: infraEnvLoading,\n error: infraEnvError,\n updateInfraEnv,\n } = useInfraEnv(clusterId, CpuArchitecture.USE_DAY1_ARCHITECTURE);\n\n const getContent = (cluster: Cluster, infraEnv: InfraEnv) => {\n if (cluster.status === 'adding-hosts') {\n return (\n <AddHostsContextProvider cluster={cluster} resetCluster={forceReload}>\n <AddHosts />\n </AddHostsContextProvider>\n );\n } else if (\n [\n 'preparing-for-installation',\n 'installing',\n 'installing-pending-user-action',\n 'finalizing',\n 'installed',\n 'error',\n 'cancelled',\n ].includes(cluster.status)\n ) {\n return (\n <>\n <ClusterBreadcrumbs clusterName={cluster.name} />\n <PageSection variant={PageSectionVariants.light}>\n <TextContent>\n <Text component=\"h1\">{cluster.name}</Text>\n </TextContent>\n </PageSection>\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ClusterDetail cluster={cluster} />\n </PageSection>\n </>\n );\n } else {\n return (\n <>\n <ClusterBreadcrumbs clusterName={cluster.name} />\n <PageSection variant={PageSectionVariants.light}>\n <TextContent>\n <Text component=\"h1\" className=\"pf-u-display-inline\">\n Install OpenShift with the Assisted Installer\n </Text>\n </TextContent>\n </PageSection>\n <PageSection variant={PageSectionVariants.light}>\n <ClusterWizardContextProvider cluster={cluster} infraEnv={infraEnv}>\n <ClusterWizard\n cluster={cluster}\n infraEnv={infraEnv}\n updateInfraEnv={updateInfraEnv}\n />\n </ClusterWizardContextProvider>\n </PageSection>\n </>\n );\n }\n };\n\n if (uiState === ResourceUIState.LOADING || infraEnvLoading) {\n return <ClusterLoading />;\n }\n\n if (uiState === ResourceUIState.ERROR && !cluster) {\n if (Number(errorDetail?.code) === 404) {\n return <Redirect to={`${routeBasePath}/clusters`} />;\n }\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState\n title=\"Failed to fetch the cluster\"\n fetchData={\n Number(errorDetail?.code) === 401 ? () => window.location.reload() : fetchCluster\n }\n actions={getErrorStateActions()}\n />\n </PageSection>\n );\n }\n\n if (infraEnvError) {\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState\n title=\"Cluster not found\"\n actions={getErrorStateActions()}\n content={\n 'Check to make sure the cluster-ID is valid. Otherwise, the cluster may have been deleted.'\n }\n />\n </PageSection>\n );\n }\n\n if (cluster && infraEnv) {\n const isOutdatedClusterData = uiState === ResourceUIState.ERROR;\n return (\n <AlertsContextProvider>\n <SentryErrorMonitorContextProvider>\n <ModalDialogsContextProvider>\n <ClusterDefaultConfigurationProvider\n loadingUI={<ClusterLoading />}\n errorUI={<ClusterUiError />}\n >\n <FeatureSupportLevelProvider loadingUi={<ClusterLoading />} cluster={cluster}>\n {getContent(cluster, infraEnv)}\n {isOutdatedClusterData && <ClusterPollingErrorModal />}\n <CancelInstallationModal />\n <ResetClusterModal />\n <DiscoveryImageModal />\n </FeatureSupportLevelProvider>\n </ClusterDefaultConfigurationProvider>\n </ModalDialogsContextProvider>\n </SentryErrorMonitorContextProvider>\n </AlertsContextProvider>\n );\n }\n\n return <Redirect to=\"/clusters\" />;\n};\n\nexport default ClusterPage;\n", "import React from 'react';\nimport {\n ButtonVariant,\n Card,\n CardBody,\n CardFooter,\n CardTitle,\n Grid,\n Stack,\n StackItem,\n Title,\n Toolbar,\n ToolbarContent,\n} from '@patternfly/react-core';\nimport { getApiErrorMessage, handleApiError } from '../../api';\nimport { DiscoveryImageModal } from '../clusterConfiguration/DiscoveryImageModal';\nimport { ModalDialogsContextProvider } from '../hosts/ModalDialogsContext';\nimport {\n ToolbarButton,\n getReadyHostCount,\n Alerts,\n AddHostsContext,\n alertsSlice,\n canInstallHost,\n} from '../../../common';\nimport InventoryAddHosts from './InventoryAddHost';\nimport { onFetchEvents } from '../fetching/fetchEvents';\nimport { HostsService } from '../../services';\nimport ClusterDetailStatusVarieties, {\n useClusterStatusVarieties,\n} from '../clusterDetail/ClusterDetailStatusVarieties';\nimport ViewClusterEventsButton from '../../../common/components/ui/ViewClusterEventsButton';\n\nconst { addAlert } = alertsSlice.actions;\n\nexport const AddHosts = () => {\n const { cluster, resetCluster } = React.useContext(AddHostsContext);\n const [isSubmitting, setSubmitting] = React.useState(false);\n const clusterVarieties = useClusterStatusVarieties(cluster);\n\n const handleHostsInstall = React.useCallback(async () => {\n setSubmitting(true);\n try {\n if (!cluster || !resetCluster || !cluster.hosts) {\n return;\n }\n\n const hostsToBeInstalled = cluster.hosts.filter((host) =>\n canInstallHost(cluster, host.status),\n );\n\n await HostsService.installAll(hostsToBeInstalled);\n await resetCluster();\n } catch (e) {\n handleApiError(e, () =>\n addAlert({\n title: 'Failed to start hosts installation.',\n message: getApiErrorMessage(e),\n }),\n );\n } finally {\n setTimeout(() => {\n setSubmitting(false);\n }, 10000);\n }\n }, [cluster, resetCluster]);\n\n if (!cluster || !resetCluster) {\n return null;\n }\n\n return (\n <ModalDialogsContextProvider>\n <Card>\n <CardTitle>\n <Title headingLevel=\"h2\" size=\"lg\" className=\"card-title\">\n Host Discovery\n </Title>\n </CardTitle>\n <CardBody>\n <Stack hasGutter>\n <StackItem>\n <Grid hasGutter>\n <ClusterDetailStatusVarieties\n cluster={cluster}\n clusterVarieties={clusterVarieties}\n />\n </Grid>\n </StackItem>\n <StackItem>\n <InventoryAddHosts cluster={cluster} />\n </StackItem>\n </Stack>\n </CardBody>\n\n <CardFooter>\n <Alerts />\n <Toolbar id=\"cluster-toolbar\">\n <ToolbarContent>\n <ToolbarButton\n variant={ButtonVariant.primary}\n name=\"install\"\n onClick={() => void handleHostsInstall()}\n isDisabled={isSubmitting || getReadyHostCount(cluster) === 0}\n >\n Install ready hosts\n </ToolbarButton>\n <ViewClusterEventsButton cluster={cluster} onFetchEvents={onFetchEvents} />\n </ToolbarContent>\n </Toolbar>\n </CardFooter>\n </Card>\n <DiscoveryImageModal />\n </ModalDialogsContextProvider>\n );\n};\n", "import React from 'react';\nimport { Text, TextContent, Alert, AlertVariant, Stack, StackItem } from '@patternfly/react-core';\nimport ClusterHostsTable from '../hosts/ClusterHostsTable';\nimport InformationAndAlerts from '../clusterConfiguration/InformationAndAlerts';\nimport { canSelectCpuArchitecture, Cluster, isArmArchitecture } from '../../../common';\nimport Day2WizardContextProvider from './day2Wizard/Day2WizardContextProvider';\nimport Day2DiscoveryImageModalButton from './day2Wizard/Day2DiscoveryImageModalButton';\nimport Day2Wizard from './day2Wizard/Day2Wizard';\n\nconst InventoryAddHosts = ({ cluster }: { cluster?: Cluster }) => {\n if (!cluster) {\n return null;\n }\n\n const showArmOnlyAlert = !canSelectCpuArchitecture(cluster) && isArmArchitecture(cluster);\n return (\n <Stack hasGutter>\n <StackItem>\n <TextContent>\n <Text component=\"p\">\n <Day2WizardContextProvider>\n <Day2DiscoveryImageModalButton cluster={cluster} />\n <Day2Wizard />\n </Day2WizardContextProvider>\n </Text>\n <InformationAndAlerts cluster={cluster} />\n </TextContent>\n </StackItem>\n {showArmOnlyAlert && (\n <StackItem>\n <Alert\n title=\"Only hosts that have arm64 cpu architecture can be added to this cluster.\"\n variant={AlertVariant.info}\n data-testid=\"arm-architecture-alert\"\n isInline\n />\n </StackItem>\n )}\n <StackItem>\n <ClusterHostsTable cluster={cluster} />\n </StackItem>\n </Stack>\n );\n};\n\nexport default InventoryAddHosts;\n", "import React, { PropsWithChildren } from 'react';\nimport Day2WizardContext, { Day2WizardContextType } from './Day2WizardContext';\nimport {\n AssistedInstallerOCMPermissionTypesListType,\n Cluster,\n CpuArchitecture,\n InfraEnv,\n} from '../../../../common';\nimport { Day2WizardStepsType, defaultWizardSteps, staticIpFormViewSubSteps } from './constants';\nimport { HostsNetworkConfigurationType } from '../../../services';\nimport { StaticIpView } from '../../clusterConfiguration/staticIp/data/dataTypes';\n\nconst getWizardStepIds = (staticIpView?: string): Day2WizardStepsType[] => {\n const stepIds: Day2WizardStepsType[] = [...defaultWizardSteps];\n if (staticIpView === StaticIpView.YAML) {\n stepIds.splice(1, 0, 'static-ip-yaml-view');\n } else if (staticIpView === StaticIpView.FORM) {\n stepIds.splice(1, 0, ...staticIpFormViewSubSteps);\n }\n return stepIds;\n};\n\nconst getNextStep = (wizardStepIds: Day2WizardStepsType[], currentStepId: Day2WizardStepsType) => {\n const currentStepIdx = wizardStepIds.indexOf(currentStepId);\n return wizardStepIds[currentStepIdx + 1];\n};\n\nconst Day2WizardContextProvider = ({\n children,\n}: PropsWithChildren<{\n cluster?: Cluster;\n infraEnv?: InfraEnv;\n permissions?: AssistedInstallerOCMPermissionTypesListType;\n}>) => {\n const [currentStepId, setCurrentStepId] = React.useState<Day2WizardStepsType>('cluster-details');\n const [selectedCpuArchitecture, setSelectedCpuArchitecture] = React.useState<CpuArchitecture>(\n CpuArchitecture.x86,\n );\n const [selectedIsoUrl, setSelectedIsoUrl] = React.useState<string>('');\n const [wizardStepIds, setWizardStepIds] = React.useState<Day2WizardStepsType[]>(\n getWizardStepIds(),\n );\n\n const contextValue = React.useMemo<Day2WizardContextType | null>(() => {\n if (!wizardStepIds || !currentStepId) {\n return null;\n }\n\n return {\n moveBack(): void {\n const currentStepIdx = wizardStepIds.indexOf(currentStepId);\n let nextStepId = wizardStepIds[currentStepIdx - 1];\n if (nextStepId === 'static-ip-host-configurations') {\n //when moving back to static ip form view, it should go to network wide configurations\n nextStepId = 'static-ip-network-wide-configurations';\n }\n setCurrentStepId(nextStepId);\n },\n moveNext(): void {\n setCurrentStepId(getNextStep(wizardStepIds, currentStepId));\n },\n onUpdateStaticIpView(view: StaticIpView): void {\n setWizardStepIds(getWizardStepIds(view));\n if (view === StaticIpView.YAML) {\n setCurrentStepId('static-ip-yaml-view');\n } else {\n setCurrentStepId('static-ip-network-wide-configurations');\n }\n },\n onUpdateHostNetworkConfigType(type: HostsNetworkConfigurationType): void {\n let stepIds;\n if (type === HostsNetworkConfigurationType.STATIC) {\n stepIds = getWizardStepIds(StaticIpView.FORM);\n } else {\n stepIds = getWizardStepIds();\n }\n setWizardStepIds(stepIds);\n setCurrentStepId(getNextStep(stepIds, currentStepId));\n },\n\n wizardStepIds,\n currentStepId,\n setCurrentStepId,\n selectedIsoUrl,\n setSelectedIsoUrl,\n selectedCpuArchitecture,\n setSelectedCpuArchitecture,\n };\n }, [wizardStepIds, currentStepId, selectedIsoUrl, selectedCpuArchitecture]);\n\n if (!contextValue) {\n return null;\n }\n\n return (\n <>\n <Day2WizardContext.Provider value={contextValue}>{children}</Day2WizardContext.Provider>\n </>\n );\n};\n\nexport default Day2WizardContextProvider;\n", "import React from 'react';\nimport { HostsNetworkConfigurationType } from '../../../services';\nimport { StaticIpView } from '../../clusterConfiguration/staticIp/data/dataTypes';\nimport { Day2WizardStepsType } from './constants';\nimport { CpuArchitecture } from '../../../../common';\n\nexport type Day2WizardContextType = {\n currentStepId: Day2WizardStepsType;\n setCurrentStepId(stepId: Day2WizardStepsType): void;\n selectedIsoUrl: string;\n setSelectedIsoUrl: (isoUrl: string) => void;\n selectedCpuArchitecture: CpuArchitecture;\n setSelectedCpuArchitecture(cpuArchitecture: CpuArchitecture): void;\n moveBack(): void;\n moveNext(): void;\n onUpdateStaticIpView(view: StaticIpView): void;\n onUpdateHostNetworkConfigType(type: HostsNetworkConfigurationType): void;\n wizardStepIds: Day2WizardStepsType[];\n};\n\nconst Day2WizardContext = React.createContext<Day2WizardContextType | null>(null);\n\nexport const useDay2WizardContext = () => {\n const context = React.useContext(Day2WizardContext);\n if (!context) {\n throw new Error('useDay2WizardContext must be used within Day2WizardContextProvider');\n }\n return context;\n};\n\nexport default Day2WizardContext;\n", "export type Day2WizardStepsType =\n | 'cluster-details'\n | 'generate-iso'\n | 'download-iso'\n | 'static-ip-yaml-view'\n | 'static-ip-network-wide-configurations'\n | 'static-ip-host-configurations';\n\nexport const day2WizardStepNames: { [key in Day2WizardStepsType]: string } = {\n 'cluster-details': 'Cluster details',\n 'static-ip-yaml-view': 'Static network configurations',\n 'static-ip-network-wide-configurations': 'Network-wide configurations',\n 'static-ip-host-configurations': 'Host specific configurations',\n 'generate-iso': 'Generate discovery ISO',\n 'download-iso': 'Download discovery ISO',\n};\n\nexport const defaultWizardSteps: Day2WizardStepsType[] = [\n 'cluster-details',\n 'generate-iso',\n 'download-iso',\n];\n\nexport const staticIpFormViewSubSteps: Day2WizardStepsType[] = [\n 'static-ip-network-wide-configurations',\n 'static-ip-host-configurations',\n];\n", "import React from 'react';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { Cluster } from '../../../../common';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\n\nconst Day2DiscoveryImageModalButton = ({ cluster }: { cluster: Cluster }) => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const { open } = day2DiscoveryImageDialog;\n\n return (\n <Button\n variant={ButtonVariant.secondary}\n onClick={() => open({ cluster })}\n id={`bare-metal-inventory-add-host-button-download-discovery-iso`}\n >\n Add hosts\n </Button>\n );\n};\n\nexport default Day2DiscoveryImageModalButton;\n", "import React from 'react';\nimport { Modal, ModalVariant, WizardHeader } from '@patternfly/react-core';\nimport classNames from 'classnames';\nimport { ClusterWizardStep, WizardFooter } from '../../../../common';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\nimport { Day2WizardStepsType } from './constants';\nimport Day2ClusterDetails from './Day2ClusterDetails';\nimport Day2DownloadISO from './Day2DownloadISO';\nimport Day2GenerateISO from './Day2GenerateISO';\nimport Day2StaticIP from './Day2StaticIP';\nimport Day2WizardNav from './Day2WizardNav';\nimport { Day2WizardContextType, useDay2WizardContext } from './Day2WizardContext';\n\n// TODO(jgyselov): remove wizardContext\nconst getCurrentStep = (step: Day2WizardStepsType, wizardContext: Day2WizardContextType) => {\n switch (step) {\n case 'cluster-details':\n return <Day2ClusterDetails />;\n case 'generate-iso':\n return <Day2GenerateISO />;\n case 'download-iso':\n return <Day2DownloadISO />;\n case 'static-ip-network-wide-configurations':\n case 'static-ip-host-configurations':\n case 'static-ip-yaml-view':\n return <Day2StaticIP />;\n default:\n return (\n <ClusterWizardStep\n navigation={<Day2WizardNav />}\n footer={\n <WizardFooter\n onNext={() => wizardContext.moveNext()}\n onBack={() => wizardContext.moveBack()}\n isBackDisabled={wizardContext.currentStepId === 'cluster-details'}\n isNextDisabled={wizardContext.currentStepId === 'download-iso'}\n onCancel={close}\n />\n }\n >\n Step {step}\n </ClusterWizardStep>\n );\n }\n};\n\nconst Day2Wizard = () => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const { isOpen, close } = day2DiscoveryImageDialog;\n const wizardContext = useDay2WizardContext();\n\n return (\n <Modal isOpen={isOpen} variant={ModalVariant.large} showClose={false} hasNoBodyWrapper>\n <div className={classNames('pf-c-wizard', 'cluster-wizard')}>\n <WizardHeader\n title={'Add hosts'}\n description={'Choose the settings for adding a new host'}\n onClose={close}\n />\n {getCurrentStep(wizardContext.currentStepId, wizardContext)}\n </div>\n </Modal>\n );\n};\n\nexport default Day2Wizard;\n", "import { Grid, GridItem } from '@patternfly/react-core';\nimport { Form, Formik } from 'formik';\nimport React from 'react';\nimport {\n canSelectCpuArchitecture,\n Cluster,\n ClusterWizardStep,\n ClusterWizardStepHeader,\n CpuArchitecture,\n ErrorState,\n LoadingState,\n WizardFooter,\n} from '../../../../common';\nimport DiscoverImageCpuArchitectureControlGroup from '../../../../common/components/clusterConfiguration/DiscoveryImageCpuArchitectureControlGroup';\nimport { HostsNetworkConfigurationType, InfraEnvsService } from '../../../services';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\nimport { handleApiError } from '../../../api';\nimport { Day2ClusterDetailValues } from '../types';\nimport { useDay2WizardContext } from './Day2WizardContext';\nimport Day2WizardNav from './Day2WizardNav';\nimport Day2HostStaticIpConfigurations from './Day2StaticIpHostConfigurations';\nimport { mapClusterCpuArchToInfraEnvCpuArch } from '../../../services/CpuArchitectureService';\n\nconst getDay2ClusterDetailInitialValues = async (\n clusterId: Cluster['id'],\n day1CpuArchitecture: CpuArchitecture,\n) => {\n try {\n const infraEnv = await InfraEnvsService.getInfraEnv(clusterId, day1CpuArchitecture);\n\n return {\n cpuArchitecture: day1CpuArchitecture,\n hostsNetworkConfigurationType: infraEnv.staticNetworkConfig\n ? HostsNetworkConfigurationType.STATIC\n : HostsNetworkConfigurationType.DHCP,\n };\n } catch (error) {\n handleApiError(error);\n return null;\n }\n};\n\nconst Day2ClusterDetails = () => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const {\n close,\n data: { cluster: day2Cluster },\n } = day2DiscoveryImageDialog;\n const wizardContext = useDay2WizardContext();\n const [initialValues, setInitialValues] = React.useState<Day2ClusterDetailValues | null>();\n const [isSubmitting, setSubmitting] = React.useState(false);\n const canSelectCpuArch = canSelectCpuArchitecture(day2Cluster);\n\n const day1CpuArchitecture = mapClusterCpuArchToInfraEnvCpuArch(day2Cluster.cpuArchitecture);\n\n React.useEffect(() => {\n const fetchAndSetInitialValues = async () => {\n const initialValues = await getDay2ClusterDetailInitialValues(\n day2Cluster.id,\n day1CpuArchitecture,\n );\n setInitialValues(initialValues);\n };\n void fetchAndSetInitialValues();\n }, [day2Cluster.id, day1CpuArchitecture]);\n\n const handleSubmit = React.useCallback(\n async (values: Day2ClusterDetailValues) => {\n try {\n setSubmitting(true);\n // - If the user selected DHCP, update all infraEnvs to have DHCP too\n // - If the user selected StaticIP, perform no changes yet.\n // (The changes will be synced to all the infraEnvs when they are submitted on the StaticIP steps)\n const isDhcp = values.hostsNetworkConfigurationType === HostsNetworkConfigurationType.DHCP;\n if (isDhcp) {\n await InfraEnvsService.updateAllInfraEnvsToDhcp(day2Cluster.id);\n }\n wizardContext.setSelectedCpuArchitecture(values.cpuArchitecture);\n wizardContext.onUpdateHostNetworkConfigType(values.hostsNetworkConfigurationType);\n } catch (error) {\n handleApiError(error);\n } finally {\n setSubmitting(false);\n }\n },\n [day2Cluster.id, wizardContext],\n );\n\n if (initialValues === undefined) {\n return <LoadingState />;\n } else if (initialValues === null) {\n return <ErrorState content=\"Failed to load associated data for the Day2 cluster\" />;\n }\n\n return (\n <Formik initialValues={initialValues} onSubmit={handleSubmit}>\n {({ submitForm }) => {\n return (\n <ClusterWizardStep\n navigation={<Day2WizardNav />}\n footer={\n <WizardFooter\n onNext={() => {\n void submitForm();\n }}\n onBack={() => wizardContext.moveBack()}\n isBackDisabled={wizardContext.currentStepId === 'cluster-details'}\n isNextDisabled={wizardContext.currentStepId === 'download-iso'}\n onCancel={close}\n isSubmitting={isSubmitting}\n />\n }\n >\n <Form id=\"day2-wizard-cluster-details__form\">\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Cluster details</ClusterWizardStepHeader>\n </GridItem>\n <GridItem span={12} lg={10} xl={9} xl2={7}>\n <DiscoverImageCpuArchitectureControlGroup\n canSelectCpuArchitecture={canSelectCpuArch}\n day1CpuArchitecture={day1CpuArchitecture}\n openshiftVersion={day2Cluster.openshiftVersion}\n />\n </GridItem>\n <GridItem>\n <Day2HostStaticIpConfigurations />\n </GridItem>\n </Grid>\n </Form>\n </ClusterWizardStep>\n );\n }}\n </Formik>\n );\n};\n\nexport default Day2ClusterDetails;\n", "import React from 'react';\nimport { FormGroup, Flex, FlexItem, TextContent, Text, TextVariants } from '@patternfly/react-core';\nimport { DetailItem, DetailList, getFieldId, RadioField } from '../ui';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\nimport { CpuArchitecture, SupportedCpuArchitectures } from '../../types';\nimport { FeatureSupportLevelBadge } from '../featureSupportLevels';\nimport { Cluster } from '../../api';\n\nconst GROUP_NAME = 'cpuArchitecture';\n\nconst DiscoverImageCpuArchitectureControlGroup = ({\n canSelectCpuArchitecture,\n day1CpuArchitecture,\n openshiftVersion,\n}: {\n canSelectCpuArchitecture: boolean;\n day1CpuArchitecture: CpuArchitecture | undefined;\n openshiftVersion: Cluster['openshiftVersion'];\n}) => {\n const { t } = useTranslation();\n\n if (!canSelectCpuArchitecture) {\n return (\n <DetailList>\n <DetailItem\n title={t('ai:CPU architecture')}\n value={day1CpuArchitecture}\n testId=\"cpu-architecture\"\n />\n </DetailList>\n );\n }\n\n return (\n <FormGroup\n isInline\n fieldId={getFieldId(GROUP_NAME, 'radio')}\n label={\n <TextContent>\n <Text component={TextVariants.h4}>\n {t('ai:CPU architecture')}\n <FeatureSupportLevelBadge\n featureId=\"MULTIARCH_RELEASE_IMAGE\"\n openshiftVersion={openshiftVersion}\n />\n </Text>\n </TextContent>\n }\n >\n <Flex>\n {SupportedCpuArchitectures.map((cpuArch) => {\n return (\n <FlexItem key={cpuArch}>\n <RadioField\n key={cpuArch}\n id={`cpu-arch_${cpuArch}`}\n name={GROUP_NAME}\n label={cpuArch}\n value={cpuArch}\n data-testid={`cpu-arch_${cpuArch}`}\n />\n </FlexItem>\n );\n })}\n </Flex>\n </FormGroup>\n );\n};\n\nexport default DiscoverImageCpuArchitectureControlGroup;\n", "import React from 'react';\nimport { WizardNav, WizardNavItem } from '@patternfly/react-core';\nimport { Day2WizardStepsType, day2WizardStepNames, staticIpFormViewSubSteps } from './constants';\nimport { useDay2WizardContext } from './Day2WizardContext';\nimport { isStaticIpStep } from '../../clusterWizard/wizardTransition';\n\nconst Day2WizardNav = () => {\n const wizardContext = useDay2WizardContext();\n\n const isStepIdxAfterCurrent = (idx: number) => {\n return !wizardContext.wizardStepIds.slice(idx).includes(wizardContext.currentStepId);\n };\n\n const isStepDisabled = (idx: number, stepId: Day2WizardStepsType) => {\n return stepId === 'cluster-details' ? false : isStepIdxAfterCurrent(idx);\n };\n\n const getNavItem = (idx: number, stepId: Day2WizardStepsType): React.ReactNode => {\n return (\n <WizardNavItem\n step={idx}\n key={stepId}\n content={day2WizardStepNames[stepId]}\n onNavItemClick={() => wizardContext.setCurrentStepId(stepId)}\n isCurrent={wizardContext.currentStepId === stepId}\n isDisabled={isStepDisabled(idx, stepId)}\n />\n );\n };\n\n const getStaticIpFormViewNavItem = (idx: number): React.ReactNode => {\n return (\n <WizardNavItem\n step={idx}\n isExpandable={true}\n content=\"Static network configurations\"\n key=\"static-network-configuration-form-view\"\n isCurrent={isStaticIpStep(wizardContext.currentStepId)}\n isDisabled={isStepIdxAfterCurrent(idx)}\n >\n <WizardNav returnList>\n {staticIpFormViewSubSteps.map((stepId, subIdx) => {\n return getNavItem(idx + subIdx, stepId);\n })}\n </WizardNav>\n </WizardNavItem>\n );\n };\n\n const getWizardNavItems = (): React.ReactNode[] => {\n const navItems: React.ReactNode[] = [];\n let i = 0;\n while (i < wizardContext.wizardStepIds.length) {\n const stepId = wizardContext.wizardStepIds[i];\n if (stepId === 'static-ip-network-wide-configurations') {\n navItems.push(getStaticIpFormViewNavItem(i));\n //skip iteration on form view sub steps\n i += 2;\n } else {\n navItems.push(getNavItem(i, stepId));\n i += 1;\n }\n }\n return navItems;\n };\n\n return <WizardNav>{getWizardNavItems()}</WizardNav>;\n};\n\nexport default Day2WizardNav;\n", "import React from 'react';\nimport { Flex, FlexItem, FormGroup, TextContent, TextVariants, Text } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport { HostsNetworkConfigurationType } from '../../../services';\nimport { getFieldId, RadioField } from '../../../../common';\nimport { Day2ClusterDetailValues } from '../types';\n\nconst GROUP_NAME = 'hostsNetworkConfigurationType';\n\nconst Day2HostStaticIpConfigurations = () => {\n const { setFieldValue } = useFormikContext<Day2ClusterDetailValues>();\n\n const onChangeNetworkType = (event: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue('hostsNetworkConfigurationType', event.target.value);\n };\n\n return (\n <FormGroup\n label={\n <TextContent>\n <Text component={TextVariants.h4}>Hosts' network configuration</Text>\n </TextContent>\n }\n fieldId={getFieldId(GROUP_NAME, 'radio')}\n isInline\n onChange={onChangeNetworkType}\n >\n <Flex>\n <FlexItem key={HostsNetworkConfigurationType.DHCP}>\n <RadioField\n name={GROUP_NAME}\n value={HostsNetworkConfigurationType.DHCP}\n label=\"DHCP only\"\n />\n </FlexItem>\n <FlexItem key={HostsNetworkConfigurationType.STATIC}>\n <RadioField\n name={GROUP_NAME}\n value={HostsNetworkConfigurationType.STATIC}\n label=\"Static IP, bridges, and bonds\"\n />\n </FlexItem>\n </Flex>\n </FormGroup>\n );\n};\n\nexport default Day2HostStaticIpConfigurations;\n", "import { Cluster, CpuArchitecture, OcmCpuArchitecture } from '../../common';\n\nconst mapOcmArchToCpuArchitecture = (ocmArch: OcmCpuArchitecture | string): CpuArchitecture => {\n switch (ocmArch) {\n case OcmCpuArchitecture.x86:\n case OcmCpuArchitecture.MULTI:\n return CpuArchitecture.x86;\n case OcmCpuArchitecture.ARM:\n return CpuArchitecture.ARM;\n default:\n throw new Error(`Unknown OCM CPU architecture: ${ocmArch}`);\n }\n};\n\n/**\n * Takes the cluster.cpuArchitecture value and maps it to\n * a valid infraEnv cpuArchitecture value (currently either x86 or AMD).\n *\n * As of 2022-10-27, cluster's cpuArchitecture can be:\n * - For an AI cluster: CpuArchitecture.x86, CpuArchitecture.ARM or the value \"multi\"\n * - For an OCM cluster: values as defined in OcmCpuArchitecture\n *\n * @param clusterCpuArchitecture the cluster's cpuArchitecture value\n */\nconst mapClusterCpuArchToInfraEnvCpuArch = (\n clusterCpuArchitecture: Cluster['cpuArchitecture'] | OcmCpuArchitecture,\n): CpuArchitecture => {\n switch (clusterCpuArchitecture) {\n case CpuArchitecture.ARM:\n case OcmCpuArchitecture.ARM:\n return CpuArchitecture.ARM;\n\n case CpuArchitecture.DAY1_CLUSTER_USES_MULTI:\n case OcmCpuArchitecture.MULTI:\n case CpuArchitecture.x86:\n case OcmCpuArchitecture.x86:\n default:\n // For multi, set default selection to x86, although they can choose the other architectures too\n return CpuArchitecture.x86;\n }\n};\n\nexport { mapOcmArchToCpuArchitecture, mapClusterCpuArchToInfraEnvCpuArch };\n", "import React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { ClusterWizardStep, ClusterWizardStepHeader, isSNO } from '../../../../common';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\nimport { useDay2WizardContext } from './Day2WizardContext';\nimport Day2WizardNav from './Day2WizardNav';\nimport DiscoveryImageSummary from '../../clusterConfiguration/DiscoveryImageSummary';\n\nconst Day2DownloadISO = () => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const { close, data } = day2DiscoveryImageDialog;\n const cluster = data.cluster;\n const wizardContext = useDay2WizardContext();\n\n return (\n <ClusterWizardStep navigation={<Day2WizardNav />}>\n <Stack hasGutter>\n <StackItem>\n <ClusterWizardStepHeader>Download Discovery ISO</ClusterWizardStepHeader>\n </StackItem>\n <StackItem>\n <DiscoveryImageSummary\n onClose={close}\n onReset={() => wizardContext.moveBack()}\n clusterName={cluster?.name || 'cluster'}\n isSNO={isSNO(cluster)}\n isoDownloadUrl={wizardContext.selectedIsoUrl}\n cpuArchitecture={wizardContext.selectedCpuArchitecture}\n />\n </StackItem>\n </Stack>\n </ClusterWizardStep>\n );\n};\n\nexport default Day2DownloadISO;\n", "import React from 'react';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { ClusterWizardStep, ClusterWizardStepHeader } from '../../../../common';\nimport DiscoveryImageForm from '../../clusterConfiguration/DiscoveryImageForm';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\nimport { useDay2WizardContext } from './Day2WizardContext';\nimport Day2WizardNav from './Day2WizardNav';\nimport useInfraEnvImageUrl from '../../../hooks/useInfraEnvImageUrl';\n\nconst Day2GenerateISO = () => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const { close, data } = day2DiscoveryImageDialog;\n const cluster = data.cluster;\n const wizardContext = useDay2WizardContext();\n const { getIsoImageUrl } = useInfraEnvImageUrl();\n\n const onImageReady = React.useCallback(async () => {\n const isoUrl = await getIsoImageUrl(cluster.id, wizardContext.selectedCpuArchitecture);\n if (!isoUrl.error) {\n wizardContext.setSelectedIsoUrl(isoUrl.url);\n wizardContext.moveNext();\n }\n }, [cluster?.id, wizardContext, getIsoImageUrl]);\n\n return (\n <ClusterWizardStep navigation={<Day2WizardNav />}>\n <Stack hasGutter>\n <StackItem>\n <ClusterWizardStepHeader>Generate Discovery ISO</ClusterWizardStepHeader>\n </StackItem>\n <StackItem>\n <DiscoveryImageForm\n cluster={cluster}\n cpuArchitecture={wizardContext.selectedCpuArchitecture}\n onCancel={close}\n onSuccess={onImageReady}\n />\n </StackItem>\n </Stack>\n </ClusterWizardStep>\n );\n};\n\nexport default Day2GenerateISO;\n", "import React from 'react';\nimport {\n Grid,\n TextContent,\n Text,\n TextVariants,\n PageSection,\n PageSectionVariants,\n Button,\n ButtonVariant,\n} from '@patternfly/react-core';\nimport {\n ClusterWizardStep,\n ErrorState,\n InfraEnv,\n InfraEnvUpdateParams,\n LoadingState,\n WizardFooter,\n} from '../../../../common';\nimport { HostsNetworkConfigurationType, InfraEnvsService } from '../../../services';\nimport { FormViewHosts } from '../../clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts';\nimport { FormViewNetworkWide } from '../../clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWide';\nimport {\n StaticIpFormState,\n StaticIpViewProps,\n} from '../../clusterConfiguration/staticIp/components/propTypes';\nimport StaticIpViewRadioGroup from '../../clusterConfiguration/staticIp/components/StaticIpViewRadioGroup';\nimport { YamlView } from '../../clusterConfiguration/staticIp/components/YamlView/YamlView';\nimport { StaticIpInfo, StaticIpView } from '../../clusterConfiguration/staticIp/data/dataTypes';\nimport { getStaticIpInfo } from '../../clusterConfiguration/staticIp/data/fromInfraEnv';\nimport { getDummyStaticIpInfo } from '../../clusterConfiguration/staticIp/data/dummyData';\nimport { useModalDialogsContext } from '../../hosts/ModalDialogsContext';\nimport { useDay2WizardContext } from './Day2WizardContext';\nimport Day2WizardNav from './Day2WizardNav';\n\nconst Day2StaticIP = () => {\n const { day2DiscoveryImageDialog } = useModalDialogsContext();\n const wizardContext = useDay2WizardContext();\n const [infraEnv, setInfraEnv] = React.useState<InfraEnv | undefined>(undefined);\n const [hasLoadError, setHasLoadError] = React.useState<boolean>(false);\n const [confirmOnChangeView, setConfirmOnChangeView] = React.useState<boolean>(false);\n const [viewChanged, setViewChanged] = React.useState<boolean>(false);\n const [initialStaticIpInfo, setInitialStaticIpInfo] = React.useState<StaticIpInfo>(\n getDummyStaticIpInfo(),\n );\n const [formState, setFormState] = React.useState<StaticIpFormState>();\n const {\n data: { cluster },\n } = day2DiscoveryImageDialog;\n\n const selectedArchitecture = wizardContext.selectedCpuArchitecture;\n\n const restartWizard = React.useCallback(() => {\n wizardContext.setCurrentStepId('cluster-details');\n wizardContext.onUpdateHostNetworkConfigType(HostsNetworkConfigurationType.DHCP);\n }, [wizardContext]);\n\n React.useEffect(() => {\n const setCurrentStaticConfig = async () => {\n let infraEnv;\n try {\n infraEnv = await InfraEnvsService.getInfraEnv(cluster.id, selectedArchitecture);\n } catch (e) {\n setHasLoadError(true);\n setInfraEnv(undefined);\n return;\n }\n\n if (!infraEnv.staticNetworkConfig) {\n // Make sure the infraEnv we store in the state has staticIP config\n // This is required to be able to reuse the StaticIP services\n infraEnv = await InfraEnvsService.setDummyStaticConfigToInfraEnv(infraEnv.id);\n }\n const staticIpInfo = getStaticIpInfo(infraEnv);\n if (staticIpInfo) {\n setInfraEnv(infraEnv);\n setInitialStaticIpInfo(staticIpInfo);\n } else {\n setHasLoadError(true);\n }\n };\n void setCurrentStaticConfig();\n }, [cluster.id, selectedArchitecture]);\n\n const onChangeView = React.useCallback((view: StaticIpView) => {\n wizardContext.onUpdateStaticIpView(view);\n setViewChanged(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (hasLoadError) {\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState\n title=\"Cannot load the Static IP configuration for this cluster\"\n content=\"For non-multi-architecture clusters, make sure you select the Day1 cpu architecture\"\n actions={[\n <Button key=\"restart-wizard\" variant={ButtonVariant.primary} onClick={restartWizard}>\n Back to Wizard\n </Button>,\n ]}\n />\n </PageSection>\n );\n } else if (!infraEnv) {\n // It's still loading\n return <LoadingState />;\n }\n\n const onFormStateChange = (formState: StaticIpFormState) => {\n const hasFilledData =\n wizardContext.currentStepId === 'static-ip-host-configurations' || !formState.isEmpty;\n setConfirmOnChangeView(hasFilledData);\n setFormState(formState);\n };\n\n const viewProps: StaticIpViewProps = {\n infraEnv,\n onFormStateChange,\n updateInfraEnv: async (updateParams: InfraEnvUpdateParams) => {\n const updatedInfraEnv = await InfraEnvsService.syncStaticIpConfigs(\n cluster.id,\n infraEnv.id,\n updateParams.staticNetworkConfig!, // eslint-disable-line @typescript-eslint/no-non-null-assertion\n );\n setInfraEnv(updatedInfraEnv);\n return updatedInfraEnv;\n },\n showEmptyValues: viewChanged,\n };\n\n const getContent = () => {\n if (initialStaticIpInfo.view === StaticIpView.YAML && !viewChanged) {\n return <YamlView {...viewProps} />;\n }\n switch (wizardContext.currentStepId) {\n case 'static-ip-yaml-view':\n return <YamlView {...viewProps} />;\n case 'static-ip-host-configurations':\n return <FormViewHosts {...viewProps} />;\n case 'static-ip-network-wide-configurations':\n return <FormViewNetworkWide {...viewProps} />;\n default:\n throw `Unexpected wizard step id ${wizardContext.currentStepId} when entering static ip page`;\n }\n };\n\n const content = getContent();\n if (!content) {\n return null;\n }\n\n return (\n <ClusterWizardStep\n navigation={<Day2WizardNav />}\n footer={\n <WizardFooter\n onNext={() => wizardContext.moveNext()}\n onBack={() => wizardContext.moveBack()}\n isNextDisabled={!formState?.isValid || formState.isAutoSaveRunning}\n onCancel={day2DiscoveryImageDialog.close}\n isSubmitting={formState?.isSubmitting}\n />\n }\n >\n <Grid hasGutter>\n <TextContent>\n <Text component={TextVariants.h2}>Static network configurations</Text>\n <Text component={TextVariants.small}>\n Network configuration can be done using either the form view or YAML view.\n Configurations done in this step are for discovering hosts.\n </Text>\n </TextContent>\n\n <StaticIpViewRadioGroup\n initialView={initialStaticIpInfo.view}\n confirmOnChangeView={confirmOnChangeView}\n onChangeView={onChangeView}\n />\n {content}\n </Grid>\n </ClusterWizardStep>\n );\n};\n\nexport default Day2StaticIP;\n", "import React from 'react';\nimport { getAssistedUiLibVersion } from '../../../common';\n\nexport const AssistedUILibVersion: React.FC = ({ children }) => (\n <>\n {children}\n <div data-testid=\"assisted-ui-lib-version\" hidden>\n {getAssistedUiLibVersion()}\n </div>\n </>\n);\n", "import React from 'react';\nimport { Provider } from 'react-redux';\nimport { Switch, Route, Redirect } from 'react-router-dom';\nimport { Clusters, ClusterPage, NewClusterPage } from './clusters';\nimport { store } from '../store';\nimport { FeatureGateContextProvider, FeatureListType } from '../../common';\nimport { isSingleClusterMode, routeBasePath } from '../config';\nimport SingleCluster from './SingleCluster';\nimport { AssistedUILibVersion } from './ui';\n\nexport const AssistedUiRouter: React.FC<{ allEnabledFeatures: FeatureListType }> = ({\n allEnabledFeatures,\n}) => (\n <Provider store={store}>\n <Router features={allEnabledFeatures} />\n </Provider>\n);\n\nexport const Router: React.FC<{ features: FeatureListType }> = ({ features, children }) => (\n <FeatureGateContextProvider features={features}>\n <AssistedUILibVersion />\n {isSingleClusterMode() ? (\n <Switch>\n <Route path={`${routeBasePath}/clusters/:clusterId`} component={ClusterPage} />\n <Route path={`${routeBasePath}/clusters`} component={SingleCluster} />\n {children}\n <Redirect to={`${routeBasePath}/clusters`} />\n </Switch>\n ) : (\n <Switch>\n <Route path={`${routeBasePath}/clusters/~new`} component={NewClusterPage} />\n <Route path={`${routeBasePath}/clusters/:clusterId`} component={ClusterPage} />\n <Route path={`${routeBasePath}/clusters`} component={Clusters} />\n {children}\n <Redirect to={`${routeBasePath}/clusters`} />\n </Switch>\n )}\n </FeatureGateContextProvider>\n);\n", "import React from 'react';\nimport { Redirect } from 'react-router-dom';\nimport { PageSectionVariants, PageSection } from '@patternfly/react-core';\nimport { Cluster, ErrorState, LoadingState } from '../../common';\nimport { routeBasePath } from '../config';\nimport { NewClusterPage } from './clusters';\nimport { ClustersAPI } from '../services/apis';\nimport { handleApiError } from '../api';\n\nconst SingleCluster = () => {\n const [error, setError] = React.useState('');\n const [clusters, setClusters] = React.useState<Cluster[]>();\n\n const fetchClusters = React.useCallback(async () => {\n try {\n const { data } = await ClustersAPI.list();\n setClusters(data);\n setError('');\n } catch (e) {\n handleApiError(e, () => setError('Failed to fetch cluster.'));\n }\n }, [setClusters]);\n\n React.useEffect(() => {\n void fetchClusters();\n }, [fetchClusters]);\n\n if (error) {\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <ErrorState title=\"Failed to fetch cluster.\" fetchData={fetchClusters} />\n </PageSection>\n );\n }\n\n if (!clusters) {\n return (\n <PageSection variant={PageSectionVariants.light} isFilled>\n <LoadingState />\n </PageSection>\n );\n }\n\n if (clusters.length === 0) {\n return <NewClusterPage />;\n }\n\n if (clusters.length > 1) {\n // TODO(mlibra): What about Day2 cluster in single-cluster flow?\n console.warn('More than one cluster found!', clusters);\n }\n\n return <Redirect to={`${routeBasePath}/clusters/${clusters[0].id}`} />;\n};\n\nexport default SingleCluster;\n", "import { InfraEnvsService } from '.';\nimport { ClustersAPI } from './apis';\nimport {\n Cluster,\n CpuArchitecture,\n OcmCpuArchitecture,\n SupportedCpuArchitectures,\n} from '../../common';\nimport { OcmClusterExtraInfo, OcmClusterType } from '../components/AddHosts/types';\nimport { mapOcmArchToCpuArchitecture } from './CpuArchitectureService';\n\nexport const getApiVipDnsName = (ocmCluster: OcmClusterType) => {\n let apiVipDnsname = '';\n let urlType = '';\n try {\n // Format of cluster.api.url: protocol://domain:port\n if (ocmCluster.api?.url) {\n urlType = 'api';\n const apiVipUrl = new URL(ocmCluster.api.url);\n apiVipDnsname = apiVipUrl.hostname; // just domain is needed\n } else if (ocmCluster.console?.url) {\n urlType = 'console';\n // Try to guess API URL from Console URL.\n // Assumption: the cluster is originated by Assisted Installer, so console URL format should be of a fixed format.\n // protocol://console-openshift-console.apps.[CLUSTER_NAME].[BASE_DOMAIN]\"\n const consoleUrlHostname = new URL(ocmCluster.console.url).hostname;\n const APPS = '.apps.';\n apiVipDnsname =\n 'api.' + consoleUrlHostname.substring(consoleUrlHostname.indexOf(APPS) + APPS.length);\n }\n } catch (e) {\n // can be ignored, the error type has been set already\n }\n return { apiVipDnsname, errorType: apiVipDnsname ? '' : urlType };\n};\n\nconst Day2ClusterService = {\n getOpenshiftClusterId(ocmCluster?: OcmClusterType) {\n return ocmCluster && ocmCluster.external_id;\n },\n\n async fetchCluster(\n ocmCluster: OcmClusterType,\n pullSecret: string,\n openshiftVersion: string,\n extraInfo: OcmClusterExtraInfo,\n ) {\n const openshiftClusterId = Day2ClusterService.getOpenshiftClusterId(ocmCluster);\n\n if (!openshiftClusterId) {\n // error?\n return;\n }\n\n const day2ClusterId = await Day2ClusterService.getDay2ClusterId(openshiftClusterId);\n if (day2ClusterId) {\n return Day2ClusterService.fetchClusterById(day2ClusterId);\n }\n // The first time the user accesses \"Add hosts\" tab, the infraEnv(s) need to be created\n const createMultipleInfraEnvs =\n ocmCluster.cpu_architecture === OcmCpuArchitecture.MULTI ||\n extraInfo.canSelectCpuArchitecture;\n const cpuArchitectures = createMultipleInfraEnvs\n ? SupportedCpuArchitectures\n : [mapOcmArchToCpuArchitecture(ocmCluster.cpu_architecture)];\n\n return Day2ClusterService.createCluster(\n openshiftClusterId,\n ocmCluster.display_name || ocmCluster.name || openshiftClusterId,\n getApiVipDnsName(ocmCluster).apiVipDnsname,\n pullSecret,\n openshiftVersion,\n cpuArchitectures,\n );\n },\n\n async fetchClusterById(clusterId: Cluster['id']) {\n const { data } = await ClustersAPI.get(clusterId);\n return data;\n },\n\n async getDay2ClusterId(openshiftClusterId: OcmClusterType['external_id']) {\n const { data: clusters } = await ClustersAPI.listByOpenshiftId(openshiftClusterId);\n const day2Clusters = clusters.filter((cluster) => cluster.kind === 'AddHostsCluster');\n if (day2Clusters.length > 0) {\n return day2Clusters[0].id;\n }\n return undefined;\n },\n\n async createCluster(\n openshiftClusterId: OcmClusterType['external_id'],\n clusterName: string,\n apiVipDnsname: string,\n pullSecret: string,\n openshiftVersion: string,\n cpuArchitectures: CpuArchitecture[],\n ) {\n const { data: day2Cluster } = await ClustersAPI.registerAddHosts({\n openshiftClusterId, // used to both match OpenShift Cluster and as an assisted-installer ID\n name: `scale-up-${clusterName}`, // both cluster.name and cluster.display-name contain just UUID which fails AI validation (k8s naming conventions)\n apiVipDnsname,\n openshiftVersion,\n });\n\n // Create the infraEnvs for each cpuArchitecture\n const infraEnvsToCreate = cpuArchitectures.map((cpuArchitecture) => {\n return InfraEnvsService.create({\n name: `${day2Cluster.name || ''}_infra-env-${cpuArchitecture}`,\n pullSecret,\n clusterId: day2Cluster.id,\n openshiftVersion,\n cpuArchitecture,\n });\n });\n await Promise.all(infraEnvsToCreate);\n\n return day2Cluster;\n },\n\n /**\n * Complete the day2Cluster coming from AI polling with the data in the OCM cluster\n * @param day2Cluster Day2 cluster\n * @param ocmCluster OCM cluster\n * @param extraInfo Extra information coming from OCM\n */\n completeAiClusterWithOcmCluster: (\n day2Cluster: Cluster | undefined,\n ocmCluster: OcmClusterType | undefined,\n extraInfo: OcmClusterExtraInfo,\n ) => {\n if (!ocmCluster || !day2Cluster) {\n return day2Cluster;\n }\n return {\n ...day2Cluster,\n openshiftVersion: ocmCluster.openshift_version,\n // The field \"cpu_architecture\" is calculated based on the existing hosts' architecture\n // It can be a specific architecture, or \"multi\" if hosts from several architectures have been discovered\n cpuArchitecture: ocmCluster.cpu_architecture,\n // The field \"can_select_cpu_arch\" only tells us that the organization has this feature,\n // but it's not applicable to individual clusters. They may actually not support multi-arch (eg OpenShift < 4.12)\n canSelectCpuArch: extraInfo.canSelectCpuArchitecture,\n };\n },\n};\n\nexport default Day2ClusterService;\n", "import Day2ClusterService from '../../services/Day2ClusterService';\nimport { getFeatureSupported } from '../featureSupportLevels/FeatureSupportLevelProvider';\nimport { OcmClusterType } from '../AddHosts/types';\n\nconst isSNOExpansionAllowed = (cluster: OcmClusterType) => {\n return getFeatureSupported(\n cluster.openshift_version,\n cluster.aiSupportLevels || [],\n 'SINGLE_NODE_EXPANSION',\n );\n};\n\nexport const canAddHost = ({ cluster }: { cluster: OcmClusterType }) => {\n if (!cluster.canEdit || !Day2ClusterService.getOpenshiftClusterId(cluster)) {\n return false;\n }\n\n const isMultiNode = (cluster.metrics?.nodes?.total || 0) > 1;\n return (\n cluster.state === 'ready' &&\n cluster.product?.id === 'OCP-AssistedInstall' &&\n (isMultiNode || isSNOExpansionAllowed(cluster))\n );\n};\n", "import React from 'react';\nimport { Provider } from 'react-redux';\nimport { AssistedUILibVersion } from '../ui';\nimport { AlertsContextProvider } from '../../../common';\nimport { HostsClusterDetailTabContent } from './HostsClusterDetailTabContent';\nimport { HostsClusterDetailTabProps } from './types';\nimport { store } from '../../store';\n\nconst HostsClusterDetailTab = (props: HostsClusterDetailTabProps) => (\n <Provider store={store}>\n <AssistedUILibVersion />\n <AlertsContextProvider>\n <HostsClusterDetailTabContent {...props} />\n </AlertsContextProvider>\n </Provider>\n);\n\nexport default HostsClusterDetailTab;\n", "import React, { ReactNode } from 'react';\nimport { useStateSafely } from '../../../common/hooks';\nimport {\n AddHostsContextProvider,\n Cluster,\n ErrorState,\n LoadingState,\n POLLING_INTERVAL,\n} from '../../../common';\nimport { useOpenshiftVersions, usePullSecret } from '../../hooks';\nimport { Button, EmptyStateVariant } from '@patternfly/react-core';\nimport Day2ClusterService, { getApiVipDnsName } from '../../services/Day2ClusterService';\nimport { handleApiError } from '../../api';\nimport { isApiError } from '../../api/types';\nimport { FeatureSupportLevelProvider } from '../featureSupportLevels';\nimport { AddHosts } from '../AddHosts';\nimport { HostsClusterDetailTabProps } from './types';\n\nexport const HostsClusterDetailTabContent = ({\n cluster: ocmCluster,\n extraInfo,\n isVisible,\n}: HostsClusterDetailTabProps) => {\n const [error, setError] = React.useState<ReactNode>();\n const [day2Cluster, setDay2Cluster] = useStateSafely<Cluster | null | undefined>(undefined);\n const pullSecret = usePullSecret();\n const { normalizeClusterVersion } = useOpenshiftVersions();\n\n const handleClickTryAgainLink = React.useCallback(() => {\n setError(undefined);\n setDay2Cluster(undefined);\n }, [setDay2Cluster]);\n\n React.useEffect(() => {\n if (!isVisible && day2Cluster) {\n // the tab is not visible, stop polling\n setDay2Cluster(undefined);\n }\n const openshiftClusterId = Day2ClusterService.getOpenshiftClusterId(ocmCluster);\n\n if (isVisible && day2Cluster === undefined && ocmCluster && openshiftClusterId && pullSecret) {\n // ensure exclusive run\n setDay2Cluster(null);\n\n const normalizedVersion = normalizeClusterVersion(ocmCluster.openshift_version);\n if (!normalizedVersion) {\n setError(\n <>\n Unsupported OpenShift cluster version: {ocmCluster.openshift_version || 'N/A'}.\n <br />\n Check your connection and{' '}\n <Button variant={'link'} isInline onClick={handleClickTryAgainLink}>\n try again\n </Button>\n .\n </>,\n );\n return;\n }\n\n const { apiVipDnsname, errorType } = getApiVipDnsName(ocmCluster);\n if (errorType) {\n const wrongUrlMessage =\n errorType === 'console'\n ? `Cluster Console URL is not valid (${ocmCluster.console?.url || ''})`\n : `Cluster API URL is not valid (${ocmCluster.api?.url || ''})`;\n setError(\n <>\n {wrongUrlMessage}, you can{' '}\n <Button variant={'link'} isInline onClick={handleClickTryAgainLink}>\n try again\n </Button>\n .\n </>,\n );\n return;\n }\n\n if (!apiVipDnsname) {\n setError(<>Neither API nor Console URL has been reported by the cluster yet.</>);\n return;\n }\n\n const doItAsync = async () => {\n try {\n const day2Cluster = await Day2ClusterService.fetchCluster(\n ocmCluster,\n pullSecret,\n normalizedVersion,\n extraInfo,\n );\n setDay2Cluster(\n Day2ClusterService.completeAiClusterWithOcmCluster(day2Cluster, ocmCluster, extraInfo),\n );\n } catch (e) {\n handleApiError(e);\n if (isApiError(e)) {\n const isImport = e.config.url?.includes('/import');\n setError(\n <>\n {isImport\n ? 'Failed to create wrapping cluster for adding new hosts.'\n : 'Failed to fetch cluster for adding new hosts.'}\n <br />\n Check your connection and{' '}\n <Button variant={'link'} isInline onClick={handleClickTryAgainLink}>\n try again\n </Button>\n .\n </>,\n );\n }\n return;\n }\n };\n\n void doItAsync();\n }\n }, [\n ocmCluster,\n extraInfo,\n pullSecret,\n day2Cluster,\n setDay2Cluster,\n isVisible,\n normalizeClusterVersion,\n handleClickTryAgainLink,\n ]);\n\n const resetCluster = React.useCallback(async () => {\n if (!day2Cluster?.id) {\n return;\n }\n try {\n const updatedDay2Cluster = await Day2ClusterService.fetchClusterById(day2Cluster.id);\n setDay2Cluster(\n Day2ClusterService.completeAiClusterWithOcmCluster(\n updatedDay2Cluster,\n ocmCluster,\n extraInfo,\n ),\n );\n } catch (e) {\n handleApiError(e);\n setError(\n <>\n Failed to reload cluster data.\n <br />\n Check your connection and{' '}\n <Button variant={'link'} isInline onClick={handleClickTryAgainLink}>\n try again\n </Button>\n .\n </>,\n );\n }\n }, [day2Cluster?.id, handleClickTryAgainLink, ocmCluster, extraInfo, setDay2Cluster]);\n\n React.useEffect(() => {\n const id = setTimeout(() => {\n const doItAsync = async () => {\n await resetCluster();\n };\n void doItAsync();\n }, POLLING_INTERVAL);\n return () => clearTimeout(id);\n }, [resetCluster]);\n\n if (error) {\n return (\n <ErrorState\n variant={EmptyStateVariant.large}\n content={error}\n title=\"Failed to prepare the cluster for adding hosts.\"\n />\n );\n }\n\n if (!day2Cluster) {\n return <LoadingState content=\"Preparing cluster for adding hosts...\" />;\n }\n\n return (\n <AddHostsContextProvider\n cluster={day2Cluster}\n resetCluster={resetCluster}\n ocpConsoleUrl={ocmCluster?.console?.url}\n >\n <FeatureSupportLevelProvider loadingUi={<LoadingState />} cluster={day2Cluster}>\n <AddHosts />\n </FeatureSupportLevelProvider>\n </AddHostsContextProvider>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }