@openshift-assisted/ui-lib 2.7.12-cim → 2.9.0-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 +23 -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 +19 -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 +44 -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 +224 -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 +21 -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 +16 -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 +16 -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 +9 -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 +202 -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 +108 -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 +29 -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 +11 -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 +145 -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 +75 -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 +26 -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 +104 -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 +48 -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 +430 -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 +282 -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 +174 -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 +132 -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 +163 -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 +44 -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 +76 -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 +70 -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 +72 -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 +57 -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 +151 -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 +115 -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 +78 -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 +72 -0
  2318. package/build/ocm/components/clusterDetail/AssistedInstallerDetailCard.js.map +1 -0
  2319. package/build/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.js +29 -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 +116 -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 +112 -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 +27 -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 +76 -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 +50 -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 +110 -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 +88 -0
  2566. package/build/ocm/services/InfraEnvIdsCacheService.js.map +1 -0
  2567. package/build/ocm/services/InfraEnvsService.js +121 -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 +37 -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 +333 -0
  2634. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx +157 -0
  2635. package/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.tsx +150 -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 +71 -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 +18 -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 +24 -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 +366 -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 +153 -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 +129 -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 +161 -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 +33 -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 +63 -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 +160 -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 +315 -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 +141 -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 +690 -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 +372 -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 +28 -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 +259 -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 +189 -0
  3004. package/lib/ocm/components/AddHosts/day2Wizard/Day2StaticIpHostConfigurations.tsx +48 -0
  3005. package/lib/ocm/components/AddHosts/day2Wizard/Day2Wizard.tsx +58 -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 +225 -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 +60 -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 +156 -0
  3021. package/lib/ocm/components/clusterConfiguration/CustomManifestCheckbox.tsx +128 -0
  3022. package/lib/ocm/components/clusterConfiguration/DiscoveryImageForm.tsx +116 -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 +191 -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 +157 -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 +253 -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 +220 -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 +199 -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 +168 -0
  3110. package/lib/ocm/components/clusterDetail/AssistedInstallerExtraDetailCard.tsx +66 -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 +207 -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 +200 -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 +23 -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 +151 -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 +67 -0
  3205. package/lib/ocm/hooks/useInfraEnvId.ts +48 -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 +125 -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 +117 -0
  3229. package/lib/ocm/services/InfraEnvsService.ts +130 -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 +57 -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/cim/types/k8s/cluster-version.ts", "../../src/cim/types/resources.ts", "../../src/cim/components/helpers/units.ts", "../../src/common/components/clusterWizard/validationsInfoUtils.ts", "../../src/common/api/utils.ts", "../../src/cim/components/ClusterDeployment/wizardTransition.ts", "../../src/cim/components/helpers/agentStatus.tsx", "../../src/common/hacks.ts", "../../src/common/utils.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/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/featureGate.tsx", "../../src/common/components/featureSupportLevels/FeatureSupportLevelBadge.tsx", "../../src/common/types/clusters.ts", "../../src/common/types/featureSupportLevel.ts", "../../src/common/types/typescriptExtensions.ts", "../../src/common/types/index.ts", "../../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/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/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/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/ocm/api/axiosExtensions.ts", "../../src/ocm/api/types.ts", "../../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/cim/components/helpers/status.ts", "../../src/cim/components/helpers/toAssisted.ts", "../../src/cim/components/helpers/network.ts", "../../src/cim/components/common/constants.ts", "../../src/cim/components/helpers/agents.ts", "../../src/cim/components/helpers/clusterDeployment.ts", "../../src/cim/components/common/InfoAndTroubleshootingNotification.tsx", "../../src/cim/components/Agent/MinimalHWRequirements.tsx", "../../src/cim/components/helpers/conditions.ts", "../../src/cim/components/helpers/versions.ts", "../../src/cim/components/helpers/labels.ts", "../../src/cim/components/helpers/agentClusterInstall.ts", "../../src/cim/components/helpers/storage.ts", "../../src/cim/components/InfraEnv/EnvironmentDetails.tsx", "../../src/cim/components/modals/EditPullSecretModal.tsx", "../../src/cim/components/modals/utils.ts", "../../src/cim/components/modals/EditSSHKeyModal.tsx", "../../src/cim/components/modals/EditNtpSourcesModal.tsx", "../../src/cim/components/InfraEnv/InfraEnvAgentTable.tsx", "../../src/cim/components/Agent/tableUtils.tsx", "../../src/cim/components/Agent/AgentStatus.tsx", "../../src/cim/components/ClusterDeployment/AdditionalNTPSourcesDialogToggle.tsx", "../../src/cim/components/common/ValidationsRunningAlert.tsx", "../../src/cim/components/common/SpecSyncErrAlert.tsx", "../../src/common/components/hosts/tableUtils.tsx", "../../src/common/components/hosts/HostPropertyValidationPopover.tsx", "../../src/cim/components/ClusterDeployment/helpers.ts", "../../src/cim/components/helpers/proxy.ts", "../../src/cim/components/Agent/BMHStatus.tsx", "../../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/cim/components/modals/EditAgentModal.tsx", "../../src/cim/components/modals/AddHostModal.tsx", "../../src/cim/components/InfraEnv/EnvironmentErrors.tsx", "../../src/cim/components/common/ResourceAlerts.tsx", "../../src/cim/components/modals/EditBMHModal.tsx", "../../src/cim/components/Agent/BMCForm.tsx", "../../src/cim/components/modals/ScaleUpModal.tsx", "../../src/cim/components/ClusterDeployment/ScaleUpForm.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionAdvanced.tsx", "../../src/cim/components/ClusterDeployment/LocationsSelector.tsx", "../../src/cim/components/ClusterDeployment/LabelsSelector.tsx", "../../src/cim/components/Agent/AgentsSelectionTable.tsx", "../../src/common/components/hosts/usePagination.ts", "../../src/common/hooks/useFormikHelpers.ts", "../../src/common/components/hosts/HostsTableDetailContext.tsx", "../../src/cim/components/ClusterDeployment/ClusterScaleUpAutoHostsSelection.tsx", "../../src/cim/components/Agent/AgentsSelectionHostCountAlerts.tsx", "../../src/cim/components/ClusterDeployment/ShortCapacitySummary.tsx", "../../src/cim/components/Agent/AgentsSelectionHostCountLabelIcon.tsx", "../../src/cim/components/Agent/AgentsSelectionUtils.ts", "../../src/cim/components/modals/MassApproveAgentModal.tsx", "../../src/cim/components/modals/MassDeleteAgentModal.tsx", "../../src/cim/components/modals/AddBmcHostModal.tsx", "../../src/cim/components/modals/AddBmcHostYamlModal.tsx", "../../src/cim/components/modals/AddBmcHostYamlForm.tsx", "../../src/cim/components/modals/constants.ts", "../../src/cim/components/modals/CimConfiguration/CimStorageMissingAlert.tsx", "../../src/cim/components/modals/CimConfiguration/CimConfigProgressAlert.tsx", "../../src/cim/utils.ts", "../../src/cim/components/modals/CimConfiguration/constants.ts", "../../src/cim/components/modals/CimConfiguration/utils.ts", "../../src/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx", "../../src/cim/components/modals/CimConfiguration/CimConfigurationForm.tsx", "../../src/cim/components/modals/CimConfiguration/persist.ts", "../../src/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.tsx", "../../src/cim/components/modals/CimConfiguration/CimIsMissingAlert.tsx", "../../src/cim/components/modals/MassApproveAction.tsx", "../../src/cim/components/InfraEnv/InfraTableToolbar.tsx", "../../src/cim/components/InfraEnv/InfraEnvHostsTabAgentsWarning.tsx", "../../src/cim/components/InfraEnv/AgentAlerts.tsx", "../../src/cim/components/InfraEnv/AddHostDropdown.tsx", "../../src/cim/components/InfraEnv/InfraEnvFormPage.tsx", "../../src/cim/components/InfraEnv/utils.ts", "../../src/cim/components/ClusterDeployment/LogsDownloadButton.tsx", "../../src/cim/components/ClusterDeployment/networkConfigurationValidation.ts", "../../src/cim/components/ClusterDeployment/ClusterDeploymentValidationsOverview.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentDetails.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentCredentials.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentDetailsTable.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentKubeconfigDownload.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentProgress.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/cim/components/ClusterDeployment/ClusterDeploymentWizard.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentWizardContext.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentDetailsStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentWizardFooter.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentWizardStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentWizardNavigation.tsx", "../../src/cim/components/ClusterDeployment/constants.ts", "../../src/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx", "../../src/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx", "../../src/cim/components/ClusterDeployment/ArmCheckbox.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentNetworkingStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentNetworkingForm.tsx", "../../src/cim/components/ClusterDeployment/NetworkConfiguration.tsx", "../../src/common/components/clusterConfiguration/AdvancedNetworkFields.tsx", "../../src/common/components/clusterWizard/networkingSteps/NetworkTypeControlGroup.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/cim/components/ClusterDeployment/ClusterDeploymentHostsNetworkTable.tsx", "../../src/cim/components/ClusterDeployment/use-networking-formik.ts", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostSelectionStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelection.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostsSelectionBasic.tsx", "../../src/cim/components/Agent/NoAgentsAlert.tsx", "../../src/cim/components/ClusterDeployment/validationSchemas.ts", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscoveryStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx", "../../src/cim/components/featureSupportLevels/ACMFeatureSupportLevelProvider.tsx", "../../src/cim/config/constants.ts", "../../src/cim/components/featureSupportLevels/featureStateUtils.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentReviewStep.tsx", "../../src/cim/components/YamlPreview/YamlPreview.tsx", "../../src/cim/components/YamlPreview/useYAMLPreview.ts", "../../src/cim/components/ClusterDeployment/ClusterInstallationError.tsx", "../../src/cim/components/ClusterDeployment/ACMClusterDeploymentDetailsStep.tsx", "../../src/cim/components/ClusterDeployment/ClusterDeploymentCreateProgress.tsx", "../../src/cim/components/Agent/AgentTable.tsx", "../../src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.tsx", "../../src/cim/components/Hypershift/hooks/useSupportedOCPVersions.ts", "../../src/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsForm.tsx", "../../src/cim/components/Hypershift/hooks/useTemptiflySync.ts", "../../src/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.tsx", "../../src/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx", "../../src/cim/components/Hypershift/HostedClusterWizard/HostsStep/NodePoolForm.tsx", "../../src/cim/components/Hypershift/forms/NodePoolAgentsForm.tsx", "../../src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.tsx", "../../src/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkForm.tsx", "../../src/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx", "../../src/cim/components/Hypershift/modals/ManageHostsModal.tsx", "../../src/cim/components/Hypershift/modals/NodePoolForm.tsx", "../../src/cim/components/Hypershift/utils/labels.ts", "../../src/cim/components/Hypershift/utils/nodepool.ts", "../../src/cim/components/Hypershift/utils/status.tsx", "../../src/cim/components/Hypershift/modals/AddNodePoolModal.tsx", "../../src/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx", "../../src/cim/components/Hypershift/DetailsPage/NodePoolStatus.tsx", "../../src/cim/components/Hypershift/DetailsPage/ConditionsTable.tsx", "../../src/cim/components/Hypershift/DetailsPage/ClusterInstallationProgress.tsx", "../../src/cim/components/Hypershift/DetailsPage/HypershiftKubeconfigDownload.tsx", "../../src/cim/components/Hypershift/DetailsPage/HostedClusterProgress.tsx", "../../src/cim/components/Hypershift/DetailsPage/NodePoolsProgress.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", "import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk';\nimport { StatusCondition } from './shared';\n\ntype UpdateHistory = {\n state: 'Completed' | 'Partial';\n startedTime: string;\n completionTime: string;\n version: string;\n image: string;\n verified: boolean;\n};\n\nexport enum ClusterVersionConditionType {\n Available = 'Available',\n Failing = 'Failing',\n Progressing = 'Progressing',\n RetrievedUpdates = 'RetrievedUpdates',\n Invalid = 'Invalid',\n Upgradeable = 'Upgradeable',\n}\n\ntype Release = {\n version: string;\n image: string;\n url?: string;\n channels?: string[];\n};\n\nexport type ClusterVersionK8sResource = {\n spec: {\n channel: string;\n clusterID: string;\n desiredUpdate?: Release;\n upstream?: string;\n };\n status: {\n desired: Release;\n history: UpdateHistory[];\n observedGeneration: number;\n versionHash: string;\n conditions?: StatusCondition<keyof typeof ClusterVersionConditionType>[];\n availableUpdates: Release[];\n conditionalUpdates?: {\n release: Release;\n conditions: StatusCondition<string>[];\n }[];\n };\n} & K8sResourceCommon;\n", "import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk';\n\n// To conform ACM\ntype ResourceType = {\n // status?: any;\n apiVersion: string;\n kind: string;\n metadata?: {\n name?: string;\n namespace?: string;\n resourceVersion?: string;\n creationTimestamp?: string;\n uid?: string;\n annotations?: Record<string, string>;\n labels?: Record<string, string>;\n generateName?: string;\n deletionTimestamp?: string;\n selfLink?: string;\n finalizers?: string[];\n ownerReferences?: {\n apiVersion: string;\n blockOwnerDeletion?: boolean;\n controller?: boolean;\n kind: string;\n name: string;\n uid?: string;\n }[];\n // managedFields?: any[];\n };\n};\n\nexport type CreateResourceFuncType = (resource: ResourceType) => Promise<ResourceType>;\nexport type DeleteResourceFuncType = (resource: ResourceType) => Promise<void>;\nexport type GetResourceFuncType = (resource: ResourceType) => Promise<ResourceType>;\nexport type ListResourcesFuncType = (\n resource: { apiVersion: string; kind: string; metadata?: { namespace?: string } },\n labels?: string[],\n query?: Record<string, string>,\n) => Promise<ResourceType[]>;\nexport type ResourcePatch = { op: 'replace' | 'add'; path: string; value: unknown };\nexport type PatchResourceFuncType = (\n resource: ResourceType,\n patches: ResourcePatch[],\n) => Promise<ResourceType>;\n\nexport const convertOCPtoCIMResourceHeader = (res: K8sResourceCommon): ResourceType => ({\n apiVersion: res.apiVersion || '',\n kind: res.kind || '',\n metadata: res.metadata,\n});\n", "import defaults from 'lodash/defaults';\nimport findIndex from 'lodash/findIndex';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport toNumber from 'lodash/toNumber';\n\ntype TypeTS = {\n units: string[];\n space: boolean;\n divisor: number;\n};\nconst TYPES: {\n [key: string]: TypeTS;\n} = {\n numeric: {\n units: ['', 'k', 'm', 'b'],\n space: false,\n divisor: 1000,\n },\n decimalBytes: {\n units: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'],\n space: true,\n divisor: 1000,\n },\n decimalBytesWithoutB: {\n units: ['', 'k', 'M', 'G', 'T', 'P', 'E'],\n space: true,\n divisor: 1000,\n },\n binaryBytes: {\n units: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'],\n space: true,\n divisor: 1024,\n },\n binaryBytesWithoutB: {\n units: ['i', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei'],\n space: true,\n divisor: 1024,\n },\n SI: {\n units: ['', 'k', 'M', 'G', 'T', 'P', 'E'],\n space: false,\n divisor: 1000,\n },\n decimalBytesPerSec: {\n units: ['Bps', 'KBps', 'MBps', 'GBps', 'TBps', 'PBps', 'EBps'],\n space: true,\n divisor: 1000,\n },\n packetsPerSec: {\n units: ['pps', 'kpps'],\n space: true,\n divisor: 1000,\n },\n seconds: {\n units: ['ns', '\u03BCs', 'ms', 's'],\n space: true,\n divisor: 1000,\n },\n};\n\nexport const getType = (name: string): TypeTS => {\n const type = TYPES[name];\n if (!isPlainObject(type)) {\n return {\n units: [],\n space: false,\n divisor: 1000,\n };\n }\n return type;\n};\n\nconst convertBaseValueToUnits = (\n value: number,\n unitArray: TypeTS['units'],\n divisor: TypeTS['divisor'],\n initialUnit?: string,\n preferredUnit?: string,\n) => {\n const sliceIndex = initialUnit ? unitArray.indexOf(initialUnit) : 0;\n const units_ = unitArray.slice(sliceIndex);\n\n if (preferredUnit || preferredUnit === '') {\n const unitIndex = units_.indexOf(preferredUnit);\n if (unitIndex !== -1) {\n return {\n value: value / divisor ** unitIndex,\n unit: preferredUnit,\n };\n }\n }\n\n let unit = units_.shift();\n while (value >= divisor && units_.length > 0) {\n value = value / divisor;\n unit = units_.shift();\n }\n return { value, unit };\n};\n\nconst convertValueWithUnitsToBaseValue = (\n value: string,\n unitArray: TypeTS['units'],\n divisor: TypeTS['divisor'],\n): { value: number; unit?: string } => {\n const defaultReturn = { value: 0, unit: undefined };\n if (typeof value !== 'string') {\n return defaultReturn;\n }\n\n let units_ = unitArray.slice().reverse();\n\n // find which unit we're given\n let truncateStringAt = -1;\n const startingUnitIndex = findIndex(units_, function (currentUnitValue) {\n const index = value.indexOf(currentUnitValue);\n if (index > -1) {\n truncateStringAt = index;\n return true;\n }\n return false;\n });\n if (startingUnitIndex <= 0) {\n // can't parse\n return defaultReturn;\n }\n\n // get the numeric value & prepare unit array for conversion\n units_ = units_.slice(startingUnitIndex);\n value = value.substring(0, truncateStringAt);\n\n let numValue: number = toNumber(value);\n\n let unit = units_.shift();\n while (units_.length > 0) {\n numValue = numValue * divisor;\n unit = units_.shift();\n }\n\n return { value: numValue, unit };\n};\n\nconst getDefaultFractionDigits = (value: number) => {\n if (value < 1) {\n return 3;\n }\n if (value < 100) {\n return 2;\n }\n return 1;\n};\n\ntype OptionsType = { locales: string[]; maximumFractionDigits?: number };\n\nconst formatValue = (value: number, options?: OptionsType) => {\n const fractionDigits = getDefaultFractionDigits(value);\n const { locales, ...rest } = defaults(options, {\n maximumFractionDigits: fractionDigits,\n });\n\n // 2nd check converts -0 to 0.\n if (!isFinite(value) || value === 0) {\n value = 0;\n }\n return Intl.NumberFormat(locales, rest).format(value);\n};\n\nconst round = (value: number, fractionDigits = 10) => {\n if (!isFinite(value)) {\n return 0;\n }\n const multiplier = Math.pow(10, fractionDigits || getDefaultFractionDigits(value));\n return Math.round(value * multiplier) / multiplier;\n};\n\nconst humanize = (\n value: number,\n typeName: string,\n useRound = false,\n initialUnit: string,\n preferredUnit: string,\n) => {\n const type = getType(typeName);\n\n if (!isFinite(value)) {\n value = 0;\n }\n\n let converted = convertBaseValueToUnits(\n value,\n type.units,\n type.divisor,\n initialUnit,\n preferredUnit,\n );\n\n if (useRound) {\n converted.value = round(converted.value);\n converted = convertBaseValueToUnits(\n converted.value,\n type.units,\n type.divisor,\n converted.unit,\n preferredUnit,\n );\n }\n\n const formattedValue = formatValue(converted.value);\n\n return {\n string: `${formattedValue}${type.space ? ' ' : ''}${converted.unit || ''}`,\n unit: converted.unit,\n value: converted.value,\n };\n};\n\nconst dehumanize = (value: string, typeName: string) => {\n const type = getType(typeName);\n return convertValueWithUnitsToBaseValue(value, type.units, type.divisor);\n};\n\nconst formatPercentage = (value: number, options?: OptionsType) => {\n const { locales, ...rest } = defaults(\n { style: 'percent' }, // Don't allow perent style to be overridden.\n options,\n {\n maximumFractionDigits: 1,\n },\n );\n return Intl.NumberFormat(locales, rest).format(value);\n};\n\ntype HumanizeFunctionType = (\n v: number,\n initialUnit: string,\n preferredUnit: string,\n) => {\n string: string;\n unit?: string;\n value: number;\n};\n\nexport const humanizeBinaryBytesWithoutB: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'binaryBytesWithoutB', true, initialUnit, preferredUnit);\nexport const humanizeBinaryBytes: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'binaryBytes', true, initialUnit, preferredUnit);\nexport const humanizeDecimalBytes: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'decimalBytes', true, initialUnit, preferredUnit);\nexport const humanizeDecimalBytesPerSec: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'decimalBytesPerSec', true, initialUnit, preferredUnit);\nexport const humanizePacketsPerSec: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'packetsPerSec', true, initialUnit, preferredUnit);\nexport const humanizeNumber: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'numeric', true, initialUnit, preferredUnit);\nexport const humanizeNumberSI: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'SI', true, initialUnit, preferredUnit);\nexport const humanizeSeconds: HumanizeFunctionType = (v, initialUnit, preferredUnit) =>\n humanize(v, 'seconds', true, initialUnit, preferredUnit);\nexport const humanizeCpuCores: HumanizeFunctionType = (v) => {\n const value = v < 1 ? round(v * 1000) : v;\n const unit = v < 1 ? 'm' : '';\n return {\n string: `${formatValue(value)}${unit}`,\n unit,\n value,\n };\n};\nexport const humanizePercentage = (value: number) => {\n // 2nd check converts -0 to 0.\n if (!isFinite(value) || value === 0) {\n value = 0;\n }\n return {\n string: formatPercentage(value / 100),\n unit: '%',\n value: round(value, 1),\n };\n};\n\nconst baseUnitedValidation = (value: string) => {\n if (value === null || value.length === 0) {\n return;\n }\n if (value.search(/\\s/g) !== -1) {\n return 'white space is not allowed';\n }\n};\n\nconst validateNumber = (float: number) => {\n if (float < 0) {\n return 'must be positive';\n }\n if (!isFinite(float)) {\n return 'must be a number';\n }\n};\n\nconst validCPUUnits = new Set(['m', '']);\nconst validateCPUUnit = (value = '') => {\n if (validCPUUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nconst validMemUnits = new Set(['E', 'P', 'T', 'G', 'M', 'k', 'Pi', 'Ti', 'Gi', 'Mi', 'Ki']);\nconst validateMemUnit = (value = '') => {\n if (validMemUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nconst validTimeUnits = new Set(['s', 'm', 'h', 'd', 'M', 'y']);\nconst validateTimeUnit = (value = '') => {\n if (validTimeUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nexport const units = {\n round,\n humanize,\n dehumanize,\n};\n\nexport const validate = {\n split: (value: string) => {\n const index = value.search(/([a-zA-Z]+)/g);\n let number, unit;\n if (index === -1) {\n number = value;\n } else {\n number = value.slice(0, index);\n unit = value.slice(index);\n }\n return [parseFloat(number), unit];\n },\n\n CPU: (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [num, unit] = validate.split(value);\n const number: number = parseFloat((num || '') as unknown as string);\n\n if (!unit) {\n return validateNumber(number);\n }\n\n return validateNumber(number) || validateCPUUnit(unit as unknown as string);\n },\n\n time: (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [num, unit] = validate.split(value);\n const number: number = parseFloat((num || '') as unknown as string);\n\n if (!unit) {\n return 'number and unit required';\n }\n\n return validateNumber(number) || validateTimeUnit(unit as unknown as string);\n },\n\n memory: (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [num, unit] = validate.split(value);\n const number: number = parseFloat((num || '') as unknown as string);\n\n if (!unit) {\n return validateNumber(parseFloat(value));\n }\n\n return validateNumber(number) || validateMemUnit(unit as unknown as string);\n },\n};\n\n// Convert k8s compute resources values to a base value for comparison.\n// If the value has no unit, it just returns the number, so this function\n// can be used for any quota resource (resource counts). `units.dehumanize`\n// is problematic for comparing quota resources because you need to know\n// what unit you're dealing with already (e.g. decimal vs binary). Returns\n// null if value isn't recognized as valid.\nexport const convertToBaseValue = (value: string) => {\n if (!isString(value)) {\n return null;\n }\n\n const [num, unit] = validate.split(value);\n const number: number = parseFloat((num || '') as unknown as string);\n\n const validationError = validateNumber(number);\n if (validationError) {\n return null;\n }\n\n if (!unit) {\n return number;\n }\n\n // Handle CPU millicores specifically.\n if (unit === 'm') {\n return number / 1000;\n }\n\n if (TYPES.binaryBytesWithoutB.units.includes(unit as string)) {\n return dehumanize(value, 'binaryBytesWithoutB').value;\n }\n\n if (TYPES.decimalBytesWithoutB.units.includes(unit as string)) {\n return dehumanize(value, 'decimalBytesWithoutB').value;\n }\n\n // Unrecognized unit.\n return null;\n};\n\nexport const secondsToNanoSeconds = (value: string | number) => {\n const val = Number(value);\n return Number.isFinite(val) ? val * 1000 ** 3 : 0;\n};\n\nexport const formatToFractionalDigits = (value: number, digits: number) =>\n Intl.NumberFormat(undefined, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n }).format(value);\n\nexport const formatBytesAsMiB = (bytes: number) => {\n const mib = bytes / 1024 / 1024;\n return formatToFractionalDigits(mib, 1);\n};\n\nexport const formatBytesAsGiB = (bytes: number) => {\n const gib = bytes / 1024 / 1024 / 1024;\n return formatToFractionalDigits(gib, 2);\n};\n\nexport const formatCores = (cores: number) => formatToFractionalDigits(cores, 3);\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 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 {\n getAllClusterWizardSoftValidationIds,\n getWizardStepClusterStatus,\n WizardStepsValidationMap,\n WizardStepValidationMap,\n} from '../../../common/components/clusterWizard/validationsInfoUtils';\nimport { ClusterWizardStepHostStatusDeterminationObject } from '../../../common/types/hosts';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { ClusterDeploymentWizardStepsType } from './types';\n\nexport type ClusterWizardStepsType =\n | 'cluster-details'\n | 'hosts-selection'\n | 'hosts-discovery'\n | 'networking'\n | 'review';\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 'odf-requirements-satisfied',\n 'lso-requirements-satisfied',\n 'cnv-requirements-satisfied',\n ],\n },\n host: {\n allowedStatuses: ['known', 'known-unbound', 'disabled'],\n groups: ['hardware'],\n validationIds: [\n 'connected',\n 'odf-requirements-satisfied',\n 'lso-requirements-satisfied',\n 'cnv-requirements-satisfied',\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 'hosts-discovery': hostDiscoveryStepValidationsMap,\n 'hosts-selection': hostDiscoveryStepValidationsMap,\n networking: networkingStepValidationsMap,\n review: reviewStepValidationsMap,\n};\n\nexport const allClusterWizardSoftValidationIds =\n getAllClusterWizardSoftValidationIds(wizardStepsValidationsMap);\n\nconst canNextFromClusterDeploymentWizardStep = (\n agentClusterInstall: AgentClusterInstallK8sResource | undefined,\n agents: AgentK8sResource[],\n wizardStepId: ClusterDeploymentWizardStepsType,\n) => {\n const clusterStatus = agentClusterInstall?.status?.debugInfo?.state;\n const validationsInfo = agentClusterInstall?.status?.validationsInfo;\n const hosts = agents.reduce<ClusterWizardStepHostStatusDeterminationObject[]>((result, agent) => {\n const status = agent.status?.debugInfo?.state;\n if (status) {\n result.push({ status, validationsInfo: agent.status?.validationsInfo });\n }\n return result;\n }, []);\n if (!clusterStatus) {\n return false;\n }\n return (\n getWizardStepClusterStatus(\n wizardStepId,\n wizardStepsValidationsMap,\n { status: clusterStatus, validationsInfo: validationsInfo || {} },\n hosts,\n ) === 'ready'\n );\n};\n\nexport const canNextFromHostSelectionStep = (\n agentClusterInstall: AgentClusterInstallK8sResource,\n agents: AgentK8sResource[],\n) => canNextFromClusterDeploymentWizardStep(agentClusterInstall, agents, 'hosts-selection');\n\nexport const canNextFromHostDiscoveryStep = (\n agentClusterInstall: AgentClusterInstallK8sResource | undefined,\n agents: AgentK8sResource[],\n) => canNextFromClusterDeploymentWizardStep(agentClusterInstall, agents, 'hosts-discovery');\n\nexport const canNextFromNetworkingStep = (\n agentClusterInstall: AgentClusterInstallK8sResource,\n agents: AgentK8sResource[],\n) => canNextFromClusterDeploymentWizardStep(agentClusterInstall, agents, 'networking');\n\nexport const canNextFromReviewStep = (\n agentClusterInstall: AgentClusterInstallK8sResource,\n agents: AgentK8sResource[],\n) => canNextFromClusterDeploymentWizardStep(agentClusterInstall, agents, 'review');\n", "import * as React from 'react';\nimport { ConnectedIcon, ExclamationCircleIcon } from '@patternfly/react-icons';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens';\nimport { hostStatus } from '../../../common';\nimport { HostStatus } from '../../../common/components/hosts/types';\n\nexport const bmhStatus: HostStatus<string> = {\n 'bmh-error': {\n key: 'bmh-error',\n title: 'Error',\n category: 'Bare Metal Host related',\n },\n registering: {\n key: 'registering',\n title: 'Registering',\n category: 'Bare Metal Host related',\n },\n provisioning: {\n key: 'provisioning',\n title: 'Provisioning',\n category: 'Bare Metal Host related',\n },\n provisioned: {\n key: 'provisioned',\n title: 'Provisioned',\n category: 'Bare Metal Host related',\n },\n deprovisioning: {\n key: 'deprovisioning',\n title: 'Deprovisioning',\n category: 'Bare Metal Host related',\n },\n inspecting: {\n key: 'inspecting',\n title: 'Inspecting',\n category: 'Bare Metal Host related',\n },\n pending: {\n key: 'pending',\n title: 'Pending',\n category: 'Bare Metal Host related',\n },\n};\n\nexport const agentStatus: HostStatus<string> = {\n ...hostStatus,\n discovered: {\n key: 'discovered',\n title: 'Discovered',\n icon: <ConnectedIcon />,\n noPopover: true,\n category: 'Discovery related',\n details: 'The host has been discovered and needs to be approved to before further use.',\n },\n ...bmhStatus,\n specSyncErr: {\n key: 'spec-sync-err',\n title: 'Sync error',\n icon: <ExclamationCircleIcon color={dangerColor.value} />,\n category: 'Discovery related',\n },\n};\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 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 * 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", "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", "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 { 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 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 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 { 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 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 { 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 * 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", "import {\n AgentClusterInstallK8sResource,\n AgentClusterInstallStatusCondition,\n AgentClusterInstallStatusConditionType,\n} from '../../types/k8s/agent-cluster-install';\nimport { Cluster, Host } from '../../../common/api/types';\nimport {\n AgentK8sResource,\n AgentStatusCondition,\n AgentStatusConditionType,\n} from '../../types/k8s/agent';\nimport { BareMetalHostK8sResource } from '../../types/k8s/bare-metal-host';\nimport { StatusCondition } from '../../types/k8s/shared';\nimport { ValidationsInfo } from '../../../common/types/hosts';\nimport {\n areOnlySoftValidationsOfWizardStepFailing,\n getWizardStepHostStatus,\n getWizardStepHostValidationsInfo,\n} from '../../../common/components/clusterWizard/validationsInfoUtils';\nimport {\n ClusterWizardStepsType,\n wizardStepsValidationsMap,\n} from '../ClusterDeployment/wizardTransition';\nimport { HostStatusDef } from '../../../common';\nimport { agentStatus, bmhStatus } from './agentStatus';\nimport { TFunction } from 'i18next';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst conditionsByTypeReducer = <K>(\n result: { K?: StatusCondition<string> },\n condition: StatusCondition<string>,\n) => ({\n ...result,\n [condition.type]: condition,\n});\n\nexport const getClusterStatusFromConditions = (\n agentClusterInstall: AgentClusterInstallK8sResource,\n t: TFunction,\n): [Cluster['status'], string] => {\n const conditions = agentClusterInstall?.status?.conditions || [];\n\n const conditionsByType: {\n [key in AgentClusterInstallStatusConditionType]?: AgentClusterInstallStatusCondition;\n } = conditions.reduce(conditionsByTypeReducer, {});\n\n const { Validated, RequirementsMet, Completed, Stopped } = conditionsByType;\n\n if (!Validated || !RequirementsMet || !Completed || !Stopped) {\n return ['insufficient', t('ai:AgentClusterInstall conditions are missing.')];\n }\n\n if (Stopped.status === 'True' && Stopped.reason === 'InstallationCancelled')\n return ['cancelled', Stopped.message];\n if (Stopped.status === 'True' && Stopped.reason === 'InstallationFailed')\n return ['error', Stopped.message];\n if (Completed.status === 'True' && Completed.reason === 'InstallationCompleted')\n return ['installed', Completed.message];\n if (Completed.status === 'False' && Completed.reason === 'InstallationInProgress')\n return ['installing', Completed.message];\n if (Validated.status === 'False' && Validated.reason === 'ValidationsFailing')\n return ['insufficient', Validated.message];\n if (Validated.status === 'False' && Validated.reason === 'ValidationsUserPending')\n return ['pending-for-input', Validated.message];\n if (Validated.status === 'False' && Validated.reason === 'ValidationsUnknown')\n return ['insufficient', Validated.message];\n\n if (RequirementsMet.status === 'False' && RequirementsMet.reason === 'ClusterNotReady')\n return ['insufficient', RequirementsMet.message];\n if (RequirementsMet.status === 'False' && RequirementsMet.reason === 'InsufficientAgents')\n return ['insufficient', RequirementsMet.message];\n if (RequirementsMet.status === 'False' && RequirementsMet.reason === 'UnapprovedAgents')\n return ['insufficient', RequirementsMet.message];\n if (Completed.status === 'False' && Completed.reason === 'UnapprovedAgents')\n return ['insufficient', Completed.message];\n\n console.error('Unhandled conditions to cluster status mapping: ', conditionsByType);\n return ['insufficient', t('ai:Unexpected AgentClusterInstall conditions.')];\n};\n\nexport const getClusterStatus = (\n agentClusterInstall?: AgentClusterInstallK8sResource,\n): [Cluster['status'], Cluster['statusInfo']] => {\n const { state: status, stateInfo: statusInfo } = agentClusterInstall?.status?.debugInfo || {};\n return [status || 'insufficient', statusInfo || ''];\n};\n\nexport const isDraft = (agentClusterInstall?: AgentClusterInstallK8sResource): boolean =>\n !!agentClusterInstall &&\n ['pending-for-input', 'insufficient', 'ready'].includes(getClusterStatus(agentClusterInstall)[0]);\n\nexport const getAgentStatusFromConditions = (\n agent: AgentK8sResource,\n t: TFunction,\n): [Host['status'], string] => {\n const conditions = agent.status?.conditions;\n\n const conditionsByType: {\n [key in AgentStatusConditionType]?: AgentStatusCondition;\n } = (conditions || []).reduce(conditionsByTypeReducer, {});\n\n const { Installed, Connected, ReadyForInstallation } = conditionsByType;\n\n if (Installed?.status === 'True') return ['installed', Installed.message];\n if (Installed?.status === 'False' && Installed.reason === 'InstallationFailed')\n return ['error', Installed.message];\n if (Installed?.status === 'False' && Installed?.reason === 'InstallationInProgress')\n return ['installing', Installed?.message];\n if (Connected?.status === 'False') return ['disconnected', Connected.message];\n if (ReadyForInstallation?.status === 'True') return ['known', ReadyForInstallation.message];\n if (\n ReadyForInstallation?.status === 'False' &&\n ReadyForInstallation?.reason === 'AgentIsNotApproved'\n )\n return ['pending-for-input', ReadyForInstallation.message];\n if (ReadyForInstallation?.status === 'False' && ReadyForInstallation?.reason === 'AgentNotReady')\n return ['insufficient', ReadyForInstallation.message];\n\n console.error('Unhandled conditions to agent status mapping: ', conditionsByType);\n return ['insufficient', t('ai:Unexpected Agent conditions.')];\n};\n\nexport type AgentStatus = Host['status'] | 'discovered';\n\nconst getInsufficientState = (agent: AgentK8sResource) =>\n agent?.spec?.clusterDeploymentName?.name ? 'insufficient' : 'insufficient-unbound';\n\nexport const getAgentStatus = (\n agent: AgentK8sResource,\n excludeDiscovered = false,\n): { status: HostStatusDef; validationsInfo: ValidationsInfo; autoCSR?: boolean } => {\n const specSyncErr = agent.status?.conditions?.find(\n (c) => c.type === 'SpecSynced' && c.status === 'False',\n );\n\n let status: HostStatusDef;\n let validationsInfo: ValidationsInfo = {};\n if (specSyncErr) {\n status = agentStatus['specSyncErr'];\n } else {\n status = agentStatus[agent.status?.debugInfo?.state || getInsufficientState(agent)];\n validationsInfo = agent.status?.validationsInfo || {};\n if (!excludeDiscovered && !agent.spec.approved) {\n status = agentStatus.discovered;\n }\n // TODO(jtomasek): Implement this\n // const sublabel = areOnlyClusterSoftValidationsFailing(agentStatus.validationsInfo)\n // ? 'Some validations failed'\n // : undefined;\n }\n return { status, validationsInfo };\n};\n\nexport const getWizardStepAgentStatus = (\n agent: AgentK8sResource,\n wizardStepId: ClusterWizardStepsType,\n t: TFunction,\n excludeDiscovered = false,\n): { status: HostStatusDef; validationsInfo: ValidationsInfo } => {\n const aStatus = getAgentStatus(agent, excludeDiscovered);\n if ([agentStatus.discovered, agentStatus.specSyncErr].includes(aStatus.status)) {\n return aStatus;\n }\n\n const status =\n agentStatus[\n getWizardStepHostStatus(wizardStepId, wizardStepsValidationsMap, {\n status: aStatus.status.key as Host['status'],\n validationsInfo: aStatus.validationsInfo,\n })\n ];\n const validationsInfo = getWizardStepHostValidationsInfo(\n aStatus.validationsInfo,\n wizardStepId,\n wizardStepsValidationsMap,\n );\n status.sublabel = areOnlySoftValidationsOfWizardStepFailing(\n aStatus.validationsInfo,\n wizardStepId,\n wizardStepsValidationsMap,\n )\n ? t('ai:Some validations failed')\n : undefined;\n\n return {\n status,\n validationsInfo,\n };\n};\n\nexport const getBMHStatus = (bmh: BareMetalHostK8sResource) => {\n let bmhState = bmhStatus.pending;\n\n if (bmh.status?.errorType) {\n bmhState = bmhStatus['bmh-error'];\n } else if (bmh.status?.provisioning?.state) {\n bmhState = bmhStatus[bmh.status?.provisioning?.state] || bmhStatus.pending;\n }\n\n return {\n state: bmhState,\n errorMessage: bmh.status?.errorMessage,\n };\n};\n", "import cloneDeep from 'lodash/cloneDeep';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { Cluster, Host, Inventory } from '../../../common/api/types';\nimport { ClusterDeploymentK8sResource } from '../../types/k8s/cluster-deployment';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { getAgentStatus, getClusterStatus } from './status';\nimport { getHostNetworks } from './network';\nimport { BareMetalHostK8sResource, InfraEnvK8sResource } from '../../types';\nimport { AGENT_BMH_NAME_LABEL_KEY, BMH_HOSTNAME_ANNOTATION } from '../common/constants';\nimport { getAgentProgress, getAgentRole, getInfraEnvNameOfAgent } from './agents';\nimport { getClusterDeploymentCpuArchitecture } from './clusterDeployment';\n\nexport const getAIHosts = (\n agents: AgentK8sResource[],\n bmhs?: BareMetalHostK8sResource[],\n infraEnv?: InfraEnvK8sResource,\n) => {\n const bmhAgents: string[] = [];\n const hosts = agents.map((agent): Host => {\n const { status } = getAgentStatus(agent, true);\n const statusInfo = agent.status?.debugInfo?.stateInfo || '';\n // TODO(mlibra) Remove that workaround once https://issues.redhat.com/browse/MGMT-7052 is fixed\n const inventory: Inventory = cloneDeep(agent.status?.inventory || {});\n inventory.interfaces?.forEach((intf) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n intf.ipv4Addresses = cloneDeep(intf.ipV4Addresses);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n intf.ipv6Addresses = cloneDeep(intf.ipV6Addresses);\n });\n\n if (agent.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY]) {\n const bmhName = agent.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY];\n bmhAgents.push(bmhName);\n const bmh = bmhs?.find(\n (h) => h.metadata?.name === bmhName && h.metadata?.namespace === agent.metadata?.namespace,\n );\n if (bmh?.spec?.bmc?.address) {\n inventory.bmcAddress = bmh.spec.bmc.address;\n }\n }\n\n const agentProgress = getAgentProgress(agent);\n return {\n kind: 'Host',\n id: agent.metadata?.uid || '',\n href: '',\n status: status.key as Host['status'],\n statusInfo,\n role: getAgentRole(agent),\n requestedHostname: agent.spec.hostname || inventory.hostname,\n createdAt: agent.metadata?.creationTimestamp,\n validationsInfo: JSON.stringify(agent.status?.validationsInfo || {}),\n inventory: JSON.stringify(inventory),\n progress: agentProgress && {\n currentStage: agentProgress.currentStage,\n installationPercentage: agentProgress.installationPercentage,\n progressInfo: agentProgress.progressInfo,\n stageStartedAt: agentProgress.stageStartTime,\n stageUpdatedAt: agentProgress.stageUpdateTime,\n },\n progressStages: agentProgress?.progressStages,\n bootstrap: agent.status?.bootstrap,\n installationDiskId: agent.spec.installation_disk_id,\n };\n });\n\n const restBmhs =\n infraEnv && bmhs\n ? bmhs\n ?.filter((h) =>\n h.metadata?.namespace === infraEnv.metadata?.namespace &&\n getInfraEnvNameOfAgent(h) === infraEnv.metadata?.name &&\n h.metadata?.name\n ? !bmhAgents.includes(h.metadata.name)\n : true,\n )\n .map((h) => {\n const hostInventory: Inventory = {\n hostname: h.metadata?.annotations?.[BMH_HOSTNAME_ANNOTATION] || h.metadata?.name,\n bmcAddress: h.spec?.bmc?.address,\n systemVendor: {\n virtual: false,\n productName: 'Bare Metal Host',\n },\n };\n\n const restBmh: Host = {\n id: h.metadata?.uid || '',\n href: 'bmc', // It's BMC\n kind: 'Host',\n status: 'known',\n statusInfo: '',\n inventory: JSON.stringify(hostInventory),\n requestedHostname:\n h.metadata?.annotations?.[BMH_HOSTNAME_ANNOTATION] || h.metadata?.name,\n role: undefined,\n createdAt: h.metadata?.creationTimestamp,\n };\n\n return restBmh;\n })\n : [];\n\n return [...hosts, ...restBmhs];\n};\n\nexport const getAICluster = ({\n clusterDeployment,\n agentClusterInstall,\n agents = [],\n infraEnv,\n}: {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall?: AgentClusterInstallK8sResource;\n agents?: AgentK8sResource[];\n infraEnv?: InfraEnvK8sResource;\n}): Cluster => {\n const installVersion = clusterDeployment.status?.installVersion;\n const [status, statusInfo] = getClusterStatus(agentClusterInstall);\n const aiCluster: Cluster = {\n id: clusterDeployment.metadata?.uid || '',\n kind: 'Cluster',\n href: '',\n name: clusterDeployment.spec?.clusterName,\n baseDnsDomain: clusterDeployment.spec?.baseDomain,\n openshiftVersion: installVersion,\n apiVip: agentClusterInstall?.status?.apiVIP || agentClusterInstall?.spec?.apiVIP,\n ingressVip: agentClusterInstall?.status?.ingressVIP || agentClusterInstall?.spec?.apiVIP,\n highAvailabilityMode:\n agentClusterInstall?.spec?.provisionRequirements?.controlPlaneAgents === 1 ? 'None' : 'Full',\n status,\n statusInfo,\n imageInfo: {\n sshPublicKey: agentClusterInstall?.spec?.sshPublicKey,\n },\n sshPublicKey: agentClusterInstall?.spec?.sshPublicKey,\n clusterNetworkHostPrefix:\n agentClusterInstall?.spec?.networking?.clusterNetwork?.[0]?.hostPrefix,\n clusterNetworkCidr: agentClusterInstall?.spec?.networking?.clusterNetwork?.[0]?.cidr,\n serviceNetworkCidr: agentClusterInstall?.spec?.networking?.serviceNetwork?.[0],\n machineNetworkCidr: agentClusterInstall?.spec?.networking?.machineNetwork?.[0]?.cidr,\n monitoredOperators: [],\n vipDhcpAllocation: false,\n userManagedNetworking:\n agentClusterInstall?.spec?.provisionRequirements?.controlPlaneAgents === 1,\n hostNetworks: getHostNetworks(agents, agentClusterInstall),\n totalHostCount: agents?.length,\n hosts: getAIHosts(agents),\n installStartedAt: clusterDeployment.status?.installStartedTimestamp,\n installCompletedAt: clusterDeployment.status?.installedTimestamp,\n validationsInfo: JSON.stringify(agentClusterInstall?.status?.validationsInfo || {}),\n cpuArchitecture: getClusterDeploymentCpuArchitecture(clusterDeployment, infraEnv),\n };\n /*\n aiCluster.agentSelectorMasterLabels =\n clusterDeployment.spec?.platform?.agentBareMetal?.agentSelector?.matchLabels;\n\n // TODO(mlibra): Where to store that in K8S resources?\n //\n // Initial value of the \"Auto-select control plane (master) hosts\" switch\n // is driven by either undefined or actual value of agentSelectorWorkerLabels\n aiCluster.agentSelectorWorkerLabels = undefined;\n*/\n return aiCluster;\n};\n", "import { AgentK8sResource } from '../../types/k8s/agent';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\n\nexport const getHostNetworks = (\n agents: AgentK8sResource[],\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) => {\n if (!agents?.length || !agentClusterInstall?.status?.connectivityMajorityGroups) {\n return [];\n }\n\n const connectivityMajorityGroups = JSON.parse(\n agentClusterInstall.status.connectivityMajorityGroups,\n );\n\n // Format: '{\"192.168.122.0/24\":[\"4ae8f799-7d60-4d13-be7b-f9c93ddec28e\",\"c891ff23-9b0d-4b8e-be05-c9bcc145e823\",\"cd188ad8-8290-4e7f-a86f-b85fef0e63aa\"]}'\n return Object.keys(connectivityMajorityGroups)\n .filter((k) => !['IPv4', 'IPv6'].includes(k))\n .map((cidr) => {\n const hostIds: string[] = [];\n connectivityMajorityGroups[cidr].forEach((hostName: string) => {\n const agent: AgentK8sResource | undefined = agents.find(\n (agent) => agent.metadata?.name === hostName,\n );\n if (!agent?.metadata?.uid) {\n console.warn(`Can not find agent of ${hostName} name.`);\n } else {\n hostIds.push(agent.metadata.uid);\n }\n });\n\n return {\n cidr,\n hostIds,\n };\n });\n};\n", "export const AGENT_LOCATION_LABEL_KEY =\n 'agentclusterinstalls.extensions.hive.openshift.io/location';\n\nexport const AGENT_SELECTOR = 'agentBareMetal-agentSelector-';\n\nexport const AGENT_AUTO_SELECT_ANNOTATION_KEY = `agentBareMetal-agentSelector/autoSelect`;\n\nexport const AGENT_NOLOCATION_VALUE = 'NOLOCATION';\n\nexport const INFRAENV_AGENTINSTALL_LABEL_KEY = 'infraenvs.agent-install.openshift.io';\n\nexport const AGENT_BMH_NAME_LABEL_KEY = 'agent-install.openshift.io/bmh';\n\nexport const INFRAENV_GENERATED_AI_FLOW = 'agentBareMetal-generated-infraenv-ai-flow'; // mind ai-template.hbs in ACM when changed here\n\nexport const CPU_ARCHITECTURE_ANNOTATION_KEY = 'agentBareMetal-cpuArchitecture';\n\nexport const getInfraEnvDocs = (docVersion: string) =>\n `https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/${docVersion}/html-single/clusters/index#enable-cim`;\n\nexport const BMH_HOSTNAME_ANNOTATION = 'bmac.agent-install.openshift.io/hostname';\n", "import { AgentStatus } from './status';\nimport { Host } from '../../../common/api/types';\nimport { AgentK8sResource, BareMetalHostK8sResource } from '../../types';\nimport { getAgentStatus } from './status';\nimport { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common/constants';\n\nconst AGENT_FOR_SELECTION_STATUSES: AgentStatus[] = [\n 'known',\n 'known-unbound',\n 'insufficient',\n 'pending-for-input',\n 'binding',\n 'unbinding',\n 'discovering',\n 'reclaiming',\n 'reclaiming-rebooting',\n];\n\nexport const hostToAgent = (agents: AgentK8sResource[] = [], host: Host) =>\n agents.find((a) => a.metadata?.uid === host.id) as AgentK8sResource;\n\nexport const getAgentsForSelection = (agents: AgentK8sResource[]) =>\n agents.filter((agent) => {\n const { status } = getAgentStatus(agent);\n return AGENT_FOR_SELECTION_STATUSES.includes(status.key as AgentStatus);\n });\n\nexport const getAgentRole = (agent: AgentK8sResource) => agent.spec.role || agent.status?.role;\n\nexport const getAgentProgress = (agent: AgentK8sResource) => agent.status?.progress;\n\nexport const getInfraEnvNameOfAgent = (resource?: AgentK8sResource | BareMetalHostK8sResource) =>\n resource?.metadata?.labels?.[INFRAENV_AGENTINSTALL_LABEL_KEY];\n\nexport const getClusterNameOfAgent = (agent?: AgentK8sResource) =>\n agent?.spec?.clusterDeploymentName?.name;\n", "import { ObjectMetadata } from '@openshift-console/dynamic-plugin-sdk';\nimport isEqual from 'lodash/isEqual';\nimport pick from 'lodash/pick';\nimport { CpuArchitecture, getHumanizedDateTime, parseStringLabels } from '../../../common';\nimport {\n AgentClusterInstallK8sResource,\n ClusterDeploymentK8sResource,\n InfraEnvK8sResource,\n} from '../../types';\nimport {\n AgentSelectorChangeProps,\n ClusterDeploymentHostsSelectionValues,\n} from '../ClusterDeployment/types';\nimport {\n AGENT_LOCATION_LABEL_KEY,\n AGENT_AUTO_SELECT_ANNOTATION_KEY,\n AGENT_SELECTOR,\n CPU_ARCHITECTURE_ANNOTATION_KEY,\n} from '../common';\nimport { getClusterStatus } from './status';\n\nexport type ClusterDeploymentParams = {\n name: string;\n namespace: string;\n baseDnsDomain: string;\n annotations?: { [key: string]: string };\n pullSecretName: string;\n};\n\nexport const getAgentSelectorFieldsFromAnnotations = (\n annotations: ObjectMetadata['annotations'] = {},\n): AgentSelectorChangeProps => {\n const locations = annotations[AGENT_LOCATION_LABEL_KEY]?.split(',') || [];\n\n const labels = Object.keys(annotations)\n .map((key) => {\n if (key.startsWith(AGENT_SELECTOR)) {\n const label = key.substr(AGENT_SELECTOR.length);\n return `${label}=${annotations[key]}`;\n }\n return undefined;\n })\n .filter(Boolean) as string[];\n\n return {\n labels,\n locations,\n autoSelect:\n !annotations[AGENT_AUTO_SELECT_ANNOTATION_KEY] ||\n annotations[AGENT_AUTO_SELECT_ANNOTATION_KEY] === 'true',\n };\n};\n\nexport const getAnnotationsFromAgentSelector = (\n clusterDeployment: ClusterDeploymentK8sResource,\n values: ClusterDeploymentHostsSelectionValues,\n): ObjectMetadata['annotations'] => {\n const { agentLabels: labelValuePairs, locations, autoSelectHosts } = values;\n const agentLabels = parseStringLabels(labelValuePairs || []);\n const annotations: ObjectMetadata['annotations'] = {\n ...(clusterDeployment?.metadata?.annotations || {}),\n };\n Object.keys(annotations).forEach((key) => {\n if (key.startsWith(AGENT_SELECTOR)) {\n delete annotations[key];\n }\n });\n Object.keys(agentLabels).forEach((key) => {\n annotations[`${AGENT_SELECTOR}${key}`] = agentLabels[key];\n });\n\n delete annotations[AGENT_AUTO_SELECT_ANNOTATION_KEY];\n\n if (locations.length) {\n annotations[AGENT_LOCATION_LABEL_KEY] = locations.join(',');\n } else {\n delete annotations[AGENT_LOCATION_LABEL_KEY];\n }\n\n if (!autoSelectHosts) {\n annotations[AGENT_AUTO_SELECT_ANNOTATION_KEY] = 'false';\n }\n return annotations;\n};\n\nexport const getClusterDeploymentResource = ({\n name,\n namespace,\n baseDnsDomain,\n annotations,\n pullSecretName,\n}: ClusterDeploymentParams): ClusterDeploymentK8sResource => {\n return {\n apiVersion: 'hive.openshift.io/v1',\n kind: 'ClusterDeployment',\n metadata: {\n name: name,\n namespace,\n annotations,\n },\n spec: {\n baseDomain: baseDnsDomain,\n clusterInstallRef: {\n group: 'extensions.hive.openshift.io',\n kind: 'AgentClusterInstall',\n name: name,\n version: 'v1beta1',\n },\n clusterName: name,\n platform: {\n agentBareMetal: {\n agentSelector: {\n /* So far left empty, annotations are used instead.\n Needs https://issues.redhat.com/browse/HIVE-1636 to be fixed.\n */\n },\n },\n },\n pullSecretRef: {\n name: pullSecretName,\n },\n },\n };\n};\n\n// Temporary workaround until https://issues.redhat.com/browse/HIVE-1666\nconst WORKAROUND_COMPUTEDURLS_CLUSTER_STATUS = ['adding-hosts', 'installed', 'finalizing'];\n\nexport const getConsoleUrl = (\n clusterDeployment?: ClusterDeploymentK8sResource,\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) =>\n clusterDeployment?.status?.webConsoleURL ||\n (WORKAROUND_COMPUTEDURLS_CLUSTER_STATUS.includes(getClusterStatus(agentClusterInstall)[0])\n ? `https://console-openshift-console.apps.${clusterDeployment?.spec?.clusterName}.${clusterDeployment?.spec?.baseDomain}`\n : undefined);\n\nexport const getClusterApiUrl = (\n clusterDeployment?: ClusterDeploymentK8sResource,\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) =>\n clusterDeployment?.status?.apiURL ||\n (WORKAROUND_COMPUTEDURLS_CLUSTER_STATUS.includes(getClusterStatus(agentClusterInstall)[0])\n ? `https://api.${clusterDeployment?.spec?.clusterName}.${clusterDeployment?.spec?.baseDomain}`\n : undefined);\n\ntype ClusterPropertyKeys =\n | 'name'\n | 'openshiftVersion'\n | 'baseDnsDomain'\n | 'apiVip'\n | 'ingressVip'\n | 'clusterId'\n | 'clusterNetworkCidr'\n | 'clusterNetworkHostPrefix'\n | 'serviceNetworkCidr'\n | 'installedTimestamp';\n\ntype ClusterPropertyItem = {\n key: string;\n value?: React.ReactNode;\n};\n\nexport const getClusterProperties = (\n clusterDeployment: ClusterDeploymentK8sResource,\n agentClusterInstall: AgentClusterInstallK8sResource,\n): { [key in ClusterPropertyKeys]: ClusterPropertyItem } => {\n const serviceNetworks = agentClusterInstall.spec?.networking?.serviceNetwork;\n const clusterNetworks = agentClusterInstall.spec?.networking?.clusterNetwork;\n\n return {\n // TODO: we should translate following keys since they are used \"as it is\" in AcmDescriptionList.tsx / List component of the stolostron project\n name: {\n key: 'Name',\n value: clusterDeployment.metadata?.name,\n },\n openshiftVersion: {\n key: 'OpenShift version',\n value: clusterDeployment.status?.installVersion,\n },\n clusterId: {\n key: 'Cluster ID',\n value: clusterDeployment.metadata?.uid,\n },\n baseDnsDomain: {\n key: 'Base DNS domain',\n value: clusterDeployment.spec?.baseDomain,\n },\n apiVip: {\n key: 'API IP',\n value: agentClusterInstall?.spec?.apiVIP,\n },\n ingressVip: {\n key: 'Ingress IP',\n value: agentClusterInstall?.spec?.ingressVIP,\n },\n clusterNetworkCidr: {\n key: (clusterNetworks?.length || 0) > 1 ? 'Cluster network CIDRs' : 'Cluster network CIDR',\n value: clusterNetworks?.map((n) => n.cidr).join(', '),\n },\n clusterNetworkHostPrefix: {\n key:\n (clusterNetworks?.length || 0) > 1\n ? 'Cluster network host prefixes'\n : 'Cluster network host prefix',\n value: clusterNetworks?.map((n) => n.hostPrefix).join(', '),\n },\n serviceNetworkCidr: {\n key: (serviceNetworks?.length || 0) > 1 ? 'Service network CIDRs' : 'Service network CIDR',\n value: serviceNetworks?.join(', '),\n },\n installedTimestamp: {\n key: 'Installed at',\n value: getHumanizedDateTime(clusterDeployment.status?.installedTimestamp),\n },\n };\n};\n\nexport const getClusterDeploymentCpuArchitecture = (\n clusterDeployment: ClusterDeploymentK8sResource,\n infraEnv?: InfraEnvK8sResource,\n) => {\n let arch;\n if (\n infraEnv &&\n isEqual(infraEnv.spec?.clusterRef, pick(clusterDeployment.metadata, ['name', 'namespace']))\n ) {\n arch = infraEnv.spec?.cpuArchitecture;\n } else {\n arch = clusterDeployment.metadata?.annotations?.[CPU_ARCHITECTURE_ANNOTATION_KEY];\n }\n\n return arch === CpuArchitecture.ARM ? CpuArchitecture.ARM : CpuArchitecture.x86;\n};\n", "import { Alert, AlertActionLink, AlertVariant } from '@patternfly/react-core';\nimport React from 'react';\nimport { MinimalHWRequirementsModal } from '../Agent/MinimalHWRequirements';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { DiscoveryTroubleshootingModal } from '../../../common/components/clusterConfiguration/DiscoveryTroubleshootingModal';\nimport { ConfigMapK8sResource } from '../../types/fromOCP/k8sTypes';\n\ntype InfoAndTroubleshootingNotificationProps = {\n isSNO?: boolean;\n assistedServiceConfigMap: ConfigMapK8sResource;\n};\n\nconst InfoAndTroubleshootingNotification = ({\n isSNO = false,\n assistedServiceConfigMap,\n}: InfoAndTroubleshootingNotificationProps) => {\n const { t } = useTranslation();\n const [isDiscoveryHintModalOpen, setIsDiscoveryHintModalOpen] = React.useState(false);\n const [isMinimalHWRequirementsModalOpen, setIsMinimalHWRequirementsModalOpen] =\n React.useState(false);\n return (\n <>\n <Alert\n variant={AlertVariant.info}\n title={t('ai:Information & Troubleshooting')}\n actionLinks={\n <>\n <AlertActionLink onClick={() => setIsMinimalHWRequirementsModalOpen(true)}>\n {t('ai:Minimum hardware requirements')}\n </AlertActionLink>\n <AlertActionLink onClick={() => setIsDiscoveryHintModalOpen(true)}>\n {t('ai:Host not showing up?', { count: +isSNO })}\n </AlertActionLink>\n </>\n }\n isInline\n />\n {isDiscoveryHintModalOpen && (\n <DiscoveryTroubleshootingModal\n isOpen={isDiscoveryHintModalOpen}\n setDiscoveryHintModalOpen={setIsDiscoveryHintModalOpen}\n />\n )}\n {isMinimalHWRequirementsModalOpen && (\n <MinimalHWRequirementsModal\n isSNOCluster={isSNO}\n aiConfigMap={assistedServiceConfigMap}\n isOpen={isMinimalHWRequirementsModalOpen}\n onClose={() => setIsMinimalHWRequirementsModalOpen(false)}\n />\n )}\n </>\n );\n};\n\nexport default InfoAndTroubleshootingNotification;\n", "import * as React from 'react';\nimport { Button, ButtonVariant, Modal, ModalVariant } from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\n\nimport { ConfigMapK8sResource } from '../../types';\nimport HostRequirements, {\n HostRequirementsListProps,\n} from '../../../common/components/hosts/HostRequirements';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype HostData = {\n cpu_cores: number;\n ram_mib: number;\n disk_size_gb: number;\n};\n\ntype HWRequirements = {\n version: string;\n master: HostData;\n worker: HostData;\n sno: HostData;\n};\n\ntype MinimalHWRequirementsProps = {\n aiConfigMap: ConfigMapK8sResource;\n isSNOCluster?: boolean;\n};\n\ntype MinimalHWRequirementsModalProps = MinimalHWRequirementsProps & {\n isOpen: boolean;\n onClose: () => void;\n};\n\nexport const getHWRequirements = (aiConfigMap: ConfigMapK8sResource): HostRequirementsListProps => {\n let hwRequirements: HWRequirements | undefined;\n try {\n const hwData = JSON.parse(\n aiConfigMap.data?.HW_VALIDATOR_REQUIREMENTS || '[]',\n ) as HWRequirements[];\n\n hwRequirements = hwData.find((req: { version?: string }) => req.version === 'default');\n } catch {\n console.error('Failed to parse hw requirements config map');\n hwRequirements = undefined;\n }\n\n return {\n master: {\n cpuCores: hwRequirements?.master?.cpu_cores,\n ramMib: hwRequirements?.master?.ram_mib,\n diskSizeGb: hwRequirements?.master?.disk_size_gb,\n },\n worker: {\n cpuCores: hwRequirements?.worker?.cpu_cores,\n ramMib: hwRequirements?.worker?.ram_mib,\n diskSizeGb: hwRequirements?.worker?.disk_size_gb,\n },\n sno: {\n cpuCores: hwRequirements?.sno?.cpu_cores,\n ramMib: hwRequirements?.sno?.ram_mib,\n diskSizeGb: hwRequirements?.sno?.disk_size_gb,\n },\n };\n};\n\nconst MinimalHWRequirements: React.FC<MinimalHWRequirementsProps> = ({\n aiConfigMap,\n isSNOCluster,\n}) => {\n const [isHostRequirementsOpen, setHostRequirementsOpen] = React.useState(false);\n const { t } = useTranslation();\n return (\n <>\n <Button\n variant={ButtonVariant.link}\n onClick={() => setHostRequirementsOpen(true)}\n isInline\n className=\"host-requirements-link\"\n >\n <InfoCircleIcon size=\"sm\" />\n &nbsp;{t('ai:Minimum hardware requirements')}\n </Button>\n <MinimalHWRequirementsModal\n isOpen={isHostRequirementsOpen}\n onClose={() => setHostRequirementsOpen(false)}\n aiConfigMap={aiConfigMap}\n isSNOCluster={isSNOCluster}\n />\n </>\n );\n};\n\nexport const MinimalHWRequirementsModal = ({\n isOpen,\n aiConfigMap,\n isSNOCluster,\n onClose,\n}: MinimalHWRequirementsModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal\n title={t('ai:Minimum hardware requirements')}\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.medium}\n >\n <HostRequirements {...getHWRequirements(aiConfigMap)} isSNOCluster={isSNOCluster} />\n </Modal>\n );\n};\n\nexport default MinimalHWRequirements;\n", "import { StatusCondition } from '../../types';\nimport { AgentK8sResource } from '../../types/k8s/agent';\n\nexport const REQUIRED_AGENT_CONDITION_TYPES = ['SpecSynced', 'Connected', 'Validated'];\n\nexport const getFailingAgentConditions = (agents: AgentK8sResource[] = []) => {\n const agentsAlerts = {};\n const ofType = REQUIRED_AGENT_CONDITION_TYPES;\n\n agents.forEach((a) => {\n const failingConds = a.status?.conditions?.filter(\n (condition) => ofType.includes(condition.type) && condition.status === 'False',\n );\n if (failingConds?.length) {\n agentsAlerts[a.metadata?.name || 'unknownname'] = failingConds;\n }\n });\n\n return agentsAlerts;\n};\n\nexport const getFailingResourceConditions = (\n resource: {\n status?: {\n conditions?: StatusCondition<string>[];\n };\n } = {},\n // ofType === unknown matches ALL condition types\n ofType?: string[],\n): StatusCondition<string>[] =>\n resource.status?.conditions?.filter(\n (c) => (!ofType || ofType?.includes(c.type)) && c.status === 'False',\n ) || [];\n", "import uniqBy from 'lodash/uniqBy';\n\nimport {\n AgentClusterInstallK8sResource,\n ClusterImageSetK8sResource,\n ClusterVersionK8sResource,\n} from '../../types';\nimport { OpenshiftVersionOptionType, OpenshiftVersion } from '../../../common';\n\nexport const getVersionFromReleaseImage = (releaseImage = '') => {\n const match = /.+:(.*)-/gm.exec(releaseImage);\n if (match && match[1]) {\n return match[1];\n }\n};\n\n// eslint-disable-next-line\nconst getSupportLevelFromChannel = (\n channel?: string,\n): OpenshiftVersion['supportLevel'] | 'custom' => {\n if (!channel) {\n return 'maintenance';\n }\n\n if (channel.startsWith('fast')) {\n return 'beta'; // TODO(mlibra): Is this correct?\n }\n\n if (channel.startsWith('stable')) {\n return 'production';\n }\n\n return 'beta';\n};\n\nexport const getOCPVersions = (\n clusterImageSets: ClusterImageSetK8sResource[],\n): OpenshiftVersionOptionType[] => {\n const versions = clusterImageSets\n .filter((clusterImageSet) => clusterImageSet.metadata?.labels?.visible !== 'false')\n .map((clusterImageSet): OpenshiftVersionOptionType => {\n const version = getVersionFromReleaseImage(clusterImageSet.spec?.releaseImage);\n return {\n label: `OpenShift ${version ? version : (clusterImageSet.metadata?.name as string)}`,\n version: version || clusterImageSet.metadata?.name || '',\n value: clusterImageSet.metadata?.name as string,\n default: false,\n // (rawagner) ACM does not have the warning so changing to 'production'\n supportLevel: 'production', // getSupportLevelFromChannel(clusterImageSet.metadata?.labels?.channel),\n };\n })\n .sort(\n (versionA, versionB) => /* descending */ -1 * versionA.label.localeCompare(versionB.label),\n );\n\n if (versions.length) {\n // make sure that the pre-selected one is the first-one after sorting\n versions[0].default = true;\n }\n const deduped = uniqBy(versions, (v) => v.version);\n return deduped;\n};\n\nexport const getSelectedVersion = (\n clusterImages: ClusterImageSetK8sResource[],\n agentClusterInstall: AgentClusterInstallK8sResource,\n) => {\n const selectedClusterImage = clusterImages.find(\n (ci) => ci.metadata?.name === agentClusterInstall?.spec?.imageSetRef?.name,\n );\n return selectedClusterImage\n ? getOCPVersions([selectedClusterImage])?.[0]?.version\n : agentClusterInstall?.spec?.imageSetRef?.name;\n};\n\nexport const getCurrentClusterVersion = (cv?: ClusterVersionK8sResource): string | undefined =>\n cv?.status?.history?.[0]?.version || cv?.spec?.desiredUpdate?.version;\n\nexport const getMajorMinorVersion = (version = '') => {\n const match = /[0-9].[0-9][0-9]?/g.exec(version);\n return match?.[0] || '';\n};\n", "import { MatchExpression } from '@openshift-console/dynamic-plugin-sdk/lib/api/common-types';\nimport { AGENT_LOCATION_LABEL_KEY } from '../common';\n\nexport const getLocationsFromMatchExpressions = (expressions: MatchExpression[] = []) =>\n expressions.find((expr) => expr.key === AGENT_LOCATION_LABEL_KEY)?.values || [];\n\nexport const getAgentLocationMatchExpression = (\n locations?: string[],\n): MatchExpression[] | undefined => {\n return locations?.length\n ? [\n {\n key: AGENT_LOCATION_LABEL_KEY,\n operator: 'In',\n values: locations,\n },\n ]\n : undefined;\n};\n", "import { AgentClusterInstallK8sResource, AgentK8sResource } from '../../types/k8s';\nimport { getClusterNameOfAgent } from './agents';\n\nexport const getIsSNOCluster = (agentClusterInstall?: AgentClusterInstallK8sResource) =>\n agentClusterInstall?.spec?.provisionRequirements?.controlPlaneAgents === 1;\n\nexport const getAgentClusterInstallOfAgent = (\n agentClusterInstalls: AgentClusterInstallK8sResource[],\n agent?: AgentK8sResource,\n) => {\n if (!agent) {\n return undefined;\n }\n\n const cdName = getClusterNameOfAgent(agent);\n if (!cdName) {\n return undefined;\n }\n\n return agentClusterInstalls.find((aci) => {\n const ownerReference = aci.metadata?.ownerReferences?.find(\n (or) => or.kind === 'ClusterDeployment' && or.name === cdName,\n );\n return !!ownerReference;\n });\n};\n", "import { convertToBaseValue } from './units';\n\nexport const getStorageSizeGiB = (def: number, actual?: string): number => {\n if (!actual) {\n return def;\n }\n\n const base = convertToBaseValue(actual);\n if (!base) {\n return def;\n }\n\n return base / 1024 / 1024 / 1024;\n};\n", "import * as React from 'react';\nimport {\n Button,\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n Grid,\n GridItem,\n Spinner,\n Title,\n TitleSizes,\n} from '@patternfly/react-core';\nimport { CheckCircleIcon, ExclamationTriangleIcon, PencilAltIcon } from '@patternfly/react-icons';\nimport { global_palette_green_500 as okColor } from '@patternfly/react-tokens/dist/js/global_palette_green_500';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\n\nimport { CpuArchitecture, LabelValue } from '../../../common';\nimport { InfraEnvK8sResource, SecretK8sResource } from '../../types';\nimport { AGENT_LOCATION_LABEL_KEY } from '../common';\nimport EditPullSecretModal, { EditPullSecretModalProps } from '../modals/EditPullSecretModal';\nimport EditSSHKeyModal, { EditSSHKeyModalProps } from '../modals/EditSSHKeyModal';\nimport EditNtpSourcesModal, { EditNtpSourcesModalProps } from '../modals/EditNtpSourcesModal';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype EditItemProps = {\n title: string;\n onEdit: VoidFunction;\n isLoading?: boolean;\n isWarning?: boolean;\n};\n\nconst EditItem: React.FC<EditItemProps> = ({ title, onEdit, isLoading, isWarning }) => {\n let icon = <CheckCircleIcon color={okColor.value} />;\n if (isLoading) {\n icon = <Spinner isSVG size=\"md\" />;\n } else if (isWarning) {\n icon = <ExclamationTriangleIcon color={warningColor.value} />;\n }\n return (\n <div>\n {icon}\n &nbsp;{title}&nbsp;\n <Button variant=\"plain\" onClick={onEdit}>\n <PencilAltIcon />\n </Button>\n </div>\n );\n};\n\ntype EnvironmentDetailsProps = {\n infraEnv: InfraEnvK8sResource;\n fetchSecret: (namespace: string, name: string) => Promise<SecretK8sResource>;\n onEditPullSecret: EditPullSecretModalProps['onSubmit'];\n onEditSSHKey: EditSSHKeyModalProps['onSubmit'];\n onEditNtpSources: EditNtpSourcesModalProps['onSubmit'];\n hasAgents: boolean;\n hasBMHs: boolean;\n};\n\nconst EnvironmentDetails: React.FC<EnvironmentDetailsProps> = ({\n infraEnv,\n fetchSecret,\n onEditPullSecret,\n onEditSSHKey,\n onEditNtpSources,\n hasAgents,\n hasBMHs,\n}) => {\n const [editPullSecret, setEditPullSecret] = React.useState(false);\n const [editSSHKey, setEditSSHKey] = React.useState(false);\n const [editNtpSources, setEditNtpSources] = React.useState(false);\n const [pullSecret, setPullSecret] = React.useState<SecretK8sResource>();\n const [pullSecretError, setPullSecretError] = React.useState<string>();\n const [pullSecretLoading, setPullSecretLoading] = React.useState(true);\n\n const namespace = infraEnv.metadata?.namespace ?? '';\n const pullSecretName = infraEnv.spec?.pullSecretRef?.name ?? '';\n const { t } = useTranslation();\n React.useEffect(() => {\n const fetch = async () => {\n try {\n if (namespace && pullSecretName) {\n const result = await fetchSecret(namespace, pullSecretName);\n setPullSecret(result);\n }\n } catch (err) {\n setPullSecret(undefined);\n // eslint-disable-next-line\n if ((err as any).code !== 404) {\n setPullSecretError((err as Error).message || t('ai:Could not fetch pull secret'));\n }\n } finally {\n setPullSecretLoading(false);\n }\n };\n void fetch();\n }, [namespace, pullSecretName, fetchSecret, editPullSecret, t]);\n return (\n <>\n <Grid hasGutter>\n <GridItem span={12}>\n <Title headingLevel=\"h1\" size={TitleSizes.lg}>\n {t('ai:Environment details')}\n </Title>\n </GridItem>\n <GridItem span={6}>\n <DescriptionList>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Infrastructure Environment name')}</DescriptionListTerm>\n <DescriptionListDescription>{infraEnv.metadata?.name}</DescriptionListDescription>\n </DescriptionListGroup>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Location')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.metadata?.labels?.[AGENT_LOCATION_LABEL_KEY] ?? t('ai:No location')}\n </DescriptionListDescription>\n </DescriptionListGroup>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Network type')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.metadata?.labels?.networkType === 'static'\n ? t('ai:Static IP, bridges and bonds')\n : t('ai:DHCP only')}\n </DescriptionListDescription>\n </DescriptionListGroup>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:CPU architecture')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.spec?.cpuArchitecture ?? CpuArchitecture.x86}\n </DescriptionListDescription>\n </DescriptionListGroup>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Labels')}</DescriptionListTerm>\n <DescriptionListDescription>\n {Object.keys(infraEnv.metadata?.labels || {}).map((k) => (\n <LabelValue key={k} value={`${k}=${infraEnv.metadata?.labels?.[k]}`} />\n ))}\n </DescriptionListDescription>\n </DescriptionListGroup>\n {infraEnv.metadata?.creationTimestamp && (\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Created at')}</DescriptionListTerm>\n <DescriptionListDescription>\n {new Date(infraEnv.metadata.creationTimestamp).toString()}\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n </DescriptionList>\n </GridItem>\n <GridItem span={6}>\n <DescriptionList>\n {infraEnv.spec?.proxy?.httpProxy && (\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:HTTP Proxy URL')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.spec.proxy.httpProxy}\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n {infraEnv.spec?.proxy?.httpsProxy && (\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:HTTPS Proxy URL')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.spec.proxy.httpsProxy}\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n {infraEnv.spec?.proxy?.noProxy && (\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:No proxy domains')}</DescriptionListTerm>\n <DescriptionListDescription>\n {infraEnv.spec.proxy.noProxy}\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Secret and keys')}</DescriptionListTerm>\n <DescriptionListDescription>\n <>\n <EditItem\n title={t('ai:Pull secret')}\n onEdit={() => setEditPullSecret(true)}\n isLoading={pullSecretLoading}\n isWarning={!pullSecret}\n />\n <EditItem\n title={t('ai:SSH public key')}\n onEdit={() => setEditSSHKey(true)}\n isWarning={!infraEnv.spec?.sshAuthorizedKey}\n />\n <EditItem title={t('ai:NTP sources')} onEdit={() => setEditNtpSources(true)} />\n </>\n </DescriptionListDescription>\n </DescriptionListGroup>\n </DescriptionList>\n </GridItem>\n </Grid>\n <EditPullSecretModal\n isOpen={editPullSecret}\n onClose={() => setEditPullSecret(false)}\n pullSecret={pullSecret}\n pullSecretError={pullSecretError}\n pullSecretLoading={pullSecretLoading}\n onSubmit={onEditPullSecret}\n infraEnv={infraEnv}\n hasAgents={hasAgents}\n hasBMHs={hasBMHs}\n />\n <EditSSHKeyModal\n isOpen={editSSHKey}\n onClose={() => setEditSSHKey(false)}\n infraEnv={infraEnv}\n onSubmit={onEditSSHKey}\n hasAgents={hasAgents}\n hasBMHs={hasBMHs}\n />\n <EditNtpSourcesModal\n isOpen={editNtpSources}\n onClose={() => setEditNtpSources(false)}\n infraEnv={infraEnv}\n onSubmit={onEditNtpSources}\n />\n </>\n );\n};\n\nexport default EnvironmentDetails;\n", "import * as React from 'react';\nimport * as Yup from 'yup';\nimport { TFunction } from 'i18next';\nimport {\n Alert,\n Button,\n ButtonVariant,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, useFormikContext } from 'formik';\nimport { InfraEnvK8sResource, SecretK8sResource } from '../../types';\nimport { LoadingState, PullSecretField, pullSecretValidationSchema } from '../../../common';\nimport { EditPullSecretFormikValues } from './types';\nimport { getWarningMessage } from './utils';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst validationSchema = (t: TFunction) =>\n Yup.object({\n pullSecret: pullSecretValidationSchema.required(t('ai:Pull secret is a required field.')),\n });\n\ntype EditPullSecretFormProps = {\n onClose: VoidFunction;\n pullSecret: SecretK8sResource | undefined;\n pullSecretError: string | undefined;\n pullSecretLoading: boolean;\n hasAgents: boolean;\n hasBMHs: boolean;\n error?: string;\n};\n\nconst EditPullSecretForm: React.FC<EditPullSecretFormProps> = ({\n pullSecret,\n pullSecretError,\n pullSecretLoading,\n onClose,\n error: submitError,\n hasAgents,\n hasBMHs,\n}) => {\n const { isSubmitting, isValid, submitForm, setFieldValue } =\n useFormikContext<EditPullSecretFormikValues>();\n\n React.useEffect(() => {\n if (!pullSecretLoading && !pullSecretError) {\n const pullSecretValue = atob(pullSecret?.data?.['.dockerconfigjson'] || '');\n setFieldValue('pullSecret', pullSecretValue);\n if (!pullSecret) {\n setFieldValue('createSecret', true);\n }\n }\n }, [pullSecret, pullSecretLoading, pullSecretError, setFieldValue]);\n const { t } = useTranslation();\n const warningMsg = getWarningMessage(hasAgents, hasBMHs, t);\n\n let body = (\n <Stack hasGutter>\n <StackItem>\n <Alert isInline variant=\"warning\" title={warningMsg} />\n </StackItem>\n <StackItem>\n <PullSecretField isOcm={false} />\n </StackItem>\n </Stack>\n );\n if (pullSecretLoading) {\n body = <LoadingState />;\n } else if (pullSecretError) {\n body = <Alert title={pullSecretError} variant=\"danger\" isInline />;\n }\n return (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>{body}</StackItem>\n </Stack>\n {submitError && (\n <StackItem>\n <Alert title={submitError} variant=\"danger\" isInline />\n </StackItem>\n )}\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n onClick={submitForm}\n isDisabled={pullSecretLoading || !!pullSecretError || isSubmitting || !isValid}\n >\n {t('ai:Save')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n};\n\nexport type EditPullSecretModalProps = EditPullSecretFormProps & {\n onSubmit: (\n values: EditPullSecretFormikValues,\n infraEnv: InfraEnvK8sResource,\n ) => Promise<InfraEnvK8sResource>;\n isOpen: boolean;\n infraEnv: InfraEnvK8sResource;\n};\n\nconst EditPullSecretModal: React.FC<EditPullSecretModalProps> = ({\n isOpen,\n onClose,\n onSubmit,\n infraEnv,\n ...rest\n}) => {\n const [error, setError] = React.useState<string | undefined>();\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Edit pull secret dialog')}\n title={t('ai:Edit pull secret')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"edit-pull-secret-modal\"\n >\n <Formik<EditPullSecretFormikValues>\n initialValues={{\n pullSecret: undefined,\n createSecret: false,\n }}\n validationSchema={validationSchema(t)}\n onSubmit={async (values) => {\n try {\n await onSubmit(values, infraEnv);\n onClose();\n } catch (err) {\n setError(getErrorMessage(err));\n }\n }}\n validateOnMount\n >\n <EditPullSecretForm {...rest} onClose={onClose} error={error} />\n </Formik>\n </Modal>\n );\n};\n\nexport default EditPullSecretModal;\n", "import { TFunction } from 'i18next';\nimport { BareMetalHostK8sResource, InfraEnvK8sResource, SecretK8sResource } from '../../types';\nimport { INFRAENV_AGENTINSTALL_LABEL_KEY, BMH_HOSTNAME_ANNOTATION } from '../common';\n\nexport const getBareMetalHostCredentialsSecret = (\n values: {\n username: string;\n password: string;\n hostname: string;\n },\n namespace: string,\n) => ({\n apiVersion: 'v1',\n kind: 'Secret',\n data: {\n username: btoa(values.username),\n password: btoa(values.password),\n },\n metadata: {\n generateName: `bmc-${values.hostname.split('.').shift()}-`,\n namespace,\n },\n type: 'Opaque',\n});\n\nexport const getBareMetalHost = (\n values: {\n name: string;\n hostname: string;\n bmcAddress: string;\n disableCertificateVerification: boolean;\n bootMACAddress: string;\n online: boolean;\n },\n infraEnv: InfraEnvK8sResource,\n secret: SecretK8sResource,\n): BareMetalHostK8sResource => ({\n apiVersion: 'metal3.io/v1alpha1',\n kind: 'BareMetalHost',\n metadata: {\n name: values.name,\n namespace: infraEnv.metadata?.namespace,\n labels: {\n [INFRAENV_AGENTINSTALL_LABEL_KEY]: infraEnv.metadata?.name || '',\n },\n annotations: {\n 'inspect.metal3.io': 'disabled',\n [BMH_HOSTNAME_ANNOTATION]: values.hostname,\n },\n },\n spec: {\n bmc: {\n address: values.bmcAddress,\n credentialsName: secret.metadata?.name,\n disableCertificateVerification: !!values.disableCertificateVerification,\n },\n bootMACAddress: values.bootMACAddress,\n description: '', // TODO(mlibra)\n online: !!values.online,\n automatedCleaningMode: 'disabled',\n },\n});\n\nexport const getWarningMessage = (hasAgents: boolean, hasBMHs: boolean, t: TFunction) => {\n if (hasBMHs && hasAgents) {\n return t(\n 'ai:The resource you are changing is already in use by hosts in the infrastructure environment. A change will require booting the hosts with a new discovery ISO file. Hosts will be rebooted automatically after the change is applied if using BMC.',\n );\n } else if (hasBMHs) {\n return t(\n 'ai:The resource you are changing is already in use by hosts in the infrastructure environment. The hosts will be rebooted automatically after the change is applied.',\n );\n } else if (hasAgents) {\n return t(\n 'ai:The resource you are changing is already in use by hosts in the infrastructure environment. A change will require booting the hosts with a new discovery ISO file.',\n );\n } else {\n return t('ai:A change will require booting hosts with a new discovery ISO file.');\n }\n};\n", "import * as React from 'react';\nimport * as Yup from 'yup';\nimport {\n Alert,\n Button,\n ButtonVariant,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, FormikProps } from 'formik';\n\nimport { InfraEnvK8sResource } from '../../types';\nimport { UploadSSH, sshPublicKeyValidationSchema } from '../../../common';\nimport { EditSSHKeyFormikValues } from './types';\nimport { getWarningMessage } from './utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst validationSchema = Yup.object({\n sshPublicKey: sshPublicKeyValidationSchema.required(\n 'An SSH key is required to debug hosts as they register.',\n ),\n});\n\nexport type EditSSHKeyModalProps = {\n isOpen: boolean;\n onClose: VoidFunction;\n // eslint-disable-next-line\n onSubmit: (values: EditSSHKeyFormikValues, infraEnv: InfraEnvK8sResource) => Promise<any>;\n infraEnv: InfraEnvK8sResource;\n hasAgents: boolean;\n hasBMHs: boolean;\n};\n\nconst EditSSHKeyModal: React.FC<EditSSHKeyModalProps> = ({\n isOpen,\n onClose,\n infraEnv,\n onSubmit,\n hasAgents,\n hasBMHs,\n}) => {\n const [error, setError] = React.useState<string | undefined>();\n const { t } = useTranslation();\n const warningMsg = getWarningMessage(hasAgents, hasBMHs, t);\n\n return (\n <Modal\n aria-label={t('ai:Edit SSH public key dialog')}\n title={t('ai:Edit SSH public key')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"edit-ssh-key-modal\"\n >\n <Formik<EditSSHKeyFormikValues>\n initialValues={{\n sshPublicKey: infraEnv.spec?.sshAuthorizedKey || '',\n }}\n validationSchema={validationSchema}\n onSubmit={async (values) => {\n try {\n await onSubmit(values, infraEnv);\n onClose();\n } catch (err) {\n setError(err?.message || t('ai:An error occured'));\n }\n }}\n validateOnMount\n >\n {({ isSubmitting, isValid, submitForm }: FormikProps<EditSSHKeyModalProps>) => (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <Alert isInline variant=\"warning\" title={warningMsg} />\n </StackItem>\n <StackItem>\n <UploadSSH />\n </StackItem>\n {error && (\n <StackItem>\n <Alert title={error} variant=\"danger\" isInline />\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={submitForm} isDisabled={isSubmitting || !isValid}>\n {t('ai:Save')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n )}\n </Formik>\n </Modal>\n );\n};\n\nexport default EditSSHKeyModal;\n", "import * as React from 'react';\nimport {\n Alert,\n Button,\n ButtonVariant,\n Form,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, FormikProps } from 'formik';\nimport { InfraEnvK8sResource } from '../../types';\nimport { RadioField, AdditionalNTPSourcesField } from '../../../common';\nimport { EditNtpSourcesFormikValues } from './types';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type EditNtpSourcesModalProps = {\n onSubmit: (\n values: EditNtpSourcesFormikValues,\n infraEnv: InfraEnvK8sResource,\n ) => Promise<InfraEnvK8sResource>;\n isOpen: boolean;\n infraEnv: InfraEnvK8sResource;\n onClose: VoidFunction;\n};\n\nconst EditNtpSourcesModal: React.FC<EditNtpSourcesModalProps> = ({\n isOpen,\n onClose,\n onSubmit,\n infraEnv,\n}) => {\n const [error, setError] = React.useState<string>();\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Edit Ntp sources dialog')}\n title={t('ai:Edit NTP sources')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"edit-ntp-sources-modal\"\n >\n <Formik<EditNtpSourcesFormikValues>\n initialValues={{\n enableNtpSources: infraEnv.spec?.additionalNTPSources ? 'additional' : 'auto',\n additionalNtpSources: infraEnv.spec?.additionalNTPSources?.join(',') || '',\n }}\n onSubmit={async (values) => {\n try {\n await onSubmit(values, infraEnv);\n onClose();\n } catch (err) {\n setError(getErrorMessage(err));\n }\n }}\n validateOnMount\n >\n {({\n isSubmitting,\n isValid,\n values,\n submitForm,\n }: FormikProps<EditNtpSourcesFormikValues>) => {\n return (\n <>\n <ModalBoxBody>\n <Form>\n <Stack hasGutter>\n <StackItem>\n <RadioField\n label={t('ai:Auto synchronized NTP (Network Time Protocol) sources')}\n value=\"auto\"\n name=\"enableNtpSources\"\n />\n </StackItem>\n <StackItem>\n <RadioField\n name=\"enableNtpSources\"\n value=\"additional\"\n description={\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:Configure your own NTP sources to sychronize the time between the hosts that will be added to this infrastructure environment.',\n )}\n </StackItem>\n <StackItem>\n <AdditionalNTPSourcesField\n name=\"additionalNtpSources\"\n isDisabled={values.enableNtpSources === 'auto'}\n helperText={t(\n 'ai:A comma separated list of IP or domain names of the NTP pools or servers.',\n )}\n />\n </StackItem>\n </Stack>\n }\n label={t('ai:Your own NTP (Network Time Protocol) sources')}\n />\n </StackItem>\n {error && (\n <StackItem>\n <Alert variant=\"danger\" title={error} />\n </StackItem>\n )}\n </Stack>\n </Form>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={submitForm} isDisabled={isSubmitting || !isValid}>\n {t('ai:Save')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n }}\n </Formik>\n </Modal>\n );\n};\n\nexport default EditNtpSourcesModal;\n", "import * as React from 'react';\nimport { Button, DropdownItem, Stack, StackItem } from '@patternfly/react-core';\nimport noop from 'lodash/noop';\n\nimport { Host } from '../../../common/api/types';\nimport {\n discoveryTypeColumn,\n agentStatusColumn,\n clusterColumn,\n useAgentsTable,\n useAgentsFilter,\n agentHostnameColumn,\n canEditBMH,\n canEditAgent,\n canChangeHostname,\n} from '../Agent/tableUtils';\nimport HostsTable, {\n DefaultExpandComponent,\n HostsTableEmptyState,\n} from '../../../common/components/hosts/HostsTable';\nimport {\n cpuCoresColumn,\n discoveredAtColumn,\n disksColumn,\n memoryColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport {\n DiscoveryTroubleshootingModal,\n MassChangeHostnameModal,\n DeleteHostAction,\n EmptyState,\n} from '../../../common';\nimport { InfraEnvAgentTableProps } from '../ClusterDeployment/types';\nimport { MassApproveAgentModal, MassDeleteAgentModal } from '../modals';\nimport { MassChangeHostnameModalProps } from '../../../common/components/hosts/MassChangeHostnameModal';\nimport MassApproveAction from '../modals/MassApproveAction';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport InfraTableToolbar from './InfraTableToolbar';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype NoFilterMatchStateProps = {\n onClearFilters: VoidFunction;\n};\n\nconst NoFilterMatchState: React.FC<NoFilterMatchStateProps> = ({ onClearFilters }) => {\n const { t } = useTranslation();\n return (\n <EmptyState\n title={t('ai:No results found')}\n content={t('ai:No results match the filter criteria. Clear filters to show results.')}\n secondaryActions={[\n <Button key=\"clear-filters\" variant=\"link\" onClick={onClearFilters}>\n {t('ai:Clear all filters')}\n </Button>,\n ]}\n />\n );\n};\n\nconst InfraEnvAgentTable: React.FC<InfraEnvAgentTableProps> = ({\n agents,\n agentMachines,\n getClusterDeploymentLink,\n bareMetalHosts,\n infraEnv,\n nmStates,\n onChangeHostname,\n onChangeBMHHostname,\n onMassDeleteHost,\n agentClusterInstalls,\n onApprove,\n onDeleteHost,\n onEditBMH,\n onEditHost,\n onUnbindHost,\n}) => {\n const [isDiscoveryHintModalOpen, setDiscoveryHintModalOpen] = React.useState(false);\n const [isMassChangeHostOpen, setMassChangeHostOpen] = React.useState(false);\n const [isMassApproveOpen, setMassApproveOpen] = React.useState(false);\n const [isMassDeleteOpen, setMassDeleteOpen] = React.useState(false);\n const [selectedHostIDs, setSelectedHostIDs] = React.useState<string[]>([]);\n\n const selectedIDsRef = React.useRef(selectedHostIDs);\n selectedIDsRef.current = selectedHostIDs;\n\n const onSelect = React.useCallback((host: Host, isSelected: boolean) => {\n if (isSelected) {\n setSelectedHostIDs([...selectedIDsRef.current, host.id]);\n } else {\n setSelectedHostIDs(selectedIDsRef.current.filter((sa) => sa !== host.id));\n }\n }, []);\n\n const [allHosts, hostActions, actionResolver] = useAgentsTable(\n {\n agents,\n bmhs: bareMetalHosts,\n infraEnv,\n agentClusterInstalls,\n },\n {\n onApprove,\n onDeleteHost,\n onEditBMH,\n onEditHost,\n onUnbindHost,\n },\n );\n const { t } = useTranslation();\n const {\n statusCount,\n hostnameFilter,\n setHostnameFilter,\n setStatusFilter,\n statusFilter,\n filteredHosts: hosts,\n } = useAgentsFilter({ agents, bmhs: bareMetalHosts, hosts: allHosts });\n\n const content = React.useMemo(\n () =>\n [\n agentHostnameColumn(\n hosts,\n agents,\n bareMetalHosts,\n hostActions.onEditHost,\n hostActions.canEditHostname,\n hostActions.canEditBMH,\n ),\n discoveryTypeColumn(agents, bareMetalHosts, t),\n agentStatusColumn({\n agents,\n bareMetalHosts,\n onEditHostname: onEditHost,\n onApprove: onApprove,\n t,\n }),\n clusterColumn(agents, agentMachines, getClusterDeploymentLink, t),\n discoveredAtColumn,\n cpuCoresColumn,\n memoryColumn,\n disksColumn,\n ].filter(Boolean),\n [\n hosts,\n agents,\n agentMachines,\n onEditHost,\n onApprove,\n getClusterDeploymentLink,\n hostActions,\n bareMetalHosts,\n t,\n ],\n );\n\n const selectedAgents = agents.filter((a) => selectedHostIDs.includes(a.metadata?.uid || ''));\n const selectedBMHs = bareMetalHosts.filter((bmh) =>\n selectedHostIDs.includes(bmh.metadata?.uid || ''),\n );\n\n const canEditHostname =\n selectedBMHs.some((bmh) => canEditBMH(bmh, t)[0]) ||\n selectedAgents.some((a) => canEditAgent(a, t)[0]);\n\n const massActions = [\n <DropdownItem\n key=\"hostname\"\n onClick={() => setMassChangeHostOpen(!isMassChangeHostOpen)}\n isDisabled={!canEditHostname}\n description={\n canEditHostname ? undefined : t('ai:Hostname cannot be changed for selected hosts.')\n }\n >\n Change hostname\n </DropdownItem>,\n <MassApproveAction\n key=\"approve\"\n onApprove={() => setMassApproveOpen(!isMassApproveOpen)}\n selectedAgents={selectedAgents}\n />,\n <DeleteHostAction key=\"delete\" onDeleteHost={() => setMassDeleteOpen(!isMassDeleteOpen)} />,\n ];\n\n const onAgentChangeHostname: MassChangeHostnameModalProps['onChangeHostname'] = async (\n host,\n hostname,\n ) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n if (agent) {\n return onChangeHostname(agent, hostname);\n } else {\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id);\n return bmh ? onChangeBMHHostname(bmh, hostname) : noop;\n }\n };\n\n const paginationProps = usePagination(hosts.length);\n\n return (\n <>\n <Stack hasGutter>\n <StackItem>\n <InfraTableToolbar\n hosts={hosts}\n setSelectedHostIDs={setSelectedHostIDs}\n massActions={massActions}\n statusCount={statusCount}\n hostnameFilter={hostnameFilter}\n statusFilter={statusFilter}\n setStatusFilter={setStatusFilter}\n selectedHostIDs={selectedHostIDs}\n setHostnameFilter={setHostnameFilter}\n {...paginationProps}\n />\n </StackItem>\n <StackItem>\n <HostsTable\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n selectedIDs={selectedHostIDs}\n setSelectedIDs={setSelectedHostIDs}\n onSelect={onSelect}\n ExpandComponent={DefaultExpandComponent}\n {...paginationProps}\n >\n {allHosts.length !== hosts.length ? (\n <NoFilterMatchState\n onClearFilters={() => {\n setHostnameFilter(undefined);\n setStatusFilter([]);\n }}\n />\n ) : (\n <HostsTableEmptyState setDiscoveryHintModalOpen={setDiscoveryHintModalOpen} />\n )}\n </HostsTable>\n </StackItem>\n </Stack>\n {isDiscoveryHintModalOpen && (\n <DiscoveryTroubleshootingModal\n isOpen={isDiscoveryHintModalOpen}\n setDiscoveryHintModalOpen={setDiscoveryHintModalOpen}\n />\n )}\n {isMassChangeHostOpen && (\n <MassChangeHostnameModal\n isOpen={isMassChangeHostOpen}\n hosts={hosts}\n selectedHostIDs={selectedHostIDs}\n onChangeHostname={onAgentChangeHostname}\n onClose={() => setMassChangeHostOpen(false)}\n canChangeHostname={canChangeHostname(agents, bareMetalHosts, t)}\n />\n )}\n {isMassDeleteOpen && (\n <MassDeleteAgentModal\n isOpen={isMassDeleteOpen}\n agents={selectedAgents}\n bmhs={selectedBMHs}\n infraEnv={infraEnv}\n nmStates={nmStates}\n onDelete={onMassDeleteHost}\n onClose={() => setMassDeleteOpen(false)}\n />\n )}\n {isMassApproveOpen && (\n <MassApproveAgentModal\n isOpen={isMassApproveOpen}\n agents={selectedAgents}\n onApprove={onApprove}\n onClose={() => setMassApproveOpen(false)}\n />\n )}\n </>\n );\n};\n\nexport default InfraEnvAgentTable;\n", "import * as React from 'react';\nimport { sortable, expandable, breakWord } from '@patternfly/react-table';\nimport { Link } from 'react-router-dom';\n\nimport {\n Host,\n HostsTableActions,\n getInventory,\n getHostname,\n Hostname,\n ActionCheck,\n} from '../../../common';\nimport { AgentClusterInstallK8sResource, AgentK8sResource, InfraEnvK8sResource } from '../../types';\nimport AgentStatus from './AgentStatus';\nimport { ActionsResolver, TableRow } from '../../../common/components/hosts/AITable';\nimport { AgentTableActions, ClusterDeploymentWizardStepsType } from '../ClusterDeployment/types';\nimport { hostActionResolver } from '../../../common/components/hosts/tableUtils';\nimport { getAgentClusterInstallOfAgent, getAIHosts, getInfraEnvNameOfAgent } from '../helpers';\nimport { isInstallationInProgress } from '../ClusterDeployment/helpers';\nimport { AGENT_BMH_NAME_LABEL_KEY } from '../common';\nimport { BareMetalHostK8sResource } from '../../types/k8s/bare-metal-host';\nimport BMHStatus from './BMHStatus';\nimport { getAgentStatus, getBMHStatus, getWizardStepAgentStatus } from '../helpers/status';\nimport { filterByHostname } from '../../../common/components/hosts/utils';\nimport { agentStatus, bmhStatus } from '../helpers/agentStatus';\nimport noop from 'lodash/noop';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\nimport { AgentMachineK8sResource } from '../Hypershift/types';\n\nexport const agentHostnameColumn = (\n hosts: Host[],\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n onEditHostname?: HostsTableActions['onEditHost'],\n canEditHostname?: HostsTableActions['canEditHost'],\n canEditBMH?: HostsTableActions['canEditBMH'],\n): TableRow<Host> => ({\n header: {\n title: '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\n let readonly = true;\n\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n if (agent) {\n readonly = canEditHostname ? !canEditHostname(host) : false;\n } else {\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id);\n if (bmh && canEditBMH) {\n readonly = !canEditBMH(host);\n }\n }\n\n return {\n title: (\n <Hostname\n host={host}\n inventory={inventory}\n onEditHostname={editHostname}\n hosts={hosts}\n readonly={readonly}\n />\n ),\n props: { 'data-testid': 'host-name' },\n sortableValue: computedHostname || '',\n };\n },\n});\n\nexport const discoveryTypeColumn = (\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n t: TFunction,\n): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Discovery type'),\n props: {\n id: 'col-header-discovery-type',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n let discoveryType = t('ai:Unknown');\n if (agent) {\n // eslint-disable-next-line no-prototype-builtins\n discoveryType = agent?.metadata?.labels?.hasOwnProperty(AGENT_BMH_NAME_LABEL_KEY)\n ? 'BMC'\n : 'Discovery ISO';\n } else {\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id);\n if (bmh) {\n discoveryType = 'BMC';\n }\n }\n return {\n title: discoveryType,\n props: { 'data-testid': 'discovery-type' },\n sortableValue: discoveryType,\n };\n },\n };\n};\n\ntype AgentStatusColumnProps = {\n agents: AgentK8sResource[];\n bareMetalHosts?: BareMetalHostK8sResource[];\n onEditHostname?: AgentTableActions['onEditHost'];\n onApprove?: AgentTableActions['onApprove'];\n wizardStepId?: ClusterDeploymentWizardStepsType;\n t: TFunction;\n isDay2?: boolean;\n};\n\nexport const agentStatusColumn = ({\n agents,\n bareMetalHosts,\n onEditHostname,\n onApprove,\n wizardStepId,\n t,\n isDay2,\n}: AgentStatusColumnProps): TableRow<Host> => {\n return {\n header: {\n title: 'Status',\n props: {\n id: 'col-header-infraenvstatus',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const bmh = bareMetalHosts?.find((b) => b.metadata?.uid === host.id);\n let bmhStatus;\n let title: React.ReactNode = '--';\n if (agent) {\n const editHostname = onEditHostname ? () => onEditHostname(agent) : undefined;\n title = (\n <AgentStatus\n agent={agent}\n onApprove={onApprove}\n onEditHostname={editHostname}\n wizardStepId={wizardStepId}\n isDay2={isDay2}\n />\n );\n } else if (bmh) {\n bmhStatus = getBMHStatus(bmh);\n title = <BMHStatus bmhStatus={bmhStatus} />;\n }\n\n return {\n title,\n props: { 'data-testid': 'host-status' },\n sortableValue: agent\n ? wizardStepId\n ? getWizardStepAgentStatus(agent, wizardStepId, t).status.title\n : getAgentStatus(agent).status.title\n : bmhStatus?.state.title || '',\n };\n },\n };\n};\n\nexport const clusterColumn = (\n agents: AgentK8sResource[],\n agentMachines: AgentMachineK8sResource[],\n getClusterDeploymentLink: (cd: { name: string; namespace: string }) => string,\n t: TFunction,\n): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Cluster'),\n props: {\n id: 'col-header-cluster',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n let cdLink: string | undefined = undefined;\n if (agent?.spec?.clusterDeploymentName) {\n //hypershift\n const amNamespace = agent.metadata?.annotations?.['agentMachineRefNamespace'];\n if (amNamespace) {\n const am = agentMachines.find(\n (am) =>\n am.status?.agentRef?.name === agent.metadata?.name &&\n am.status?.agentRef?.namespace === agent.metadata?.namespace,\n );\n const nodePool = am?.metadata?.annotations?.['hypershift.openshift.io/nodePool'];\n if (nodePool) {\n const hcNamespace = nodePool.split('/')[0];\n const hcName = agent.spec.clusterDeploymentName.name;\n cdLink = getClusterDeploymentLink({ name: hcName, namespace: hcNamespace });\n }\n } else {\n cdLink = getClusterDeploymentLink(agent.spec.clusterDeploymentName);\n }\n }\n return {\n title: cdLink ? <Link to={cdLink}>{agent?.spec?.clusterDeploymentName?.name}</Link> : '--',\n props: { 'data-testid': 'cluster' },\n sortableValue: agent?.spec?.clusterDeploymentName?.name ?? '--',\n };\n },\n };\n};\n\nexport const infraEnvColumn = (agents: AgentK8sResource[], t: TFunction): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Infrastructure env'),\n props: {\n id: 'col-header-infraenv',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id) as AgentK8sResource;\n const infraEnvName = getInfraEnvNameOfAgent(agent);\n const title = infraEnvName ? (\n <Link\n to={`/multicloud/infrastructure/environments/details/${agent.metadata?.namespace}/${infraEnvName}/overview`}\n >\n {infraEnvName}\n </Link>\n ) : (\n 'N/A'\n );\n return {\n title,\n props: { 'data-testid': 'infra-env' },\n sortableValue: infraEnvName,\n };\n },\n };\n};\n\nexport const canEditBMH = (bmh: BareMetalHostK8sResource, t: TFunction): ActionCheck => {\n const canEdit = [\n bmhStatus.deprovisioning.key,\n bmhStatus.pending.key,\n bmhStatus.registering.key,\n ].includes(getBMHStatus(bmh).state.key);\n\n return [\n canEdit,\n canEdit\n ? undefined\n : t(\n 'ai:Bare metal host cannot be edited. Remove this host and add it again if a change is needed.',\n ),\n ];\n};\n\nexport const canEditAgent = (agent: AgentK8sResource, t: TFunction): ActionCheck => {\n const enabled = getAgentStatus(agent).status.category !== 'Installation related';\n return [\n enabled,\n enabled\n ? undefined\n : t('ai:Hostname cannot be edited while host is either installed or being installed.'),\n ];\n};\n\nexport const canChangeHostname =\n (\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n t: TFunction,\n ): ((h: Host) => ActionCheck) =>\n (h: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === h.id);\n if (agent) {\n return canEditAgent(agent, t);\n }\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === h.id);\n if (bmh) {\n return canEditBMH(bmh, t);\n }\n return [true, undefined];\n };\n\nexport const canUnbindAgent = (\n agentClusterInstalls: AgentClusterInstallK8sResource[] | undefined,\n agent: AgentK8sResource,\n t: TFunction,\n): ActionCheck => {\n if (!agent?.spec.clusterDeploymentName?.name) {\n return [false, t('ai:The agent is not bound to a cluster.')];\n }\n\n const { status } = getAgentStatus(agent);\n if (\n [\n 'preparing-for-installation',\n 'installing',\n 'installing-in-progress',\n 'installing-pending-user-action',\n 'resetting-pending-user-action',\n ].includes(status.key)\n ) {\n return [false, t('ai:It is not possible to remove a host which is being installed.')];\n }\n\n if (\n ['installed', 'error', 'cancelled'].includes(status.key) &&\n (agent.status?.role === 'master' || agent.status?.role === 'bootstrap')\n ) {\n return [\n false,\n t('ai:It is not possible to remove control plane node from an installed cluster.'),\n ];\n }\n\n if (agentClusterInstalls) {\n const agentClusterInstall = getAgentClusterInstallOfAgent(agentClusterInstalls, agent);\n\n if (agentClusterInstall) {\n if (isInstallationInProgress(agentClusterInstall)) {\n return [\n false,\n t('ai:It is not possible to remove a node from a cluster during installation.'),\n ];\n }\n }\n }\n\n return [true, undefined];\n};\n\nconst canDeleteAgent = (agent: AgentK8sResource, t: TFunction): ActionCheck => {\n const enabled = getAgentStatus(agent).status.category !== 'Installation related';\n\n return [\n enabled,\n enabled\n ? undefined\n : t('ai:Host cannot be deleted while host is either installed or being installed.'),\n ];\n};\n\ntype AgentsTableResources = {\n agents: AgentK8sResource[];\n bmhs?: BareMetalHostK8sResource[];\n infraEnv?: InfraEnvK8sResource;\n agentClusterInstalls?: AgentClusterInstallK8sResource[];\n};\n\nexport const useAgentsTable = (\n { agents, bmhs, infraEnv, agentClusterInstalls }: AgentsTableResources,\n tableActions?: Partial<AgentTableActions>,\n): [Host[], HostsTableActions, ActionsResolver<Host>] => {\n const {\n onEditHost,\n onDeleteHost,\n onEditRole,\n onSelect,\n onEditBMH,\n onUnbindHost,\n onSetInstallationDiskId,\n } = tableActions || {};\n const { t } = useTranslation();\n const [hosts, actions] = React.useMemo(\n (): [Host[], HostsTableActions] => [\n getAIHosts(agents, bmhs, infraEnv),\n {\n onEditHost: onEditHost\n ? (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n if (agent) {\n return onEditHost(agent);\n }\n const bmh = bmhs?.find((bmh) => bmh.metadata?.uid === host.id);\n if (bmh && onEditBMH) {\n return onEditBMH(bmh);\n }\n return noop;\n }\n : undefined,\n canEditHost: (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n if (!agent) {\n return false;\n }\n return canEditAgent(agent, t);\n },\n onDeleteHost: onDeleteHost\n ? (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const bmh = bmhs?.find((a) => a.metadata?.uid === host.id);\n return onDeleteHost(agent, bmh);\n }\n : undefined,\n canDelete: (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const bmh = bmhs?.find((a) => a.metadata?.uid === host.id);\n\n if (agent) {\n return canDeleteAgent(agent, t);\n } else if (bmh) {\n return [true, undefined];\n }\n\n return [false, t('ai:Host not found')];\n },\n onEditRole: onEditRole\n ? (host: Host, role: string | undefined) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n return agent ? onEditRole(agent, role) : Promise.resolve(agent);\n }\n : undefined,\n canEditRole: () => !!onEditRole,\n onDiskRole: onSetInstallationDiskId\n ? (hostId, diskId) => {\n const agent = agents.find((a) => a.metadata?.uid === hostId);\n if (agent && diskId) {\n return onSetInstallationDiskId(agent, diskId);\n }\n return Promise.resolve(agent);\n }\n : undefined,\n canEditDisks: () => !!onSetInstallationDiskId,\n onSelect: onSelect\n ? (host: Host, selected: boolean) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n return agent ? onSelect(agent, selected) : noop;\n }\n : undefined,\n onEditBMH: onEditBMH\n ? (host: Host) => {\n const bmh = bmhs?.find((h) => h.metadata?.uid === host.id);\n return bmh ? onEditBMH(bmh) : noop;\n }\n : undefined,\n canEditBMH: (host: Host) => {\n const bmh = bmhs?.find((h) => h.metadata?.uid === host.id);\n\n if (!bmh) {\n return [false, t('ai:Bare metal host not found')];\n }\n return canEditBMH(bmh, t);\n },\n onUnbindHost: onUnbindHost\n ? (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n return agent ? onUnbindHost(agent) : noop;\n }\n : undefined,\n canUnbindHost: (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n\n if (agent) {\n return canUnbindAgent(agentClusterInstalls, agent, t);\n }\n const bmh = bmhs?.find((bmh) => bmh.metadata?.uid === host.id);\n if (bmh) {\n return [false, t('ai:Bare metal host cannot be removed from cluster.')];\n }\n return [false, t('ai:Host not found')];\n },\n },\n ],\n [\n agents,\n bmhs,\n infraEnv,\n onEditHost,\n onDeleteHost,\n onEditRole,\n onSetInstallationDiskId,\n onSelect,\n onEditBMH,\n onUnbindHost,\n t,\n agentClusterInstalls,\n ],\n );\n const actionResolver = React.useMemo(() => hostActionResolver(actions), [actions]);\n return [hosts, actions, actionResolver];\n};\n\nconst filterByStatus = (\n hosts: Host[],\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n statusFilter: string[],\n) => {\n if (!statusFilter?.length) {\n return hosts;\n }\n const statusKeys = Object.keys(agentStatus).filter((k) =>\n statusFilter.includes(agentStatus[k].title),\n );\n return hosts.filter((h) => {\n const agent = agents.find((a) => a.metadata?.uid === h.id);\n if (!agent) {\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === h.id);\n if (!bmh) {\n return false;\n }\n const bmhStatus = getBMHStatus(bmh);\n return statusKeys.includes(bmhStatus.state.key);\n }\n const { status } = getAgentStatus(agent);\n return statusKeys.includes(status.key);\n });\n};\n\nexport const filterHosts = (\n hosts: Host[],\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n hostnameFilter: string | undefined,\n statusFilter: string[],\n) => {\n const byHostname = filterByHostname(hosts, hostnameFilter);\n const byStatus = filterByStatus(byHostname, agents, bareMetalHosts, statusFilter);\n\n return byStatus;\n};\n\ntype UseAgentsFilterArgs = {\n agents: AgentK8sResource[];\n bmhs: BareMetalHostK8sResource[];\n hosts: Host[];\n};\n\nexport const useAgentsFilter = ({ agents, bmhs, hosts }: UseAgentsFilterArgs) => {\n const [hostnameFilter, setHostnameFilter] = React.useState<string>();\n const [statusFilter, setStatusFilter] = React.useState<string[]>([]);\n const statusCount = Object.keys(agentStatus).reduce((acc, curr) => {\n acc[agentStatus[curr].title] = 0;\n return acc;\n }, {});\n hosts.forEach((host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const bmh = bmhs.find((bmh) => bmh.metadata?.uid === host.id);\n if (agent) {\n const { status } = getAgentStatus(agent);\n statusCount[status.title]++;\n } else if (bmh) {\n const { state } = getBMHStatus(bmh);\n statusCount[state.title]++;\n }\n });\n\n const filteredHosts = filterHosts(hosts, agents, bmhs, hostnameFilter, statusFilter);\n\n return {\n statusCount,\n hostnameFilter,\n setHostnameFilter,\n statusFilter,\n setStatusFilter,\n filteredHosts,\n };\n};\n", "import { Button, Popover, Stack, StackItem } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { getHostname, HostStatus } from '../../../common';\nimport { AgentK8sResource } from '../../types';\nimport { AgentTableActions, ClusterDeploymentWizardStepsType } from '../ClusterDeployment/types';\nimport { getAIHosts } from '../helpers/toAssisted';\nimport { getAgentStatus, getWizardStepAgentStatus } from '../helpers/status';\n\nimport '@patternfly/react-styles/css/utilities/Text/text.css';\nimport { AdditionalNTPSourcesDialogToggle } from '../ClusterDeployment/AdditionalNTPSourcesDialogToggle';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport ValidationsRunningAlert from '../common/ValidationsRunningAlert';\nimport { agentStatus } from '../helpers/agentStatus';\nimport SpecSyncErrAlert from '../common/SpecSyncErrAlert';\n\nexport type AgentStatusProps = {\n agent: AgentK8sResource;\n onApprove?: AgentTableActions['onApprove'];\n onEditHostname?: AgentTableActions['onEditHost'];\n zIndex?: number;\n wizardStepId?: ClusterDeploymentWizardStepsType;\n isDay2?: boolean;\n};\n\nconst AgentStatus: React.FC<AgentStatusProps> = ({\n agent,\n onApprove,\n onEditHostname,\n zIndex,\n wizardStepId,\n isDay2,\n}) => {\n const [host] = getAIHosts([agent]);\n const editHostname = onEditHostname ? () => onEditHostname(agent) : undefined;\n const pendingApproval = !agent.spec.approved;\n\n const hostname = getHostname(host, agent.status?.inventory || {});\n const { t } = useTranslation();\n const status = wizardStepId\n ? getWizardStepAgentStatus(agent, wizardStepId, t)\n : getAgentStatus(agent, false);\n\n const showValidationsRunning =\n isDay2 &&\n Object.values(status.validationsInfo).some((valInfo) =>\n valInfo.some((v) => ['pending', 'error', 'failure'].includes(v.status)),\n );\n\n return (\n <HostStatus\n host={host}\n onEditHostname={editHostname}\n zIndex={zIndex}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n autoCSR\n additionalPopoverContent={\n status.status === agentStatus.specSyncErr ? (\n <StackItem>\n <SpecSyncErrAlert agent={agent} />\n </StackItem>\n ) : showValidationsRunning ? (\n <StackItem>\n <ValidationsRunningAlert />\n </StackItem>\n ) : undefined\n }\n {...status}\n >\n {pendingApproval && onApprove && (\n <Popover\n aria-label={t('ai:Approve host popover')}\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n headerContent={<div>{t('ai:Approve host to join infrastructure environment')}</div>}\n bodyContent={\n <Stack hasGutter>\n <StackItem>\n {t('ai:Make sure that you expect and recognize the host before approving.')}\n </StackItem>\n <StackItem>\n {hostname && <>{t('ai:Hostname: {{hostname}}', { hostname })}</>}\n </StackItem>\n </Stack>\n }\n footerContent={\n <Button variant=\"link\" onClick={() => onApprove(agent)} isInline>\n {t('ai:Approve host')}\n </Button>\n }\n >\n <Button variant=\"link\" isInline className=\"pf-u-font-size-xs\">\n {t('ai:Approve host')}\n </Button>\n </Popover>\n )}\n </HostStatus>\n );\n};\n\nexport default AgentStatus;\n", "import React from 'react';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\n// TODO we should use hostValidationFailureHints instead of passing this 'action' which is actually a hint\nexport const AdditionalNTPSourcesDialogToggle: React.FC = () => {\n const { t } = useTranslation();\n return (\n <>\n {t(\n \"ai:NTP sources can be edited in Host's Infrastructure environment. After updating the NTP sources, make sure to restart the host.\",\n )}\n </>\n );\n};\n", "import { Alert } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst ValidationsRunningAlert = () => {\n const { t } = useTranslation();\n return (\n <Alert\n variant=\"info\"\n isInline\n title={t(\n 'ai:Validations are running. If they take more than 2 minutes, please attend to the alert below.',\n )}\n />\n );\n};\n\nexport default ValidationsRunningAlert;\n", "import { Alert } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { AgentK8sResource } from '../../types';\n\nconst SpecSyncErrAlert = ({ agent }: { agent: AgentK8sResource }) => {\n const { t } = useTranslation();\n return (\n <Alert variant=\"danger\" isInline title={t('ai:Host specification sync error')}>\n {agent.status?.conditions?.find((c) => c.type === 'SpecSynced')?.message}\n </Alert>\n );\n};\n\nexport default SpecSyncErrAlert;\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", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport mapKeys from 'lodash/mapKeys';\nimport camelCase from 'lodash/camelCase';\nimport uniq from 'lodash/uniq';\nimport { EventList } from '../../../common/api/types';\nimport {\n AgentClusterInstallK8sResource,\n InfraEnvK8sResource,\n BareMetalHostK8sResource,\n} from '../../types/k8s';\nimport { getClusterStatus } from '../helpers/status';\nimport { getK8sProxyURL } from '../helpers/proxy';\nimport { getInfraEnvNameOfAgent } from '../helpers/agents';\nimport { EventListFetchProps } from '../../../common';\nimport { ClusterDeploymentK8sResource, AgentK8sResource } from '../../types';\nimport { INFRAENV_GENERATED_AI_FLOW, BMH_HOSTNAME_ANNOTATION } from '../common/constants';\nimport { gridSpans } from '@patternfly/react-core';\nimport { getErrorMessage } from '../../../common/utils';\nexport const shouldShowClusterDeploymentValidationOverview = (\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n return (\n agentClusterInstall?.status?.validationsInfo &&\n (['insufficient', 'pending-for-input'].includes(clusterStatus) ||\n (clusterStatus === 'ready' && agentClusterInstall.spec?.holdInstallation))\n );\n};\n\nexport const shouldShowClusterCredentials = (\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n return ['installed', 'adding-hosts'].includes(clusterStatus);\n};\n\nexport const shouldShowClusterInstallationProgress = (\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n return [\n 'preparing-for-installation',\n 'installing',\n 'installing-pending-user-action',\n 'finalizing',\n 'installed',\n 'error',\n 'cancelled',\n 'adding-hosts',\n ].includes(clusterStatus);\n};\n\nexport const isInstallationInProgress = (agentClusterInstall: AgentClusterInstallK8sResource) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n\n if (\n !agentClusterInstall?.spec?.holdInstallation &&\n ['insufficient', 'ready'].includes(clusterStatus)\n ) {\n // special initial state\n return true;\n }\n\n return [\n 'preparing-for-installation',\n 'installing',\n 'finalizing',\n 'installing-pending-user-action',\n ].includes(clusterStatus);\n};\n\nexport const isInstallationReady = (agentClusterInstall: AgentClusterInstallK8sResource) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n return [\n 'ready',\n 'error',\n 'preparing-for-installation',\n 'installing',\n 'finalizing',\n 'installed',\n 'adding-hosts',\n 'cancelled',\n 'installing-pending-user-action',\n ].includes(clusterStatus);\n};\n\nexport const shouldShowClusterInstallationError = (\n agentClusterInstall: AgentClusterInstallK8sResource,\n) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n return ['error', 'cancelled'].includes(clusterStatus);\n};\n\nexport const formatEventsData = (rawData: any): EventList =>\n rawData.map((event: any) => mapKeys(event, (value, key) => camelCase(key)));\n\n// events are downloaded using ACM's wrapped fetchGet(), so the backendUrl is missing here\nconst getEventsURL = (\n aiNamespace: string,\n agentClusterInstall?: AgentClusterInstallK8sResource,\n) => {\n if (agentClusterInstall?.status?.debugInfo?.eventsURL) {\n const eventsURL = new URL(agentClusterInstall.status?.debugInfo?.eventsURL);\n return `${getK8sProxyURL(aiNamespace)}${eventsURL.pathname}${eventsURL.search}`;\n }\n return null;\n};\n\nexport const getOnFetchEventsHandler =\n (\n fetchEvents: (url: string) => Promise<string>,\n aiNamespace: string,\n agentClusterInstall?: AgentClusterInstallK8sResource,\n ): EventListFetchProps['onFetchEvents'] =>\n async (params, onSuccess, onError) => {\n const eventsURL = getEventsURL(aiNamespace, agentClusterInstall);\n if (!eventsURL) {\n onError('Cannot determine events URL');\n return;\n }\n try {\n const result = await fetchEvents(eventsURL);\n const data = formatEventsData(result);\n onSuccess(data);\n } catch (e) {\n onError(getErrorMessage(e));\n }\n };\n\nexport const isCIMFlow = (clusterDeployment?: ClusterDeploymentK8sResource) =>\n !clusterDeployment?.spec?.platform?.agentBareMetal?.agentSelector?.matchLabels?.[\n INFRAENV_GENERATED_AI_FLOW\n ];\n\nexport const isAgentOfInfraEnv = (infraEnv?: InfraEnvK8sResource, agent?: AgentK8sResource) =>\n getInfraEnvNameOfAgent(agent) === infraEnv?.metadata?.name &&\n agent?.metadata?.namespace === infraEnv?.metadata?.namespace;\n\nexport const isAgentOfCluster = (agent: AgentK8sResource, cdName?: string, cdNamespace?: string) =>\n agent.spec?.clusterDeploymentName?.name === cdName &&\n agent.spec?.clusterDeploymentName?.namespace === cdNamespace;\n\nexport const getAgentsHostsNames = (\n agents: AgentK8sResource[] = [],\n bmhs: BareMetalHostK8sResource[] = [],\n): string[] => {\n const raw: (string | undefined)[] = agents.map(\n (agent) => agent.spec?.hostname || agent.status?.inventory?.hostname,\n );\n bmhs.forEach((bmh) => {\n const hostname = bmh.metadata?.annotations?.[BMH_HOSTNAME_ANNOTATION];\n if (hostname) {\n raw.push(hostname);\n }\n });\n return uniq(raw.filter(Boolean)) as string[];\n};\n\nexport const getGridSpans = (\n isPreviewOpen: boolean,\n): {\n span: gridSpans;\n lg?: gridSpans;\n xl?: gridSpans;\n xl2?: gridSpans;\n} =>\n isPreviewOpen\n ? {\n span: 12,\n }\n : {\n span: 12,\n lg: 10,\n xl: 9,\n xl2: 7,\n };\n", "// Alternative namespaces:\n// assisted-installer: pre-2.3\n// open-cluster-management: acm >= 2.3\n// rhacm: acm downstream >= 2.3\nexport const getK8sProxyURL = (aiNamespace = 'open-cluster-management') =>\n `/api/v1/namespaces/${aiNamespace}/services/https:assisted-service:8090/proxy`;\n", "import { Button, Popover } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { getBMHStatus } from '../helpers/status';\n\ntype BMHStatusProps = {\n bmhStatus: ReturnType<typeof getBMHStatus>;\n};\n\nconst BMHStatus: React.FC<BMHStatusProps> = ({ bmhStatus }) =>\n bmhStatus.errorMessage ? (\n <Popover\n headerContent=\"Error\"\n bodyContent={bmhStatus.errorMessage}\n minWidth=\"30rem\"\n maxWidth=\"50rem\"\n hideOnOutsideClick\n zIndex={300}\n >\n <Button variant=\"link\" isInline>\n {bmhStatus.state.title}\n </Button>\n </Popover>\n ) : (\n <>{bmhStatus.state.title}</>\n );\n\nexport default BMHStatus;\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 * as React from 'react';\nimport EditHostModal from '../../../common/components/hosts/EditHostModal';\nimport { EditAgentModalProps } from '../ClusterDeployment/types';\nimport { getAIHosts } from '../helpers/toAssisted';\n\nconst EditAgentModal: React.FC<EditAgentModalProps> = ({ agent, onSave, ...rest }) => {\n const [host] = agent ? getAIHosts([agent]) : [];\n return (\n <EditHostModal\n host={host}\n inventory={agent?.status?.inventory}\n {...rest}\n onSave={async ({ hostname }) => agent && onSave(agent, hostname)}\n />\n );\n};\n\nexport default EditAgentModal;\n", "import * as React from 'react';\nimport { FormikHelpers } from 'formik';\nimport {\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n Modal,\n ModalVariant,\n Spinner,\n} from '@patternfly/react-core';\nimport { DownloadIso, DiscoveryImageConfigForm, DiscoveryImageFormValues } from '../../../common';\nimport { AddHostModalProps } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { EnvironmentErrors } from '../InfraEnv/EnvironmentErrors';\nimport { InfraEnvK8sResource } from '../../types';\n\ntype AddHostModalStepType = 'iso-config' | 'iso-download';\n\nconst AddHostModal: React.FC<AddHostModalProps> = ({\n isOpen,\n onClose,\n infraEnv,\n agentClusterInstall,\n onSaveISOParams,\n docVersion,\n}) => {\n const hasDHCP = infraEnv.metadata?.labels?.networkType !== 'static';\n const sshPublicKey = infraEnv.spec?.sshAuthorizedKey || agentClusterInstall?.spec?.sshPublicKey;\n const { httpProxy, httpsProxy, noProxy } = infraEnv.spec?.proxy || {};\n\n const areIsoDataAvailable = !!sshPublicKey || !!httpProxy || !!httpsProxy || !!noProxy;\n const isoDialog = areIsoDataAvailable ? 'iso-download' : 'iso-config';\n const [dialogType, setDialogType] = React.useState<AddHostModalStepType>(isoDialog);\n const { t } = useTranslation();\n const handleIsoConfigSubmit = async (\n values: DiscoveryImageFormValues,\n formikActions: FormikHelpers<DiscoveryImageFormValues>,\n ) => {\n try {\n await onSaveISOParams(values);\n setDialogType('iso-download');\n } catch (error) {\n formikActions.setStatus({\n error: {\n title: t('ai:Failed to download the discovery Image'),\n message: error, // TODO(mlibra): parse it better!!\n },\n });\n }\n };\n\n return (\n <Modal\n aria-label={t('ai:Add host dialog')}\n title={t('ai:Add host')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"add-host-modal\"\n >\n <EnvironmentErrors infraEnv={infraEnv} docVersion={docVersion} inModal>\n {dialogType === 'iso-config' && (\n <DiscoveryImageConfigForm\n onCancel={onClose}\n handleSubmit={handleIsoConfigSubmit}\n hideDiscoveryImageType={true} // So far configured by env variable on backend\n imageType=\"full-iso\" // So far the only option for CIM\n sshPublicKey={sshPublicKey}\n httpProxy={httpProxy}\n httpsProxy={httpsProxy}\n noProxy={noProxy}\n hasDHCP={hasDHCP}\n />\n )}\n {dialogType === 'iso-download' && (\n <GeneratingIsoDownload\n onClose={onClose}\n infraEnv={infraEnv}\n onReset={() => setDialogType('iso-config')}\n hasDHCP={hasDHCP}\n />\n )}\n </EnvironmentErrors>\n </Modal>\n );\n};\n\nconst GeneratingIsoDownload = ({\n infraEnv,\n onClose,\n onReset,\n hasDHCP,\n}: {\n infraEnv: InfraEnvK8sResource;\n onClose: VoidFunction;\n onReset: VoidFunction;\n hasDHCP: boolean;\n}) => {\n const { t } = useTranslation();\n return infraEnv.status?.isoDownloadURL ? (\n <DownloadIso\n onClose={onClose}\n downloadUrl={infraEnv.status.isoDownloadURL}\n onReset={onReset}\n hasDHCP={hasDHCP}\n />\n ) : (\n <EmptyState>\n <EmptyStateIcon icon={Spinner} />\n <EmptyStateBody>{t('ai:Generating discovery ISO')}</EmptyStateBody>\n </EmptyState>\n );\n};\n\nexport default AddHostModal;\n", "import * as React from 'react';\nimport { getFailingResourceConditions } from '../helpers';\nimport { InfraEnvK8sResource } from '../../types';\nimport { SingleResourceAlerts } from '../common/ResourceAlerts';\nimport { Alert, AlertVariant, ModalBoxBody } from '@patternfly/react-core';\nimport { getInfraEnvDocs } from '../common/constants';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type EnvironmentErrorsProps = {\n infraEnv: InfraEnvK8sResource;\n docVersion: string;\n inModal?: boolean;\n children?: React.ReactNode;\n};\n\nexport const EnvironmentErrors: React.FC<EnvironmentErrorsProps> = ({\n infraEnv,\n docVersion,\n children,\n inModal,\n}) => {\n const infraEnvAlerts = getFailingResourceConditions(infraEnv, undefined /* For ALL */);\n const { t } = useTranslation();\n\n if (infraEnv.status && !infraEnvAlerts.length) {\n return <>{children}</>;\n }\n\n const errors = (\n <>\n {!infraEnv.status && (\n <Alert\n title={t('ai:Central infrastructure management is not running')}\n variant={AlertVariant.warning}\n isInline\n className=\"cim-resource-alerts\"\n actionLinks={\n <a href={getInfraEnvDocs(docVersion)} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Open documentation')}\n </a>\n }\n >\n {t(\n 'ai:It seems the Central infrastructure management is not configured which will prevent its features to be used. Please refer to the documentation for the first time setup steps.',\n )}\n </Alert>\n )}\n <SingleResourceAlerts\n title={t('ai:Failing infrastructure environment')}\n conditions={infraEnvAlerts}\n />\n </>\n );\n\n return inModal ? <ModalBoxBody>{errors}</ModalBoxBody> : errors;\n};\n", "import React from 'react';\nimport {\n Alert,\n AlertVariant,\n TextContent,\n TextList,\n TextListItem,\n TextListItemVariants,\n TextListVariants,\n} from '@patternfly/react-core';\nimport { StatusCondition } from '../../types';\n\nimport './ResourceAlerts.css';\n\nexport const SingleResourceAlerts: React.FC<{\n conditions: StatusCondition<string>[];\n title: string;\n}> = ({ title, conditions }) => {\n if (!conditions.length) {\n return null;\n }\n\n return (\n <Alert\n title={title}\n variant={AlertVariant.danger}\n isInline\n className=\"cim-resource-alerts cim-resource-alerts--noul\"\n >\n <TextContent>\n <TextList component={TextListVariants.ul}>\n {conditions.map((c) => {\n const [title, ...messages] = c.message.split(/:|\\.,/);\n return (\n <React.Fragment key={title}>\n <TextListItem component={TextListItemVariants.li}>\n <strong>{title}</strong>\n </TextListItem>\n {messages.map((m) => (\n <TextListItem key={m} component={TextListItemVariants.li}>\n {m}\n </TextListItem>\n ))}\n </React.Fragment>\n );\n })}\n </TextList>\n </TextContent>\n </Alert>\n );\n};\n", "import * as React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport BMCForm from '../Agent/BMCForm';\nimport { SecretK8sResource } from '../../types';\nimport { LoadingState } from '../../../common';\nimport { EditBMHModalProps } from './types';\nimport { AGENT_BMH_NAME_LABEL_KEY } from '../common/constants';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst EditBMHModal: React.FC<EditBMHModalProps> = ({\n isOpen,\n onClose,\n onEdit,\n infraEnv,\n bmh,\n nmStates,\n fetchSecret,\n usedHostnames,\n}) => {\n const [secret, setSecret] = React.useState<SecretK8sResource>();\n const [isLoading, setLoading] = React.useState(true);\n const hasDHCP = infraEnv.metadata?.labels?.networkType !== 'static';\n\n const bmhName = bmh?.metadata?.name;\n const bmhNamespace = bmh?.metadata?.namespace;\n const bmhSecret = bmh?.spec?.bmc?.credentialsName;\n\n const nmState = nmStates.find(\n (nm) => nm.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY] === bmhName,\n );\n const { t } = useTranslation();\n React.useEffect(() => {\n setSecret(undefined);\n const getResources = async () => {\n if (bmhSecret && bmhNamespace) {\n try {\n const secretResult = await fetchSecret(bmhNamespace, bmhSecret);\n setSecret(secretResult);\n } catch (err) {\n console.error(t('ai:Could not get secret'), err);\n }\n }\n\n setLoading(false);\n };\n\n if (bmhNamespace && bmhName) {\n setLoading(true);\n void getResources();\n }\n }, [bmhName, bmhNamespace, fetchSecret, bmhSecret, hasDHCP, t]);\n return (\n <Modal\n aria-label={t('ai:Edit BMH dialog')}\n title={t('ai:Edit BMH')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n id=\"edit-bmh-modal\"\n >\n {isLoading ? (\n <LoadingState />\n ) : (\n <BMCForm\n isEdit\n onCreateBMH={onEdit({ bmh, secret, nmState })}\n onClose={onClose}\n hasDHCP={hasDHCP}\n infraEnv={infraEnv}\n bmh={bmh}\n secret={secret}\n nmState={nmState}\n usedHostnames={usedHostnames}\n />\n )}\n </Modal>\n );\n};\n\nexport default EditBMHModal;\n", "import * as React from 'react';\nimport * as yaml from 'js-yaml';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertVariant,\n Button,\n ButtonVariant,\n Form,\n FormGroup,\n Grid,\n GridItem,\n ModalBoxBody,\n ModalBoxFooter,\n Text,\n TextInputTypes,\n TextVariants,\n} from '@patternfly/react-core';\nimport { Formik, FormikProps, FormikConfig, FieldArray, useField, useFormikContext } from 'formik';\nimport * as Yup from 'yup';\nimport { InfraEnvK8sResource, SecretK8sResource } from '../../types';\nimport {\n InputField,\n macAddressValidationSchema,\n CodeField,\n getFieldId,\n richNameValidationSchema,\n getRichTextValidation,\n RichInputField,\n hostnameValidationMessages,\n bmcAddressValidationSchema,\n} from '../../../common';\nimport { Language } from '@patternfly/react-code-editor';\nimport { MinusCircleIcon, PlusCircleIcon } from '@patternfly/react-icons';\nimport { AddBmcValues, BMCFormProps } from './types';\nimport { NMStateK8sResource } from '../../types/k8s/nm-state';\nimport { BareMetalHostK8sResource } from '../../types/k8s/bare-metal-host';\nimport {\n AGENT_BMH_NAME_LABEL_KEY,\n BMH_HOSTNAME_ANNOTATION,\n INFRAENV_AGENTINSTALL_LABEL_KEY,\n} from '../common';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nconst MacMapping = () => {\n const [field, { touched, error }] = useField<{ macAddress: string; name: string }[]>({\n name: 'macMapping',\n });\n const { errors } = useFormikContext();\n const fieldId = getFieldId('macMapping', 'input');\n const isValid = !(touched && error);\n const { t } = useTranslation();\n\n return (\n <FormGroup\n fieldId={fieldId}\n label={t('ai:MAC to interface name mapping')}\n validated={isValid ? 'default' : 'error'}\n >\n <FieldArray\n name=\"macMapping\"\n render={({ push, remove }) => (\n <Grid hasGutter>\n <GridItem span={5}>\n <Text component={TextVariants.small}>MAC address</Text>\n </GridItem>\n <GridItem span={5}>\n <Text component={TextVariants.small}>NIC</Text>\n </GridItem>\n {field.value.map((mac, index) => {\n const macField = `macMapping[${index}].macAddress`;\n const nameField = `macMapping[${index}].name`;\n return (\n <React.Fragment key={index}>\n <GridItem span={5}>\n <InputField name={macField} inputError={errors[macField]?.[0]} />\n </GridItem>\n <GridItem span={5}>\n <InputField name={nameField} inputError={errors[nameField]?.[0]} />\n </GridItem>\n {index !== 0 && (\n <GridItem span={2}>\n <MinusCircleIcon onClick={() => remove(index)} />\n </GridItem>\n )}\n </React.Fragment>\n );\n })}\n <GridItem span={6}>\n <Button\n icon={<PlusCircleIcon />}\n onClick={() => push({ macAddress: '', name: '' })}\n variant=\"link\"\n isInline\n >\n {t('ai:Add more')}\n </Button>\n </GridItem>\n </Grid>\n )}\n />\n </FormGroup>\n );\n};\n\nconst getNMState = (values: AddBmcValues, infraEnv: InfraEnvK8sResource): NMStateK8sResource => {\n // eslint-disable-next-line\n const config: any = yaml.load(values.nmState);\n const nmState = {\n apiVersion: 'agent-install.openshift.io/v1beta1',\n kind: 'NMStateConfig',\n metadata: {\n generateName: `${infraEnv.metadata?.name}-`,\n namespace: infraEnv.metadata?.namespace,\n labels: {\n [AGENT_BMH_NAME_LABEL_KEY]: values.name,\n [INFRAENV_AGENTINSTALL_LABEL_KEY]: infraEnv?.metadata?.name || '',\n },\n },\n spec: {\n config,\n interfaces: values.macMapping.filter((m) => m.macAddress.length && m.name.length),\n },\n };\n return nmState;\n};\n\nconst getValidationSchema = (usedHostnames: string[], origHostname: string, t: TFunction) => {\n return Yup.object({\n name: Yup.string().required(t('ai:Required field')),\n hostname: richNameValidationSchema(t, usedHostnames, origHostname),\n bmcAddress: bmcAddressValidationSchema(t).required(t('ai:Required field')),\n username: Yup.string().required(t('ai:Required field')),\n password: Yup.string().required(t('ai:Required field')),\n bootMACAddress: macAddressValidationSchema,\n nmState: Yup.string(),\n macMapping: Yup.array().of(\n Yup.object().shape(\n {\n macAddress: macAddressValidationSchema.when(['name'], {\n is: (name) => !!name,\n then: macAddressValidationSchema.required(t('ai:MAC has to be specified')),\n }),\n name: Yup.string().when(['macAddress'], {\n is: (macAddress) => !!macAddress,\n then: Yup.string().required(t('ai:Name has to be specified')),\n }),\n },\n [['name', 'macAddress']],\n ),\n ),\n });\n};\n\nconst emptyValues: AddBmcValues = {\n name: '',\n hostname: '',\n bmcAddress: '',\n username: '',\n password: '',\n bootMACAddress: '',\n disableCertificateVerification: true, // TODO(mlibra)\n online: false, // TODO(mlibra)\n nmState: '',\n macMapping: [{ macAddress: '', name: '' }],\n};\n\nconst getInitValues = (\n bmh?: BareMetalHostK8sResource,\n nmState?: NMStateK8sResource,\n secret?: SecretK8sResource,\n isEdit?: boolean,\n): AddBmcValues => {\n if (isEdit) {\n return {\n name: bmh?.metadata?.name || '',\n hostname: bmh?.metadata?.annotations?.[BMH_HOSTNAME_ANNOTATION] || '',\n bmcAddress: bmh?.spec?.bmc?.address || '',\n username: secret?.data?.username ? atob(secret.data.username) : '',\n password: secret?.data?.password ? atob(secret.data.password) : '',\n bootMACAddress: bmh?.spec?.bootMACAddress || '',\n disableCertificateVerification: !!bmh?.spec?.bmc?.disableCertificateVerification,\n online: !!bmh?.spec?.online,\n nmState: nmState ? yaml.dump(nmState?.spec?.config) : '',\n macMapping: nmState?.spec?.interfaces || [{ macAddress: '', name: '' }],\n };\n } else {\n return emptyValues;\n }\n};\n\nconst BMCForm: React.FC<BMCFormProps> = ({\n onCreateBMH,\n onClose,\n hasDHCP,\n infraEnv,\n bmh,\n nmState,\n secret,\n isEdit,\n usedHostnames,\n}) => {\n const [error, setError] = React.useState<string>();\n\n const handleSubmit: FormikConfig<AddBmcValues>['onSubmit'] = async (values) => {\n try {\n setError(undefined);\n const nmState = values.nmState ? getNMState(values, infraEnv) : undefined;\n await onCreateBMH(values, nmState);\n onClose();\n } catch (e) {\n setError(getErrorMessage(e));\n }\n };\n const { t } = useTranslation();\n const { initValues, validationSchema } = React.useMemo(() => {\n const initValues = getInitValues(bmh, nmState, secret, isEdit);\n const validationSchema = getValidationSchema(usedHostnames, initValues.hostname, t);\n return { initValues, validationSchema };\n }, [usedHostnames, bmh, nmState, secret, isEdit, t]);\n\n return (\n <Formik\n initialValues={initValues}\n isInitialValid={false}\n validate={getRichTextValidation(validationSchema)}\n onSubmit={handleSubmit}\n >\n {({ isSubmitting, isValid, submitForm }: FormikProps<AddBmcValues>) => (\n <>\n <ModalBoxBody>\n <Form id=\"add-bmc-form\">\n <InputField\n label={t('ai:Name')}\n name=\"name\"\n placeholder={t('ai:Enter the name for the Host')}\n isRequired\n isDisabled={isEdit}\n />\n <RichInputField\n label={t('ai:Hostname')}\n name=\"hostname\"\n placeholder={t('ai:Enter the hostname for the Host')}\n richValidationMessages={hostnameValidationMessages(t)}\n isRequired\n />\n <InputField\n label={t('ai:Baseboard Management Controller Address')}\n name=\"bmcAddress\"\n placeholder={t('ai:Enter an address')}\n isRequired\n />\n <InputField\n label={t('ai:Boot NIC MAC Address')}\n name=\"bootMACAddress\"\n placeholder={t('ai:Enter an address')}\n description={t(\n \"ai:The MAC address of the host's network connected NIC that wll be used to provision the host.\",\n )}\n />\n <InputField\n label={t('ai:Username')}\n name=\"username\"\n placeholder={t('ai:Enter a username for the BMC')}\n isRequired\n />\n <InputField\n type={TextInputTypes.password}\n label={t('ai:Password')}\n name=\"password\"\n placeholder={t('ai:Enter a password for the BMC')}\n isRequired\n />\n {!hasDHCP && (\n <>\n <CodeField\n label={t('ai:NMState')}\n name=\"nmState\"\n language={Language.yaml}\n description={t(\n 'ai:Upload a YAML file in NMstate format that includes your network configuration (static IPs, bonds, etc.).',\n )}\n />\n <MacMapping />\n </>\n )}\n </Form>\n {error && (\n <Alert\n title={t('ai:Failed to add host')}\n variant={AlertVariant.danger}\n isInline\n actionClose={<AlertActionCloseButton onClose={() => setError(undefined)} />}\n >\n {error}\n </Alert>\n )}\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={submitForm} isDisabled={isSubmitting || !isValid}>\n {isEdit ? t('ai:Submit') : t('ai:Create')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n Cancel\n </Button>\n </ModalBoxFooter>\n </>\n )}\n </Formik>\n );\n};\n\nexport default BMCForm;\n", "import React from 'react';\nimport * as Yup from 'yup';\nimport {\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n Button,\n ButtonVariant,\n Alert,\n AlertVariant,\n AlertActionCloseButton,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, FormikConfig, FormikProps } from 'formik';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { ClusterDeploymentK8sResource } from '../../types/k8s/cluster-deployment';\nimport ScaleUpForm from '../ClusterDeployment/ScaleUpForm';\nimport {\n getAgentSelectorFieldsFromAnnotations,\n getClusterDeploymentCpuArchitecture,\n} from '../helpers/clusterDeployment';\nimport { ScaleUpFormValues } from '../ClusterDeployment/types';\nimport EditAgentModal from './EditAgentModal';\nimport { getAgentsHostsNames } from '../ClusterDeployment/helpers';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst getAgentsToAdd = (\n selectedHostIds: ScaleUpFormValues['selectedHostIds'] | ScaleUpFormValues['autoSelectedHostIds'],\n agents: AgentK8sResource[],\n) =>\n agents.filter(\n (agent) =>\n selectedHostIds.includes(agent.metadata?.uid || '') &&\n !(agent.spec?.clusterDeploymentName?.name || agent.spec?.clusterDeploymentName?.namespace),\n );\n\nconst getValidationSchema = (agentsCount: number) => {\n return Yup.lazy<ScaleUpFormValues>((values) => {\n return Yup.object<ScaleUpFormValues>().shape({\n hostCount: Yup.number().min(1).max(agentsCount),\n autoSelectedHostIds: values.autoSelectHosts\n ? Yup.array<string>().min(1).max(agentsCount)\n : Yup.array<string>(),\n selectedHostIds: values.autoSelectHosts\n ? Yup.array<string>()\n : Yup.array<string>().min(1).max(agentsCount),\n });\n });\n};\n\ntype ScaleUpModalProps = {\n isOpen: boolean;\n onClose: VoidFunction;\n addHostsToCluster: (agentsToAdd: AgentK8sResource[]) => Promise<void>;\n clusterDeployment: ClusterDeploymentK8sResource;\n agents: AgentK8sResource[];\n onChangeHostname: (agent: AgentK8sResource, hostname: string) => Promise<AgentK8sResource>;\n};\n\nconst ScaleUpModal: React.FC<ScaleUpModalProps> = ({\n isOpen,\n onClose,\n addHostsToCluster,\n clusterDeployment,\n agents,\n onChangeHostname,\n}) => {\n const [editAgent, setEditAgent] = React.useState<AgentK8sResource | undefined>();\n const [error, setError] = React.useState<string | undefined>();\n\n const { t } = useTranslation();\n const getInitialValues = (): ScaleUpFormValues => {\n const agentSelector = getAgentSelectorFieldsFromAnnotations(\n clusterDeployment?.metadata?.annotations,\n );\n\n const autoSelectHosts = agentSelector.autoSelect;\n return {\n autoSelectHosts,\n hostCount: 1,\n agentLabels: agentSelector.labels,\n locations: agentSelector.locations,\n cpuArchitecture: getClusterDeploymentCpuArchitecture(clusterDeployment),\n selectedHostIds: [],\n autoSelectedHostIds: [],\n };\n };\n\n const validationSchema = React.useMemo(() => getValidationSchema(agents.length), [agents.length]);\n\n const handleSubmit: FormikConfig<ScaleUpFormValues>['onSubmit'] = async (values) => {\n const { autoSelectHosts, autoSelectedHostIds, selectedHostIds } = values;\n try {\n setError(undefined);\n const agentsToAdd = getAgentsToAdd(\n autoSelectHosts ? autoSelectedHostIds : selectedHostIds,\n agents,\n );\n await addHostsToCluster(agentsToAdd);\n onClose();\n } catch (e) {\n setError(getErrorMessage(e));\n }\n };\n\n const clusterAgents = agents.filter(\n (a) =>\n a.spec.clusterDeploymentName?.name === clusterDeployment.metadata?.name &&\n a.spec.clusterDeploymentName?.namespace === clusterDeployment.metadata?.namespace,\n );\n return (\n <>\n <Modal\n aria-label={t('ai:Add worker host dialog')}\n title={t('ai:Add worker hosts')}\n isOpen={isOpen}\n onClose={onClose}\n hasNoBodyWrapper\n id=\"scale-up-modal\"\n >\n <Formik\n initialValues={getInitialValues()}\n validationSchema={validationSchema}\n onSubmit={handleSubmit}\n validateOnMount\n >\n {({ isSubmitting, isValid, submitForm }: FormikProps<ScaleUpFormValues>) => {\n return (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <ScaleUpForm agents={agents} onEditHost={setEditAgent} />\n </StackItem>\n {error && (\n <StackItem>\n <Alert\n title={t('ai:Failed to add hosts to the cluster')}\n variant={AlertVariant.danger}\n actionClose={\n <AlertActionCloseButton onClose={() => setError(undefined)} />\n }\n isInline\n >\n {error}\n </Alert>\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={submitForm} isDisabled={isSubmitting || !isValid}>\n {t('ai:Submit')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n }}\n </Formik>\n </Modal>\n {editAgent && (\n <EditAgentModal\n agent={editAgent}\n isOpen\n onClose={() => setEditAgent(undefined)}\n onSave={onChangeHostname}\n usedHostnames={getAgentsHostsNames(clusterAgents)}\n />\n )}\n </>\n );\n};\n\nexport default ScaleUpModal;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Flex, FlexItem, Form, FormGroup } from '@patternfly/react-core';\nimport { getAgentsForSelection } from '../helpers/agents';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport ClusterDeploymentHostsSelectionAdvanced from './ClusterDeploymentHostsSelectionAdvanced';\nimport { ScaleUpFormValues } from './types';\nimport SwitchField from '../../../common/components/ui/formik/SwitchField';\nimport ClusterScaleUpAutoHostsSelection from './ClusterScaleUpAutoHostsSelection';\nimport { AgentTableActions } from '../ClusterDeployment/types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport RadioField from '../../../common/components/ui/formik/RadioField';\n\ntype ScaleUpFormProps = {\n agents: AgentK8sResource[];\n onEditHost: AgentTableActions['onEditHost'];\n};\n\nconst ScaleUpForm: React.FC<ScaleUpFormProps> = ({ agents, onEditHost }) => {\n const { values } = useFormikContext<ScaleUpFormValues>();\n const { autoSelectHosts } = values;\n const availableAgents = React.useMemo(\n () =>\n getAgentsForSelection(agents).filter(\n (agent) =>\n !(\n agent.spec?.clusterDeploymentName?.name || agent.spec?.clusterDeploymentName?.namespace\n ) && agent.status?.inventory.cpu?.architecture === values.cpuArchitecture,\n ),\n [agents, values.cpuArchitecture],\n );\n const { t } = useTranslation();\n return (\n <Form>\n <SwitchField name=\"autoSelectHosts\" label={t('ai:Auto-select hosts')} />\n <FormGroup fieldId=\"cpuArchitecture\" label={t('ai:CPU architecture')}>\n <Flex justifyContent={{ default: 'justifyContentFlexStart' }}>\n <FlexItem>\n <RadioField name=\"cpuArchitecture\" id=\"x86_64\" value=\"x86_64\" label={t('ai:x86_64')} />\n </FlexItem>\n {/* <FlexItem spacer={{ default: 'spacer4xl' }} /> */}\n <FlexItem>\n <RadioField\n name=\"cpuArchitecture\"\n id=\"arm64\"\n value=\"arm64\"\n label={<>{t('ai:arm64')}&nbsp;</>}\n />\n </FlexItem>\n </Flex>\n </FormGroup>\n\n {autoSelectHosts && <ClusterScaleUpAutoHostsSelection availableAgents={availableAgents} />}\n\n {!autoSelectHosts && (\n <ClusterDeploymentHostsSelectionAdvanced<ScaleUpFormValues>\n availableAgents={availableAgents}\n onEditHost={onEditHost}\n />\n )}\n </Form>\n );\n};\n\nexport default ScaleUpForm;\n", "import isMatch from 'lodash/isMatch';\nimport { useFormikContext } from 'formik';\nimport React from 'react';\nimport Measure from 'react-measure';\nimport { Alert, AlertVariant, Grid, GridItem } from '@patternfly/react-core';\n\nimport { AgentK8sResource } from '../../types';\nimport { AGENT_LOCATION_LABEL_KEY, AGENT_NOLOCATION_VALUE } from '../common';\nimport LocationsSelector from './LocationsSelector';\nimport { ClusterDeploymentHostsSelectionValues, ScaleUpFormValues } from './types';\nimport LabelsSelector, { infraEnvLabelKeys } from './LabelsSelector';\nimport AgentsSelectionTable from '../Agent/AgentsSelectionTable';\nimport { AgentTableActions } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { CpuArchitecture } from '../../../common';\n\ntype ClusterDeploymentHostsSelectionAdvancedProps = {\n availableAgents: AgentK8sResource[];\n onEditRole?: AgentTableActions['onEditRole'];\n onEditHost?: AgentTableActions['onEditHost'];\n onSetInstallationDiskId?: AgentTableActions['onSetInstallationDiskId'];\n onHostSelect?: VoidFunction;\n cpuArchitecture?: CpuArchitecture;\n};\n\ntype FormValues = ClusterDeploymentHostsSelectionValues | ScaleUpFormValues;\n\nconst ClusterDeploymentHostsSelectionAdvanced = <T extends FormValues>({\n availableAgents,\n onEditRole,\n onSetInstallationDiskId,\n onEditHost,\n onHostSelect,\n cpuArchitecture,\n}: ClusterDeploymentHostsSelectionAdvancedProps) => {\n const { t } = useTranslation();\n const { values } = useFormikContext<T>();\n const { locations, agentLabels } = values;\n\n const matchingAgents = React.useMemo(\n () =>\n availableAgents.filter((agent) => {\n const labels = agentLabels.reduce((acc, curr) => {\n const label = curr.split('=');\n acc[label[0]] = label[1];\n return acc;\n }, {});\n const matchesLocation = locations.length\n ? locations.includes(\n agent.metadata?.labels?.[AGENT_LOCATION_LABEL_KEY] || AGENT_NOLOCATION_VALUE,\n )\n : true;\n const matchesLabels = agent.metadata?.labels\n ? isMatch(agent.metadata?.labels, labels)\n : true;\n return matchesLocation && matchesLabels;\n }),\n [availableAgents, locations, agentLabels],\n );\n\n return (\n <>\n <Grid hasGutter>\n <GridItem>\n <LocationsSelector agents={availableAgents} />\n </GridItem>\n <GridItem>\n <LabelsSelector\n agents={matchingAgents}\n name=\"agentLabels\"\n labelKeysFilter={infraEnvLabelKeys}\n />\n </GridItem>\n {cpuArchitecture && (\n <Alert\n variant={AlertVariant.info}\n title={t(\n 'ai:Displaying only hosts with {{cpuArchitecture}} architecture in the table.',\n {\n cpuArchitecture,\n },\n )}\n isInline\n />\n )}\n <GridItem>\n <Measure bounds>\n {({ measureRef, contentRect }) => (\n <div ref={measureRef}>\n <AgentsSelectionTable\n matchingAgents={matchingAgents}\n onEditRole={onEditRole}\n onSetInstallationDiskId={onSetInstallationDiskId}\n width={contentRect.bounds?.width}\n onEditHost={onEditHost}\n onHostSelect={onHostSelect}\n />\n </div>\n )}\n </Measure>\n </GridItem>\n </Grid>\n </>\n );\n};\n\nexport default ClusterDeploymentHostsSelectionAdvanced;\n", "import React from 'react';\nimport countBy from 'lodash/countBy';\nimport { MultiSelectField, PopoverIcon } from '../../../common';\nimport { AGENT_LOCATION_LABEL_KEY, AGENT_NOLOCATION_VALUE } from '../common';\nimport { AgentK8sResource } from '../../types';\nimport { MultiSelectOption } from '../../../common/components/ui/formik/types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\nimport { Trans } from 'react-i18next';\n\nconst LocationsLabelIcon: React.FC = () => {\n const { t } = useTranslation();\n return (\n <PopoverIcon\n position=\"right\"\n bodyContent={\n <>\n {t('ai:Select one or multiple locations to choose the hosts from.')}\n <br />\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:Keep the field empty to match <bold>any</bold> location.\"\n />\n\n <br />\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:Set <bold>{{agent_location_label_key}}</bold> label in Agent resource to specify it's location.\"\n values={{ agent_location_label_key: AGENT_LOCATION_LABEL_KEY }}\n />\n </>\n }\n />\n );\n};\n\nconst getNumOfHosts = (size: number, t: TFunction) => {\n if (size === 0) {\n return t('ai:(no hosts available)');\n } else if (size === 1) {\n return t('ai:(1 host available)');\n }\n return t('ai:({{size}} hosts available)', { size });\n};\n\nconst LocationsSelector: React.FC<{ agents: AgentK8sResource[] }> = ({ agents }) => {\n const locations = countBy(\n agents,\n ({ metadata }) => metadata?.labels?.[AGENT_LOCATION_LABEL_KEY] || AGENT_NOLOCATION_VALUE,\n );\n const { t } = useTranslation();\n const agentLocationOptions = Object.keys(locations).map<MultiSelectOption>((location) => ({\n // Why is that bloody prop set as mandatory in the SelectOptionProps??\n isLastOptionBeforeFooter: (index: number): boolean => index === locations.length,\n id: location,\n value: location,\n displayName: `${\n location === AGENT_NOLOCATION_VALUE ? t('ai:No location') : location\n } ${getNumOfHosts(locations[location], t)}`,\n }));\n return (\n <MultiSelectField\n idPostfix=\"locations\"\n name=\"locations\"\n label={t('ai:Host locations')}\n labelIcon={<LocationsLabelIcon />}\n placeholderText={t('ai:Type or select location(s)')}\n helperText={t('ai:Select one or more locations to view hosts')}\n options={agentLocationOptions}\n />\n );\n};\n\nexport default LocationsSelector;\n", "import React from 'react';\nimport flatten from 'lodash/flatten';\nimport {\n Dropdown,\n DropdownItem,\n DropdownToggle,\n Label,\n LabelGroup,\n Split,\n SplitItem,\n} from '@patternfly/react-core';\nimport { useField } from 'formik';\n\nimport { MultiSelectField } from '../../../common';\nimport { AgentK8sResource } from '../../types';\nimport { MultiSelectOption } from '../../../common/components/ui/formik/types';\nimport { AGENT_LOCATION_LABEL_KEY, INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nimport './LabelSelector.css';\n\nexport const infraEnvLabelKeys = [INFRAENV_AGENTINSTALL_LABEL_KEY, AGENT_LOCATION_LABEL_KEY];\n\nconst getSelectOptions = (agents: AgentK8sResource[], labelKeysFilter?: string[]) =>\n Array.from(\n new Set(\n flatten(\n agents.map((agent) =>\n Object.keys(agent.metadata?.labels || {})\n .filter((k) => !labelKeysFilter?.includes(k))\n .map((k) => `${k}=${agent.metadata?.labels?.[k] || ''}`),\n ),\n ),\n ),\n ).map<MultiSelectOption>((value) => ({\n id: value,\n value: value,\n displayName: value,\n }));\n\ntype LabelsSelectorProps = {\n agents: AgentK8sResource[];\n labelKeysFilter?: string[];\n name?: string;\n label?: string;\n};\n\nconst LabelsSelector: React.FC<LabelsSelectorProps> = ({\n agents,\n labelKeysFilter,\n name = 'agentLabels',\n label,\n}) => {\n const { t } = useTranslation();\n const agentLabelOptions = getSelectOptions(agents, labelKeysFilter);\n return (\n <MultiSelectField\n idPostfix=\"agentLabels\"\n name={name}\n label={label || t('ai:Labels matching hosts')}\n placeholderText=\"app=frontend\"\n helperText={t(\n 'ai:Provide as many labels as you can to narrow the list to relevant hosts only.',\n )}\n options={agentLabelOptions}\n />\n );\n};\n\nexport default LabelsSelector;\n\nexport const LabelSelectorGroup: React.FC<LabelsSelectorProps> = ({\n agents,\n labelKeysFilter,\n name = 'agentLabels',\n label,\n}) => {\n const { t } = useTranslation();\n const [addLabelOpen, setAddLabelOpen] = React.useState(false);\n const [field, , { setValue }] = useField<{ key: string; value: string }[]>(name);\n\n const options = getSelectOptions(agents, labelKeysFilter);\n\n const availableOptions = options.filter(\n (option) =>\n !(field.value || [])\n .map(({ key, value }) => `${key}=${value}`)\n .includes(option.value as string),\n );\n\n const children = availableOptions.length\n ? availableOptions.map((option) => (\n <DropdownItem\n key={option.id}\n id={option.id}\n onClick={() => {\n const values = (option.value as string).split('=', 2);\n setValue([...field.value, { key: values[0], value: values[1] }]);\n }}\n >\n {option.displayName}\n </DropdownItem>\n ))\n : [\n <DropdownItem key=\"no-option\" isDisabled>\n {t('ai:No label available')}\n </DropdownItem>,\n ];\n\n const categoryName = label || t('ai:Filter hosts by existing labels');\n\n return (\n <Split hasGutter className=\"pf-c-label-group pf-m-category ai-split-filter-hosts\">\n <SplitItem>\n {field.value.length ? (\n <LabelGroup categoryName={categoryName} className=\"ai-group-label-selector\">\n {field.value.map(({ key, value }) => (\n <Label\n key={key}\n onClose={() => setValue(field.value.filter((value) => value.key !== key))}\n isTruncated\n >\n {`${key}=${value}`}\n </Label>\n ))}\n </LabelGroup>\n ) : (\n <span className=\"pf-c-label-group__label\">{categoryName}</span>\n )}\n </SplitItem>\n <SplitItem>\n <Dropdown\n onSelect={() => setAddLabelOpen(false)}\n toggle={\n <DropdownToggle\n toggleIndicator={null}\n onToggle={setAddLabelOpen}\n style={{ padding: 0 }}\n >\n <Label color=\"blue\" variant=\"outline\" className=\"pf-m-overflow\">\n {t('ai:Add label')}\n </Label>\n </DropdownToggle>\n }\n isOpen={addLabelOpen}\n isPlain\n dropdownItems={children}\n menuAppendTo={() => document.body}\n />\n </SplitItem>\n </Split>\n );\n};\n", "import React from 'react';\nimport { useField } from 'formik';\nimport HostsTable, { DefaultExpandComponent } from '../../../common/components/hosts/HostsTable';\nimport {\n cpuCoresColumn,\n disksColumn,\n memoryColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport {\n ClusterDeploymentHostsSelectionValues,\n AgentTableActions,\n} from '../ClusterDeployment/types';\nimport {\n infraEnvColumn,\n agentStatusColumn,\n useAgentsTable,\n agentHostnameColumn,\n} from './tableUtils';\nimport DefaultEmptyState from '../../../common/components/ui/uiState/EmptyState';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useFormikHelpers } from '../../../common/hooks/useFormikHelpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { HostDetail } from '../../../common/components/hosts/HostRowDetail';\nimport { ExpandComponentProps } from '../../../common/components/hosts/AITable';\nimport { Host } from '../../../common/api/types';\nimport {\n HostsTableDetailContextProvider,\n useHostsTableDetailContext,\n} from '../../../common/components/hosts/HostsTableDetailContext';\n\nexport function ExpandComponent({ obj: host }: ExpandComponentProps<Host>) {\n const { onDiskRole, canEditDisks } = useHostsTableDetailContext();\n return (\n <HostDetail key={host.id} host={host} onDiskRole={onDiskRole} canEditDisks={canEditDisks} />\n );\n}\n\ntype AgentsSelectionTableProps = {\n matchingAgents: AgentK8sResource[];\n width?: number;\n onEditRole?: AgentTableActions['onEditRole'];\n onSetInstallationDiskId?: AgentTableActions['onSetInstallationDiskId'];\n onEditHost?: AgentTableActions['onEditHost'];\n onHostSelect?: VoidFunction;\n};\n\nconst AgentsSelectionTable: React.FC<AgentsSelectionTableProps> = ({\n matchingAgents,\n onEditRole,\n width,\n onEditHost,\n onHostSelect,\n onSetInstallationDiskId,\n}) => {\n const { t } = useTranslation();\n const [{ value: selectedIDs }] =\n useField<ClusterDeploymentHostsSelectionValues['selectedHostIds']>('selectedHostIds');\n\n const idsRef = React.useRef(selectedIDs);\n idsRef.current = selectedIDs;\n\n const { setValue, setTouched } =\n useFormikHelpers<ClusterDeploymentHostsSelectionValues['selectedHostIds']>('selectedHostIds');\n\n const setFieldValue = React.useCallback(\n (ids: string[]) => {\n setValue(ids, true);\n setTouched(true, false);\n },\n [setValue, setTouched],\n );\n\n React.useEffect(() => {\n const allIds = matchingAgents.map((a) => a.metadata?.uid);\n const presentIds = selectedIDs.filter((id) => allIds.includes(id));\n if (presentIds.length !== selectedIDs.length) {\n void setFieldValue(presentIds);\n }\n }, [matchingAgents, setFieldValue, selectedIDs]);\n\n const onSelect = React.useCallback(\n (agent: AgentK8sResource, selected: boolean) => {\n const newIDs = selected\n ? [...idsRef.current, agent.metadata?.uid || '']\n : idsRef.current.filter((uid: string) => uid !== agent.metadata?.uid);\n void setFieldValue(newIDs);\n onHostSelect?.();\n },\n [setFieldValue, onHostSelect],\n );\n\n const [hosts, actions, actionResolver] = useAgentsTable(\n { agents: matchingAgents },\n { onSelect, onEditRole, onEditHost, onSetInstallationDiskId },\n );\n\n const addAll = width && width > 700;\n\n const content = React.useMemo(() => {\n return [\n agentHostnameColumn(hosts, matchingAgents, [], actions.onEditHost, actions.canEditHostname),\n ...(addAll ? [infraEnvColumn(matchingAgents, t)] : []),\n agentStatusColumn({\n agents: matchingAgents,\n wizardStepId: 'hosts-selection',\n t,\n }),\n roleColumn(t, actions.canEditRole, actions.onEditRole, undefined, undefined),\n ...(addAll ? [cpuCoresColumn, memoryColumn, disksColumn] : []),\n ];\n }, [\n matchingAgents,\n actions.canEditRole,\n actions.onEditRole,\n addAll,\n hosts,\n actions.onEditHost,\n actions.canEditHostname,\n t,\n ]);\n\n const paginationProps = usePagination(hosts.length);\n return (\n <HostsTableDetailContextProvider\n canEditDisks={actions.canEditDisks}\n onDiskRole={actions.onDiskRole}\n >\n <HostsTable\n hosts={hosts}\n content={content}\n selectedIDs={selectedIDs}\n actionResolver={actionResolver}\n ExpandComponent={actions.onDiskRole ? ExpandComponent : DefaultExpandComponent}\n {...actions}\n {...paginationProps}\n >\n <DefaultEmptyState\n title={t('ai:No hosts found')}\n content={t('ai:No host matches provided labels/locations')}\n />\n </HostsTable>\n </HostsTableDetailContextProvider>\n );\n};\n\nexport default AgentsSelectionTable;\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 { useField } from 'formik';\nimport * as React from 'react';\n\n// workaround for https://github.com/jaredpalmer/formik/issues/2268\n// formik helpers are new a instance on every formik store update :(\nexport const useFormikHelpers = <R>(fieldID: string) => {\n const [{ value }, , { setValue, setTouched }] = useField<R>(fieldID);\n\n const idsRef = React.useRef(value);\n idsRef.current = value;\n\n const setValueRef = React.useRef(setValue);\n setValueRef.current = setValue;\n const setTouchedRef = React.useRef(setTouched);\n setTouchedRef.current = setTouched;\n\n const setFieldValue = React.useCallback((value: R, shouldValidate?: boolean) => {\n setValueRef.current(value, shouldValidate);\n }, []);\n\n const setFieldTouched = React.useCallback(\n (touched: boolean, shouldValidate?: boolean) => setTouchedRef.current(touched, shouldValidate),\n [],\n );\n\n const valueRef = React.useRef<R>(value);\n valueRef.current = value;\n\n return { setValue: setFieldValue, setTouched: setFieldTouched, valueRef };\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 { Grid, GridItem } from '@patternfly/react-core';\nimport { NumberInputField } from '../../../common';\nimport LocationsSelector from './LocationsSelector';\nimport { AgentK8sResource } from '../../types';\nimport AgentsSelectionHostCountAlerts from '../Agent/AgentsSelectionHostCountAlerts';\nimport AgentsSelectionHostCountLabelIcon from '../Agent/AgentsSelectionHostCountLabelIcon';\nimport { useAgentsAutoSelection } from '../Agent/AgentsSelectionUtils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterScaleUpAutoHostsSelectionProps = {\n availableAgents: AgentK8sResource[];\n};\n\nconst ClusterScaleUpAutoHostsSelection: React.FC<ClusterScaleUpAutoHostsSelectionProps> = ({\n availableAgents,\n}) => {\n const { matchingAgents, selectedAgents, hostCount } = useAgentsAutoSelection(availableAgents);\n const { t } = useTranslation();\n\n return (\n <>\n <Grid hasGutter>\n <GridItem span={12} lg={10} xl={9} xl2={7}>\n <NumberInputField\n label={t('ai:Number of hosts')}\n labelIcon={<AgentsSelectionHostCountLabelIcon />}\n idPostfix=\"hostcount\"\n name=\"hostCount\"\n minValue={1}\n maxValue={matchingAgents.length}\n isRequired\n />\n </GridItem>\n <GridItem span={12} lg={10} xl={9} xl2={7}>\n <LocationsSelector agents={availableAgents} />\n </GridItem>\n </Grid>\n\n <AgentsSelectionHostCountAlerts\n matchingAgentsCount={matchingAgents.length}\n selectedAgents={selectedAgents}\n targetHostCount={hostCount}\n />\n </>\n );\n};\n\nexport default ClusterScaleUpAutoHostsSelection;\n", "import React from 'react';\nimport { Alert, AlertGroup, AlertVariant } from '@patternfly/react-core';\nimport ShortCapacitySummary from '../ClusterDeployment/ShortCapacitySummary';\nimport { AgentK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nconst getHostCountWarningText = (hostsSelected: number, t: TFunction) => {\n switch (hostsSelected) {\n case 0:\n return t('ai:No host is selected.');\n }\n return t('ai:Only {{hostsSelected}} host is selected.', {\n count: hostsSelected,\n hostsSelected,\n });\n};\n\ntype AgentsSelectionHostCountAlertsProps = {\n matchingAgentsCount: number;\n selectedAgents: AgentK8sResource[];\n targetHostCount: number;\n};\n\nconst AgentsSelectionHostCountAlerts = ({\n matchingAgentsCount,\n selectedAgents,\n targetHostCount,\n}: AgentsSelectionHostCountAlertsProps) => {\n const selectedAgentsCount = selectedAgents.length;\n const { t } = useTranslation();\n\n return (\n <AlertGroup>\n {selectedAgentsCount === targetHostCount && (\n <Alert\n variant={AlertVariant.success}\n title={t(\n 'ai:{{selectedAgentsCount}} host selected out of {{matchingAgentsCount}} matching.',\n { count: selectedAgentsCount, selectedAgentsCount, matchingAgentsCount },\n )}\n isInline\n >\n <ShortCapacitySummary selectedAgents={selectedAgents} />\n </Alert>\n )}\n {selectedAgentsCount < targetHostCount && (\n <Alert\n variant={AlertVariant.warning}\n title={getHostCountWarningText(selectedAgentsCount, t)}\n isInline\n >\n <ShortCapacitySummary selectedAgents={selectedAgents} />\n </Alert>\n )}\n </AlertGroup>\n );\n};\n\nexport default AgentsSelectionHostCountAlerts;\n", "import React from 'react';\nimport { fileSize } from '../../../common';\nimport { AgentK8sResource } from '../../types';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport const getTotalCompute = (selectedAgents: AgentK8sResource[], t: TFunction) => {\n const totals = selectedAgents.reduce(\n (acc, agent) => {\n acc.cpus += agent.status?.inventory.cpu?.count || 0;\n acc.memory += agent.status?.inventory.memory?.usableBytes || 0;\n return acc;\n },\n {\n cpus: 0,\n memory: 0,\n },\n );\n\n return t('ai:{{cpus}} CPUs | {{memory}} Memory', {\n cpus: totals.cpus,\n memory: fileSize(totals.memory, 2, 'iec'),\n });\n};\n\ntype ShortCapacitySummaryProps = {\n selectedAgents: AgentK8sResource[];\n};\n\nconst ShortCapacitySummary: React.FC<ShortCapacitySummaryProps> = ({ selectedAgents }) => {\n const { t } = useTranslation();\n return (\n <div>\n {t('ai:Total compute')}: {getTotalCompute(selectedAgents, t)}\n </div>\n );\n};\n\nexport default ShortCapacitySummary;\n", "import React from 'react';\nimport PopoverIcon from '../../../common/components/ui/PopoverIcon';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst AgentsSelectionHostCountLabelIcon = () => {\n const { t } = useTranslation();\n return (\n <PopoverIcon\n position=\"right\"\n bodyContent={t('ai:Total count of hosts to be included in the cluster.')}\n />\n );\n};\n\nexport default AgentsSelectionHostCountLabelIcon;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport isEqual from 'lodash/isEqual';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport {\n ClusterDeploymentHostsSelectionValues,\n ScaleUpFormValues,\n} from '../ClusterDeployment/types';\nimport { AGENT_LOCATION_LABEL_KEY, AGENT_NOLOCATION_VALUE } from '../common/constants';\n\ntype AllowedFormValues = ClusterDeploymentHostsSelectionValues | ScaleUpFormValues;\n\nexport const useAgentsAutoSelection = <FormValues extends AllowedFormValues>(\n availableAgents: AgentK8sResource[],\n) => {\n const { setFieldValue, values } = useFormikContext<FormValues>();\n const { hostCount, locations, autoSelectedHostIds } = values;\n\n const [matchingAgents, selectedAgents] = React.useMemo(() => {\n const mAgents = availableAgents.filter((agent) => {\n const agentLocation =\n agent.metadata?.labels?.[AGENT_LOCATION_LABEL_KEY] || AGENT_NOLOCATION_VALUE;\n return locations.length ? locations.includes(agentLocation) : true;\n });\n const sAgents = mAgents.filter((a) => autoSelectedHostIds.includes(a.metadata?.uid || ''));\n return [mAgents, sAgents];\n }, [availableAgents, locations, autoSelectedHostIds]);\n\n React.useEffect(() => {\n const ids = matchingAgents.map((a) => a.metadata?.uid).splice(0, hostCount);\n if (!isEqual(ids, autoSelectedHostIds)) {\n setTimeout(() => setFieldValue('autoSelectedHostIds', ids, true));\n }\n }, [matchingAgents, setFieldValue, autoSelectedHostIds, hostCount]);\n\n return { matchingAgents, selectedAgents, hostCount };\n};\n", "import * as React from 'react';\nimport {\n Alert,\n Button,\n ButtonVariant,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { sortable } from '@patternfly/react-table';\nimport { getAIHosts } from '../helpers';\nimport { AgentK8sResource } from '../../types';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport { TableRow } from '../../../common/components/hosts/AITable';\nimport { Host, ModalProgress } from '../../../common';\nimport { agentStatus } from '../helpers/agentStatus';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\ntype ApproveTableRowProps = {\n agent?: AgentK8sResource;\n};\n\nconst ApproveTableRow: React.FC<ApproveTableRowProps> = ({ agent, children }) => (\n <div className={agent?.spec.approved ? 'pf-u-color-200' : undefined}>{children}</div>\n);\n\nconst hostnameColumn = (agents: AgentK8sResource[], t: TFunction): 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 },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const hostname = agent?.spec.hostname || agent?.status?.inventory.hostname;\n return {\n title: <ApproveTableRow agent={agent}>{hostname}</ApproveTableRow>,\n props: { 'data-testid': 'hostname' },\n sortableValue: hostname,\n };\n },\n };\n};\n\nconst statusColumn = (agents: AgentK8sResource[], t: TFunction): TableRow<Host> => {\n return {\n header: {\n title: t('ai:Status'),\n props: {\n id: 'col-header-status', // ACM jest tests require id over testId\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const status = agent?.spec.approved ? t('ai:Already approved') : agentStatus.discovered.title;\n const icon = agentStatus.discovered.icon;\n return {\n title: (\n <ApproveTableRow agent={agent}>\n {agent?.spec.approved ? (\n status\n ) : (\n <>\n {icon} {status}\n </>\n )}\n </ApproveTableRow>\n ),\n props: { 'data-testid': 'status' },\n sortableValue: status,\n };\n },\n };\n};\n\ntype MassApproveAgentModalProps = {\n agents: AgentK8sResource[];\n onApprove: (agent: AgentK8sResource) => Promise<AgentK8sResource>;\n isOpen: boolean;\n onClose: VoidFunction;\n};\n\nconst MassApproveAgentModal: React.FC<MassApproveAgentModalProps> = ({\n agents,\n onApprove,\n isOpen,\n onClose,\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 let i = 0;\n try {\n for (const agent of agents) {\n if (!agent.spec.approved) {\n setProgress((100 * (i + 1)) / agents.length);\n await onApprove(agent);\n }\n i++;\n }\n setProgress(null);\n onClose();\n } catch (err) {\n setError({\n title: t('ai:An error occured while approving agents'),\n message: getErrorMessage(err),\n });\n setProgress(null);\n }\n };\n const { content, hosts } = React.useMemo(\n () => ({\n content: [hostnameColumn(agents, t), statusColumn(agents, t)],\n hosts: getAIHosts(agents),\n }),\n [agents, t],\n );\n\n const paginationProps = usePagination(hosts.length);\n return (\n <Modal\n aria-label={t('ai:Approve hosts dialog')}\n title={t('ai:Approve hosts to join infrastructure environment')}\n isOpen={isOpen}\n onClose={onClose}\n hasNoBodyWrapper\n id=\"mass-approve-modal\"\n variant=\"medium\"\n >\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <Alert\n isInline\n variant=\"info\"\n title={t(\n 'ai:You are approving multiple hosts. All hosts listed below will be approved to join the infrastructure environment if you continue. Make sure that you expect and recognize the hosts before approving.',\n )}\n />\n </StackItem>\n <StackItem>\n <HostsTable hosts={hosts} content={content} {...paginationProps}>\n <div>{t('ai:No hosts selected')}</div>\n </HostsTable>\n </StackItem>\n <StackItem>\n <ModalProgress error={error} progress={progress} />\n </StackItem>\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button onClick={onClick} isDisabled={progress !== null}>\n {t('ai:Approve all 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 MassApproveAgentModal;\n", "import * as React from 'react';\nimport { Button, Flex, FlexItem, Popover } from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons';\nimport { Link } from 'react-router-dom';\nimport { sortable } from '@patternfly/react-table';\nimport { global_palette_blue_300 as blueInfoColor } from '@patternfly/react-tokens/dist/js/global_palette_blue_300';\nimport {\n Host,\n getHostname,\n getInventory,\n MassDeleteHostModal as CommonMassDeleteHostModal,\n} from '../../../common';\nimport { TableRow } from '../../../common/components/hosts/AITable';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport {\n AgentK8sResource,\n BareMetalHostK8sResource,\n InfraEnvK8sResource,\n NMStateK8sResource,\n} from '../../types';\nimport { useAgentsTable } from '../Agent/tableUtils';\nimport { AGENT_BMH_NAME_LABEL_KEY } from '../common/constants';\nimport AgentStatus from '../Agent/AgentStatus';\nimport BMHStatus from '../Agent/BMHStatus';\nimport { getBMHStatus, getAgentStatus } from '../helpers';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nconst hostnameColumn = (agents: AgentK8sResource[], t: TFunction): 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 },\n cell: (host) => {\n const inventory = getInventory(host);\n const computedHostname = getHostname(host, inventory);\n const assignedToCluster = agents.find((a) => a.metadata?.uid === host.id)?.spec\n ?.clusterDeploymentName?.name;\n return {\n title: (\n <div className={assignedToCluster ? 'pf-u-color-200' : undefined}>{computedHostname}</div>\n ),\n props: { 'data-testid': 'hostname' },\n sortableValue: computedHostname,\n };\n },\n };\n};\n\nconst statusColumn = (\n agents: AgentK8sResource[],\n bmhs: BareMetalHostK8sResource[],\n t: TFunction,\n): TableRow<Host> => ({\n header: {\n title: t('ai:Status'),\n props: {\n id: 'col-header-status',\n },\n transforms: [sortable],\n },\n cell: (host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const clusterName = agent?.spec.clusterDeploymentName?.name;\n const bmh = bmhs?.find((b) => b.metadata?.uid === host.id);\n\n let bmhStatus;\n let title: React.ReactNode = '--';\n if (agent) {\n title = clusterName ? (\n <Flex>\n <FlexItem>\n <AgentStatus agent={agent} zIndex={7000} />\n </FlexItem>\n <FlexItem align={{ default: 'alignRight' }}>\n <Popover\n aria-label={t('ai:Cluster popover')}\n headerContent={<div>{t('ai:Cannot be deleted')}</div>}\n bodyContent={\n <div>\n {t(\n 'ai:Hosts that are bound to a cluster cannot be deleted. Remove the host from the cluster and try again.',\n )}\n </div>\n }\n footerContent={\n <Link to={`/multicloud/infrastructure/clusters/details/${clusterName}/`}>\n {t('ai:Go to cluster {{clusterName}}', { clusterName })}\n </Link>\n }\n >\n <Button variant=\"link\" icon={<InfoCircleIcon color={blueInfoColor.value} />}>\n {t('ai:Cannot be deleted')}\n </Button>\n </Popover>\n </FlexItem>\n </Flex>\n ) : (\n <AgentStatus agent={agent} />\n );\n } else if (bmh) {\n bmhStatus = getBMHStatus(bmh);\n title = <BMHStatus bmhStatus={bmhStatus} />;\n }\n\n return {\n title,\n props: { 'data-testid': 'host-status' },\n sortableValue: agent ? getAgentStatus(agent).status.title : bmhStatus?.state.title || '',\n };\n },\n});\n\nconst tableContent = (\n agents: AgentK8sResource[],\n bareMetalHosts: BareMetalHostK8sResource[],\n t: TFunction,\n) => [hostnameColumn(agents, t), statusColumn(agents, bareMetalHosts, t)];\n\ntype MassDeleteAgentModalProps = {\n isOpen: boolean;\n onClose: VoidFunction;\n agents: AgentK8sResource[];\n bmhs: BareMetalHostK8sResource[];\n nmStates: NMStateK8sResource[];\n // eslint-disable-next-line\n onDelete: (\n agent?: AgentK8sResource,\n bmh?: BareMetalHostK8sResource,\n nmStates?: NMStateK8sResource[],\n ) => Promise<unknown>;\n infraEnv: InfraEnvK8sResource;\n};\n\nconst MassDeleteAgentModal: React.FC<MassDeleteAgentModalProps> = ({\n isOpen,\n onClose,\n onDelete,\n agents,\n bmhs,\n infraEnv,\n nmStates,\n}) => {\n const [hosts] = useAgentsTable({ agents, bmhs, infraEnv });\n const onClick = async (host: Host) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n const bmhLabel = agent?.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY];\n let bmh;\n if (!agent) {\n bmh = bmhs.find((bmh) => bmh.metadata?.uid === host.id);\n } else if (bmhLabel) {\n bmh = bmhs.find(\n (bmh) =>\n bmh?.metadata?.name === bmhLabel && agent.metadata?.namespace === bmh.metadata?.namespace,\n );\n }\n if (!agent?.spec?.clusterDeploymentName?.name) {\n return onDelete(agent, bmh, nmStates);\n }\n };\n const { t } = useTranslation();\n const content = React.useMemo(() => tableContent(agents, bmhs, t), [agents, bmhs, t]);\n const paginationProps = usePagination(hosts.length);\n\n return (\n <CommonMassDeleteHostModal hosts={hosts} isOpen={isOpen} onClose={onClose} onDelete={onClick}>\n <HostsTable hosts={hosts} content={content} {...paginationProps}>\n <div>{t('ai:No hosts selected')}</div>\n </HostsTable>\n </CommonMassDeleteHostModal>\n );\n};\nexport default MassDeleteAgentModal;\n", "import * as React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport BMCForm from '../Agent/BMCForm';\nimport { AddBmcHostModalProps } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { EnvironmentErrors } from '../InfraEnv/EnvironmentErrors';\n\nconst AddBmcHostModal: React.FC<AddBmcHostModalProps> = ({\n isOpen,\n onClose,\n infraEnv,\n onCreateBMH,\n usedHostnames,\n docVersion,\n}) => {\n const hasDHCP = infraEnv.metadata?.labels?.networkType !== 'static';\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Add BMC host dialog')}\n title={t('ai:Add host using Baseboard Management Controller (BMC)')}\n isOpen={isOpen}\n onClose={onClose}\n variant={ModalVariant.medium}\n hasNoBodyWrapper\n id=\"add-host-modal\"\n >\n <EnvironmentErrors infraEnv={infraEnv} docVersion={docVersion} inModal>\n <BMCForm\n onCreateBMH={onCreateBMH}\n onClose={onClose}\n hasDHCP={hasDHCP}\n infraEnv={infraEnv}\n usedHostnames={usedHostnames}\n />\n </EnvironmentErrors>\n </Modal>\n );\n};\n\nexport default AddBmcHostModal;\n", "import * as React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport { UploadActionModalProps } from './types';\nimport AddBmcHostYamlForm from './AddBmcHostYamlForm';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { EnvironmentErrors } from '../InfraEnv/EnvironmentErrors';\n\nconst AddBmcHostYamlModal: React.FC<UploadActionModalProps> = ({\n isOpen,\n onClose,\n onCreateBmcByYaml,\n infraEnv,\n docVersion,\n}) => {\n const { t } = useTranslation();\n return (\n <Modal\n aria-label={t('ai:Add host dialog')}\n title={t('ai:Add hosts by uploading YAML (BMC)')}\n variant={ModalVariant.medium}\n isOpen={isOpen}\n onClose={onClose}\n hasNoBodyWrapper\n >\n <EnvironmentErrors infraEnv={infraEnv} docVersion={docVersion} inModal>\n <AddBmcHostYamlForm onClose={onClose} onCreateBmcByYaml={onCreateBmcByYaml} />\n </EnvironmentErrors>\n </Modal>\n );\n};\n\nexport default AddBmcHostYamlModal;\n", "import * as React from 'react';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertVariant,\n Button,\n ButtonVariant,\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n EmptyStateVariant,\n ModalBoxBody,\n ModalBoxFooter,\n Spinner,\n Stack,\n StackItem,\n Title,\n} from '@patternfly/react-core';\nimport { ErrorCircleOIcon, UploadIcon } from '@patternfly/react-icons';\nimport jsYaml from 'js-yaml';\nimport { saveAs } from 'file-saver';\n\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { getErrorMessage } from '../../../common/utils';\n\nimport { credentials, host1, host2 } from './constants';\nimport { UploadActionModalProps } from './types';\n\nimport './AddBmcHostYamlForm.css';\n\nconst AddBmcHostYamlForm: React.FC<\n Pick<UploadActionModalProps, 'onClose' | 'onCreateBmcByYaml'>\n> = ({ onClose, onCreateBmcByYaml }) => {\n const [fileName, setFileName] = React.useState<string>();\n const [fileError, setFileError] = React.useState<string>();\n const [showOpenFileButton, setShowOpenFileButton] = React.useState(true);\n const [showOpeningMessage, setShowOpeningMessage] = React.useState(false);\n const [yamlContent, setYamlContent] = React.useState<unknown>();\n const [error, setError] = React.useState<string | undefined>();\n\n const { t } = useTranslation();\n\n const downloadYaml = () => {\n const yaml = [credentials, host1, host2].map((doc) => jsYaml.dump(doc)).join('---\\n');\n const blob = new Blob([yaml], { type: 'text/plain;charset=utf-8' });\n saveAs(blob, 'bmc_hosts_template.yaml');\n };\n\n const importBMAsYAML = () => {\n const input = document.createElement('input');\n input.setAttribute('id', 'importBMAsYaml');\n input.type = 'file';\n input.accept = '.yaml';\n input.style.visibility = 'hidden';\n const body = document.querySelector('body');\n body?.appendChild(input);\n input.onchange = (e: Event) => {\n setShowOpeningMessage(true);\n input.remove();\n const target = e.target as HTMLInputElement;\n const file: File = (target.files as FileList)[0];\n const maxSize = 12582912; //12 MiB\n if (file.size > maxSize) {\n setShowOpenFileButton(false);\n setFileName(file.name);\n setFileError(t('ai:The file is too big. Upload a file up to 12 MiB.'));\n setYamlContent(undefined);\n } else {\n const reader = new FileReader();\n reader.readAsText(file, 'UTF-8');\n reader.onload = (readerEvent) => {\n const content = readerEvent.target?.result;\n // parse yaml\n if (content && typeof content === 'string') {\n try {\n //await new Promise((r) => setTimeout(r, 100));\n const yamlContent = jsYaml.loadAll(content);\n setFileName(file.name);\n setFileError(undefined);\n setYamlContent(yamlContent);\n } catch (err) {\n setFileName(file.name);\n setFileError(\n t(\n 'ai:File is not structured correctly. Use the template to use the right file structure.',\n ),\n );\n setYamlContent(undefined);\n }\n } else {\n setYamlContent(undefined);\n setFileName(file.name);\n setFileError(\n t(\n 'ai:File is not structured correctly. Use the template to use the right file structure.',\n ),\n );\n }\n\n setShowOpenFileButton(false);\n };\n }\n };\n input.click();\n };\n\n const deleteFileContent = () => {\n setFileError(undefined);\n setError(undefined);\n setFileName(undefined);\n setShowOpenFileButton(true);\n setShowOpeningMessage(false);\n };\n\n const handleSubmit = async () => {\n try {\n setShowOpeningMessage(false);\n setError(undefined);\n if (yamlContent !== undefined) {\n await onCreateBmcByYaml(yamlContent);\n }\n\n onClose();\n } catch (e) {\n setError(getErrorMessage(e));\n }\n };\n\n return (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <EmptyState variant={EmptyStateVariant.large}>\n <EmptyStateIcon icon={UploadIcon} />\n <Title headingLevel=\"h4\" size=\"lg\">\n {t('ai:Upload a YAML file')}\n </Title>\n <EmptyStateBody>\n <p>\n {t(\n 'ai:Upload a YAML file with BareMetalHost and Secret resource definitions. Use the provided template as a reference.',\n )}\n </p>\n <Stack hasGutter>\n <StackItem>\n <Button variant={ButtonVariant.link} onClick={downloadYaml}>\n {t('ai:Download template')}\n </Button>\n </StackItem>\n {showOpenFileButton && (\n <StackItem>\n <Button\n variant={ButtonVariant.secondary}\n onClick={() => {\n try {\n importBMAsYAML();\n } catch (e) {\n setError(getErrorMessage(e));\n }\n }}\n isDisabled={showOpeningMessage}\n >\n {showOpeningMessage ? (\n <>\n {t('ai:Opening file')} <Spinner size=\"sm\" />\n </>\n ) : (\n t('ai:Open file')\n )}\n </Button>\n </StackItem>\n )}\n {fileName && (\n <StackItem>\n {fileName}&nbsp;\n <ErrorCircleOIcon onClick={deleteFileContent} />\n </StackItem>\n )}\n </Stack>\n </EmptyStateBody>\n </EmptyState>\n </StackItem>\n {error && (\n <StackItem>\n <Alert\n title={t('ai:Failed to add host by YAML')}\n variant={AlertVariant.danger}\n isInline\n actionClose={<AlertActionCloseButton onClose={() => setError(undefined)} />}\n >\n {t(\n 'ai:The YAML file might not be formatted correctly. Use the template to format and try again.',\n )}\n <br />\n {t('ai:Received error:')}&nbsp;{error}\n </Alert>\n </StackItem>\n )}\n {fileError && (\n <StackItem>\n <Alert\n title={t('ai:The file cannot be uploaded')}\n variant={AlertVariant.danger}\n isInline\n actionClose={\n <AlertActionCloseButton /* onClose={() => setFileError(undefined)}*/ />\n }\n >\n {fileError}\n </Alert>\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n onClick={() => {\n void handleSubmit();\n }}\n isDisabled={!fileName || !!fileError}\n >\n {t('ai:Upload')}\n </Button>\n <Button onClick={onClose} variant={ButtonVariant.secondary}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n );\n};\n\nexport default AddBmcHostYamlForm;\n", "export const credentials = {\n apiVersion: 'v1',\n data: {\n username: '<<base64 of the username>>',\n password: '<<base64 of the password>>',\n },\n kind: 'Secret',\n metadata: {\n name: '<<name of credentials. Should be unique>>',\n namespace: '<<name of namespace - usually the same as the name of the infra env>>',\n },\n type: 'Opaque',\n};\n\nexport const host1 = {\n apiVersion: 'metal3.io/v1alpha1',\n kind: 'BareMetalHost',\n metadata: {\n annotations: {\n 'bmac.agent-install.openshift.io/hostname': '<<hostname of the host>>',\n 'inspect.metal3.io': 'disabled',\n },\n labels: {\n 'infraenvs.agent-install.openshift.io':\n '<<the name of the infra env in which this host will be>>',\n },\n name: '<<the name of the BareMetalHost CR>>',\n namespace: '<<name of namespace - usually the same as the name of the infra env>>',\n },\n spec: {\n automatedCleaningMode: 'disabled',\n bmc: {\n address: '<<Baseboard Management Controller Address>>',\n credentialsName: '<<the name of the secret containing the credentials (defined in line 7)>>',\n disableCertificateVerification: true,\n },\n bootMACAddress:\n \"<<The MAC address of the host's network connected NIC that wll be used to provision the host.>>\",\n online: false,\n },\n};\n\nexport const host2 = {\n apiVersion: 'metal3.io/v1alpha1',\n kind: 'BareMetalHost',\n metadata: {\n annotations: {\n 'bmac.agent-install.openshift.io/hostname': '<<hostname of the host>>',\n 'inspect.metal3.io': 'disabled',\n },\n labels: {\n 'infraenvs.agent-install.openshift.io':\n '<<the name of the infra env in which this host will be>>',\n },\n name: '<<the name of the BareMetalHost CR>>',\n namespace: '<<name of namespace - usually the same as the name of the infra env>>',\n },\n spec: {\n automatedCleaningMode: 'disabled',\n bmc: {\n address: '<<Baseboard Management Controller Address>>',\n credentialsName: '<<the name of the secret containing the credentials (defined in line 7)>>',\n disableCertificateVerification: true,\n },\n bootMACAddress:\n \"<<The MAC address of the host's network connected NIC that wll be used to provision the host.>>\",\n online: false,\n },\n};\n", "import * as React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Alert, AlertActionLink, AlertVariant } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\nexport const CimStorageMissingAlert: React.FC<{\n docStorageUrl: string;\n storageOperatorUrl: string;\n}> = ({ docStorageUrl, storageOperatorUrl }) => {\n const { t } = useTranslation();\n const history = useHistory();\n\n const contentWorkaround = (\n <>\n {t('ai:Learn more about storage class')}&nbsp;&nbsp;\n <ExternalLinkAltIcon />\n </>\n );\n\n const actionLinks: React.ReactNode[] = [\n <AlertActionLink\n key=\"install-storage-operator\"\n onClick={() => history.push(storageOperatorUrl)}\n >\n {t('ai:Install storage operator')}\n </AlertActionLink>,\n <AlertActionLink key=\"storage-class\" onClick={() => window.open(docStorageUrl, '_blank')}>\n {contentWorkaround as unknown as string}\n </AlertActionLink>,\n ];\n\n return (\n <Alert\n title={t('ai:Must have a storage class')}\n variant={AlertVariant.warning}\n isInline\n actionLinks={actionLinks}\n >\n {t(\n \"ai:You'll first need to have a storage operator in order to create the storage class. If you don't have one installed, we recommend OpenShift Data Foundation operator, but you may use any.\",\n )}\n </Alert>\n );\n};\n", "import * as React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport {\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n AlertActionCloseButton,\n} from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { AgentServiceConfigConditionType } from '../../../types';\nimport { CimConfigProgressAlertProps } from './types';\nimport { getConditionByType } from '../../../utils';\nimport { isCIMConfigProgressing, isCIMConfigured } from './utils';\n\nconst LOCAL_STORAGE_ID_SUCCESS = 'cim-config-progress-alert';\n\nexport const resetCimConfigProgressAlertSuccessStatus = () => {\n window.localStorage.setItem(LOCAL_STORAGE_ID_SUCCESS, '');\n};\n\nexport const CimConfigProgressAlert: React.FC<CimConfigProgressAlertProps> = ({\n agentServiceConfig,\n assistedServiceDeploymentUrl,\n}) => {\n const { t } = useTranslation();\n const history = useHistory();\n const [hideSuccess, setHideSuccess] = React.useState(true);\n\n React.useEffect(\n () => {\n setHideSuccess(window.localStorage.getItem(LOCAL_STORAGE_ID_SUCCESS) === 'closed');\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n undefined /* With every re-render */,\n );\n\n if (!agentServiceConfig) {\n // missing\n return null;\n }\n\n // success\n if (isCIMConfigured({ agentServiceConfig })) {\n if (hideSuccess) {\n return null;\n }\n\n const onCloseSuccess = () => {\n window.localStorage.setItem(LOCAL_STORAGE_ID_SUCCESS, 'closed');\n setHideSuccess(true);\n };\n\n return (\n <Alert\n variant={AlertVariant.success}\n isInline\n title={t('ai:Host inventory configured successfully.')}\n actionClose={<AlertActionCloseButton onClose={onCloseSuccess} />}\n />\n );\n }\n\n const assistedServiceDeploymentLink = (\n <Button\n variant={ButtonVariant.link}\n isInline\n key=\"assisted-service-deployment\"\n onClick={() => history.push(assistedServiceDeploymentUrl)}\n >\n {t('ai:Troubleshoot in the assisted service deployment')} <ExternalLinkAltIcon />\n </Button>\n );\n\n // progressing\n if (isCIMConfigProgressing({ agentServiceConfig })) {\n const actionLinks: React.ReactNode[] = [assistedServiceDeploymentLink];\n return (\n <Alert\n variant={AlertVariant.info}\n isInline\n title={t('ai:Configuration may take a few minutes.')}\n actionLinks={actionLinks}\n >\n {t(\"ai:If the configuration is taking longer than 3 minutes, you'll need to troubleshoot.\")}\n </Alert>\n );\n }\n\n const deploymentsHealthyCondition = getConditionByType<AgentServiceConfigConditionType>(\n agentServiceConfig.status?.conditions || [],\n 'DeploymentsHealthy',\n );\n const reconcileCompletedCondition = getConditionByType<AgentServiceConfigConditionType>(\n agentServiceConfig.status?.conditions || [],\n 'ReconcileCompleted',\n );\n\n const actionLinks: React.ReactNode[] = [assistedServiceDeploymentLink];\n\n return (\n <Alert\n title={t('ai:Configuration is hanging for a long time.')}\n variant={AlertVariant.danger}\n isInline\n actionLinks={actionLinks}\n >\n {t('ai:Last observed condition:')}{' '}\n {deploymentsHealthyCondition?.message || reconcileCompletedCondition?.message}\n <br />\n {t(\n 'ai:You can either wait or investigate. A common issue can be misconfigured storage. Once you fix the issue, you can delete AgentServiceConfig to try again.',\n )}\n </Alert>\n );\n};\n", "import { StatusCondition } from './types';\n\nexport function getConditionByType<ConditionType>(\n conditions: StatusCondition<ConditionType>[],\n type: ConditionType,\n): StatusCondition<ConditionType> | undefined {\n return conditions.find((c) => c.type === type);\n}\n", "export const MIN_DB_VOL_SIZE = 1; // In Gi\nexport const MIN_FS_VOL_SIZE = 1;\nexport const MIN_IMG_VOL_SIZE = 10;\n\nexport const CIM_CONFIG_TIMEOUT = 3 * 60 * 1000; // in ms\n", "import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk';\n\nimport { AgentServiceConfigConditionType, AgentServiceConfigK8sResource } from '../../../types';\nimport { getConditionByType } from '../../../utils';\nimport { CIM_CONFIG_TIMEOUT } from './constants';\n\nexport const LOCAL_STORAGE_ID_LAST_UPDATE_TIMESTAMP = 'cim-config-configuring-started-at';\n\nexport const isCIMEnabled = ({\n agentServiceConfig,\n}: {\n agentServiceConfig?: AgentServiceConfigK8sResource;\n}): boolean => !!agentServiceConfig;\n\nexport const isCIMConfigured = ({\n agentServiceConfig,\n}: {\n agentServiceConfig?: AgentServiceConfigK8sResource;\n}): boolean => {\n const deploymentsHealthyCondition = getConditionByType<AgentServiceConfigConditionType>(\n agentServiceConfig?.status?.conditions || [],\n 'DeploymentsHealthy',\n );\n\n return deploymentsHealthyCondition?.status === 'True';\n};\n\nexport const isCIMConfigProgressing = ({\n agentServiceConfig,\n}: {\n agentServiceConfig?: AgentServiceConfigK8sResource;\n}): boolean => {\n if (!agentServiceConfig) {\n return false;\n }\n\n const deploymentsHealthyCondition = getConditionByType<AgentServiceConfigConditionType>(\n agentServiceConfig?.status?.conditions || [],\n 'DeploymentsHealthy',\n );\n\n const now = Date.now();\n\n // Potential post-creation change of the ingress controller (from No to Yes) forces the AI deployment reconciliation and so reporting \"errors\" during the course.\n // For that reason we can not reuse AgentServiceController's creationTimestamp to report issues with a graceful delay.\n // We can store timestamp into a label or simply to the localStorage - let's see if that is an issue in a multi-tenant environment.\n const updateTime = new Date(\n // agentServiceConfig.metadata?.creationTimestamp || 0,\n window.localStorage.getItem(LOCAL_STORAGE_ID_LAST_UPDATE_TIMESTAMP) || 0,\n );\n const withinProgressingTimePerion: boolean = now - updateTime.valueOf() < CIM_CONFIG_TIMEOUT;\n\n return (\n !deploymentsHealthyCondition ||\n deploymentsHealthyCondition.status === 'Unknown' ||\n (deploymentsHealthyCondition.status === 'False' && withinProgressingTimePerion)\n );\n};\n\nexport const isStorageConfigured = ({\n storageClasses,\n}: {\n storageClasses?: K8sResourceCommon[];\n}): boolean => !!storageClasses && storageClasses.length > 0;\n", "import * as React from 'react';\nimport {\n Alert,\n AlertVariant,\n Button,\n ButtonVariant,\n Modal,\n ModalVariant,\n} from '@patternfly/react-core';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { getStorageSizeGiB } from '../../helpers';\nimport { AlertPayload } from '../../../../common';\n\nimport { CimConfigurationModalProps, CimConfiguratioProps } from './types';\nimport { CimConfigurationForm } from './CimConfigurationForm';\nimport { isIngressController, onEnableCIM } from './persist';\nimport { CimConfigDisconnectedAlert } from './CimConfigDisconnectedAlert';\nimport { MIN_DB_VOL_SIZE, MIN_FS_VOL_SIZE, MIN_IMG_VOL_SIZE } from './constants';\nimport { isCIMConfigProgressing } from './utils';\nimport { resetCimConfigProgressAlertSuccessStatus } from './CimConfigProgressAlert';\n\nimport './CimConfigurationModal.css';\n\nexport const CimConfigurationModal: React.FC<CimConfigurationModalProps> = ({\n isOpen,\n onClose,\n agentServiceConfig,\n platform,\n docDisconnectedUrl,\n docConfigUrl,\n docConfigAwsUrl,\n\n getResource,\n listResources,\n patchResource,\n createResource,\n}) => {\n const { t } = useTranslation();\n const [error, setError] = React.useState<AlertPayload>();\n const [isSaving, setSaving] = React.useState(false);\n\n const [dbVolSize, _setDbVolSize] = React.useState<number>(() =>\n getStorageSizeGiB(10, agentServiceConfig?.spec?.databaseStorage?.resources?.requests?.storage),\n );\n const [dbVolSizeValidation, setDbVolSizeValidation] = React.useState<string>();\n\n const [fsVolSize, _setFsVolSize] = React.useState<number>(() =>\n getStorageSizeGiB(\n 100,\n agentServiceConfig?.spec?.filesystemStorage?.resources?.requests?.storage,\n ),\n );\n const [fsVolSizeValidation, setFsVolSizeValidation] = React.useState<string>();\n\n const [imgVolSize, _setImgVolSize] = React.useState<number>(() =>\n getStorageSizeGiB(50, agentServiceConfig?.spec?.imageStorage?.resources?.requests?.storage),\n );\n const [imgVolSizeValidation, setImgVolSizeValidation] = React.useState<string>();\n\n const [configureLoadBalancer, setConfigureLoadBalancer] = React.useState<boolean>(\n platform === 'AWS',\n );\n const [configureLoadBalancerInitial, setConfigureLoadBalancerInitial] = React.useState(true);\n\n const setDbVolSize = (v: number): void => {\n if (v < MIN_DB_VOL_SIZE) {\n setDbVolSizeValidation(t('ai:Minimal value is 1Gi'));\n } else {\n setDbVolSizeValidation(undefined);\n }\n _setDbVolSize(v);\n };\n const setFsVolSize = (v: number): void => {\n if (v < MIN_FS_VOL_SIZE) {\n setFsVolSizeValidation(t('ai:Minimal value is 1Gi'));\n } else {\n setFsVolSizeValidation(undefined);\n }\n _setFsVolSize(v);\n };\n const setImgVolSize = (v: number): void => {\n if (v < MIN_IMG_VOL_SIZE) {\n setImgVolSizeValidation(t('ai:Minimal value is 10Gi'));\n } else {\n setImgVolSizeValidation(undefined);\n }\n _setImgVolSize(v);\n };\n\n const isEdit = !!agentServiceConfig;\n\n React.useEffect(\n () => {\n const doItAsync = async (): Promise<void> => {\n if (platform === 'AWS') {\n if (!isEdit || (await isIngressController(getResource))) {\n setConfigureLoadBalancer(true);\n setConfigureLoadBalancerInitial(true);\n return;\n }\n }\n\n setConfigureLoadBalancer(false);\n setConfigureLoadBalancerInitial(false);\n };\n\n void doItAsync();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [platform],\n );\n\n const formProps: CimConfiguratioProps = {\n dbVolSize,\n dbVolSizeValidation,\n setDbVolSize,\n fsVolSize,\n fsVolSizeValidation,\n setFsVolSize,\n imgVolSize,\n imgVolSizeValidation,\n setImgVolSize,\n\n configureLoadBalancer,\n configureLoadBalancerInitial,\n setConfigureLoadBalancer,\n };\n\n const onConfigure = () => {\n const doItAsync = async (): Promise<void> => {\n setSaving(true);\n setError(undefined);\n resetCimConfigProgressAlertSuccessStatus();\n\n if (\n await onEnableCIM({\n t,\n setError,\n getResource,\n listResources,\n patchResource,\n createResource,\n agentServiceConfig,\n\n platform,\n dbVolSizeGiB: dbVolSize,\n fsVolSizeGiB: fsVolSize,\n imgVolSizeGiB: imgVolSize,\n configureLoadBalancer,\n })\n ) {\n // successfuly persisted\n onClose();\n }\n\n // keep modal open and show error\n setConfigureLoadBalancerInitial(configureLoadBalancer);\n setSaving(false);\n };\n\n void doItAsync();\n };\n\n const isError = !!error?.title; // this is a communication error only (not the one from agentServiceConfig)\n\n const isConfigure =\n !isEdit || !configureLoadBalancerInitial; /* The only possible change for the Edit flow */\n\n const isConfigureDisabled = !!(\n isSaving ||\n dbVolSizeValidation ||\n fsVolSizeValidation ||\n imgVolSizeValidation ||\n (isEdit && configureLoadBalancerInitial === configureLoadBalancer)\n );\n\n const isInProgressPeriod = isCIMConfigProgressing({ agentServiceConfig });\n // const isConfiguring = isSaving || isInProgressPeriod;\n\n let actions: React.ReactNode[];\n if (isConfigure) {\n actions = [\n <Button\n key=\"configure\"\n variant={ButtonVariant.primary}\n isDisabled={isConfigureDisabled}\n onClick={onConfigure}\n >\n {t('ai:Configure')}\n </Button>,\n <Button key=\"cancel\" variant={ButtonVariant.link} onClick={onClose}>\n {t('ai:Cancel')}\n </Button>,\n ];\n } else {\n actions = [\n <Button key=\"close\" variant={ButtonVariant.primary} onClick={onClose}>\n {t('ai:Close')}\n </Button>,\n ];\n }\n\n return (\n <Modal\n aria-label={t('ai:Configure host inventory settings')}\n title={t('ai:Configure host inventory settings')}\n isOpen={isOpen}\n onClose={onClose}\n actions={actions}\n variant={ModalVariant.medium}\n id=\"cim-config-modal\"\n className=\"cim-config-modal\"\n >\n {t(\n 'ai:Configuring the host inventory settings will enable the Central Infrastructure Management.',\n )}\n {isError && (\n <Alert title={error.title} variant={error.variant || AlertVariant.danger} isInline>\n {error.message}\n </Alert>\n )}\n <CimConfigDisconnectedAlert docDisconnectedUrl={docDisconnectedUrl} />\n <CimConfigurationForm\n isEdit={isEdit}\n isInProgressPeriod={isInProgressPeriod}\n onClose={onClose}\n docConfigUrl={docConfigUrl}\n docConfigAwsUrl={docConfigAwsUrl}\n {...formProps}\n />\n {isConfigure && (\n <Alert\n variant={AlertVariant.warning}\n title={t('ai:Storage sizes cannot be changed once you configure.')}\n isInline\n />\n )}\n </Modal>\n );\n};\n", "import * as React from 'react';\nimport { Trans } from 'react-i18next';\nimport {\n Flex,\n FlexItem,\n Form,\n FormGroup,\n Popover,\n Checkbox,\n TextInput,\n} from '@patternfly/react-core';\nimport { ExternalLinkAltIcon, HelpIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { CimConfigurationFormProps } from './types';\n\nimport './CimConfigurationForm.css';\n\nexport const CimConfigurationForm: React.FC<CimConfigurationFormProps> = ({\n docConfigUrl,\n docConfigAwsUrl,\n isEdit,\n isInProgressPeriod,\n\n dbVolSize,\n dbVolSizeValidation,\n setDbVolSize,\n fsVolSize,\n fsVolSizeValidation,\n setFsVolSize,\n imgVolSize,\n imgVolSizeValidation,\n setImgVolSize,\n configureLoadBalancer,\n configureLoadBalancerInitial,\n setConfigureLoadBalancer,\n}) => {\n const { t } = useTranslation();\n\n const getNumber = (v: string, min: number): number => {\n const p = parseFloat(v);\n if (isNaN(p)) {\n // Do not check for minimum here - keep it on validation\n return min;\n }\n return p;\n };\n\n const awsHelp = (\n <Popover\n bodyContent={t(\n \"ai:If you're running your hub cluster of Amazon Web Services and want to enable the CIM service, we recommend you to configure your load balancer if it is not already configured. Learn more about enabling CIM on AWS.\",\n )}\n footerContent={\n <a href={docConfigAwsUrl} target=\"_blank\" rel=\"noreferrer\">\n <Trans t={t}>\n ai:Learn more about enabling CIM on AWS <ExternalLinkAltIcon />\n </Trans>\n </a>\n }\n >\n <button\n type=\"button\"\n aria-label={t('ai:More info for load balancer on Amazon web services')}\n aria-describedby=\"cim-config-form-aws-title\"\n onClick={(e) => e.preventDefault()}\n className=\"pf-c-form__group-label-help\"\n >\n <HelpIcon noVerticalAlign />\n </button>\n </Popover>\n );\n\n return (\n <Form>\n <FormGroup\n fieldId=\"cim-config-form-storage-title\"\n label={t('ai:Storage sizes')}\n className=\"cim-config-form-title\"\n labelIcon={\n <Popover\n bodyContent={t(\n 'ai:The storage sizes will be used to store different files and data for cluster creation.',\n )}\n footerContent={\n <a href={docConfigUrl} target=\"_blank\" rel=\"noreferrer\">\n <Trans t={t}>\n ai:Learn more about storage sizes. <ExternalLinkAltIcon />\n </Trans>\n </a>\n }\n >\n <button\n type=\"button\"\n aria-label={t('ai:More info for configure storage sizes')}\n aria-describedby=\"cim-config-form-storage-title\"\n onClick={(e) => e.preventDefault()}\n className=\"pf-c-form__group-label-help\"\n >\n <HelpIcon noVerticalAlign />\n </button>\n </Popover>\n }\n >\n {t('ai:If there are many clusters, use higher values for the storage fields.')}\n </FormGroup>\n <Flex justifyContent={{ default: 'justifyContentSpaceBetween' }}>\n <FlexItem>\n <FormGroup\n label={t('ai:Database storage')}\n fieldId=\"cim-config-form-storage-db\"\n labelIcon={\n <Popover\n bodyContent={t(\n 'ai:Specify how much storage is allocated for storing files such as database tables and database views for the clusters. Recommended is 10Gi or more. The value can not be updated later.',\n )}\n >\n <button\n type=\"button\"\n aria-label={t('ai:More info for database storage')}\n aria-describedby=\"cim-config-form-storage-db\"\n onClick={(e) => e.preventDefault()}\n className=\"pf-c-form__group-label-help\"\n >\n <HelpIcon noVerticalAlign />\n </button>\n </Popover>\n }\n helperTextInvalid={dbVolSizeValidation}\n validated={dbVolSizeValidation ? 'error' : 'default'}\n isRequired\n >\n <span className=\"cim-config-form-volume\">\n <TextInput\n isRequired\n isDisabled={isEdit /* Not supported by backend */}\n type=\"number\"\n id=\"cim-config-form-storage-db\"\n name=\"cim-config-form-storage-db\"\n value={dbVolSize}\n onChange={(v: string) => setDbVolSize(getNumber(v, 1))}\n min={0 /* Do the validation elsewhere */}\n />{' '}\n Gi\n </span>\n </FormGroup>\n </FlexItem>\n <FlexItem>\n <FormGroup\n label={t('ai:System storage')}\n fieldId=\"cim-config-form-storage-sys\"\n labelIcon={\n <Popover\n bodyContent={t(\n 'ai:Specify how much storage is allocated for storing logs, manifests and \"kubeconfig\" files for the clusters. Recommended is 100Gi or more. The value can not be updated later.',\n )}\n >\n <button\n type=\"button\"\n aria-label={t('ai:More info for system storage')}\n aria-describedby=\"cim-config-form-storage-sys\"\n onClick={(e) => e.preventDefault()}\n className=\"pf-c-form__group-label-help\"\n >\n <HelpIcon noVerticalAlign />\n </button>\n </Popover>\n }\n helperTextInvalid={fsVolSizeValidation}\n validated={fsVolSizeValidation ? 'error' : 'default'}\n isRequired\n >\n <span className=\"cim-config-form-volume\">\n <TextInput\n isRequired\n isDisabled={isEdit /* Not supported by backend */}\n type=\"number\"\n id=\"cim-config-form-storage-sys\"\n name=\"cim-config-form-storage-sys\"\n value={fsVolSize}\n onChange={(v: string) => setFsVolSize(getNumber(v, 1))}\n min={0}\n />{' '}\n Gi\n </span>\n </FormGroup>\n </FlexItem>\n <FlexItem>\n <FormGroup\n label={t('ai:Image storage')}\n fieldId=\"cim-config-form-storage-img\"\n labelIcon={\n <Popover\n bodyContent={t(\n 'ai:Specify how much storage to allocate for the images of the clusters. There must be 1G of image storage for each instance of Red Hat Enterprise Linux CoreOS that is running. Recommended is 50Gi or more. The value can not be updated later.',\n )}\n >\n <button\n type=\"button\"\n aria-label={t('ai:More info for image storage')}\n aria-describedby=\"cim-config-form-storage-img\"\n onClick={(e) => e.preventDefault()}\n className=\"pf-c-form__group-label-help\"\n >\n <HelpIcon noVerticalAlign />\n </button>\n </Popover>\n }\n helperTextInvalid={imgVolSizeValidation}\n validated={imgVolSizeValidation ? 'error' : 'default'}\n isRequired\n >\n <span className=\"cim-config-form-volume\">\n <TextInput\n isRequired\n isDisabled={isEdit /* Not supported by backend */}\n type=\"number\"\n id=\"cim-config-form-storage-img\"\n name=\"cim-config-form-storage-img\"\n value={imgVolSize}\n onChange={(v: string) => setImgVolSize(getNumber(v, 10))}\n min={0}\n />{' '}\n Gi\n </span>\n </FormGroup>\n </FlexItem>\n </Flex>\n\n <Checkbox\n label={\n <span className=\"cim-config-form-aws-label\">\n {t('ai:Configure load balancer on Amazon Web Services for me.')}\n &nbsp;\n {awsHelp}\n </span>\n }\n id=\"cim-config-form-aws\"\n className=\"cim-config-form-aws\"\n // isRequired\n name=\"aws-loadbalancer-checkbox\"\n isChecked={configureLoadBalancer}\n isDisabled={\n isInProgressPeriod ||\n (isEdit &&\n configureLoadBalancerInitial) /* For edit flow, only No to Yes transition is possible */\n }\n onChange={setConfigureLoadBalancer}\n />\n </Form>\n );\n};\n", "import { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk';\nimport { AlertVariant } from '@patternfly/react-core';\nimport { TFunction } from 'i18next';\nimport { getErrorMessage } from '../../../../common/utils';\n\nimport {\n AgentServiceConfigK8sResource,\n convertOCPtoCIMResourceHeader,\n CreateResourceFuncType,\n GetResourceFuncType,\n ListResourcesFuncType,\n PatchResourceFuncType,\n ResourcePatch,\n RouteK8sResource,\n} from '../../../types';\nimport { LOCAL_STORAGE_ID_LAST_UPDATE_TIMESTAMP } from './utils';\n\nexport type SetErrorFuncType = ({\n title,\n message,\n variant,\n}: {\n title: string;\n message?: string;\n variant?: AlertVariant;\n}) => void;\n\nconst ASSISTED_IMAGE_SERVICE_ROUTE_PREFIX = 'assisted-image-service-multicluster-engine';\n\n// Since we do not know MCE's namespace, query all routes,\n// Find assisted-image-service's one and parse domain from there.\nconst getAssistedImageServiceRoute = async (\n t: TFunction,\n setError: SetErrorFuncType,\n listResources: ListResourcesFuncType,\n): Promise<RouteK8sResource | undefined> => {\n let allRoutes;\n try {\n allRoutes = (await listResources({\n kind: 'Route',\n apiVersion: 'route.openshift.io/v1',\n })) as RouteK8sResource[];\n } catch (e) {\n console.error('Failed to read all routes: ', allRoutes);\n setError({\n title: t('ai:Failed to save configuration'),\n message: t('ai:Can not query routes.'),\n });\n return undefined;\n }\n\n const assistedImageServiceRoute = allRoutes?.find(\n (r: RouteK8sResource) => r.metadata?.name === 'assisted-image-service',\n );\n\n if (!assistedImageServiceRoute?.spec?.host) {\n setError({\n title: t('ai:Failed to save configuration'),\n message: t('ai:Can not find host of the assisted-image-service route'),\n });\n return undefined;\n }\n\n return assistedImageServiceRoute;\n};\n\n// There are many ways how to get the domain name, let's follow the documentation.\nconst getClusterDomain = (\n t: TFunction,\n setError: SetErrorFuncType,\n assistedImageServiceRoute: RouteK8sResource,\n): string | undefined => {\n const prefix = `${ASSISTED_IMAGE_SERVICE_ROUTE_PREFIX}.`;\n const host: string = assistedImageServiceRoute.spec?.host || '';\n const appsDomain = host.substring(host.indexOf(prefix) + prefix.length);\n\n // the appsDomain can be prefixed either by \"apps.\" or \"nlb-apps.\" so search for first dot\n const domain = appsDomain.substring(appsDomain.indexOf('.') + 1);\n\n if (!domain) {\n // It must be present\n console.error('Can not find domain in assistedImageServiceRoute: ', assistedImageServiceRoute);\n setError({\n title: t('ai:Can not find cluster domain.'),\n });\n }\n\n return domain;\n};\n\n// Keep this function in sync with getClusterDomain()\nconst patchAssistedImageServiceRoute = async (\n t: TFunction,\n setError: SetErrorFuncType,\n patchResource: PatchResourceFuncType,\n\n assistedImageServiceRoute: RouteK8sResource,\n domain: string,\n): Promise<boolean> => {\n const newHost = `${ASSISTED_IMAGE_SERVICE_ROUTE_PREFIX}.nlb-apps.${domain}`;\n\n const labels = assistedImageServiceRoute.metadata?.labels || {};\n labels['router-type'] = 'nlb';\n\n const patches: ResourcePatch[] = [\n {\n op: 'replace',\n path: '/spec/host',\n value: newHost,\n },\n {\n op: assistedImageServiceRoute.metadata?.labels ? 'replace' : 'add',\n path: '/metadata/labels',\n value: labels,\n },\n ];\n\n try {\n await patchResource(convertOCPtoCIMResourceHeader(assistedImageServiceRoute), patches);\n } catch (e) {\n console.error('Failed to patch assisted-image-service route: ', e, patches);\n setError({\n title: t('ai:Failed to patch assisted-image-service route for new domain.'),\n });\n return false;\n }\n\n return true;\n};\n\nexport const isIngressController = async (getResource: GetResourceFuncType): Promise<boolean> => {\n try {\n await getResource({\n apiVersion: 'operator.openshift.io/v1',\n kind: 'IngressController',\n metadata: {\n name: 'ingress-controller-with-nlb',\n namespace: 'openshift-ingress-operator',\n },\n });\n\n return true;\n } catch {\n return false;\n }\n};\n\nconst createIngressController = async (\n t: TFunction,\n setError: SetErrorFuncType,\n createResource: CreateResourceFuncType,\n\n domain: string,\n): Promise<boolean> => {\n // Assumption: the IngressController resource is not present - ensured at higher level\n\n const ingressController = {\n apiVersion: 'operator.openshift.io/v1',\n kind: 'IngressController',\n metadata: {\n name: 'ingress-controller-with-nlb',\n namespace: 'openshift-ingress-operator',\n },\n spec: {\n domain: `nlb-apps.${domain}`,\n routeSelector: {\n matchLabels: {\n 'router-type': 'nlb',\n },\n },\n endpointPublishingStrategy: {\n type: 'LoadBalancerService',\n loadBalancer: {\n scope: 'External',\n providerParameters: {\n type: 'AWS',\n aws: {\n type: 'NLB',\n },\n },\n },\n },\n },\n };\n\n try {\n await createResource(ingressController);\n return true;\n } catch (e) {\n console.error('Create IngressController error: ', e);\n setError({\n title: t('ai:Failed to create IngressController'),\n });\n }\n\n return false;\n};\n\nconst patchProvisioningConfiguration = async ({\n t,\n setError,\n patchResource,\n getResource,\n}: {\n t: TFunction;\n setError: SetErrorFuncType;\n patchResource: PatchResourceFuncType;\n getResource: GetResourceFuncType;\n}) => {\n try {\n const provisioning = (await getResource({\n kind: 'Provisioning',\n apiVersion: 'metal3.io/v1alpha1',\n metadata: {\n name: 'provisioning-configuration',\n },\n })) as K8sResourceCommon & { spec?: { watchAllNamespaces?: boolean } };\n\n const patches: ResourcePatch[] = [\n {\n op: provisioning.spec?.watchAllNamespaces ? 'replace' : 'add',\n path: '/spec/watchAllNamespaces',\n value: true,\n },\n ];\n\n await patchResource(convertOCPtoCIMResourceHeader(provisioning), patches);\n } catch (e) {\n console.error('Failed to patch provisioning-configuration: ', e);\n setError({\n title: t('ai:Failed to configure provisioning to enable registering hosts via BMC.'),\n message: getErrorMessage(e),\n variant: AlertVariant.warning,\n });\n }\n};\n\nconst createAgentServiceConfig = async ({\n t,\n setError,\n createResource,\n dbVolSizeGiB,\n fsVolSizeGiB,\n imgVolSizeGiB,\n}: {\n t: TFunction;\n setError: SetErrorFuncType;\n createResource: CreateResourceFuncType;\n\n dbVolSizeGiB: number;\n fsVolSizeGiB: number;\n imgVolSizeGiB: number;\n}): Promise<boolean> => {\n try {\n const agentServiceConfig = {\n apiVersion: 'agent-install.openshift.io/v1beta1',\n kind: 'AgentServiceConfig',\n metadata: {\n name: 'agent',\n },\n spec: {\n databaseStorage: {\n accessModes: ['ReadWriteOnce'],\n resources: {\n requests: {\n storage: `${dbVolSizeGiB}Gi`,\n },\n },\n },\n filesystemStorage: {\n accessModes: ['ReadWriteOnce'],\n resources: {\n requests: {\n storage: `${fsVolSizeGiB}Gi`,\n },\n },\n },\n imageStorage: {\n accessModes: ['ReadWriteOnce'],\n resources: {\n requests: {\n storage: `${imgVolSizeGiB}Gi`,\n },\n },\n },\n },\n };\n\n await createResource(agentServiceConfig);\n return true;\n } catch (e) {\n console.error('Failed to create AgentServiceConfig: ', e);\n setError({\n title: t('ai:Failed to create AgentServiceConfig'),\n message: getErrorMessage(e),\n });\n return false;\n }\n};\n\n/* Following functions are tested but recently not used.\nconst patchAgentServiceConfig = async ({\n t,\n setError,\n patchResource,\n agentServiceConfig,\n imgVolSizeGB,\n}: {\n t: TFunction;\n setError: SetErrorFuncType;\n patchResource: PatchResourceFuncType;\n agentServiceConfig: AgentServiceConfigK8sResource;\n\n imgVolSizeGB: number;\n}): Promise<boolean> => {\n try {\n const patches: ResourcePatch[] = [\n {\n op: 'replace',\n path: '/spec/imageStorage/resources/requests/storage',\n value: `${imgVolSizeGB}G`,\n },\n ];\n await patchResource(agentServiceConfig, patches);\n return true;\n } catch (e) {\n console.error('Failed to patch AgentServiceConfig: ', e);\n setError({\n title: t('ai:Failed to update the AgentServiceConfig'),\n });\n return false;\n }\n};\n\nexport const onDeleteCimConfig = async ({\n deleteResource,\n}: {\n deleteResource: DeleteResourceFuncType;\n}) => {\n try {\n await deleteResource({\n apiVersion: 'agent-install.openshift.io/v1beta1',\n kind: 'AgentServiceConfig',\n metadata: {\n name: 'agent',\n // cluster-scoped resource\n },\n });\n } catch (e) {\n console.error('Failed to delete AgentServiceConfig: ', e);\n }\n};\n*/\n// https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/2.6/html/multicluster_engine/multicluster_engine_overview#enable-cim\nexport const onEnableCIM = async ({\n t,\n setError,\n createResource,\n getResource,\n listResources,\n patchResource,\n\n agentServiceConfig,\n platform,\n\n dbVolSizeGiB,\n fsVolSizeGiB,\n imgVolSizeGiB,\n\n configureLoadBalancer,\n}: {\n t: TFunction;\n setError: SetErrorFuncType;\n createResource: CreateResourceFuncType;\n getResource: GetResourceFuncType;\n listResources: ListResourcesFuncType;\n patchResource: PatchResourceFuncType;\n\n agentServiceConfig?: AgentServiceConfigK8sResource;\n platform: string;\n\n dbVolSizeGiB: number;\n fsVolSizeGiB: number;\n imgVolSizeGiB: number;\n\n configureLoadBalancer: boolean;\n}) => {\n if (['none', 'baremetal', 'openstack', 'vsphere'].includes(platform.toLocaleLowerCase())) {\n await patchProvisioningConfiguration({ t, setError, patchResource, getResource });\n }\n\n if (agentServiceConfig) {\n console.log('The AgentServiceConfig recently can not be patched. Delete and create instead.');\n } else {\n if (\n !(await createAgentServiceConfig({\n t,\n setError,\n createResource,\n dbVolSizeGiB,\n fsVolSizeGiB,\n imgVolSizeGiB,\n }))\n ) {\n return false;\n }\n }\n\n // see isCIMConfigProgressing()\n window.localStorage.setItem(LOCAL_STORAGE_ID_LAST_UPDATE_TIMESTAMP, new Date().toISOString());\n\n if (configureLoadBalancer) {\n // Recently No to Yes only (since we do not delete the ingress controller)\n if (await isIngressController(getResource)) {\n console.log('IngressController already present, we do not patch it.');\n return true /* Not an error */;\n }\n\n const assistedImageServiceRoute = await getAssistedImageServiceRoute(\n t,\n setError,\n listResources,\n );\n if (!assistedImageServiceRoute) {\n return false;\n }\n\n const domain = getClusterDomain(t, setError, assistedImageServiceRoute);\n if (!domain) {\n return false;\n }\n\n if (\n !(await createIngressController(t, setError, createResource, domain)) ||\n !(await patchAssistedImageServiceRoute(\n t,\n setError,\n patchResource,\n assistedImageServiceRoute,\n domain,\n ))\n ) {\n return false;\n }\n }\n\n return true;\n};\n", "import * as React from 'react';\nimport { Alert, AlertVariant } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { Trans } from 'react-i18next';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\nexport const CimConfigDisconnectedAlert: React.FC<{\n docDisconnectedUrl: string;\n}> = ({ docDisconnectedUrl }) => {\n const { t } = useTranslation();\n\n return (\n <Alert\n title={\n <Trans t={t}>\n ai:To configure for disconnected environments,{' '}\n <a href={docDisconnectedUrl} target=\"_blank\" rel=\"noreferrer\">\n view documentation <ExternalLinkAltIcon />\n </a>\n </Trans>\n }\n variant={AlertVariant.info}\n isInline\n />\n );\n};\n", "import * as React from 'react';\nimport { Alert, AlertVariant } from '@patternfly/react-core';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\nexport const CimIsMissingAlert: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Alert\n isInline\n variant={AlertVariant.warning}\n title={t('ai:Can not manage hosts until Central Infrastructure Management is set up.')}\n />\n );\n};\n", "import * as React from 'react';\nimport { DropdownItem } from '@patternfly/react-core';\nimport { AgentK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype MassApproveActionProps = {\n onApprove: VoidFunction;\n selectedAgents: AgentK8sResource[];\n};\n\nconst MassApproveAction: React.FC<MassApproveActionProps> = ({ onApprove, selectedAgents }) => {\n const { t } = useTranslation();\n const disabledDescription = selectedAgents.every((a) => a.spec.approved)\n ? t('ai:All selected hosts are already approved.')\n : undefined;\n return (\n <DropdownItem\n onClick={onApprove}\n isDisabled={!!disabledDescription}\n description={disabledDescription}\n >\n {t('ai:Approve')}\n </DropdownItem>\n );\n};\n\nexport default MassApproveAction;\n", "import {\n Badge,\n Grid,\n GridItem,\n SearchInput,\n Select,\n SelectGroup,\n SelectOption,\n SelectVariant,\n Split,\n SplitItem,\n ToolbarFilter,\n ToolbarItem,\n} from '@patternfly/react-core';\nimport { FilterIcon } from '@patternfly/react-icons';\nimport * as React from 'react';\nimport { HostStatus } from '../../../common/components/hosts/types';\nimport { agentStatus } from '../helpers/agentStatus';\nimport { Host, TableToolbar } from '../../../common';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst getStatusesForFiler = (statuses: HostStatus<string>) => {\n const filterStatuses: {\n [category: string]: {\n [label: string]: string[];\n };\n } = {};\n\n const sortedStatuses = Object.keys(statuses).sort((a, b) =>\n statuses[a].title.localeCompare(statuses[b].title),\n );\n\n sortedStatuses.forEach((status) => {\n const { category, title } = statuses[status];\n if (filterStatuses[category]) {\n if (filterStatuses[category][title]) {\n filterStatuses[category][title].push(status);\n } else {\n filterStatuses[category] = {\n ...filterStatuses[category],\n [title]: [status],\n };\n }\n } else {\n filterStatuses[category] = {\n [title]: [status],\n };\n }\n });\n\n return filterStatuses;\n};\n\ntype InfraTableToolbarProps = ReturnType<typeof usePagination> & {\n setSelectedHostIDs: (items: string[]) => void;\n massActions: React.ReactNode[];\n hosts: Host[];\n statusFilter: string[];\n statusCount: object;\n hostnameFilter: string | undefined;\n setHostnameFilter: (hostname: string | undefined) => void;\n setStatusFilter: (status: string[]) => void;\n selectedHostIDs: string[];\n};\n\nconst InfraTableToolbar: React.FC<InfraTableToolbarProps> = ({\n setSelectedHostIDs,\n massActions,\n hosts,\n statusFilter,\n statusCount,\n hostnameFilter,\n setHostnameFilter,\n setStatusFilter,\n selectedHostIDs,\n ...paginationProps\n}) => {\n const [statusFilterOpen, setStatusFilterOpen] = React.useState(false);\n const filterStatuses = React.useMemo(() => getStatusesForFiler(agentStatus), []);\n const { t } = useTranslation();\n const itemIDs = React.useMemo(() => hosts.map((h) => h.id), [hosts]);\n return (\n <TableToolbar\n selectedIDs={selectedHostIDs || []}\n itemIDs={itemIDs}\n setSelectedIDs={setSelectedHostIDs}\n actions={massActions}\n clearAllFilters={() => setStatusFilter([])}\n {...paginationProps}\n >\n <ToolbarItem>\n <SearchInput\n placeholder={t('ai:Find by hostname')}\n value={hostnameFilter}\n onChange={setHostnameFilter}\n onClear={() => setHostnameFilter(undefined)}\n />\n </ToolbarItem>\n <ToolbarItem>\n <ToolbarFilter\n chips={statusFilter}\n deleteChip={(category, chip) => setStatusFilter(statusFilter?.filter((f) => f !== chip))}\n deleteChipGroup={() => setStatusFilter([])}\n categoryName=\"Status\"\n >\n <Select\n variant={SelectVariant.checkbox}\n aria-label={t('ai:Status')}\n onToggle={setStatusFilterOpen}\n onSelect={(e, value) => {\n // eslint-disable-next-line\n if ((e.target as any).checked) {\n const newItems = (statusFilter ? [...statusFilter, value] : [value]) as string[];\n setStatusFilter(newItems);\n } else {\n setStatusFilter(statusFilter?.filter((f) => f !== value));\n }\n }}\n selections={statusFilter}\n isOpen={statusFilterOpen}\n placeholderText={t('ai:Status')}\n toggleIcon={<FilterIcon />}\n >\n {[\n <Grid key=\"statuses\" hasGutter className=\"table-toolbar__dropdown\">\n {Object.keys(filterStatuses).map((category) => (\n <GridItem key={category} span={4}>\n <SelectGroup label={category}>\n {Object.keys(filterStatuses[category]).map((label) => (\n <SelectOption\n key={label}\n value={label}\n isChecked={statusFilter?.includes(label)}\n >\n <Split hasGutter>\n <SplitItem>{label}</SplitItem>\n <SplitItem>\n <Badge isRead>{statusCount[label] || 0}</Badge>\n </SplitItem>\n </Split>\n </SelectOption>\n ))}\n </SelectGroup>\n </GridItem>\n ))}\n </Grid>,\n ]}\n </Select>\n </ToolbarFilter>\n </ToolbarItem>\n </TableToolbar>\n );\n};\n\nexport default InfraTableToolbar;\n", "import * as React from 'react';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens';\nimport { getAgentStatus, getBMHStatus } from '../helpers';\nimport { AgentK8sResource, BareMetalHostK8sResource } from '../../types';\nimport { AGENT_BMH_NAME_LABEL_KEY } from '../common';\nimport { Tooltip } from '@patternfly/react-core';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type InfraEnvHostsTabAgentsWarning = {\n infraAgents: AgentK8sResource[];\n infraBMHs: BareMetalHostK8sResource[];\n};\n\nconst InfraEnvHostsTabAgentsWarning: React.FC<InfraEnvHostsTabAgentsWarning> = ({\n infraAgents,\n infraBMHs,\n}) => {\n const { t } = useTranslation();\n const agentsBMHNames = infraAgents.reduce<string[]>((names, agent) => {\n const name = agent.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY];\n name && names.push(name);\n return names;\n }, []);\n\n const bmhsWithoutAgents = infraBMHs.filter((bmh) =>\n agentsBMHNames.includes(bmh.metadata?.name || ''),\n );\n\n const agentStates = infraAgents.map((agent) => getAgentStatus(agent, true).status);\n const bmhStates = bmhsWithoutAgents.map((bmh) => getBMHStatus(bmh).state);\n\n const hostStates = [...agentStates, ...bmhStates];\n\n const problemStates = [\n 'bmh-error',\n 'preparing-failed',\n 'disconnected-unbound',\n 'disconnected',\n 'insufficient-unbound',\n 'insufficient',\n 'cancelled',\n 'error',\n ];\n\n const hostsWithProblemsCount = hostStates.filter(({ key }) => problemStates.includes(key)).length;\n\n if (hostsWithProblemsCount) {\n return (\n <Tooltip content={t('ai:{{count}} host has problems', { count: hostsWithProblemsCount })}>\n <ExclamationTriangleIcon\n color={warningColor.value}\n className=\"infra-env-hosts-tab-title__icon\"\n />\n </Tooltip>\n );\n }\n return null;\n};\n\nexport default InfraEnvHostsTabAgentsWarning;\n", "import * as React from 'react';\nimport { Alert, AlertVariant } from '@patternfly/react-core';\nimport { getInfraEnvDocs } from '../common/constants';\nimport { getInfraEnvNameOfAgent } from '../helpers';\nimport { BareMetalHostK8sResource, InfraEnvK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype AgentAlertsProps = {\n docVersion: string;\n infraEnv: InfraEnvK8sResource;\n bareMetalHosts: BareMetalHostK8sResource[];\n};\n\nconst AgentAlerts: React.FC<AgentAlertsProps> = ({ infraEnv, bareMetalHosts, docVersion }) => {\n const infraBMHs =\n infraEnv &&\n bareMetalHosts?.filter(\n (h) =>\n h.metadata?.namespace === infraEnv.metadata?.namespace &&\n getInfraEnvNameOfAgent(h) === infraEnv.metadata?.name,\n );\n const { t } = useTranslation();\n return (\n <>\n {infraBMHs?.some((bmh) => !bmh.status) && (\n <Alert\n title={t('ai:Metal3 operator is not configured')}\n variant={AlertVariant.warning}\n isInline\n className=\"cim-resource-alerts\"\n actionLinks={\n <a href={getInfraEnvDocs(docVersion)} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('ai:Open documentation')}\n </a>\n }\n >\n {t(\n 'ai:It seems the Metal3 operator is missing configuration which will prevent it to find bare metal hosts in this namespace. Please refer to the documentation for the first time setup steps.',\n )}\n </Alert>\n )}\n </>\n );\n};\n\nexport default AgentAlerts;\n", "import {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownSeparator,\n DropdownToggle,\n Split,\n SplitItem,\n} from '@patternfly/react-core';\nimport * as React from 'react';\nimport { PopoverIcon } from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { AddBmcHostModal, AddBmcHostYamlModal, AddHostModal } from '../modals';\nimport { AddHostDropdownProps } from './types';\nimport './AddHostDropdown.css';\n\nconst AddHostDropdown = ({\n infraEnv,\n agentClusterInstall,\n onSaveISOParams,\n usedHostnames,\n onCreateBMH,\n docVersion,\n onCreateBmcByYaml,\n isBMPlatform,\n}: AddHostDropdownProps) => {\n const [addModalType, setAddModalType] = React.useState<'iso' | 'bmc' | 'yaml' | undefined>(\n undefined,\n );\n const [isKebabOpen, setIsKebabOpen] = React.useState(false);\n const { t } = useTranslation();\n return (\n <>\n <Dropdown\n id=\"infraenv-actions\"\n toggle={\n <DropdownToggle id=\"dropdown-basic\" onToggle={setIsKebabOpen} toggleVariant=\"primary\">\n {t('ai:Add hosts')}\n </DropdownToggle>\n }\n isOpen={isKebabOpen}\n dropdownItems={[\n <DropdownItem\n key=\"discovery-iso\"\n onClick={() => {\n setIsKebabOpen(false);\n setAddModalType('iso');\n }}\n description={t('ai:Discover hosts by booting a discovery image')}\n >\n {t('ai:With Discovery ISO')}\n </DropdownItem>,\n <DropdownSeparator key=\"separator\" />,\n <DropdownGroup\n id=\"discovery-bmc\"\n key=\"discovery-bmc\"\n className=\"ai-discovery-bmc__group\"\n label={\n <Split hasGutter>\n <SplitItem>{t('ai:Baseboard Management Controller (BMC)')}</SplitItem>\n <SplitItem>\n {!isBMPlatform && (\n <>\n {' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <p>\n {t(\n `ai:To enable the host's baseboard management controller (BMC) on the hub cluster, deploy the hub cluster on vSphere, BareMetal, OpenStack, or platform-agnostic (none type).`,\n )}\n </p>\n }\n />\n </>\n )}\n </SplitItem>\n </Split>\n }\n >\n <DropdownItem\n key=\"with-credentials\"\n onClick={() => {\n setIsKebabOpen(false);\n setAddModalType('bmc');\n }}\n description={t('ai:Discover a single host via Baseboard Management Controller')}\n isDisabled={!isBMPlatform}\n >\n {t('ai:With BMC form')}\n </DropdownItem>\n <DropdownItem\n key=\"upload-yaml\"\n onClick={() => {\n setIsKebabOpen(false);\n setAddModalType('yaml');\n }}\n description={t(\n 'ai:Discover multiple hosts by providing yaml with Bare Metal Host definitions',\n )}\n isDisabled={!isBMPlatform}\n >\n {t('ai:By uploading a YAML')}\n </DropdownItem>\n </DropdownGroup>,\n ]}\n position={'right'}\n />\n {addModalType === 'iso' && (\n <AddHostModal\n infraEnv={infraEnv}\n agentClusterInstall={agentClusterInstall}\n isOpen\n onClose={() => setAddModalType(undefined)}\n onSaveISOParams={onSaveISOParams}\n docVersion={docVersion}\n />\n )}\n {addModalType === 'bmc' && (\n <AddBmcHostModal\n infraEnv={infraEnv}\n isOpen\n onClose={() => setAddModalType(undefined)}\n onCreateBMH={onCreateBMH}\n usedHostnames={usedHostnames}\n docVersion={docVersion}\n />\n )}\n {addModalType === 'yaml' && (\n <AddBmcHostYamlModal\n infraEnv={infraEnv}\n isOpen\n onClose={() => setAddModalType(undefined)}\n onCreateBmcByYaml={onCreateBmcByYaml}\n docVersion={docVersion}\n />\n )}\n </>\n );\n};\n\nexport default AddHostDropdown;\n", "import * as React from 'react';\nimport * as Yup from 'yup';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertVariant,\n Button,\n Flex,\n FlexItem,\n Form,\n FormGroup,\n Grid,\n GridItem,\n Spinner,\n Stack,\n StackItem,\n Title,\n TitleSizes,\n} from '@patternfly/react-core';\nimport { Formik, FormikProps, useFormikContext } from 'formik';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons';\n\nimport {\n httpProxyValidationSchema,\n noProxyValidationSchema,\n PullSecretField,\n sshPublicKeyValidationSchema,\n LabelField,\n UploadSSH,\n ProxyFields,\n RadioField,\n PopoverIcon,\n pullSecretValidationSchema,\n OCP_STATIC_IP_DOC,\n CheckboxField,\n AdditionalNTPSourcesField,\n richNameValidationSchema,\n getRichTextValidation,\n nameValidationMessages,\n RichInputField,\n locationValidationSchema,\n locationValidationMessages,\n ntpSourceValidationSchema,\n CpuArchitecture,\n} from '../../../common';\n\nimport './infra-env.css';\nimport { getErrorMessage } from '../../../common/utils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nexport type EnvironmentStepFormValues = {\n name: string;\n location: string;\n pullSecret: string;\n sshPublicKey: string;\n httpProxy: string;\n httpsProxy: string;\n noProxy: string;\n enableProxy: boolean;\n labels: string[];\n networkType: 'dhcp' | 'static';\n cpuArchitecture: CpuArchitecture;\n enableNtpSources: boolean;\n additionalNtpSources: string;\n};\n\nconst validationSchema = (usedNames: string[], t: TFunction) =>\n Yup.lazy<EnvironmentStepFormValues>((values) =>\n Yup.object<EnvironmentStepFormValues>().shape({\n name: richNameValidationSchema(t, usedNames),\n location: locationValidationSchema(t).required(t('ai:Location is a required field.')),\n pullSecret: pullSecretValidationSchema.required(t('ai:Pull secret is a required field.')),\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 labels: Yup.array()\n .of(Yup.string())\n .test(\n 'label-equals-validation',\n 'Label selector needs to be in a `key=value` form',\n (values: string[]) =>\n values.every((value) => {\n const parts = value.split('=');\n return parts.length === 2;\n }),\n ),\n additionalNtpSources: ntpSourceValidationSchema,\n }),\n );\n\nconst initialValues: EnvironmentStepFormValues = {\n name: '',\n location: '',\n pullSecret: '',\n sshPublicKey: '',\n httpProxy: '',\n httpsProxy: '',\n noProxy: '',\n enableProxy: false,\n labels: [],\n networkType: 'dhcp',\n cpuArchitecture: CpuArchitecture.x86,\n enableNtpSources: false,\n additionalNtpSources: '',\n};\n\ntype InfraEnvFormProps = {\n onValuesChanged?: (values: EnvironmentStepFormValues) => void;\n};\n\nconst InfraEnvForm: React.FC<InfraEnvFormProps> = ({ onValuesChanged }) => {\n const { values } = useFormikContext<EnvironmentStepFormValues>();\n const { t } = useTranslation();\n React.useEffect(() => onValuesChanged?.(values), [onValuesChanged, values]);\n return (\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:Infrastructure environments are used by clusters. Create an infrastructure environment to add resources to your cluster.',\n )}\n </StackItem>\n <StackItem>\n <Form>\n <RichInputField\n label={t('ai:Name')}\n name=\"name\"\n isRequired\n richValidationMessages={nameValidationMessages(t)}\n placeholder={t('ai:Enter infrastructure environment name')}\n />\n <FormGroup\n fieldId=\"network-type\"\n label={t('ai:Network type')}\n labelIcon={\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <>\n {t(\n 'ai:This will determine for the infrastructure environment which kind of hosts would be able to be added. If the hosts that you want to add are using DHCP server, select this option, else, select the static IP.',\n )}\n </>\n }\n />\n }\n >\n <Flex justifyContent={{ default: 'justifyContentFlexStart' }}>\n <FlexItem>\n <RadioField name=\"networkType\" id=\"dhcp\" value=\"dhcp\" label={t('ai:DHCP only')} />\n </FlexItem>\n <FlexItem spacer={{ default: 'spacer4xl' }} />\n <FlexItem>\n <RadioField\n name=\"networkType\"\n id=\"static-ip\"\n value=\"static\"\n label={\n <>\n {t('ai:Static IP, bridges and bonds')}&nbsp;\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:To use static network configuration, follow the steps listed in the documentation.',\n )}\n </StackItem>\n <StackItem>\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 </StackItem>\n </Stack>\n }\n />\n </>\n }\n />\n </FlexItem>\n </Flex>\n </FormGroup>\n <FormGroup fieldId=\"cpuArchitecture\" label={t('ai:CPU architecture')}>\n <Flex justifyContent={{ default: 'justifyContentFlexStart' }}>\n <FlexItem>\n <RadioField\n name=\"cpuArchitecture\"\n id=\"x86_64\"\n value=\"x86_64\"\n label={t('ai:x86_64')}\n />\n </FlexItem>\n <FlexItem spacer={{ default: 'spacer4xl' }} />\n <FlexItem>\n <RadioField\n name=\"cpuArchitecture\"\n id=\"arm64\"\n value=\"arm64\"\n label={<>{t('ai:arm64')}&nbsp;</>}\n />\n </FlexItem>\n </Flex>\n </FormGroup>\n <RichInputField\n label={t('ai:Location')}\n name=\"location\"\n isRequired\n richValidationMessages={locationValidationMessages(t)}\n placeholder={t('ai:Enter geographic location for the environment')}\n helperText={t(\n \"ai:Used to describe hosts' physical location. Helps for quicker host selection during cluster creation.\",\n )}\n />\n <LabelField label={t('ai:Labels')} name=\"labels\" />\n <PullSecretField isOcm={false} />\n <UploadSSH />\n <ProxyFields />\n <CheckboxField\n label={t('ai:Add your own NTP (Network Time Protocol) sources')}\n name=\"enableNtpSources\"\n helperText={\n <p>\n {t(\n 'ai:Configure your own NTP sources to synchronize the time between the hosts that will be added to this infrastructure environment.',\n )}\n </p>\n }\n body={\n values.enableNtpSources && (\n <Grid hasGutter>\n <AdditionalNTPSourcesField\n name=\"additionalNtpSources\"\n helperText={t(\n 'ai:A comma separated list of IP or domain names of the NTP pools or servers.',\n )}\n />\n </Grid>\n )\n }\n />\n </Form>\n </StackItem>\n </Stack>\n );\n};\n\ntype InfraEnvFormPageProps = InfraEnvFormProps & {\n usedNames: string[];\n // eslint-disable-next-line\n onSubmit?: (values: EnvironmentStepFormValues) => Promise<any>;\n onFinish?: (values: EnvironmentStepFormValues) => void;\n onClose?: VoidFunction;\n formRef: React.Ref<FormikProps<EnvironmentStepFormValues>>;\n};\n\nexport const InfraEnvFormPage: React.FC<InfraEnvFormPageProps> = ({\n usedNames,\n onSubmit,\n onClose,\n onFinish,\n onValuesChanged,\n formRef,\n}) => {\n const [error, setError] = React.useState<string | undefined>();\n const { t } = useTranslation();\n return (\n <Formik\n initialValues={initialValues}\n initialStatus={{ error: null }}\n validate={getRichTextValidation(validationSchema(usedNames, t))}\n onSubmit={async (values: EnvironmentStepFormValues) => {\n try {\n await onSubmit?.(values);\n onFinish?.(values);\n } catch (e) {\n setError(getErrorMessage(e));\n }\n }}\n innerRef={formRef}\n >\n {({ isValid, isSubmitting, submitForm }: FormikProps<EnvironmentStepFormValues>) => (\n <Stack hasGutter>\n <StackItem>\n {onSubmit && onClose ? (\n <Grid hasGutter span={8}>\n <GridItem>\n <Title headingLevel=\"h1\" size={TitleSizes.xl}>\n {t('ai:Configure environment')}\n </Title>\n </GridItem>\n <GridItem>\n <InfraEnvForm onValuesChanged={onValuesChanged} />\n </GridItem>\n </Grid>\n ) : (\n <div className=\"infra-env__form\">\n <InfraEnvForm onValuesChanged={onValuesChanged} />\n </div>\n )}\n </StackItem>\n {error && (\n <StackItem>\n <Alert\n variant={AlertVariant.danger}\n actionClose={<AlertActionCloseButton onClose={() => setError(undefined)} />}\n title={t('ai:Error creating InfraEnv')}\n >\n {error}\n </Alert>\n </StackItem>\n )}\n {onSubmit && onClose && (\n <StackItem>\n <>\n <Button\n variant=\"primary\"\n type=\"submit\"\n isDisabled={!isValid || isSubmitting}\n onClick={submitForm}\n >\n {t('ai:Create')} {isSubmitting && <Spinner isSVG size=\"md\" />}\n </Button>\n <Button variant=\"link\" onClick={onClose} isDisabled={isSubmitting}>\n {t('ai:Cancel')}\n </Button>\n </>\n </StackItem>\n )}\n </Stack>\n )}\n </Formik>\n );\n};\n", "import {\n AgentClusterInstallK8sResource,\n ClusterDeploymentK8sResource,\n InfraEnvK8sResource,\n SecretK8sResource,\n} from '../../types';\nimport { EnvironmentStepFormValues } from './InfraEnvFormPage';\nimport { getClusterDeploymentResource } from '../helpers';\nimport { AGENT_LOCATION_LABEL_KEY } from '../common';\n\nexport const getLabels = (values: EnvironmentStepFormValues) =>\n values.labels.reduce((acc, curr) => {\n const label = curr.split('=');\n acc[label[0]] = label[1];\n return acc;\n }, {});\n\n// TODO(mlibra): This should not be needed once we have late-binding\nexport const getClusterDeploymentForInfraEnv = (\n pullSecretName: string,\n namespace: string,\n values: EnvironmentStepFormValues,\n): ClusterDeploymentK8sResource =>\n getClusterDeploymentResource({\n name: values.name,\n namespace,\n baseDnsDomain: '', // TODO(mlibra): This function is about to be removed anyway\n annotations: getLabels(values),\n pullSecretName,\n });\n\ntype GetAgentClusterInstallProps = {\n clusterDeploymentName?: string;\n namespace: string;\n values: EnvironmentStepFormValues;\n};\n\nexport const getAgentClusterInstall = ({\n clusterDeploymentName,\n namespace,\n values,\n}: GetAgentClusterInstallProps): AgentClusterInstallK8sResource => {\n const obj: AgentClusterInstallK8sResource = {\n apiVersion: 'extensions.hive.openshift.io/v1beta1',\n kind: 'AgentClusterInstall',\n metadata: {\n name: values.name,\n namespace,\n },\n spec: {\n holdInstallation: true,\n clusterDeploymentRef: clusterDeploymentName\n ? {\n name: clusterDeploymentName,\n namespace,\n }\n : {},\n networking: {\n clusterNetwork: [\n {\n cidr: '10.128.0.0/14', // '10.128.0.0/14',\n hostPrefix: 23, // 23,\n },\n ],\n serviceNetwork: ['172.30.0.0/16'],\n },\n provisionRequirements: {\n controlPlaneAgents: 3,\n },\n imageSetRef: {\n name: 'openshift-v4.8.0', // 'openshift-v4.7.0',\n },\n },\n };\n\n if (obj.spec && values.sshPublicKey) {\n obj.spec.sshPublicKey = values.sshPublicKey;\n }\n\n return obj;\n};\n\nexport const getSecret = (\n namespace: string,\n values: EnvironmentStepFormValues,\n): SecretK8sResource => ({\n kind: 'Secret',\n apiVersion: 'v1',\n metadata: {\n name: values.name,\n namespace,\n },\n data: {\n '.dockerconfigjson': btoa(values.pullSecret),\n },\n type: 'kubernetes.io/dockerconfigjson',\n});\n\nexport const getInfraEnv = (\n namespace: string,\n values: EnvironmentStepFormValues,\n): InfraEnvK8sResource => {\n const labels = getLabels(values);\n if (values.location) {\n labels[AGENT_LOCATION_LABEL_KEY] = labels[AGENT_LOCATION_LABEL_KEY] || values.location;\n }\n\n const infraEnv: InfraEnvK8sResource = {\n apiVersion: 'agent-install.openshift.io/v1beta1',\n kind: 'InfraEnv',\n metadata: {\n name: values.name,\n namespace,\n labels: {\n [AGENT_LOCATION_LABEL_KEY]: values.location,\n },\n },\n spec: {\n agentLabels: labels,\n clusterRef: {\n name: values.name,\n namespace,\n },\n pullSecretRef: {\n name: values.name,\n },\n sshAuthorizedKey: values.sshPublicKey,\n },\n status: {\n agentLabelSelector: {\n matchLabels: labels,\n },\n },\n };\n\n if (infraEnv.spec && values.enableProxy) {\n infraEnv.spec.proxy = {\n httpProxy: values.httpProxy,\n httpsProxy: values.httpsProxy,\n noProxy: values.noProxy,\n };\n }\n return infraEnv;\n};\n", "import React from 'react';\nimport { saveAs } from 'file-saver';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { AgentClusterInstallK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype LogsDownloadButtonProps = {\n id: string;\n Component?: React.FC;\n agentClusterInstall?: AgentClusterInstallK8sResource;\n variant?: ButtonVariant;\n};\n\nexport const LogsDownloadButton: React.FC<LogsDownloadButtonProps> = ({\n Component = Button,\n agentClusterInstall,\n id,\n variant,\n}) => {\n const { t } = useTranslation();\n const logsURL = agentClusterInstall?.status?.debugInfo?.logsURL;\n return (\n <Component\n onClick={() => logsURL && saveAs(logsURL, 'logs.tar')}\n isDisabled={!logsURL}\n id={id}\n variant={variant}\n >\n {t('ai:Download Installation Logs')}\n </Component>\n );\n};\n", "import * as Yup from 'yup';\nimport { Cluster, ClusterDefaultConfig } from '../../../common/api';\nimport { HostSubnets, NetworkConfigurationValues } from '../../../common/types/clusters';\nimport {\n hostPrefixValidationSchema,\n hostSubnetValidationSchema,\n ipBlockValidationSchema,\n sshPublicKeyValidationSchema,\n vipValidationSchema,\n} from '../../../common/components/ui';\n\nimport {\n getSubnetFromMachineNetworkCidr,\n getHostSubnets,\n isSubnetInIPv6,\n getDefaultNetworkType,\n} from '../../../common/components/clusterConfiguration/utils';\nimport {\n isSNO,\n selectClusterNetworkCIDR,\n selectClusterNetworkHostPrefix,\n selectMachineNetworkCIDR,\n selectServiceNetworkCIDR,\n} from '../../../common/selectors/clusterSelectors';\nimport { NO_SUBNET_SET } from '../../../common/config';\n\nconst getInitHostSubnet = (\n cluster: Cluster,\n managedNetworkingType: 'userManaged' | 'clusterManaged',\n) => {\n if (!isSNO(cluster) && managedNetworkingType === 'userManaged') {\n return NO_SUBNET_SET;\n }\n const machineNetworkCIDR = selectMachineNetworkCIDR(cluster);\n if (machineNetworkCIDR) {\n return getSubnetFromMachineNetworkCidr(machineNetworkCIDR);\n }\n if (managedNetworkingType === 'clusterManaged') {\n return getHostSubnets(cluster)?.[0]?.subnet;\n }\n};\n\nexport const getNetworkInitialValues = (\n cluster: Cluster,\n defaultNetworkSettings: ClusterDefaultConfig,\n): NetworkConfigurationValues => {\n const managedNetworkingType = cluster.userManagedNetworking ? 'userManaged' : 'clusterManaged';\n const isIPv6 = isSubnetInIPv6(cluster);\n const isSNOCluster = isSNO(cluster);\n\n return {\n clusterNetworkCidr:\n selectClusterNetworkCIDR(cluster) || defaultNetworkSettings.clusterNetworkCidr,\n clusterNetworkHostPrefix:\n selectClusterNetworkHostPrefix(cluster) || defaultNetworkSettings.clusterNetworkHostPrefix,\n serviceNetworkCidr:\n selectServiceNetworkCIDR(cluster) || defaultNetworkSettings.serviceNetworkCidr,\n apiVip: cluster.apiVip || '',\n ingressVip: cluster.ingressVip || '',\n sshPublicKey: cluster.sshPublicKey || '',\n hostSubnet: getInitHostSubnet(cluster, managedNetworkingType) || NO_SUBNET_SET,\n vipDhcpAllocation: cluster.vipDhcpAllocation,\n managedNetworkingType,\n networkType: cluster.networkType || getDefaultNetworkType(isSNOCluster, isIPv6),\n };\n};\n\nexport const getNetworkConfigurationValidationSchema = (\n initialValues: NetworkConfigurationValues,\n hostSubnets: HostSubnets,\n) =>\n Yup.lazy<NetworkConfigurationValues>((values) =>\n Yup.object<NetworkConfigurationValues>().shape({\n clusterNetworkHostPrefix: hostPrefixValidationSchema(values.clusterNetworkCidr),\n clusterNetworkCidr: ipBlockValidationSchema(values.serviceNetworkCidr),\n serviceNetworkCidr: ipBlockValidationSchema(values.clusterNetworkCidr),\n apiVip: vipValidationSchema(hostSubnets, values, initialValues.apiVip),\n ingressVip: vipValidationSchema(hostSubnets, values, initialValues.ingressVip),\n sshPublicKey: sshPublicKeyValidationSchema,\n hostSubnet: hostSubnetValidationSchema,\n }),\n );\n", "import React from 'react';\nimport {\n Alert,\n AlertActionLink,\n AlertVariant,\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n List,\n ListItem,\n} from '@patternfly/react-core';\nimport { Cluster } from '../../../common/api/types';\nimport { ValidationsInfo } from '../../../common/types/clusters';\nimport { clusterValidationGroupLabels } from '../../../common/config/constants';\nimport { filterValidationsInfoByStatus } from '../../../common/components/clusterConfiguration/utils';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nfunction getCardTitle(clusterStatus: Cluster['status'], t: TFunction) {\n switch (clusterStatus) {\n case 'pending-for-input':\n case 'insufficient':\n return t('ai:The cluster is not ready for installation.');\n default:\n return t('ai:Cluster configured and ready for installation.');\n }\n}\n\nfunction getAlertVariant(clusterStatus: Cluster['status']) {\n switch (clusterStatus) {\n case 'pending-for-input':\n case 'insufficient':\n return AlertVariant.danger;\n default:\n return AlertVariant.success;\n }\n}\n\nfunction getContinueClusterConfigurationLinkLabel(clusterStatus: Cluster['status'], t: TFunction) {\n switch (clusterStatus) {\n case 'pending-for-input':\n case 'insufficient':\n return t('ai:Continue cluster configuration');\n default:\n return t('ai:Go to cluster configuration to start the installation');\n }\n}\n\ntype ClusterDeploymentValidationsOverviewProps = {\n validationsInfo: ValidationsInfo;\n clusterStatus: [Cluster['status'], Cluster['statusInfo']];\n onContinueClusterConfiguration: () => void;\n};\n\nconst ClusterDeploymentValidationsOverview = ({\n validationsInfo,\n clusterStatus,\n onContinueClusterConfiguration,\n}: ClusterDeploymentValidationsOverviewProps) => {\n const { t } = useTranslation();\n const [status] = clusterStatus;\n const title = getCardTitle(status, t);\n const filteredValidationsInfo = filterValidationsInfoByStatus(validationsInfo);\n return (\n <Alert\n isExpandable={['pending-for-input', 'insufficient'].includes(status)}\n isInline\n variant={getAlertVariant(status)}\n title={title}\n actionLinks={\n <>\n <AlertActionLink onClick={onContinueClusterConfiguration}>\n {getContinueClusterConfigurationLinkLabel(status, t)}\n </AlertActionLink>\n </>\n }\n >\n {!!Object.entries(filteredValidationsInfo).length && (\n <DescriptionList>\n {Object.entries(filteredValidationsInfo).map(([group, validations]) => {\n return (\n <DescriptionListGroup key={group}>\n <DescriptionListTerm>{clusterValidationGroupLabels(t)[group]}</DescriptionListTerm>\n <DescriptionListDescription>\n {validations && (\n <List>\n {validations.map((validation) => (\n <ListItem key={validation.id}>{validation.message}</ListItem>\n ))}\n </List>\n )}\n </DescriptionListDescription>\n </DescriptionListGroup>\n );\n })}\n </DescriptionList>\n )}\n </Alert>\n );\n};\n\nexport default ClusterDeploymentValidationsOverview;\n", "import React from 'react';\nimport {\n Button,\n ButtonVariant,\n Card,\n CardBody,\n CardExpandableContent,\n CardHeader,\n CardTitle,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport ClusterPropertiesList from '../../../common/components/clusterDetail/ClusterPropertiesList';\nimport { getAICluster } from '../helpers/toAssisted';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n} from '../../types';\nimport ClusterDeploymentCredentials from './ClusterDeploymentCredentials';\nimport { shouldShowClusterCredentials, shouldShowClusterInstallationProgress } from './helpers';\nimport { EventsModalButton } from '../../../common/components/ui/eventsModal';\nimport ClusterDeploymentDetailsTable from './ClusterDeploymentDetailsTable';\nimport { FetchSecret } from './types';\nimport { getClusterProperties, getConsoleUrl } from '../helpers/clusterDeployment';\nimport ClusterDeploymentKubeconfigDownload from './ClusterDeploymentKubeconfigDownload';\nimport { EventListFetchProps } from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterDeploymentDetailsProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n fetchSecret: FetchSecret;\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n};\n\nconst ClusterDeploymentDetails: React.FC<ClusterDeploymentDetailsProps> = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n fetchSecret,\n onFetchEvents,\n}) => {\n const [progressCardExpanded, setProgressCardExpanded] = React.useState(true);\n const [inventoryCardExpanded, setInventoryCardExpanded] = React.useState(true);\n const [detailsCardExpanded, setDetailsCardExpanded] = React.useState(true);\n\n const clusterAgents = agents.filter(\n (a) =>\n a.spec.clusterDeploymentName?.name === clusterDeployment.metadata?.name &&\n a.spec.clusterDeploymentName?.namespace === clusterDeployment.metadata?.namespace,\n );\n\n const cluster = getAICluster({ clusterDeployment, agentClusterInstall, agents: clusterAgents });\n\n const clusterProperties = React.useMemo(\n () => getClusterProperties(clusterDeployment, agentClusterInstall),\n [clusterDeployment, agentClusterInstall],\n );\n const { t } = useTranslation();\n return (\n <Stack hasGutter>\n {shouldShowClusterInstallationProgress(agentClusterInstall) && (\n <StackItem>\n <Card id=\"cluster-installation-progress-card\" isExpanded={progressCardExpanded}>\n <CardHeader\n onExpand={() => setProgressCardExpanded(!progressCardExpanded)}\n toggleButtonProps={{\n id: 'progress-card-toggle-button',\n 'aria-label': 'Cluster installation process',\n 'aria-labelledby': 'titleId progress-card-toggle-button',\n 'aria-expanded': progressCardExpanded,\n }}\n >\n <CardTitle id=\"titleId\">{t('ai:Cluster installation process')}</CardTitle>\n </CardHeader>\n <CardExpandableContent>\n <CardBody>\n <Stack hasGutter>\n {shouldShowClusterCredentials(agentClusterInstall) && (\n <StackItem>\n <ClusterDeploymentCredentials\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={clusterAgents}\n fetchSecret={fetchSecret}\n consoleUrl={getConsoleUrl(clusterDeployment)}\n />\n </StackItem>\n )}\n <StackItem>\n <ClusterDeploymentKubeconfigDownload\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n fetchSecret={fetchSecret}\n />{' '}\n <EventsModalButton\n id=\"cluster-events-button\"\n entityKind=\"cluster\"\n cluster={cluster}\n title={t('ai:Cluster Events')}\n variant={ButtonVariant.link}\n style={{ textAlign: 'right' }}\n onFetchEvents={onFetchEvents}\n ButtonComponent={Button}\n >\n {t('ai:View Cluster Events')}\n </EventsModalButton>\n </StackItem>\n </Stack>\n </CardBody>\n </CardExpandableContent>\n </Card>\n </StackItem>\n )}\n <StackItem>\n <Card id=\"cluster-inventory-card\" isExpanded={inventoryCardExpanded}>\n <CardHeader\n onExpand={() => setInventoryCardExpanded(!inventoryCardExpanded)}\n toggleButtonProps={{\n id: 'inventory-card-toggle-button',\n 'aria-label': 'Hosts inventory',\n 'aria-labelledby': 'titleId inventory-card-toggle-button',\n 'aria-expanded': inventoryCardExpanded,\n }}\n >\n <CardTitle id=\"titleId\">{t('ai:Hosts inventory')}</CardTitle>\n </CardHeader>\n <CardExpandableContent>\n <CardBody>\n <ClusterDeploymentDetailsTable\n agents={clusterAgents}\n agentClusterInstall={agentClusterInstall}\n />\n </CardBody>\n </CardExpandableContent>\n </Card>\n </StackItem>\n <StackItem>\n <Card id=\"cluster-details-card\" isExpanded={detailsCardExpanded}>\n <CardHeader\n onExpand={() => setDetailsCardExpanded(!detailsCardExpanded)}\n toggleButtonProps={{\n id: 'details-card-toggle-button',\n 'aria-label': 'Details',\n 'aria-labelledby': 'titleId details-card-toggle-button',\n 'aria-expanded': detailsCardExpanded,\n }}\n >\n <CardTitle id=\"titleId\">{t('ai:Details')}</CardTitle>\n </CardHeader>\n <CardExpandableContent>\n <CardBody>\n <ClusterPropertiesList\n leftItems={[\n clusterProperties.name,\n clusterProperties.openshiftVersion,\n clusterProperties.clusterId,\n clusterProperties.installedTimestamp,\n clusterProperties.baseDnsDomain,\n ]}\n rightItems={[\n clusterProperties.apiVip,\n clusterProperties.ingressVip,\n clusterProperties.clusterNetworkCidr,\n clusterProperties.clusterNetworkHostPrefix,\n clusterProperties.serviceNetworkCidr,\n ]}\n />\n </CardBody>\n </CardExpandableContent>\n </Card>\n </StackItem>\n </Stack>\n );\n};\n\nexport default ClusterDeploymentDetails;\n", "import React from 'react';\nimport { ClusterCredentials, Credentials } from '../../../common';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { ClusterDeploymentK8sResource } from '../../types/k8s/cluster-deployment';\nimport { getAICluster } from '../helpers/toAssisted';\nimport { FetchSecret } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterDeploymentCredentialsProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n consoleUrl?: string;\n fetchSecret: FetchSecret;\n};\n\nconst ClusterDeploymentCredentials = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n consoleUrl,\n fetchSecret,\n}: ClusterDeploymentCredentialsProps) => {\n const [credentials, setCredentials] = React.useState<Credentials | undefined>();\n const [isError, setIsError] = React.useState(false);\n\n const cluster = getAICluster({ clusterDeployment, agentClusterInstall, agents });\n\n const adminPasswordSecretRefName =\n agentClusterInstall.spec?.clusterMetadata?.adminPasswordSecretRef?.name ||\n clusterDeployment.spec?.clusterMetadata?.adminPasswordSecretRef?.name;\n const namespace = clusterDeployment.metadata?.namespace;\n const { t } = useTranslation();\n React.useEffect(() => {\n const fetchCredentials = async () => {\n if (adminPasswordSecretRefName && namespace) {\n try {\n const secret = await fetchSecret(adminPasswordSecretRefName, namespace);\n setCredentials({\n username: atob(secret?.data?.username || ''),\n password: atob(secret?.data?.password || ''),\n consoleUrl,\n });\n } catch (e) {\n setIsError(true);\n console.error(t('ai:Failed to fetch adminPasswordSecret secret.'), e);\n }\n }\n };\n\n void fetchCredentials();\n }, [adminPasswordSecretRefName, namespace, fetchSecret, consoleUrl, t]);\n\n return <ClusterCredentials cluster={cluster} credentials={credentials} error={isError} />;\n};\n\nexport default ClusterDeploymentCredentials;\n", "import * as React from 'react';\nimport { AgentClusterInstallK8sResource, AgentK8sResource } from '../../types';\nimport DefaultEmptyState from '../../../common/components/ui/uiState/EmptyState';\nimport { ConnectedIcon } from '@patternfly/react-icons';\nimport { infraEnvColumn, agentStatusColumn, useAgentsTable } from '../Agent/tableUtils';\nimport {\n cpuCoresColumn,\n disksColumn,\n hostnameColumn,\n memoryColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport HostsTable, { DefaultExpandComponent } from '../../../common/components/hosts/HostsTable';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport const getAgentId = (agent: AgentK8sResource) => agent.metadata?.uid as string;\n\nexport const AgentTableEmptyState = () => {\n const { t } = useTranslation();\n return (\n <DefaultEmptyState\n icon={ConnectedIcon}\n title={t('ai:Waiting for hosts...')}\n content={t('ai:Hosts may take a few minutes to appear here after booting.')}\n />\n );\n};\n\nexport type ClusterDeploymentDetailsTableProps = {\n agents: AgentK8sResource[];\n agentClusterInstall: AgentClusterInstallK8sResource;\n};\n\nconst ClusterDeploymentDetailsTable: React.FC<ClusterDeploymentDetailsTableProps> = ({\n agents,\n agentClusterInstall,\n}) => {\n const agentClusterInstalls = React.useMemo(() => [agentClusterInstall], [agentClusterInstall]);\n const [hosts, , actionResolver] = useAgentsTable({ agents, agentClusterInstalls });\n const { t } = useTranslation();\n const content = React.useMemo(\n () => [\n hostnameColumn(t),\n roleColumn(t),\n agentStatusColumn({\n agents,\n t,\n }),\n infraEnvColumn(agents, t),\n cpuCoresColumn,\n memoryColumn,\n disksColumn,\n ],\n [agents, t],\n );\n\n const paginationProps = usePagination(agents.length);\n return (\n <HostsTable\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n ExpandComponent={DefaultExpandComponent}\n {...paginationProps}\n >\n <AgentTableEmptyState />\n </HostsTable>\n );\n};\n\nexport default ClusterDeploymentDetailsTable;\n", "import React from 'react';\nimport { saveAs } from 'file-saver';\nimport KubeconfigDownload from '../../../common/components/clusterDetail/KubeconfigDownload';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { ClusterDeploymentK8sResource } from '../../types/k8s/cluster-deployment';\nimport { getClusterStatus } from '../helpers/status';\nimport { FetchSecret } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterDeploymentKubeconfigDownloadProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n fetchSecret: FetchSecret;\n};\n\nconst ClusterDeploymentKubeconfigDownload = ({\n clusterDeployment,\n agentClusterInstall,\n fetchSecret,\n}: ClusterDeploymentKubeconfigDownloadProps) => {\n const [clusterStatus] = getClusterStatus(agentClusterInstall);\n const { t } = useTranslation();\n const handleKubeconfigDownload = async () => {\n const kubeconfigSecretName =\n agentClusterInstall.spec?.clusterMetadata?.adminKubeconfigSecretRef?.name ||\n clusterDeployment.spec?.clusterMetadata?.adminKubeconfigSecretRef?.name;\n const kubeconfigSecretNamespace = clusterDeployment.metadata?.namespace;\n if (kubeconfigSecretName && kubeconfigSecretNamespace) {\n try {\n const kubeconfigSecret = await fetchSecret(kubeconfigSecretName, kubeconfigSecretNamespace);\n const kubeconfig = kubeconfigSecret.data?.kubeconfig;\n\n if (!kubeconfig) throw new Error(t('ai:Kubeconfig is empty.'));\n\n const blob = new Blob([atob(kubeconfig)], { type: 'text/plain;charset=utf-8' });\n saveAs(blob, 'kubeconfig.yaml');\n } catch (e) {\n console.error('Failed to fetch kubeconfig secret.', e);\n }\n }\n };\n\n return (\n <KubeconfigDownload\n handleDownload={handleKubeconfigDownload}\n clusterId={clusterDeployment.metadata?.uid || ''}\n status={clusterStatus}\n />\n );\n};\n\nexport default ClusterDeploymentKubeconfigDownload;\n", "import React from 'react';\nimport ClusterProgress from '../../../common/components/clusterDetail/ClusterProgress';\nimport ClusterProgressItems from '../../../common/components/clusterDetail/ClusterProgressItems';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { ClusterDeploymentK8sResource } from '../../types/k8s/cluster-deployment';\nimport { EventListFetchProps } from '../../../common';\nimport { getAICluster } from '../helpers/toAssisted';\nimport { Stack, StackItem } from '@patternfly/react-core';\n\ntype ClusterDeploymentProgressProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n onFetchEvents: EventListFetchProps['onFetchEvents'];\n fallbackEventsURL?: string;\n};\n\nconst ClusterDeploymentProgress = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n onFetchEvents,\n fallbackEventsURL,\n}: ClusterDeploymentProgressProps) => {\n const cluster = getAICluster({ clusterDeployment, agentClusterInstall, agents });\n return (\n <Stack hasGutter>\n <StackItem>\n <ClusterProgress\n totalPercentage={agentClusterInstall.status?.progress?.totalPercentage || 0}\n cluster={cluster}\n />\n </StackItem>\n <StackItem>\n <ClusterProgressItems\n cluster={cluster}\n onFetchEvents={onFetchEvents}\n fallbackEventsURL={fallbackEventsURL}\n />\n </StackItem>\n </Stack>\n );\n};\n\nexport default ClusterDeploymentProgress;\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 * as React from 'react';\nimport classNames from 'classnames';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport { AlertsContextProvider, LoadingState } from '../../../common';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentDetailsStep from './ClusterDeploymentDetailsStep';\nimport ClusterDeploymentNetworkingStep from './ClusterDeploymentNetworkingStep';\nimport ClusterDeploymentHostSelectionStep from './ClusterDeploymentHostSelectionStep';\nimport { ClusterDeploymentWizardProps, ClusterDeploymentWizardStepsType } from './types';\nimport ClusterDeploymentHostsDiscoveryStep from './ClusterDeploymentHostsDiscoveryStep';\nimport { ACMFeatureSupportLevelProvider } from '../featureSupportLevels';\nimport ClusterDeploymentReviewStep from './ClusterDeploymentReviewStep';\nimport { YamlPreview, useYamlPreview } from '../YamlPreview';\n\nconst ClusterDeploymentWizard: React.FC<ClusterDeploymentWizardProps> = ({\n className,\n onSaveDetails,\n onSaveNetworking,\n onSaveHostsSelection,\n onClose,\n onFinish,\n hostActions,\n usedClusterNames,\n fetchSecret,\n clusterDeployment,\n agentClusterInstall,\n agents,\n clusterImages,\n aiConfigMap,\n infraEnv,\n fetchInfraEnv,\n initialStep,\n isPreviewOpen,\n setPreviewOpen,\n fetchManagedClusters,\n fetchKlusterletAddonConfig,\n onSaveISOParams,\n onCreateBMH,\n ...rest\n}) => {\n const [currentStepId, setCurrentStepId] = React.useState<ClusterDeploymentWizardStepsType>(\n initialStep || 'cluster-details',\n );\n\n const isAIFlow = infraEnv;\n\n const { code, loadingResources } = useYamlPreview({\n agentClusterInstall,\n clusterDeployment,\n fetchSecret,\n fetchManagedClusters,\n fetchKlusterletAddonConfig,\n });\n\n const renderCurrentStep = () => {\n const stepId: ClusterDeploymentWizardStepsType = !clusterDeployment\n ? 'cluster-details'\n : currentStepId;\n\n switch (stepId) {\n case 'hosts-selection':\n if (agentClusterInstall?.metadata?.name) {\n return (\n <ClusterDeploymentHostSelectionStep\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n onClose={onClose}\n onSaveHostsSelection={onSaveHostsSelection}\n agents={agents}\n aiConfigMap={aiConfigMap}\n onEditRole={hostActions.onEditRole}\n onSetInstallationDiskId={hostActions.onSetInstallationDiskId}\n />\n );\n }\n return <LoadingState />;\n case 'hosts-discovery':\n if (isAIFlow) {\n return onSaveISOParams && onCreateBMH ? (\n <ClusterDeploymentHostsDiscoveryStep\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n bareMetalHosts={[] /* TODO(mlibra) */}\n aiConfigMap={aiConfigMap}\n infraEnv={infraEnv}\n fetchSecret={fetchSecret}\n onClose={onClose}\n onChangeBMHHostname={(bmh, hostname) => {\n console.log('onChangeBMHHostname is not implemented: ', hostname);\n return Promise.resolve(bmh);\n }}\n onEditRole={hostActions.onEditRole}\n onSetInstallationDiskId={hostActions.onSetInstallationDiskId}\n onDeleteHost={hostActions.onDeleteHost}\n onSaveISOParams={onSaveISOParams}\n onCreateBMH={onCreateBMH}\n {...rest}\n />\n ) : (\n <LoadingState />\n );\n }\n return <LoadingState />;\n case 'networking':\n return (\n <ClusterDeploymentNetworkingStep\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n onSaveNetworking={onSaveNetworking}\n onClose={onClose}\n onEditHost={hostActions.onEditHost}\n onEditRole={hostActions.onEditRole}\n fetchInfraEnv={fetchInfraEnv}\n isPreviewOpen={isPreviewOpen}\n />\n );\n case 'review':\n return (\n <ClusterDeploymentReviewStep\n onFinish={onFinish}\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n onClose={onClose}\n clusterImages={clusterImages}\n infraEnv={infraEnv}\n />\n );\n case 'cluster-details':\n default:\n return (\n <ClusterDeploymentDetailsStep\n clusterImages={clusterImages}\n usedClusterNames={usedClusterNames}\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n onSaveDetails={onSaveDetails}\n onClose={onClose}\n isPreviewOpen={isPreviewOpen}\n infraEnv={infraEnv}\n />\n );\n }\n };\n\n return (\n <Grid style={{ height: '100%' }}>\n <GridItem span={isPreviewOpen ? 7 : 12}>\n <AlertsContextProvider>\n <ACMFeatureSupportLevelProvider clusterImages={clusterImages} isEditClusterFlow={true}>\n <ClusterDeploymentWizardContext.Provider\n value={{\n currentStepId,\n setCurrentStepId,\n clusterDeployment /* Hotfix: agentClusterInstall, agents */,\n }}\n >\n <div className={classNames('pf-c-wizard', className)}>{renderCurrentStep()}</div>\n </ClusterDeploymentWizardContext.Provider>\n </ACMFeatureSupportLevelProvider>\n </AlertsContextProvider>\n </GridItem>\n {isPreviewOpen && (\n <GridItem span={5}>\n <YamlPreview code={code} setPreviewOpen={setPreviewOpen} loading={loadingResources}>\n {`${clusterDeployment.metadata?.name || ''} cluster`}\n </YamlPreview>\n </GridItem>\n )}\n </Grid>\n );\n};\n\nexport default ClusterDeploymentWizard;\n", "import React from 'react';\nimport { ClusterDeploymentK8sResource } from '../../types';\nimport { ClusterDeploymentWizardStepsType } from './types';\n\ntype ClusterDeploymentWizardContextType = {\n currentStepId: ClusterDeploymentWizardStepsType;\n setCurrentStepId: (stepId: ClusterDeploymentWizardStepsType) => void;\n clusterDeployment?: ClusterDeploymentK8sResource;\n};\n\nconst ClusterDeploymentWizardContext = React.createContext<ClusterDeploymentWizardContextType>({\n currentStepId: 'cluster-details',\n setCurrentStepId: () => {\n console.error(\n 'Tried to use ClusterDeploymentWizardContext but there was no provider rendered.',\n );\n },\n});\n\nexport default ClusterDeploymentWizardContext;\n", "import React from 'react';\nimport { Formik } from 'formik';\nimport { Lazy } from 'yup';\nimport { Grid, GridItem } from '@patternfly/react-core';\n\nimport {\n useAlerts,\n getClusterDetailsInitialValues,\n getClusterDetailsValidationSchema,\n ClusterWizardStepHeader,\n ClusterDetailsValues,\n useFeatureSupportLevel,\n getRichTextValidation,\n} from '../../../common';\n\nimport { ClusterDeploymentDetailsStepProps, ClusterDeploymentDetailsValues } from './types';\nimport ClusterDeploymentWizardFooter from './ClusterDeploymentWizardFooter';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentWizardStep from './ClusterDeploymentWizardStep';\nimport { getAICluster, getOCPVersions } from '../helpers';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n InfraEnvK8sResource,\n} from '../../types';\nimport ClusterDeploymentDetailsForm from './ClusterDeploymentDetailsForm';\nimport { ClusterImageSetK8sResource } from '../../types/k8s/cluster-image-set';\nimport { isCIMFlow, getGridSpans } from './helpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype UseDetailsFormikArgs = {\n clusterImages: ClusterImageSetK8sResource[];\n usedClusterNames: string[];\n clusterDeployment?: ClusterDeploymentK8sResource;\n agentClusterInstall?: AgentClusterInstallK8sResource;\n agents?: AgentK8sResource[];\n defaultBaseDomain?: string;\n pullSecret?: string;\n infraEnv?: InfraEnvK8sResource;\n};\n\nexport const useDetailsFormik = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n clusterImages,\n usedClusterNames,\n defaultBaseDomain,\n pullSecret,\n infraEnv,\n}: UseDetailsFormikArgs): [ClusterDetailsValues, Lazy] => {\n const { t } = useTranslation();\n const featureSupportLevels = useFeatureSupportLevel();\n const ocpVersions = getOCPVersions(clusterImages);\n const cluster = React.useMemo(\n () =>\n clusterDeployment && agentClusterInstall\n ? getAICluster({\n clusterDeployment,\n agentClusterInstall,\n agents,\n infraEnv,\n })\n : undefined,\n [agentClusterInstall, clusterDeployment, agents, infraEnv],\n );\n const initialValues = React.useMemo(\n () =>\n getClusterDetailsInitialValues({\n managedDomains: [], // not supported\n cluster,\n ocpVersions,\n baseDomain: defaultBaseDomain,\n pullSecret,\n }),\n [], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const validationSchema = React.useMemo(\n () =>\n getClusterDetailsValidationSchema({\n usedClusterNames,\n featureSupportLevels,\n pullSecretSet: true,\n ocpVersions,\n validateUniqueName: true,\n t,\n }),\n [usedClusterNames, ocpVersions, featureSupportLevels, t],\n );\n\n return [initialValues, validationSchema];\n};\n\nconst ClusterDeploymentDetailsStep: React.FC<ClusterDeploymentDetailsStepProps> = ({\n clusterImages,\n clusterDeployment,\n agentClusterInstall,\n agents,\n usedClusterNames,\n onSaveDetails,\n onClose,\n pullSecret,\n isPreviewOpen,\n infraEnv,\n}) => {\n const { addAlert } = useAlerts();\n const { setCurrentStepId } = React.useContext(ClusterDeploymentWizardContext);\n const { t } = useTranslation();\n const [initialValues, validationSchema] = useDetailsFormik({\n clusterDeployment,\n agentClusterInstall,\n agents,\n clusterImages,\n usedClusterNames,\n infraEnv,\n });\n const next = () =>\n isCIMFlow(clusterDeployment)\n ? setCurrentStepId('hosts-selection')\n : setCurrentStepId('hosts-discovery');\n\n const handleSubmit = async (values: ClusterDeploymentDetailsValues) => {\n try {\n await onSaveDetails(values);\n next();\n } catch (error) {\n addAlert({\n title: t('ai:Failed to save ClusterDeployment'),\n message: error as string,\n });\n }\n };\n\n return (\n <Formik\n initialValues={initialValues}\n validate={getRichTextValidation(validationSchema)}\n onSubmit={handleSubmit}\n >\n {({ submitForm, isSubmitting, isValid, isValidating, dirty }) => {\n const handleOnNext = () => {\n if (dirty) {\n void submitForm();\n } else {\n next();\n }\n };\n\n const footer = (\n <ClusterDeploymentWizardFooter\n agentClusterInstall={agentClusterInstall}\n isSubmitting={isSubmitting}\n isNextDisabled={!isValid || isValidating || isSubmitting}\n onNext={handleOnNext}\n onCancel={onClose}\n />\n );\n\n const gridSpans = getGridSpans(isPreviewOpen);\n\n return (\n <ClusterDeploymentWizardStep footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Cluster Details</ClusterWizardStepHeader>\n </GridItem>\n <GridItem {...gridSpans}>\n <ClusterDeploymentDetailsForm\n agentClusterInstall={agentClusterInstall}\n clusterDeployment={clusterDeployment}\n clusterImages={clusterImages}\n pullSecret={pullSecret}\n />\n </GridItem>\n </Grid>\n </ClusterDeploymentWizardStep>\n );\n }}\n </Formik>\n );\n};\n\nexport default ClusterDeploymentDetailsStep;\n", "import React from 'react';\nimport { Alert, AlertGroup, AlertVariant } from '@patternfly/react-core';\nimport {\n Alerts,\n WizardFooter,\n useAlerts,\n WizardFooterGenericProps,\n ClusterWizardStepValidationsAlert,\n} from '../../../common';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport { ClusterWizardStepHostStatusDeterminationObject } from '../../../common/types/hosts';\nimport { ValidationsInfo } from '../../../common/types/clusters';\nimport { Cluster } from '../../../common/api/types';\nimport { ClusterWizardStepsType, wizardStepsValidationsMap } from './wizardTransition';\nimport { AgentClusterInstallK8sResource } from '../../types/k8s/agent-cluster-install';\nimport { AgentK8sResource } from '../../types/k8s/agent';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport ValidationsRunningAlert from '../common/ValidationsRunningAlert';\n\ntype ValidationSectionProps = {\n requireProxy?: boolean;\n currentStepId: ClusterWizardStepsType;\n validationsInfo?: ValidationsInfo;\n clusterStatus?: Cluster['status'];\n hosts: ClusterWizardStepHostStatusDeterminationObject[];\n};\n\nconst ValidationSection: React.FC<ValidationSectionProps> = ({\n currentStepId,\n clusterStatus,\n validationsInfo,\n hosts,\n children,\n}) => {\n return (\n <AlertGroup>\n {children}\n {clusterStatus && (\n <ClusterWizardStepValidationsAlert\n currentStepId={currentStepId}\n clusterStatus={clusterStatus}\n hosts={hosts}\n validationsInfo={validationsInfo}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n >\n <ValidationsRunningAlert />\n </ClusterWizardStepValidationsAlert>\n )}\n </AlertGroup>\n );\n};\n\ntype ClusterDeploymentWizardFooterProps = React.ComponentProps<typeof WizardFooter> &\n WizardFooterGenericProps & {\n agentClusterInstall?: AgentClusterInstallK8sResource;\n agents?: AgentK8sResource[];\n showClusterErrors?: boolean;\n onSyncError?: VoidFunction;\n };\n\nconst ClusterDeploymentWizardFooter: React.FC<ClusterDeploymentWizardFooterProps> = ({\n agentClusterInstall,\n agents,\n showClusterErrors,\n children,\n onSyncError,\n isNextDisabled,\n ...rest\n}) => {\n const { alerts } = useAlerts();\n const { currentStepId } = React.useContext(ClusterDeploymentWizardContext);\n const clusterStatus = showClusterErrors\n ? agentClusterInstall?.status?.debugInfo?.state\n : undefined;\n const validationsInfo = showClusterErrors\n ? agentClusterInstall?.status?.validationsInfo\n : undefined;\n const hosts = React.useMemo(\n () =>\n (agents || []).reduce<ClusterWizardStepHostStatusDeterminationObject[]>((result, agent) => {\n const status = agent.status?.debugInfo?.state;\n if (status) {\n result.push({ status, validationsInfo: agent.status?.validationsInfo });\n }\n return result;\n }, []),\n [agents],\n );\n\n const syncError = agentClusterInstall?.status?.conditions?.find(\n (c) => c.type === 'SpecSynced' && c.status === 'False',\n )?.message;\n\n const { t } = useTranslation();\n React.useEffect(() => {\n if (syncError && onSyncError) {\n onSyncError();\n }\n }, [syncError, onSyncError]);\n\n const alertsSection = alerts.length ? <Alerts /> : undefined;\n const errorsSection = (\n <ValidationSection\n currentStepId={currentStepId}\n clusterStatus={clusterStatus}\n validationsInfo={validationsInfo}\n hosts={hosts}\n >\n {syncError && (\n <Alert variant={AlertVariant.danger} title={t('ai:An error occured')} isInline>\n {syncError}\n </Alert>\n )}\n {children}\n </ValidationSection>\n );\n\n return (\n <WizardFooter\n alerts={alertsSection}\n errors={errorsSection}\n isNextDisabled={isNextDisabled || !!syncError}\n {...rest}\n />\n );\n};\n\nexport default ClusterDeploymentWizardFooter;\n", "import * as React from 'react';\nimport { ClusterWizardStep } from '../../../common/components/clusterWizard';\nimport ClusterDeploymentWizardNavigation from './ClusterDeploymentWizardNavigation';\n\ntype ClusterDeploymentWizardStepProps = {\n footer: React.ReactNode;\n};\n\nconst ClusterDeploymentWizardStep: React.FC<ClusterDeploymentWizardStepProps> = (props) => (\n <ClusterWizardStep navigation={<ClusterDeploymentWizardNavigation />} {...props} />\n);\n\nexport default ClusterDeploymentWizardStep;\n", "import React from 'react';\nimport { WizardNav } from '@patternfly/react-core';\nimport { WizardNavItem } from '../../../common';\nimport { wizardStepNames } from './constants';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport { ClusterDeploymentWizardStepsType } from './types';\nimport { isCIMFlow } from './helpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst wizardSteps = Object.keys(wizardStepNames) as ClusterDeploymentWizardStepsType[];\n\nconst ClusterDeploymentWizardNavigation: React.FC<{\n // cluster?: Cluster\n}> = () => {\n const { currentStepId, setCurrentStepId, clusterDeployment } = React.useContext(\n ClusterDeploymentWizardContext,\n );\n const { t } = useTranslation();\n const stepNames = wizardStepNames(t);\n return (\n <WizardNav>\n <WizardNavItem key=\"installation-type\" content=\"Installation type\" step={0} isDisabled />\n <WizardNavItem\n key=\"cluster-details\"\n content={stepNames['cluster-details']}\n isCurrent={currentStepId === 'cluster-details'}\n // isValid={ () => !cluster || canNextHostDiscovery({ cluster }) }\n isDisabled={false}\n step={1}\n onNavItemClick={() => setCurrentStepId('cluster-details')}\n />\n <WizardNavItem key=\"automation\" content=\"Automation\" step={2} isDisabled />\n {isCIMFlow(clusterDeployment) ? (\n <WizardNavItem\n key=\"hosts-selection\"\n content={stepNames['hosts-selection']}\n isDisabled={!wizardSteps.slice(1).includes(currentStepId)}\n // isValid={ () => !cluster || canNextHostDiscovery({ cluster }) }\n isCurrent={currentStepId === 'hosts-selection'}\n step={2}\n onNavItemClick={() => setCurrentStepId('hosts-selection')}\n />\n ) : (\n <WizardNavItem\n key=\"hosts-discovery\"\n content={stepNames['hosts-discovery']}\n isDisabled={!wizardSteps.slice(1).includes(currentStepId)}\n // isValid={ () => !cluster || canNextHostDiscovery({ cluster }) }\n isCurrent={currentStepId === 'hosts-discovery'}\n step={2}\n onNavItemClick={() => setCurrentStepId('hosts-discovery')}\n />\n )}\n <WizardNavItem\n key=\"networking\"\n content={stepNames['networking']}\n isDisabled={!wizardSteps.slice(2).includes(currentStepId)}\n // isValid={ () => !cluster || canNextHostDiscovery({ cluster }) }\n isCurrent={currentStepId === 'networking'}\n step={3}\n onNavItemClick={() => setCurrentStepId('networking')}\n />\n <WizardNavItem\n key=\"review\"\n content={stepNames['review']}\n isDisabled={!wizardSteps.slice(3).includes(currentStepId)}\n // isValid={ () => !cluster || canNextHostDiscovery({ cluster }) }\n isCurrent={currentStepId === 'review'}\n step={4}\n onNavItemClick={() => setCurrentStepId('review')}\n />\n </WizardNav>\n );\n};\n\nexport default ClusterDeploymentWizardNavigation;\n", "import { ClusterDeploymentWizardStepsType } from './types';\nimport { TFunction } from 'i18next';\n\nexport const clusterHostsSelectionLabel = (t: TFunction): { [key in string]: string } => ({\n hostCount: t('ai:Host Count'),\n masterLabels: t('ai:Host Labels'), // used in both masters-only and \"auto-select masters\" contexts\n workerLabels: t('ai:Worker Hosts Labels'),\n});\n\nexport const wizardStepNames = (\n t: TFunction,\n): {\n [key in ClusterDeploymentWizardStepsType]: string;\n} => ({\n 'cluster-details': t('ai:Cluster details'),\n 'hosts-selection': t('ai:Cluster hosts'),\n 'hosts-discovery': t('ai:Cluster hosts'),\n networking: t('ai:Networking'),\n review: t('ai:Review and create'),\n});\n\n// TODO(mlibra): what is the limit???\nexport const HOSTS_MAX_COUNT = 1024;\nexport const HOSTS_MIN_COUNT = 3;\n", "import * as React from 'react';\nimport { Alert, Stack, StackItem } from '@patternfly/react-core';\nimport { AgentClusterInstallK8sResource, ClusterDeploymentK8sResource } from '../../types';\nimport { ClusterImageSetK8sResource } from '../../types/k8s/cluster-image-set';\nimport { getOCPVersions, getSelectedVersion } from '../helpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport {\n ClusterDetailsFormFields,\n ClusterDetailsFormFieldsProps,\n} from './ClusterDetailsFormFields';\n\ntype ClusterDeploymentDetailsFormProps = {\n clusterImages: ClusterImageSetK8sResource[];\n clusterDeployment?: ClusterDeploymentK8sResource;\n agentClusterInstall?: AgentClusterInstallK8sResource;\n pullSecret?: string;\n extensionAfter?: ClusterDetailsFormFieldsProps['extensionAfter'];\n};\n\nconst ClusterDeploymentDetailsForm: React.FC<ClusterDeploymentDetailsFormProps> = ({\n agentClusterInstall,\n clusterDeployment,\n clusterImages,\n pullSecret,\n extensionAfter,\n}) => {\n const ocpVersions = React.useMemo(() => getOCPVersions(clusterImages), [clusterImages]);\n const forceOpenshiftVersion = agentClusterInstall\n ? getSelectedVersion(clusterImages, agentClusterInstall)\n : undefined;\n const isEditFlow = !!clusterDeployment;\n const { t } = useTranslation();\n return (\n <Stack hasGutter>\n {isEditFlow && (\n <StackItem>\n <Alert\n isInline\n variant=\"info\"\n title={t('ai:Some details are not editable after the draft cluster was created.')}\n />\n </StackItem>\n )}\n <StackItem>\n <ClusterDetailsFormFields\n versions={ocpVersions}\n isEditFlow={isEditFlow}\n forceOpenshiftVersion={forceOpenshiftVersion}\n defaultPullSecret={pullSecret}\n extensionAfter={extensionAfter}\n />\n </StackItem>\n </Stack>\n );\n};\n\nexport default ClusterDeploymentDetailsForm;\n", "import * as React from 'react';\nimport { Alert, AlertVariant, FlexItem, Form } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\n\nimport { SNOControlGroup } from '../../../common/components/clusterConfiguration';\nimport { StaticTextField } from '../../../common/components/ui/StaticTextField';\nimport OpenShiftVersionSelect from '../../../common/components/clusterConfiguration/OpenShiftVersionSelect';\nimport { PullSecret } from '../../../common/components/clusters';\nimport { OpenshiftVersionOptionType } from '../../../common/types';\nimport {\n InputField,\n RichInputField,\n acmClusterNameValidationMessages,\n} from '../../../common/components/ui/formik';\nimport { ClusterDetailsValues } from '../../../common/components/clusterWizard/types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport ArmCheckbox from './ArmCheckbox';\n\nexport type ClusterDetailsFormFieldsProps = {\n isEditFlow: boolean;\n forceOpenshiftVersion?: string;\n defaultPullSecret?: string;\n extensionAfter?: { [key: string]: React.ReactElement };\n versions: OpenshiftVersionOptionType[];\n};\n\nexport const BaseDnsHelperText: React.FC<{ name?: string; baseDnsDomain?: string }> = ({\n name,\n baseDnsDomain,\n}) => {\n const { t } = useTranslation();\n return (\n <>\n {t(\n 'ai:All DNS records must be subdomains of this base and include the cluster name. This cannot be changed after cluster installation. The full cluster address will be:',\n )}{' '}\n <br />\n <strong>\n {name || '[Cluster Name]'}.{baseDnsDomain || '[example.com]'}\n </strong>\n </>\n );\n};\n\nexport const ClusterDetailsFormFields: React.FC<ClusterDetailsFormFieldsProps> = ({\n isEditFlow,\n versions,\n defaultPullSecret,\n forceOpenshiftVersion,\n extensionAfter,\n}) => {\n const { values } = useFormikContext<ClusterDetailsValues>();\n const { name, baseDnsDomain, highAvailabilityMode } = values;\n const nameInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n nameInputRef.current?.focus();\n }, []);\n const atListOneDiskEncryptionEnableOn =\n values.enableDiskEncryptionOnMasters || values.enableDiskEncryptionOnWorkers;\n\n const { t } = useTranslation();\n return (\n <Form id=\"wizard-cluster-details__form\">\n {isEditFlow ? (\n <StaticTextField name=\"name\" label={t('ai:Cluster name')} isRequired>\n {name}\n </StaticTextField>\n ) : (\n <RichInputField\n ref={nameInputRef}\n label={t('ai:Cluster name')}\n name=\"name\"\n placeholder={t('ai:Enter cluster name')}\n richValidationMessages={acmClusterNameValidationMessages(t)}\n isRequired\n />\n )}\n {extensionAfter?.['name'] && extensionAfter['name']}\n {isEditFlow ? (\n <StaticTextField\n name=\"baseDnsDomain\"\n label={t('ai:Base domain')}\n helperText={<BaseDnsHelperText name={name} baseDnsDomain={baseDnsDomain} />}\n isRequired\n >\n {baseDnsDomain}\n </StaticTextField>\n ) : (\n <InputField\n label={t('ai:Base domain')}\n name=\"baseDnsDomain\"\n helperText={<BaseDnsHelperText name={name} baseDnsDomain={baseDnsDomain} />}\n placeholder=\"example.com\"\n isRequired\n />\n )}\n {forceOpenshiftVersion ? (\n <StaticTextField name=\"openshiftVersion\" label=\"OpenShift version\" isRequired>\n {t('ai:OpenShift')} {forceOpenshiftVersion}\n </StaticTextField>\n ) : (\n <OpenShiftVersionSelect versions={versions} />\n )}\n <SNOControlGroup versions={versions} highAvailabilityMode={highAvailabilityMode} />\n <ArmCheckbox versions={versions} />\n {extensionAfter?.['openshiftVersion'] && extensionAfter['openshiftVersion']}\n {!isEditFlow && <PullSecret defaultPullSecret={defaultPullSecret} />}\n {extensionAfter?.['pullSecret'] && extensionAfter['pullSecret']}\n {/* <DiskEncryptionControlGroup\n values={values}\n isDisabled={isPullSecretSet}\n isSNO={isSNO({ highAvailabilityMode })}\n /> */}\n {atListOneDiskEncryptionEnableOn && values.diskEncryptionMode === 'tpmv2' && (\n <Alert\n variant={AlertVariant.warning}\n isInline\n title={\n <FlexItem>\n {t(\n 'ai:To use this encryption method, enable TPMv2 encryption in the BIOS of each selected host.',\n )}\n </FlexItem>\n }\n />\n )}\n {atListOneDiskEncryptionEnableOn && values.diskEncryptionMode === 'tang' && (\n <Alert\n variant={AlertVariant.warning}\n isInline\n title={\n <FlexItem>\n {t(\n 'ai:The use of Tang encryption mode to encrypt your disks is only supported for bare metal or vSphere installations on user-provisioned infrastructure.',\n )}\n </FlexItem>\n }\n />\n )}\n </Form>\n );\n};\n", "import * as React from 'react';\nimport { Checkbox, 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 { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst Label = ({ version }: { version: string }) => {\n const { t } = useTranslation();\n return (\n <>\n {t('ai:Use arm64 CPU architecture')}{' '}\n <PopoverIcon\n noVerticalAlign\n bodyContent={\n <p>\n {t(\n 'ai:Check this option if you want to use the arm64 CPU architecture instead of the default x86_64 CPU architecture. Please note that some features will not be available.',\n )}\n </p>\n }\n />\n <FeatureSupportLevelBadge featureId=\"ARM64_ARCHITECTURE\" openshiftVersion={version} />\n </>\n );\n};\n\ntype ArmCheckboxProps = { versions: OpenshiftVersionOptionType[] };\n\nconst ArmCheckbox: React.FC<ArmCheckboxProps> = ({ versions }) => {\n const { t } = useTranslation();\n const {\n values: { openshiftVersion },\n } = useFormikContext<ClusterCreateParams>();\n const [{ name, value }, , { setValue }] = useField<CpuArchitecture>('cpuArchitecture');\n const fieldId = getFieldId(name, 'input');\n\n const featureSupportLevelContext = useFeatureSupportLevel();\n const isSupportedVersionAvailable = !!versions.find((version) =>\n featureSupportLevelContext.isFeatureSupported(version.value, 'ARM64_ARCHITECTURE'),\n );\n\n const prevVersionRef = React.useRef(openshiftVersion);\n const handleChange = 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 handleChange(false);\n }\n prevVersionRef.current = openshiftVersion;\n }, [openshiftVersion, handleChange, 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 <Checkbox\n id={fieldId}\n name={name}\n isDisabled={featureSupportLevelContext.isFeatureDisabled(\n openshiftVersion,\n 'ARM64_ARCHITECTURE',\n )}\n label={<Label version={openshiftVersion} />}\n aria-describedby={`${fieldId}-helper`}\n description={\n <HelperText fieldId={fieldId}>\n {t('ai:Make sure all the hosts are using arm64 CPU architecture.')}\n </HelperText>\n }\n isChecked={isArmArchitecture({ cpuArchitecture: value })}\n onChange={handleChange}\n />\n </Tooltip>\n </FormGroup>\n );\n};\n\nexport default ArmCheckbox;\n", "import React from 'react';\nimport { Formik, useFormikContext } from 'formik';\nimport { Alert, AlertVariant, Grid, GridItem } from '@patternfly/react-core';\n\nimport {\n useAlerts,\n ClusterWizardStepHeader,\n FormikAutoSave,\n getFormikErrorFields,\n clusterFieldLabels,\n} from '../../../common';\n\nimport {\n ClusterDeploymentDetailsNetworkingProps,\n AgentTableActions,\n ClusterDeploymentNetworkingValues,\n} from './types';\nimport ClusterDeploymentWizardFooter from './ClusterDeploymentWizardFooter';\nimport ClusterDeploymentWizardStep from './ClusterDeploymentWizardStep';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentNetworkingForm from './ClusterDeploymentNetworkingForm';\nimport { isAgentOfCluster, isCIMFlow } from './helpers';\nimport { useInfraEnvProxies, useNetworkingFormik } from './use-networking-formik';\nimport { canNextFromNetworkingStep } from './wizardTransition';\nimport { AgentK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype NetworkingFormProps = {\n clusterDeployment: ClusterDeploymentDetailsNetworkingProps['clusterDeployment'];\n agentClusterInstall: ClusterDeploymentDetailsNetworkingProps['agentClusterInstall'];\n onClose: ClusterDeploymentDetailsNetworkingProps['onClose'];\n agents: AgentK8sResource[];\n fetchInfraEnv: ClusterDeploymentDetailsNetworkingProps['fetchInfraEnv'];\n onEditHost: AgentTableActions['onEditHost'];\n onEditRole: AgentTableActions['onEditRole'];\n isPreviewOpen: ClusterDeploymentDetailsNetworkingProps['isPreviewOpen'];\n};\n\nconst NetworkingForm: React.FC<NetworkingFormProps> = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n onClose,\n fetchInfraEnv,\n onEditHost,\n onEditRole,\n isPreviewOpen,\n}) => {\n const [showFormErrors, setShowFormErrors] = React.useState(false);\n const [showClusterErrors, setShowClusterErrors] = React.useState(false);\n const [nextRequested, setNextRequested] = React.useState(false);\n const { infraEnvWithProxy, infraEnvsError, infraEnvsLoading, sameProxies } = useInfraEnvProxies({\n fetchInfraEnv,\n agents,\n });\n const { isValid, isValidating, isSubmitting, validateForm, setTouched, errors, touched, values } =\n useFormikContext<ClusterDeploymentNetworkingValues>();\n const { setCurrentStepId } = React.useContext(ClusterDeploymentWizardContext);\n\n const canContinue = canNextFromNetworkingStep(agentClusterInstall, agents);\n\n const onBack = () =>\n isCIMFlow(clusterDeployment)\n ? setCurrentStepId('hosts-selection')\n : setCurrentStepId('hosts-discovery');\n\n const onNext = async () => {\n if (!showFormErrors) {\n const errors = await validateForm();\n setTouched(\n Object.keys(errors).reduce((acc, curr) => {\n acc[curr] = true;\n return acc;\n }, {}),\n );\n setShowFormErrors(true);\n if (Object.keys(errors).length) {\n return;\n }\n }\n setNextRequested(true);\n };\n\n React.useEffect(() => {\n setNextRequested(false);\n setShowClusterErrors(false);\n }, [values.apiVip, values.ingressVip]);\n\n React.useEffect(() => {\n if (nextRequested) {\n setShowClusterErrors(true);\n if (canContinue) {\n setCurrentStepId('review');\n }\n }\n }, [nextRequested, canContinue, setCurrentStepId]);\n\n const onSyncError = React.useCallback(() => setNextRequested(false), []);\n\n const errorFields = getFormikErrorFields(errors, touched);\n const { t } = useTranslation();\n const footer = (\n <ClusterDeploymentWizardFooter\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n isSubmitting={isSubmitting}\n isNextDisabled={\n nextRequested || isSubmitting || (showFormErrors ? !isValid || isValidating : false)\n }\n showClusterErrors={!errorFields.length && showClusterErrors}\n onBack={onBack}\n onNext={onNext}\n onCancel={onClose}\n nextButtonText=\"Next\"\n onSyncError={onSyncError}\n >\n {showFormErrors && !!errorFields.length && (\n <Alert\n variant={AlertVariant.danger}\n title={t('ai:Provided cluster configuration is not valid')}\n isInline\n >\n {t('ai:The following fields are invalid or missing')}:{' '}\n {errorFields.map((field: string) => clusterFieldLabels(t)[field] || field).join(', ')}.\n </Alert>\n )}\n </ClusterDeploymentWizardFooter>\n );\n\n return (\n <ClusterDeploymentWizardStep footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>{t('ai:Networking')}</ClusterWizardStepHeader>\n </GridItem>\n <GridItem>\n <ClusterDeploymentNetworkingForm\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n sameProxies={sameProxies}\n infraEnvsError={infraEnvsError}\n infraEnvWithProxy={infraEnvWithProxy}\n infraEnvsLoading={infraEnvsLoading}\n onEditHost={onEditHost}\n onEditRole={onEditRole}\n isPreviewOpen={isPreviewOpen}\n />\n </GridItem>\n </Grid>\n <FormikAutoSave />\n </ClusterDeploymentWizardStep>\n );\n};\n\nconst ClusterDeploymentNetworkingStep: React.FC<ClusterDeploymentDetailsNetworkingProps> = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n onSaveNetworking,\n ...rest\n}) => {\n const { addAlert } = useAlerts();\n\n const cdName = clusterDeployment?.metadata?.name;\n const cdNamespace = clusterDeployment?.metadata?.namespace;\n\n const clusterAgents = React.useMemo(\n () => agents.filter((a) => isAgentOfCluster(a, cdName, cdNamespace)),\n [agents, cdName, cdNamespace],\n );\n\n const { initialValues, validationSchema } = useNetworkingFormik({\n clusterDeployment,\n agentClusterInstall,\n agents: clusterAgents,\n });\n const { t } = useTranslation();\n const handleSubmit = async (values: ClusterDeploymentNetworkingValues) => {\n try {\n await onSaveNetworking(values);\n } catch (error) {\n addAlert({\n title: t('ai:Failed to save ClusterDeployment'),\n message: error instanceof Error ? error.message : undefined,\n });\n }\n };\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={validationSchema}\n onSubmit={handleSubmit}\n >\n <NetworkingForm\n {...rest}\n agents={clusterAgents}\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n />\n </Formik>\n );\n};\n\nexport default ClusterDeploymentNetworkingStep;\n", "import * as React from 'react';\nimport {\n Alert,\n Form,\n Grid,\n GridItem,\n Spinner,\n Text,\n TextContent,\n TextVariants,\n Checkbox,\n Split,\n SplitItem,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport {\n ClusterDefaultConfig,\n CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4,\n getHostSubnets,\n SecurityFields,\n ProxyFields,\n ProxyInputFields,\n} from '../../../common';\nimport NetworkConfiguration from './NetworkConfiguration';\nimport ClusterDeploymentHostsNetworkTable from './ClusterDeploymentHostsNetworkTable';\nimport { getAICluster } from '../helpers';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n InfraEnvK8sResource,\n} from '../../types';\nimport { AgentTableActions, ClusterDeploymentNetworkingValues } from './types';\nimport { useFormikContext } from 'formik';\nimport { getGridSpans } from './helpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\n\n// TODO(mlibra): So far a constant. Should be queried from somewhere.\nexport const defaultNetworkSettings: ClusterDefaultConfig = CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4;\n\ntype ClusterDeploymentNetworkingFormProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n onValuesChanged?: (values: ClusterDeploymentNetworkingValues) => void;\n infraEnvWithProxy: InfraEnvK8sResource | undefined;\n sameProxies: boolean;\n infraEnvsError: string | undefined;\n infraEnvsLoading: boolean;\n isPreviewOpen: boolean;\n onEditHost: AgentTableActions['onEditHost'];\n onEditRole: AgentTableActions['onEditRole'];\n};\n\nconst ClusterDeploymentNetworkingForm: React.FC<ClusterDeploymentNetworkingFormProps> = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n onValuesChanged,\n infraEnvWithProxy,\n sameProxies,\n infraEnvsError,\n infraEnvsLoading,\n isPreviewOpen,\n onEditHost,\n onEditRole,\n}) => {\n const { values, touched, setFieldValue, setFieldTouched } =\n useFormikContext<ClusterDeploymentNetworkingValues>();\n React.useEffect(() => onValuesChanged?.(values), [onValuesChanged, values]);\n const [editProxy, setEditProxy] = React.useState(false);\n\n const cluster = getAICluster({\n clusterDeployment,\n agentClusterInstall,\n agents,\n });\n\n const hostSubnets = React.useMemo(() => getHostSubnets(cluster), [cluster]);\n const { t } = useTranslation();\n React.useEffect(() => {\n if (!!infraEnvWithProxy && !touched.enableProxy) {\n setFieldValue('enableProxy', true, false);\n if (sameProxies) {\n setFieldValue('httpProxy', infraEnvWithProxy.spec?.proxy?.httpProxy, false);\n setFieldValue('httpsProxy', infraEnvWithProxy.spec?.proxy?.httpsProxy, false);\n setFieldValue('noProxy', infraEnvWithProxy.spec?.proxy?.noProxy, false);\n }\n }\n }, [infraEnvWithProxy, sameProxies, setFieldValue, touched.enableProxy, setFieldTouched]);\n\n let proxyConfig = <ProxyFields />;\n if (infraEnvWithProxy) {\n if (!sameProxies) {\n proxyConfig = (\n <>\n <TextContent>\n <Text component=\"h2\">{t('ai:Cluster-wide proxy')}</Text>\n <Text component={TextVariants.p}>\n <Trans\n t={t}\n components={{ bold: <strong /> }}\n i18nKey=\"ai:The hosts you selected are using different proxy settings. Configure a proxy that will be applied for these hosts. <bold>Configure at least one of the proxy settings below.</bold>\"\n />\n </Text>\n </TextContent>\n <ProxyInputFields />\n </>\n );\n } else {\n proxyConfig = (\n <>\n <Checkbox\n id=\"edit-proxy\"\n label={t('ai:Edit cluster-wide proxy settings')}\n onChange={setEditProxy}\n isChecked={editProxy}\n body={editProxy && <ProxyInputFields />}\n />\n </>\n );\n }\n }\n\n const gridSpans = getGridSpans(isPreviewOpen);\n\n return (\n <Form>\n <Stack hasGutter>\n <StackItem>\n <Grid hasGutter>\n <GridItem {...gridSpans}>\n <NetworkConfiguration\n cluster={cluster}\n hostSubnets={hostSubnets}\n isVipDhcpAllocationDisabled\n defaultNetworkSettings={defaultNetworkSettings}\n hideManagedNetworking\n />\n </GridItem>\n </Grid>\n </StackItem>\n <StackItem>\n {infraEnvsError ? (\n <Alert title={infraEnvsError} variant=\"danger\" isInline />\n ) : infraEnvsLoading ? (\n <Split hasGutter>\n <SplitItem>\n <Spinner isSVG size=\"md\" />\n </SplitItem>\n <SplitItem>{t('ai:Loading proxy configuration')}</SplitItem>\n </Split>\n ) : (\n proxyConfig\n )}\n </StackItem>\n <StackItem>\n <SecurityFields clusterSshKey={cluster.sshPublicKey} />\n </StackItem>\n <StackItem>\n <TextContent>\n <Text component=\"h2\">{t('ai:Host inventory')}</Text>\n </TextContent>\n <ClusterDeploymentHostsNetworkTable\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n onEditHost={onEditHost}\n onEditRole={onEditRole}\n />\n </StackItem>\n </Stack>\n </Form>\n );\n};\n\nexport default ClusterDeploymentNetworkingForm;\n", "import React, { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport { Checkbox, Grid } from '@patternfly/react-core';\nimport AdvancedNetworkFields from '../../../common/components/clusterConfiguration/AdvancedNetworkFields';\nimport { NetworkConfigurationValues } from '../../../common/types/clusters';\nimport { Address6 } from 'ip-address';\nimport {\n AvailableSubnetsControl,\n ManagedNetworkingControlGroup,\n UserManagedNetworkingTextContent,\n VirtualIPControlGroup,\n VirtualIPControlGroupProps,\n} from '../../../common/components/clusterWizard/networkingSteps';\nimport {\n canSelectNetworkTypeSDN,\n ClusterDefaultConfig,\n getDefaultNetworkType,\n isAdvNetworkConf,\n isSNO,\n isSubnetInIPv6,\n NETWORK_TYPE_OVN,\n NO_SUBNET_SET,\n} from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type NetworkConfigurationProps = VirtualIPControlGroupProps & {\n defaultNetworkSettings: ClusterDefaultConfig;\n hideManagedNetworking?: boolean;\n};\n\nconst NetworkConfiguration: React.FC<NetworkConfigurationProps> = ({\n cluster,\n hostSubnets,\n isVipDhcpAllocationDisabled,\n defaultNetworkSettings,\n hideManagedNetworking,\n children,\n}) => {\n const { t } = useTranslation();\n const { setFieldValue, values, touched, validateField } =\n useFormikContext<NetworkConfigurationValues>();\n\n const isMultiNodeCluster = !isSNO(cluster);\n const isClusterCIDRIPv6 = Address6.isValid(values.clusterNetworkCidr || '');\n const { isIPv6, defaultNetworkType, isSDNSelectable } = React.useMemo(() => {\n const isIPv6 = isSubnetInIPv6({\n machineNetworkCidr: cluster.machineNetworkCidr,\n clusterNetworkCidr: values.clusterNetworkCidr,\n serviceNetworkCidr: values.serviceNetworkCidr,\n });\n return {\n isIPv6,\n defaultNetworkType: getDefaultNetworkType(!isMultiNodeCluster, isIPv6),\n isSDNSelectable: canSelectNetworkTypeSDN(!isMultiNodeCluster, isIPv6),\n };\n }, [\n isMultiNodeCluster,\n values.clusterNetworkCidr,\n cluster.machineNetworkCidr,\n values.serviceNetworkCidr,\n ]);\n\n const [isAdvanced, setAdvanced] = React.useState(\n isAdvNetworkConf(cluster, defaultNetworkSettings, defaultNetworkType),\n );\n\n const toggleAdvConfiguration = (checked: boolean) => {\n setAdvanced(checked);\n\n if (!checked) {\n setFieldValue('clusterNetworkCidr', defaultNetworkSettings.clusterNetworkCidr);\n setFieldValue('serviceNetworkCidr', defaultNetworkSettings.serviceNetworkCidr);\n setFieldValue('clusterNetworkHostPrefix', defaultNetworkSettings.clusterNetworkHostPrefix);\n setFieldValue('networkType', defaultNetworkType);\n }\n };\n\n const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';\n const firstSubnet = hostSubnets[0]?.subnet;\n\n useEffect(() => {\n if (isUserManagedNetworking && isMultiNodeCluster) {\n values.hostSubnet !== NO_SUBNET_SET && setFieldValue('hostSubnet', NO_SUBNET_SET, false);\n } else if (values.hostSubnet === NO_SUBNET_SET && firstSubnet) {\n setFieldValue('hostSubnet', firstSubnet, false);\n }\n }, [isUserManagedNetworking, isMultiNodeCluster, values.hostSubnet, setFieldValue, firstSubnet]);\n\n useEffect(() => {\n if (!cluster.networkType) {\n setFieldValue('networkType', getDefaultNetworkType(!isMultiNodeCluster, isIPv6));\n } else if (!isSDNSelectable) {\n setFieldValue('networkType', NETWORK_TYPE_OVN);\n }\n // Skipping \"cluster.networkType\" as it's ultimately the value we are setting in the form\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isIPv6, isMultiNodeCluster, setFieldValue]);\n\n useEffect(() => {\n if (isUserManagedNetworking) {\n const shouldValidate = !!touched.hostSubnet;\n\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', '', shouldValidate);\n setFieldValue('apiVip', '', shouldValidate);\n } else {\n if (!values.vipDhcpAllocation && touched.hostSubnet) {\n validateField('ingressVip');\n validateField('apiVip');\n }\n }\n }, [\n touched.hostSubnet,\n isMultiNodeCluster,\n isUserManagedNetworking,\n setFieldValue,\n values.vipDhcpAllocation,\n validateField,\n ]);\n return (\n <Grid hasGutter>\n {!hideManagedNetworking && (\n <ManagedNetworkingControlGroup disabled={!!cluster.openshiftVersion} />\n )}\n\n {isUserManagedNetworking && (\n <UserManagedNetworkingTextContent shouldDisplayLoadBalancersBullet={isMultiNodeCluster} />\n )}\n\n {children}\n\n {!(isMultiNodeCluster && isUserManagedNetworking) && (\n <AvailableSubnetsControl\n hostSubnets={hostSubnets}\n hosts={cluster.hosts || []}\n isRequired={!isUserManagedNetworking}\n isMultiNodeCluster={isMultiNodeCluster}\n />\n )}\n\n {!isUserManagedNetworking && (\n <VirtualIPControlGroup\n cluster={cluster}\n hostSubnets={hostSubnets}\n isVipDhcpAllocationDisabled={isVipDhcpAllocationDisabled}\n />\n )}\n\n <Checkbox\n id=\"useAdvancedNetworking\"\n label={t('ai:Use advanced networking')}\n description={t('ai:Configure advanced networking properties (e.g. CIDR ranges).')}\n isChecked={isAdvanced}\n onChange={toggleAdvConfiguration}\n body={\n isAdvanced && (\n <AdvancedNetworkFields\n isSDNSelectable={isSDNSelectable}\n isClusterCIDRIPv6={isClusterCIDRIPv6}\n />\n )\n }\n />\n </Grid>\n );\n};\n\nexport default NetworkConfiguration;\n", "import React from 'react';\nimport { Grid, TextInputTypes } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport { InputField } from '../../components/ui';\nimport { NetworkConfigurationValues } from '../../types/clusters';\nimport { PREFIX_MAX_RESTRICTION } from '../../config/constants';\nimport { NetworkTypeControlGroup } from '../clusterWizard/networkingSteps/NetworkTypeControlGroup';\nimport { useFeature } from '../../features';\nimport { useTranslation } from '../../hooks/use-translation-wrapper';\n\ntype AdvancedNetworkFieldsProps = {\n isSDNSelectable: boolean;\n isClusterCIDRIPv6: boolean;\n};\n\nconst AdvancedNetworkFields: React.FC<AdvancedNetworkFieldsProps> = ({\n isSDNSelectable,\n isClusterCIDRIPv6,\n}) => {\n const isNetworkTypeSelectionEnabled = useFeature(\n 'ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE',\n );\n const { setFieldValue, values } = useFormikContext<NetworkConfigurationValues>();\n const clusterNetworkCidrPrefix = parseInt((values.clusterNetworkCidr || '').split('/')[1]) || 1;\n const { t } = useTranslation();\n const formatClusterNetworkHostPrefix = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (isNaN(parseInt(e.target.value))) {\n setFieldValue('clusterNetworkHostPrefix', clusterNetworkCidrPrefix);\n }\n };\n\n const clusterNetworkHostPrefixHelperText = isClusterCIDRIPv6\n ? t(\n 'ai: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 )\n : t(\n 'ai: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 );\n\n return (\n <Grid hasGutter>\n <InputField\n name=\"clusterNetworkCidr\"\n label={t('ai:Cluster network CIDR')}\n helperText={t(\n 'ai: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 )}\n isRequired\n />\n <InputField\n name=\"clusterNetworkHostPrefix\"\n label={t('ai:Cluster network host prefix')}\n type={TextInputTypes.number}\n min={clusterNetworkCidrPrefix}\n max={isClusterCIDRIPv6 ? PREFIX_MAX_RESTRICTION.IPv6 : PREFIX_MAX_RESTRICTION.IPv4}\n onBlur={(e) => formatClusterNetworkHostPrefix(e as React.ChangeEvent<HTMLInputElement>)}\n helperText={clusterNetworkHostPrefixHelperText}\n isRequired\n />\n <InputField\n name=\"serviceNetworkCidr\"\n label={t('ai:Service network CIDR')}\n helperText={t(\n 'ai: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 )}\n isRequired\n />\n {isNetworkTypeSelectionEnabled && (\n <NetworkTypeControlGroup isSDNSelectable={isSDNSelectable} />\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 { 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 * as React from 'react';\nimport { ConnectedIcon } from '@patternfly/react-icons';\nimport { EmptyState, Host } from '../../../common';\nimport { AgentTableActions } from './types';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n} from '../../types';\nimport { getAICluster, getIsSNOCluster } from '../helpers';\nimport { AdditionalNTPSourcesDialogToggle } from './AdditionalNTPSourcesDialogToggle';\nimport { agentStatusColumn, useAgentsTable } from '../Agent/tableUtils';\nimport HostsTable from '../../../common/components/hosts/HostsTable';\nimport { HostDetail } from '../../../common/components/hosts/HostRowDetail';\nimport {\n activeNICColumn,\n hostnameColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ExpandComponentProps = {\n obj: Host;\n};\n\nconst ExpandComponent: React.FC<ExpandComponentProps> = ({ obj }) => (\n <HostDetail\n host={obj}\n AdditionalNTPSourcesDialogToggleComponent={AdditionalNTPSourcesDialogToggle}\n />\n);\n\ntype ClusterDeploymentHostsNetworkTableProps = Pick<\n AgentTableActions,\n 'onEditHost' | 'onEditRole'\n> & {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n};\n\nconst ClusterDeploymentHostsNetworkTable: React.FC<ClusterDeploymentHostsNetworkTableProps> =\n // eslint-disable-next-line react/display-name\n React.memo(({ clusterDeployment, agentClusterInstall, agents, onEditHost, onEditRole }) => {\n const { t } = useTranslation();\n const cluster = React.useMemo(\n () => getAICluster({ clusterDeployment, agentClusterInstall, agents }),\n [clusterDeployment, agentClusterInstall, agents],\n );\n const [hosts, hostActions, actionResolver] = useAgentsTable(\n { agents },\n {\n onEditHost,\n onEditRole,\n },\n );\n\n const isSNOCluster = getIsSNOCluster(agentClusterInstall);\n const content = React.useMemo(\n () =>\n isSNOCluster\n ? [\n hostnameColumn(t, hostActions.onEditHost, hosts),\n agentStatusColumn({\n agents,\n onEditHostname: onEditHost,\n wizardStepId: 'networking',\n t,\n }),\n activeNICColumn(cluster),\n ]\n : [\n hostnameColumn(t, hostActions.onEditHost, hosts),\n roleColumn(t, hostActions.canEditRole, hostActions.onEditRole),\n agentStatusColumn({\n agents,\n onEditHostname: onEditHost,\n wizardStepId: 'networking',\n t,\n }),\n activeNICColumn(cluster),\n ],\n [isSNOCluster, onEditHost, hosts, agents, hostActions, cluster, t],\n );\n\n const paginationProps = usePagination(hosts.length);\n return (\n <HostsTable\n testId=\"networking-host-table\"\n hosts={hosts}\n ExpandComponent={ExpandComponent}\n content={content}\n actionResolver={actionResolver}\n {...paginationProps}\n >\n <EmptyState\n icon={ConnectedIcon}\n title={t('ai:Waiting for hosts...')}\n content={t('ai:Hosts may take a few minutes to appear here after booting.')}\n />\n </HostsTable>\n );\n });\n\nexport default ClusterDeploymentHostsNetworkTable;\n", "import React from 'react';\nimport * as Yup from 'yup';\n\nimport { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common';\nimport { getHostSubnets } from '../../../common/components/clusterConfiguration/utils';\nimport { getNetworkInitialValues } from './networkConfigurationValidation';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n InfraEnvK8sResource,\n} from '../../types';\nimport { getAICluster } from '../helpers';\nimport { defaultNetworkSettings } from './ClusterDeploymentNetworkingForm';\nimport { useDeepCompareMemoize } from '../../../common/hooks';\nimport {\n HostSubnets,\n hostPrefixValidationSchema,\n ipBlockValidationSchema,\n vipValidationSchema,\n sshPublicKeyValidationSchema,\n hostSubnetValidationSchema,\n httpProxyValidationSchema,\n noProxyValidationSchema,\n} from '../../../common';\nimport { ClusterDeploymentNetworkingValues } from './types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst getInfraEnvProxy = (infraEnvs: InfraEnvK8sResource[]) => {\n const infraEnvWithProxy = infraEnvs.find(\n (ie) => ie.spec?.proxy?.httpProxy || ie.spec?.proxy?.httpsProxy || ie.spec?.proxy?.noProxy,\n );\n return {\n infraEnvWithProxy,\n sameProxies: infraEnvs.every(\n (ie) =>\n ie.spec?.proxy?.httpProxy === infraEnvWithProxy?.spec?.proxy?.httpProxy &&\n ie.spec?.proxy?.httpsProxy === infraEnvWithProxy?.spec?.proxy?.httpsProxy &&\n ie.spec?.proxy?.noProxy === infraEnvWithProxy?.spec?.proxy?.noProxy,\n ),\n };\n};\n\nconst getNetworkConfigurationValidationSchema = (\n initialValues: ClusterDeploymentNetworkingValues,\n hostSubnets: HostSubnets,\n) =>\n Yup.lazy<ClusterDeploymentNetworkingValues>((values) =>\n Yup.object<ClusterDeploymentNetworkingValues>().shape({\n clusterNetworkHostPrefix: hostPrefixValidationSchema(values.clusterNetworkCidr),\n clusterNetworkCidr: ipBlockValidationSchema(values.serviceNetworkCidr),\n serviceNetworkCidr: ipBlockValidationSchema(values.clusterNetworkCidr),\n apiVip: vipValidationSchema(hostSubnets, values, initialValues.apiVip),\n ingressVip: vipValidationSchema(hostSubnets, values, initialValues.ingressVip),\n sshPublicKey: sshPublicKeyValidationSchema,\n hostSubnet: hostSubnetValidationSchema,\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 UseNetworkingFormikArgs = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n};\n\nexport const useNetworkingFormik = ({\n clusterDeployment,\n agentClusterInstall,\n agents,\n}: UseNetworkingFormikArgs) => {\n const initialValues = React.useMemo(\n () => {\n const cluster = getAICluster({\n clusterDeployment,\n agentClusterInstall,\n agents,\n });\n return {\n ...getNetworkInitialValues(cluster, defaultNetworkSettings),\n enableProxy: false,\n editProxy: false,\n };\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const validationSchema = React.useMemo(() => {\n const cluster = getAICluster({\n clusterDeployment,\n agentClusterInstall,\n agents,\n });\n const hostSubnets = getHostSubnets(cluster);\n return getNetworkConfigurationValidationSchema(initialValues, hostSubnets);\n }, [initialValues, clusterDeployment, agentClusterInstall, agents]);\n\n return {\n initialValues,\n validationSchema,\n };\n};\n\ntype UseInfraEnvProxiesArgs = {\n agents: AgentK8sResource[];\n fetchInfraEnv: (name: string, namespace: string) => Promise<InfraEnvK8sResource>;\n};\n\nexport const useInfraEnvProxies = ({ agents, fetchInfraEnv }: UseInfraEnvProxiesArgs) => {\n const [infraEnvs, setInfraEnvs] = React.useState<InfraEnvK8sResource[]>();\n const [infraEnvsError, setInfraEnvsError] = React.useState<string>();\n const { infraEnvWithProxy, sameProxies } = getInfraEnvProxy(infraEnvs || []);\n\n const infraEnvsMetadata = agents\n .map((a) => ({\n name: a.metadata?.labels?.[INFRAENV_AGENTINSTALL_LABEL_KEY],\n namespace: a.metadata?.namespace,\n }))\n .filter((ie) => ie.name && ie.namespace)\n .sort() as { name: string; namespace: string }[];\n\n const memoInfraEnvs = useDeepCompareMemoize(infraEnvsMetadata);\n const { t } = useTranslation();\n React.useEffect(() => {\n const fetch = async () => {\n setInfraEnvs(undefined);\n setInfraEnvsError(undefined);\n const infraEnvRequests = memoInfraEnvs.map((ie) => fetchInfraEnv(ie.name, ie.namespace));\n try {\n const infraEnvResults = await Promise.all(infraEnvRequests);\n setInfraEnvs(infraEnvResults);\n } catch (e) {\n setInfraEnvsError(e.message || t('ai:Could not fetch infra environments'));\n }\n };\n\n void fetch();\n }, [memoInfraEnvs, fetchInfraEnv, setInfraEnvs, setInfraEnvsError, t]);\n\n return {\n infraEnvWithProxy,\n sameProxies,\n infraEnvsError,\n infraEnvsLoading: !infraEnvs,\n };\n};\n", "import React from 'react';\nimport * as Yup from 'yup';\nimport { TestOptionsMessage } from 'yup';\nimport { Formik, FormikConfig, useFormikContext } from 'formik';\nimport { Alert, AlertVariant, Grid, GridItem } from '@patternfly/react-core';\nimport { ClusterWizardStepHeader, useAlerts } from '../../../common';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n} from '../../types';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentWizardFooter from './ClusterDeploymentWizardFooter';\nimport ClusterDeploymentWizardStep from './ClusterDeploymentWizardStep';\nimport ClusterDeploymentHostsSelection from './ClusterDeploymentHostsSelection';\nimport {\n ClusterDeploymentHostSelectionStepProps,\n ClusterDeploymentHostsSelectionValues,\n} from './types';\nimport { hostCountValidationSchema } from './validationSchemas';\nimport {\n getAgentSelectorFieldsFromAnnotations,\n getIsSNOCluster,\n getWizardStepAgentStatus,\n} from '../helpers';\nimport { canNextFromHostSelectionStep } from './wizardTransition';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { TFunction } from 'i18next';\n\nconst getInitialValues = ({\n agents,\n clusterDeployment,\n agentClusterInstall,\n}: {\n agents: AgentK8sResource[];\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n}): ClusterDeploymentHostsSelectionValues => {\n const isSNOCluster = getIsSNOCluster(agentClusterInstall);\n const cdName = clusterDeployment?.metadata?.name;\n const cdNamespace = clusterDeployment?.metadata?.namespace;\n let hostCount =\n (agentClusterInstall?.spec?.provisionRequirements?.controlPlaneAgents || 0) +\n (agentClusterInstall?.spec?.provisionRequirements?.workerAgents || 0);\n if (isSNOCluster) {\n hostCount = 1;\n } else if (hostCount === 2 || hostCount === 0) {\n hostCount = 3;\n } else if (hostCount === 4) {\n hostCount = 5;\n }\n\n const agentSelector = getAgentSelectorFieldsFromAnnotations(\n clusterDeployment?.metadata?.annotations,\n );\n\n const selectedIds = agents\n .filter(\n (agent) =>\n agent.spec?.clusterDeploymentName?.name === cdName &&\n agent.spec?.clusterDeploymentName?.namespace === cdNamespace,\n )\n .map((agent) => agent.metadata?.uid as string);\n const autoSelectHosts = agentSelector.autoSelect;\n\n return {\n autoSelectHosts,\n hostCount,\n useMastersAsWorkers: hostCount === 1 || hostCount === 3, // TODO: Recently not supported - https://issues.redhat.com/browse/MGMT-7677\n agentLabels: agentSelector?.labels || [],\n locations: agentSelector?.locations || [],\n selectedHostIds: selectedIds,\n autoSelectedHostIds: selectedIds,\n };\n};\n\nconst getMinHostsCount = (selectedHostsCount: number) => (selectedHostsCount === 4 ? 5 : 3);\n\nconst getValidationSchema = (agentClusterInstall: AgentClusterInstallK8sResource, t: TFunction) => {\n const isSNOCluster = getIsSNOCluster(agentClusterInstall);\n\n const getMinMessage: TestOptionsMessage<{ min: number }> = ({ min }) => {\n const message = t('ai:Please select at least {{min}} hosts for the cluster', { min });\n if (min === 5) {\n return `${message} ${t('ai:or select just 3 hosts instead.')}`;\n }\n return `${message}.`;\n };\n\n return Yup.lazy<ClusterDeploymentHostsSelectionValues>((values) => {\n return Yup.object<ClusterDeploymentHostsSelectionValues>().shape({\n hostCount: isSNOCluster ? Yup.number() : hostCountValidationSchema(t),\n useMastersAsWorkers: Yup.boolean().required(t('ai:Required field')),\n autoSelectedHostIds: values.autoSelectHosts\n ? Yup.array<string>().min(values.hostCount).max(values.hostCount)\n : Yup.array<string>(),\n selectedHostIds: values.autoSelectHosts\n ? Yup.array<string>()\n : isSNOCluster\n ? Yup.array<string>()\n .min(1, t('ai:Please select one host for the cluster.'))\n .max(1, t('ai:Please select one host for the cluster.')) // TODO(jtomasek): replace this with Yup.array().length() after updating Yup\n : Yup.array<string>().min(getMinHostsCount(values.selectedHostIds.length), getMinMessage),\n });\n });\n};\n\ntype UseHostsSelectionFormikArgs = {\n agents: AgentK8sResource[];\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n t: TFunction;\n};\n\nexport const useHostsSelectionFormik = ({\n agents,\n clusterDeployment,\n agentClusterInstall,\n t,\n}: UseHostsSelectionFormikArgs): [ClusterDeploymentHostsSelectionValues, Yup.Lazy] => {\n const initialValues = React.useMemo(\n () => getInitialValues({ agents, clusterDeployment, agentClusterInstall }),\n [agentClusterInstall, agents, clusterDeployment],\n );\n\n const validationSchema = React.useMemo(\n () => getValidationSchema(agentClusterInstall, t),\n [agentClusterInstall, t],\n );\n\n return [initialValues, validationSchema];\n};\n\nconst getSelectedAgents = (\n agents: AgentK8sResource[],\n values: ClusterDeploymentHostsSelectionValues,\n) => {\n const selectedHostIds = values.autoSelectHosts\n ? values.autoSelectedHostIds\n : values.selectedHostIds;\n return agents.filter((agent) => selectedHostIds.includes(agent.metadata?.uid || ''));\n};\n\ntype HostSelectionFormProps = Omit<ClusterDeploymentHostSelectionStepProps, 'onSaveHostsSelection'>;\n\nconst HostSelectionForm: React.FC<HostSelectionFormProps> = ({\n agents,\n agentClusterInstall,\n onClose,\n clusterDeployment,\n aiConfigMap,\n onEditRole: onEditRoleInit,\n onSetInstallationDiskId,\n}) => {\n const { setCurrentStepId } = React.useContext(ClusterDeploymentWizardContext);\n const [showClusterErrors, setShowClusterErrors] = React.useState(false);\n const {\n values,\n isValid,\n isValidating,\n isSubmitting,\n touched,\n errors,\n validateForm,\n setTouched,\n submitForm,\n setSubmitting,\n } = useFormikContext<ClusterDeploymentHostsSelectionValues>();\n const [nextRequested, setNextRequested] = React.useState(false);\n const [showFormErrors, setShowFormErrors] = React.useState(false);\n const selectedAgents = getSelectedAgents(agents, values);\n const { t } = useTranslation();\n const onEditRole = React.useCallback(\n async (agent: AgentK8sResource, role: string | undefined) => {\n setNextRequested(false);\n setShowClusterErrors(false);\n setSubmitting(true);\n const response = await onEditRoleInit?.(agent, role);\n setSubmitting(false);\n return response;\n },\n [onEditRoleInit, setSubmitting],\n );\n\n const onAutoSelectChange = React.useCallback(() => {\n setNextRequested(false);\n setShowClusterErrors(false);\n setShowFormErrors(false);\n }, []);\n\n const onHostSelect = React.useCallback(() => {\n setNextRequested(false);\n setShowClusterErrors(false);\n }, []);\n\n const onNext = async () => {\n if (!showFormErrors) {\n setShowFormErrors(true);\n const errors = await validateForm();\n setTouched(\n Object.keys(errors).reduce((acc, curr) => {\n acc[curr] = true;\n return acc;\n }, {}),\n );\n if (Object.keys(errors).length) {\n return;\n }\n }\n void submitForm();\n setNextRequested(true);\n };\n\n React.useEffect(() => {\n if (nextRequested && !isSubmitting) {\n const agentStatuses = selectedAgents.map(\n (agent) => getWizardStepAgentStatus(agent, 'hosts-selection', t).status.key,\n );\n if (\n agentStatuses.some((status) =>\n ['disconnected', 'disabled', 'error', 'insufficient', 'cancelled'].includes(status),\n )\n ) {\n setNextRequested(false);\n } else if (\n !!selectedAgents.length &&\n selectedAgents.every(\n (agent) => getWizardStepAgentStatus(agent, 'hosts-selection', t).status.key === 'known',\n )\n ) {\n setShowClusterErrors(true);\n if (canNextFromHostSelectionStep(agentClusterInstall, selectedAgents)) {\n setCurrentStepId('networking');\n }\n }\n }\n }, [nextRequested, selectedAgents, agentClusterInstall, setCurrentStepId, isSubmitting, t]);\n\n let submittingText: string | undefined = undefined;\n\n if (isSubmitting) {\n submittingText = t('ai:Saving changes...');\n } else if (nextRequested && !showClusterErrors) {\n submittingText = t('ai:Binding hosts...');\n }\n\n const onSyncError = React.useCallback(() => setNextRequested(false), []);\n\n const footer = (\n <ClusterDeploymentWizardFooter\n agentClusterInstall={agentClusterInstall}\n agents={selectedAgents}\n isSubmitting={!!submittingText}\n submittingText={submittingText}\n isNextDisabled={\n nextRequested || isSubmitting || (showFormErrors ? !isValid || isValidating : false)\n }\n onNext={onNext}\n onBack={() => setCurrentStepId('cluster-details')}\n onCancel={onClose}\n showClusterErrors={showClusterErrors}\n onSyncError={onSyncError}\n >\n {showFormErrors && errors.selectedHostIds && touched.selectedHostIds && (\n <Alert\n variant={AlertVariant.danger}\n title={t('ai:Provided cluster configuration is not valid')}\n isInline\n >\n {errors.selectedHostIds}\n </Alert>\n )}\n </ClusterDeploymentWizardFooter>\n );\n\n return (\n <ClusterDeploymentWizardStep footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>{t('ai:Cluster hosts')}</ClusterWizardStepHeader>\n </GridItem>\n <GridItem>\n <ClusterDeploymentHostsSelection\n agentClusterInstall={agentClusterInstall}\n agents={agents}\n clusterDeployment={clusterDeployment}\n aiConfigMap={aiConfigMap}\n onEditRole={onEditRole}\n onSetInstallationDiskId={onSetInstallationDiskId}\n onAutoSelectChange={onAutoSelectChange}\n onHostSelect={onHostSelect}\n />\n </GridItem>\n </Grid>\n </ClusterDeploymentWizardStep>\n );\n};\n\nconst ClusterDeploymentHostSelectionStep: React.FC<ClusterDeploymentHostSelectionStepProps> = ({\n onSaveHostsSelection,\n ...rest\n}) => {\n const { t } = useTranslation();\n\n const { addAlert } = useAlerts();\n const { agents, clusterDeployment, agentClusterInstall } = rest;\n\n const [initialValues, validationSchema] = useHostsSelectionFormik({\n agents,\n clusterDeployment,\n agentClusterInstall,\n t,\n });\n\n const handleSubmit: FormikConfig<ClusterDeploymentHostsSelectionValues>['onSubmit'] = async (\n values,\n { setSubmitting },\n ) => {\n try {\n await onSaveHostsSelection(values);\n } catch (error) {\n addAlert({\n title: t('ai:Failed to save host selection.'),\n message: error.message as string,\n });\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={validationSchema}\n onSubmit={handleSubmit}\n >\n <HostSelectionForm {...rest} />\n </Formik>\n );\n};\n\nexport default ClusterDeploymentHostSelectionStep;\n", "import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Grid, GridItem, TextContent, Form } from '@patternfly/react-core';\nimport { SwitchField } from '../../../common';\nimport {\n ClusterDeploymentHostsSelectionProps,\n ClusterDeploymentHostsSelectionValues,\n} from './types';\nimport ClusterDeploymentHostsSelectionBasic from './ClusterDeploymentHostsSelectionBasic';\nimport ClusterDeploymentHostsSelectionAdvanced from './ClusterDeploymentHostsSelectionAdvanced';\nimport {\n getAgentsForSelection,\n getClusterDeploymentCpuArchitecture,\n getIsSNOCluster,\n} from '../helpers';\nimport MinimalHWRequirements from '../Agent/MinimalHWRequirements';\nimport NoAgentsAlert from '../Agent/NoAgentsAlert';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst ClusterDeploymentHostsSelection: React.FC<ClusterDeploymentHostsSelectionProps> = ({\n agentClusterInstall,\n clusterDeployment,\n agents,\n aiConfigMap,\n onEditRole,\n onAutoSelectChange,\n onHostSelect,\n onSetInstallationDiskId,\n}) => {\n const { values } = useFormikContext<ClusterDeploymentHostsSelectionValues>();\n const { autoSelectHosts } = values;\n const isSNOCluster = getIsSNOCluster(agentClusterInstall);\n\n const cdName = clusterDeployment?.metadata?.name;\n const cdNamespace = clusterDeployment?.metadata?.namespace;\n const cpuArchitecture = getClusterDeploymentCpuArchitecture(clusterDeployment);\n\n const availableAgents = React.useMemo(\n () =>\n getAgentsForSelection(agents).filter(\n (agent) =>\n (agent.spec.clusterDeploymentName?.name === cdName &&\n agent.spec.clusterDeploymentName?.namespace === cdNamespace) ||\n (!agent.spec.clusterDeploymentName?.name &&\n !agent.spec.clusterDeploymentName?.namespace &&\n agent.status?.inventory.cpu?.architecture === cpuArchitecture),\n ),\n [agents, cdNamespace, cdName, cpuArchitecture],\n );\n const { t } = useTranslation();\n return (\n <Grid hasGutter>\n <GridItem>\n <TextContent>\n {isSNOCluster\n ? t(\n 'ai:Exactly 1 host is required, capable of functioning both as control plane and worker node.',\n )\n : t('ai:At least 3 hosts are required, capable of functioning as control plane nodes.')}\n </TextContent>\n </GridItem>\n {aiConfigMap && (\n <GridItem>\n <MinimalHWRequirements aiConfigMap={aiConfigMap} isSNOCluster={isSNOCluster} />\n </GridItem>\n )}\n\n <GridItem>\n {availableAgents.length ? (\n <Form>\n <SwitchField\n name=\"autoSelectHosts\"\n label={t('ai:Auto-select hosts')}\n onChange={onAutoSelectChange}\n />\n\n {autoSelectHosts && (\n <ClusterDeploymentHostsSelectionBasic\n availableAgents={availableAgents}\n isSNOCluster={isSNOCluster}\n />\n )}\n\n {!autoSelectHosts && (\n <ClusterDeploymentHostsSelectionAdvanced<ClusterDeploymentHostsSelectionValues>\n availableAgents={availableAgents}\n onEditRole={onEditRole}\n onHostSelect={onHostSelect}\n onSetInstallationDiskId={onSetInstallationDiskId}\n cpuArchitecture={cpuArchitecture}\n />\n )}\n </Form>\n ) : (\n <NoAgentsAlert cpuArchitecture={cpuArchitecture} />\n )}\n </GridItem>\n </Grid>\n );\n};\n\nexport default ClusterDeploymentHostsSelection;\n", "import React from 'react';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport { CheckboxField, NumberInputField } from '../../../common';\nimport { HOSTS_MAX_COUNT, HOSTS_MIN_COUNT } from './constants';\nimport { useFormikContext } from 'formik';\nimport { ClusterDeploymentHostsSelectionValues } from './types';\nimport LocationsSelector from './LocationsSelector';\nimport { AgentK8sResource } from '../../types';\nimport AgentsSelectionHostCountAlerts from '../Agent/AgentsSelectionHostCountAlerts';\nimport AgentsSelectionHostCountLabelIcon from '../Agent/AgentsSelectionHostCountLabelIcon';\nimport { useAgentsAutoSelection } from '../Agent/AgentsSelectionUtils';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterDeploymentHostsSelectionBasicProps = {\n availableAgents: AgentK8sResource[];\n isSNOCluster: boolean;\n};\n\nconst ClusterDeploymentHostsSelectionBasic: React.FC<ClusterDeploymentHostsSelectionBasicProps> = ({\n isSNOCluster,\n availableAgents,\n}) => {\n const { setFieldValue } = useFormikContext<ClusterDeploymentHostsSelectionValues>();\n const { matchingAgents, selectedAgents, hostCount } = useAgentsAutoSelection(availableAgents);\n const { t } = useTranslation();\n\n React.useEffect(() => {\n if (hostCount === 3) {\n setFieldValue('useMastersAsWorkers', true);\n }\n }, [hostCount, setFieldValue]);\n\n return (\n <>\n <Grid hasGutter>\n <GridItem>\n <NumberInputField\n label={t('ai:Number of hosts')}\n labelIcon={<AgentsSelectionHostCountLabelIcon />}\n idPostfix=\"hostcount\"\n name=\"hostCount\"\n isRequired\n minValue={isSNOCluster ? 1 : HOSTS_MIN_COUNT}\n maxValue={isSNOCluster ? 1 : HOSTS_MAX_COUNT}\n isDisabled={isSNOCluster}\n formatValue={(newValue) => {\n if (newValue === 4) {\n return hostCount >= 4 ? 3 : 5;\n }\n return newValue;\n }}\n />\n </GridItem>\n\n <GridItem>\n {/* That field is not supported ATM - (requires MGMT-7677) */}\n <CheckboxField\n idPostfix=\"mastersasworkers\"\n name=\"useMastersAsWorkers\"\n label={t('ai:Run workloads on control plane hosts')}\n isDisabled={hostCount < 5}\n />\n </GridItem>\n\n <GridItem>\n <LocationsSelector agents={availableAgents} />\n </GridItem>\n </Grid>\n\n <AgentsSelectionHostCountAlerts\n matchingAgentsCount={matchingAgents.length}\n selectedAgents={selectedAgents}\n targetHostCount={hostCount}\n />\n </>\n );\n};\n\nexport default ClusterDeploymentHostsSelectionBasic;\n", "import React from 'react';\nimport { Alert, AlertVariant, List, ListComponent, ListItem } from '@patternfly/react-core';\nimport { Link } from 'react-router-dom';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { Trans } from 'react-i18next';\nimport { CpuArchitecture } from '../../../common';\n\nconst NoAgentsAlert = ({ cpuArchitecture }: { cpuArchitecture: CpuArchitecture }) => {\n const { t } = useTranslation();\n return (\n <Alert\n variant={AlertVariant.warning}\n title={t('ai:No available hosts with {{cpuArchitecture}} architecture were found', {\n cpuArchitecture,\n })}\n isInline\n >\n {t(\n 'ai:The cluster can not be installed yet because there are no available hosts with {{cpuArchitecture}} architecture found. To continue:',\n { cpuArchitecture },\n )}\n <br />\n <List component={ListComponent.ol}>\n <ListItem>\n <Trans t={t} cpuArchitecture={cpuArchitecture}>\n ai:Add hosts with {{ cpuArchitecture }} architecture to an{' '}\n <Link to=\"/multicloud/infrastructure/environments\">infrastructure environment</Link>\n </Trans>\n </ListItem>\n <ListItem>\n {t('ai:Continue configuration by editing this cluster and utilize the newly added hosts')}\n </ListItem>\n </List>\n </Alert>\n );\n};\n\nexport default NoAgentsAlert;\n", "import * as Yup from 'yup';\nimport { HOSTS_MAX_COUNT, HOSTS_MIN_COUNT } from './constants';\nimport { TFunction } from 'i18next';\n\nexport const hostCountValidationSchema = (t: TFunction) => {\n return Yup.number()\n .min(\n HOSTS_MIN_COUNT,\n t('ai:A cluster can have {{HOSTS_MIN_COUNT}} hosts at minimum.', {\n HOSTS_MIN_COUNT,\n }),\n )\n .max(\n HOSTS_MAX_COUNT,\n t('ai:Maximum hosts count {{HOSTS_MAX_COUNT}} reached.', { HOSTS_MAX_COUNT }),\n )\n .test('not-four', t('ai:A cluster needs 2 or more worker nodes.'), (value) => value !== 4)\n .required(t('ai:Required field'));\n};\n", "import React from 'react';\nimport uniq from 'lodash/uniq';\nimport { Grid, GridItem, Alert, AlertVariant, List, ListItem } from '@patternfly/react-core';\n\nimport { ClusterWizardStepHeader } from '../../../common';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentWizardFooter from './ClusterDeploymentWizardFooter';\nimport ClusterDeploymentWizardStep from './ClusterDeploymentWizardStep';\nimport { ClusterDeploymentHostsDiscoveryStepProps } from './types';\nimport ClusterDeploymentHostsDiscovery from './ClusterDeploymentHostsDiscovery';\nimport { getAgentsHostsNames, isAgentOfInfraEnv } from './helpers';\nimport { getIsSNOCluster, getWizardStepAgentStatus } from '../helpers';\nimport { canNextFromHostDiscoveryStep } from './wizardTransition';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst ClusterDeploymentHostsDiscoveryStep: React.FC<ClusterDeploymentHostsDiscoveryStepProps> = ({\n agentClusterInstall,\n agents: allAgents,\n infraEnv,\n onSaveHostsDiscovery,\n onClose,\n ...rest\n}) => {\n const { t } = useTranslation();\n const { setCurrentStepId } = React.useContext(ClusterDeploymentWizardContext);\n const [showClusterErrors, setShowClusterErrors] = React.useState(false);\n const [nextRequested, setNextRequested] = React.useState(false);\n const [showFormErrors, setShowFormErrors] = React.useState(false);\n const infraEnvAgents = React.useMemo(\n () => allAgents.filter((a) => isAgentOfInfraEnv(infraEnv, a)),\n [allAgents, infraEnv],\n );\n const usedHostnames = React.useMemo(() => getAgentsHostsNames(infraEnvAgents), [infraEnvAgents]);\n\n const errors = [];\n if (getIsSNOCluster(agentClusterInstall)) {\n infraEnvAgents.length > 1 &&\n errors.push(t('ai:Single node cluster cannot contain more than 1 host.'));\n } else {\n (infraEnvAgents.length === 4 || infraEnvAgents.length < 3) &&\n errors.push(t('ai:Cluster must have 3 or 5 and more hosts.'));\n }\n\n if (infraEnvAgents.some((a) => !a.spec.approved)) {\n errors.push(t('ai:All hosts must be approved.'));\n }\n\n if (usedHostnames.some((h) => h === 'localhost')) {\n errors.push(t('ai:Hostname localhost is forbidden.'));\n }\n\n if (uniq(usedHostnames).length !== usedHostnames.length) {\n errors.push(t('ai:Hostnames must be unique.'));\n }\n const agentsNotHealthy = infraEnvAgents\n .map((agent) => getWizardStepAgentStatus(agent, 'hosts-discovery', t).status.key)\n .some((status) =>\n ['disconnected', 'disabled', 'error', 'insufficient', 'cancelled'].includes(status),\n );\n\n if (agentsNotHealthy) {\n errors.push(t('ai:Some hosts are not ready.'));\n }\n\n const onNext = async () => {\n if (!showFormErrors) {\n setShowFormErrors(true);\n if (errors.length) {\n return;\n }\n }\n await onSaveHostsDiscovery();\n setNextRequested(true);\n };\n\n React.useEffect(() => {\n setNextRequested(false);\n setShowClusterErrors(false);\n }, [infraEnvAgents.length]);\n\n React.useEffect(() => {\n if (nextRequested) {\n if (agentsNotHealthy) {\n setNextRequested(false);\n } else {\n setShowClusterErrors(true);\n if (canNextFromHostDiscoveryStep(agentClusterInstall, infraEnvAgents)) {\n setCurrentStepId('networking');\n }\n }\n }\n }, [nextRequested, infraEnvAgents, agentClusterInstall, setCurrentStepId, agentsNotHealthy]);\n\n const submittingText =\n nextRequested && !showClusterErrors ? t('ai:Saving changes...') : undefined;\n\n const onSyncError = React.useCallback(() => setNextRequested(false), []);\n\n const footer = (\n <ClusterDeploymentWizardFooter\n agentClusterInstall={agentClusterInstall}\n agents={infraEnvAgents}\n isSubmitting={!!submittingText}\n submittingText={submittingText}\n isNextDisabled={nextRequested || (showFormErrors ? !!errors.length : false)}\n onNext={onNext}\n onBack={() => setCurrentStepId('cluster-details')}\n showClusterErrors={showClusterErrors}\n onSyncError={onSyncError}\n onCancel={onClose}\n >\n {showFormErrors && !!errors.length && (\n <Alert\n variant={AlertVariant.danger}\n title={t('ai:Provided cluster configuration is not valid')}\n isInline\n >\n <List>\n {errors.map((error) => (\n <ListItem key={error}>{error}</ListItem>\n ))}\n </List>\n </Alert>\n )}\n </ClusterDeploymentWizardFooter>\n );\n\n return (\n <ClusterDeploymentWizardStep footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>{t('ai:Cluster hosts')}</ClusterWizardStepHeader>\n </GridItem>\n <GridItem>\n <ClusterDeploymentHostsDiscovery\n agentClusterInstall={agentClusterInstall}\n agents={infraEnvAgents}\n infraEnv={infraEnv}\n usedHostnames={usedHostnames}\n {...rest}\n />\n </GridItem>\n </Grid>\n </ClusterDeploymentWizardStep>\n );\n};\n\nexport default ClusterDeploymentHostsDiscoveryStep;\n", "import React from 'react';\nimport { Grid, GridItem, TextContent, Text } from '@patternfly/react-core';\nimport Measure from 'react-measure';\nimport {\n DiscoveryInstructions,\n DiscoveryTroubleshootingModal,\n FormatDiskWarning,\n HostsNotShowingLink,\n VMRebootConfigurationInfo,\n} from '../../../common';\nimport { getIsSNOCluster } from '../helpers';\nimport MinimalHWRequirements from '../Agent/MinimalHWRequirements';\nimport { ClusterDeploymentHostsDiscoveryProps } from './types';\nimport { EditBMHModal, EditAgentModal } from '../modals';\nimport { AgentK8sResource, BareMetalHostK8sResource } from '../../types';\nimport ClusterDeploymentHostDiscoveryTable from './ClusterDeploymentHostDiscoveryTable';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport AddHostDropdown from '../InfraEnv/AddHostDropdown';\n\nconst ClusterDeploymentHostsDiscovery: React.FC<ClusterDeploymentHostsDiscoveryProps> = ({\n agentClusterInstall,\n agents,\n bareMetalHosts,\n aiConfigMap,\n infraEnv,\n infraNMStates,\n usedHostnames,\n onSaveAgent,\n onEditRole,\n onSetInstallationDiskId,\n onSaveBMH,\n fetchSecret,\n onChangeBMHHostname,\n onApproveAgent,\n onDeleteHost,\n onFormSaveError,\n ...rest\n}) => {\n const [isDiscoveryHintModalOpen, setDiscoveryHintModalOpen] = React.useState(false);\n const [editBMH, setEditBMH] = React.useState<BareMetalHostK8sResource>();\n const [editAgent, setEditAgent] = React.useState<AgentK8sResource | undefined>();\n\n const isVM = true; // TODO(mlibra): calculate from agent's inventory\n\n const isSNOCluster = getIsSNOCluster(agentClusterInstall);\n const { t } = useTranslation();\n return (\n <Grid hasGutter>\n <GridItem>\n <TextContent>\n <DiscoveryInstructions showAllInstructions />\n </TextContent>\n </GridItem>\n <AddHostDropdown\n infraEnv={infraEnv}\n agentClusterInstall={agentClusterInstall}\n usedHostnames={usedHostnames}\n {...rest}\n />\n <GridItem>\n <TextContent>\n <Text component=\"h3\">{t('ai:Information and warnings')}</Text>\n {aiConfigMap && (\n <Text component=\"p\">\n <MinimalHWRequirements aiConfigMap={aiConfigMap} isSNOCluster={isSNOCluster} />\n </Text>\n )}\n <Text component=\"p\">\n <HostsNotShowingLink setDiscoveryHintModalOpen={setDiscoveryHintModalOpen} />\n </Text>\n {isVM && <VMRebootConfigurationInfo />}\n </TextContent>\n </GridItem>\n <GridItem>\n {/* <OCSDisksManualFormattingHint /> Recently not used in the ACM flow */}\n <FormatDiskWarning />\n </GridItem>\n\n <GridItem>\n <Measure bounds>\n {({ measureRef, contentRect }) => (\n <div ref={measureRef}>\n <ClusterDeploymentHostDiscoveryTable\n agents={agents}\n bareMetalHosts={bareMetalHosts}\n infraEnv={infraEnv}\n onEditHost={setEditAgent}\n onEditRole={onEditRole}\n onSetInstallationDiskId={onSetInstallationDiskId}\n onEditBMH={setEditBMH}\n onChangeHostname={onSaveAgent}\n onChangeBMHHostname={onChangeBMHHostname}\n onApprove={onApproveAgent}\n width={contentRect.bounds?.width}\n onDeleteHost={onDeleteHost}\n />\n </div>\n )}\n </Measure>\n <EditBMHModal\n infraEnv={infraEnv}\n bmh={editBMH}\n nmStates={infraNMStates}\n isOpen={!!editBMH}\n onClose={() => setEditBMH(undefined)}\n onEdit={onSaveBMH}\n fetchSecret={fetchSecret}\n usedHostnames={usedHostnames || []}\n />\n <EditAgentModal\n isOpen={!!editAgent}\n onClose={() => setEditAgent(undefined)}\n usedHostnames={usedHostnames}\n onFormSaveError={onFormSaveError}\n agent={editAgent}\n onSave={onSaveAgent}\n />\n </GridItem>\n <DiscoveryTroubleshootingModal\n isOpen={isDiscoveryHintModalOpen}\n setDiscoveryHintModalOpen={setDiscoveryHintModalOpen}\n />\n </Grid>\n );\n};\n\nexport default ClusterDeploymentHostsDiscovery;\n", "import * as React from 'react';\nimport noop from 'lodash/noop';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { Host } from '../../../common/api/types';\nimport {\n discoveryTypeColumn,\n agentStatusColumn,\n useAgentsTable,\n canChangeHostname,\n} from '../Agent/tableUtils';\nimport HostsTable, {\n DefaultExpandComponent,\n HostsTableEmptyState,\n} from '../../../common/components/hosts/HostsTable';\nimport {\n cpuCoresColumn,\n discoveredAtColumn,\n disksColumn,\n hostnameColumn,\n memoryColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport {\n DiscoveryTroubleshootingModal,\n ChangeHostnameAction,\n MassChangeHostnameModal,\n TableToolbar,\n} from '../../../common';\nimport { ClusterDeploymentHostDiscoveryTableProps } from '../ClusterDeployment/types';\nimport MassApproveAgentModal from '../modals/MassApproveAgentModal';\nimport { MassChangeHostnameModalProps } from '../../../common/components/hosts/MassChangeHostnameModal';\nimport MassApproveAction from '../modals/MassApproveAction';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\nimport { ExpandComponent } from '../Agent/AgentsSelectionTable';\nimport { HostsTableDetailContextProvider } from '../../../common/components/hosts/HostsTableDetailContext';\n\nconst ClusterDeploymentHostDiscoveryTable: React.FC<ClusterDeploymentHostDiscoveryTableProps> = ({\n agents,\n bareMetalHosts,\n infraEnv,\n onApprove,\n onChangeHostname,\n onChangeBMHHostname,\n onEditRole,\n onSetInstallationDiskId,\n onEditHost,\n onEditBMH,\n onDeleteHost,\n width,\n}) => {\n const [isDiscoveryHintModalOpen, setDiscoveryHintModalOpen] = React.useState(false);\n const [isMassChangeHostOpen, setMassChangeHostOpen] = React.useState(false);\n const [isMassApproveOpen, setMassApproveOpen] = React.useState(false);\n const [selectedHostIDs, setSelectedHostIDs] = React.useState<string[]>([]);\n const { t } = useTranslation();\n const onSelect = (host: Host, isSelected: boolean) => {\n if (isSelected) {\n setSelectedHostIDs([...selectedHostIDs, host.id]);\n } else {\n setSelectedHostIDs(selectedHostIDs.filter((sa) => sa !== host.id));\n }\n };\n\n const [hosts, hostActions, actionResolver] = useAgentsTable(\n {\n agents,\n bmhs: bareMetalHosts,\n infraEnv,\n },\n { onEditHost, onEditRole, onEditBMH, onDeleteHost, onSetInstallationDiskId },\n );\n\n const addAll = width && width > 700;\n\n const content = React.useMemo(\n () => [\n hostnameColumn(t, hostActions.onEditHost),\n ...(addAll ? [discoveryTypeColumn(agents, bareMetalHosts, t)] : []),\n agentStatusColumn({\n agents,\n bareMetalHosts,\n onEditHostname: onEditHost,\n onApprove,\n wizardStepId: 'hosts-discovery',\n t,\n }),\n roleColumn(t, hostActions.canEditRole, hostActions.onEditRole),\n ...(addAll ? [discoveredAtColumn, cpuCoresColumn, memoryColumn, disksColumn] : []),\n ],\n [agents, hostActions, bareMetalHosts, onApprove, onEditHost, addAll, t],\n );\n\n const selectedAgents = agents.filter((a) => selectedHostIDs.includes(a.metadata?.uid || ''));\n\n const massActions = [\n <ChangeHostnameAction\n key=\"hostname\"\n onChangeHostname={() => setMassChangeHostOpen(!isMassChangeHostOpen)}\n />,\n <MassApproveAction\n key=\"approve\"\n onApprove={() => setMassApproveOpen(!isMassApproveOpen)}\n selectedAgents={selectedAgents}\n />,\n ];\n\n const onAgentChangeHostname: MassChangeHostnameModalProps['onChangeHostname'] = async (\n host,\n hostname,\n ) => {\n const agent = agents.find((a) => a.metadata?.uid === host.id);\n if (agent) {\n return onChangeHostname(agent, hostname);\n } else {\n const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id);\n return bmh ? onChangeBMHHostname(bmh, hostname) : noop;\n }\n };\n\n const paginationProps = usePagination(hosts.length);\n const itemIDs = hosts.map((h) => h.id);\n\n return (\n <>\n <Stack hasGutter>\n <StackItem>\n <TableToolbar\n selectedIDs={selectedHostIDs}\n itemIDs={itemIDs}\n setSelectedIDs={setSelectedHostIDs}\n actions={massActions}\n {...paginationProps}\n />\n </StackItem>\n <StackItem>\n <HostsTableDetailContextProvider\n canEditDisks={hostActions.canEditDisks}\n onDiskRole={hostActions.onDiskRole}\n >\n <HostsTable\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n selectedIDs={selectedHostIDs}\n setSelectedIDs={setSelectedHostIDs}\n onSelect={onSelect}\n ExpandComponent={hostActions.onDiskRole ? ExpandComponent : DefaultExpandComponent}\n {...paginationProps}\n >\n <HostsTableEmptyState setDiscoveryHintModalOpen={setDiscoveryHintModalOpen} />\n </HostsTable>\n </HostsTableDetailContextProvider>\n </StackItem>\n </Stack>\n {isDiscoveryHintModalOpen && (\n <DiscoveryTroubleshootingModal\n isOpen={isDiscoveryHintModalOpen}\n setDiscoveryHintModalOpen={setDiscoveryHintModalOpen}\n />\n )}\n {isMassChangeHostOpen && (\n <MassChangeHostnameModal\n isOpen={isMassChangeHostOpen}\n hosts={hosts}\n selectedHostIDs={selectedHostIDs}\n onChangeHostname={onAgentChangeHostname}\n onClose={() => setMassChangeHostOpen(false)}\n canChangeHostname={canChangeHostname(agents, bareMetalHosts, t)}\n />\n )}\n {isMassApproveOpen && (\n <MassApproveAgentModal\n isOpen={isMassApproveOpen}\n agents={selectedAgents}\n onApprove={onApprove}\n onClose={() => setMassApproveOpen(false)}\n />\n )}\n </>\n );\n};\n\nexport default ClusterDeploymentHostDiscoveryTable;\n", "import React, { PropsWithChildren } from 'react';\nimport {\n FeatureSupportLevelsMap,\n FeatureIdToSupportLevel,\n FeatureId,\n SupportLevel,\n FeatureSupportLevelContextProvider,\n FeatureSupportLevelData,\n} from '../../../common';\nimport { ClusterImageSetK8sResource } from '../../types';\nimport { featureSupportLevelsACM } from '../../config/constants';\nimport { getFeatureDisabledReason, isFeatureSupported } from './featureStateUtils';\nimport { getOCPVersions, getVersionFromReleaseImage, getMajorMinorVersion } from '../helpers';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport type ACMFeatureSupportLevelProvider = PropsWithChildren<{\n clusterImages: ClusterImageSetK8sResource[];\n isEditClusterFlow?: boolean;\n}>;\nconst getFeatureSupportLevelsMap = (): FeatureSupportLevelsMap => {\n try {\n const featureSupportLevelsMap: FeatureSupportLevelsMap = {};\n featureSupportLevelsACM.supportLevels.forEach((feature) => {\n const featureIdParams = {};\n const featureProps = feature.features;\n featureProps.forEach((ops: { featureId: string | number; supportLevel: string }) => {\n featureIdParams[ops.featureId] = ops.supportLevel;\n });\n featureSupportLevelsMap[feature.openshiftVersion] = featureIdParams;\n });\n return featureSupportLevelsMap;\n } catch (err) {\n console.error(err);\n return {};\n }\n};\n\nexport const ACMFeatureSupportLevelProvider: React.FC<ACMFeatureSupportLevelProvider> = ({\n children,\n clusterImages,\n isEditClusterFlow = false,\n}) => {\n const { t } = useTranslation();\n\n const supportLevelData: FeatureSupportLevelsMap = React.useMemo<FeatureSupportLevelsMap>(() => {\n return getFeatureSupportLevelsMap();\n }, []);\n const ocpVersions = getOCPVersions(clusterImages);\n\n const getNormalizedVersion = React.useCallback(\n (versionName: string) => {\n const clusterImage = clusterImages.find(\n (clusterImageSet) => clusterImageSet.metadata?.name === versionName,\n );\n const version =\n getVersionFromReleaseImage(clusterImage?.spec?.releaseImage) ||\n clusterImage?.metadata?.name ||\n '';\n return getMajorMinorVersion(version);\n },\n [clusterImages],\n );\n\n const getVersionSupportLevelsMap: FeatureSupportLevelData['getVersionSupportLevelsMap'] =\n React.useCallback(\n (versionName: string): FeatureIdToSupportLevel | undefined => {\n const normalized = getNormalizedVersion(versionName);\n return normalized\n ? supportLevelData[normalized]\n : {\n /* empty FeatureIdToSupportLevel */\n };\n },\n [supportLevelData, getNormalizedVersion],\n );\n\n // TODO(mlibra): Following callbacks can be reused with the OCM flow, just based on providing an application-specific map\n const getFeatureSupportLevel: FeatureSupportLevelData['getFeatureSupportLevel'] =\n React.useCallback(\n (versionName: string, featureId: FeatureId): SupportLevel | undefined => {\n const versionSupportLevelData = getVersionSupportLevelsMap(versionName);\n return versionSupportLevelData ? versionSupportLevelData[featureId] : undefined;\n },\n [getVersionSupportLevelsMap],\n );\n\n const isFeatureSupportedCallback = React.useCallback(\n (versionName: string, featureId: FeatureId) => {\n const supportLevel = getFeatureSupportLevel(versionName, featureId);\n return isFeatureSupported(supportLevel);\n },\n [getFeatureSupportLevel],\n );\n\n const getDisabledReasonCallback = React.useCallback(\n (versionName: string, featureId: FeatureId) => {\n const isSupported = isFeatureSupportedCallback(versionName, featureId);\n return getFeatureDisabledReason(\n featureId,\n isEditClusterFlow,\n versionName,\n ocpVersions,\n isSupported,\n t,\n );\n },\n [isFeatureSupportedCallback, t, ocpVersions, isEditClusterFlow],\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,\n getFeatureSupportLevel,\n isFeatureDisabled,\n getFeatureDisabledReason: getDisabledReasonCallback,\n isFeatureSupported: isFeatureSupportedCallback,\n };\n }, [\n getVersionSupportLevelsMap,\n getFeatureSupportLevel,\n isFeatureDisabled,\n getDisabledReasonCallback,\n isFeatureSupportedCallback,\n ]);\n\n return (\n <FeatureSupportLevelContextProvider value={providerValue}>\n {children}\n </FeatureSupportLevelContextProvider>\n );\n};\n\nexport default ACMFeatureSupportLevelProvider;\n", "// source: https://github.com/openshift/assisted-service/blob/master/internal/featuresupport/support_levels_list.go\nexport const featureSupportLevelsACM = {\n supportLevels: [\n {\n features: [\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'SNO',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'LVM',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'unsupported',\n },\n ],\n openshiftVersion: '4.6',\n },\n {\n features: [\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'unsupported',\n },\n ],\n openshiftVersion: '4.7',\n },\n {\n features: [\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'SNO',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'LVM',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'unsupported',\n },\n ],\n openshiftVersion: '4.8',\n },\n {\n features: [\n {\n featureId: 'SNO',\n supportLevel: 'supported',\n },\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'LVM',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'unsupported',\n },\n ],\n openshiftVersion: '4.9',\n },\n {\n features: [\n {\n featureId: 'SNO',\n supportLevel: 'supported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'supported',\n },\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'LVM',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'unsupported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'unsupported',\n },\n ],\n openshiftVersion: '4.10',\n },\n {\n features: [\n {\n featureId: 'SNO',\n supportLevel: 'supported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'supported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'supported',\n },\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'tech-preview',\n },\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'LVM',\n supportLevel: 'dev-preview',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'dev-preview',\n },\n ],\n openshiftVersion: '4.11',\n },\n {\n features: [\n {\n featureId: 'SNO',\n supportLevel: 'supported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE',\n supportLevel: 'supported',\n },\n {\n featureId: 'ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'SINGLE_NODE_EXPANSION',\n supportLevel: 'supported',\n },\n {\n featureId: 'LVM',\n supportLevel: 'supported',\n },\n {\n featureId: 'DUAL_STACK_NETWORKING',\n supportLevel: 'supported',\n },\n {\n featureId: 'NUTANIX_INTEGRATION',\n supportLevel: 'supported',\n },\n {\n featureId: 'MULTIARCH_RELEASE_IMAGE',\n supportLevel: 'tech-preview',\n },\n {\n featureId: 'VIP_AUTO_ALLOC',\n supportLevel: 'dev-preview',\n },\n ],\n openshiftVersion: '4.12',\n },\n ],\n};\n", "import { FeatureId, OpenshiftVersionOptionType, SupportLevel } from '../../../common/types';\nimport { TFunction } from 'i18next';\n\nconst getClusterExistsReason = (t: TFunction) =>\n t('ai:This option is not editable after the draft cluster is created');\n\nconst getSNODisabledReason = (clusterExists: boolean, isSupported: boolean, t: TFunction) => {\n if (clusterExists) {\n return getClusterExistsReason(t);\n }\n if (!isSupported) {\n return t('ai:Single-Node OpenShift is not supported in this OpenShift version');\n }\n return undefined;\n};\n\nconst getArmDisabledReason = (\n clusterExists: boolean,\n versionName: string,\n versionOptions: OpenshiftVersionOptionType[],\n isSupported: boolean,\n t: TFunction,\n) => {\n if (clusterExists) {\n return getClusterExistsReason(t);\n }\n if (!isSupported) {\n return t('ai:arm64 is not supported in this OpenShift version');\n }\n // TODO(jtomasek): versionOptions derived from clusterimagesets need to include cpuArchitectures array to correctly determine this\n // if (!isArmSupportedByTheImage(versionName, versionOptions)) {\n // return t('ai:Selected image does not support arm64');\n // }\n return undefined;\n};\n\nexport const getFeatureDisabledReason = (\n featureId: FeatureId,\n clusterExists: boolean,\n versionName: string,\n versionOptions: OpenshiftVersionOptionType[],\n isSupported: boolean,\n t: TFunction,\n): string | undefined => {\n switch (featureId) {\n case 'SNO': {\n return getSNODisabledReason(clusterExists, isSupported, t);\n }\n case 'ARM64_ARCHITECTURE': {\n return getArmDisabledReason(clusterExists, versionName, versionOptions, isSupported, t);\n }\n default: {\n return undefined;\n }\n }\n};\n\nexport const isFeatureSupported = (supportLevel: SupportLevel | undefined) => {\n return supportLevel !== 'unsupported';\n};\n", "import { Grid, GridItem } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { canNextFromReviewStep } from './wizardTransition';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n ClusterImageSetK8sResource,\n InfraEnvK8sResource,\n} from '../../types';\nimport {\n ClusterWizardStepHeader,\n DetailList,\n DetailItem,\n ReviewHostsInventory,\n ClusterValidations,\n HostsValidations,\n useAlerts,\n} from '../../../common';\nimport ClusterDeploymentWizardContext from './ClusterDeploymentWizardContext';\nimport ClusterDeploymentWizardFooter from './ClusterDeploymentWizardFooter';\nimport ClusterDeploymentWizardStep from './ClusterDeploymentWizardStep';\nimport { getSelectedVersion, getAICluster, getClusterDeploymentCpuArchitecture } from '../helpers';\nimport { isAgentOfCluster } from './helpers';\nimport { wizardStepNames } from './constants';\nimport {\n wizardStepsValidationsMap,\n ClusterWizardStepsType,\n allClusterWizardSoftValidationIds,\n} from './wizardTransition';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterDeploymentReviewStepProps = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n agents: AgentK8sResource[];\n onClose: VoidFunction;\n // eslint-disable-next-line\n onFinish: () => Promise<any>;\n clusterImages: ClusterImageSetK8sResource[];\n infraEnv?: InfraEnvK8sResource;\n};\n\nconst ClusterDeploymentReviewStep: React.FC<ClusterDeploymentReviewStepProps> = ({\n agentClusterInstall,\n agents,\n onClose,\n onFinish,\n clusterDeployment,\n clusterImages,\n infraEnv,\n}) => {\n const { addAlert, clearAlerts } = useAlerts();\n const { setCurrentStepId } = React.useContext(ClusterDeploymentWizardContext);\n const [isSubmitting, setSubmitting] = React.useState(false);\n const onBack = () => setCurrentStepId('networking');\n const cdName = clusterDeployment.metadata?.name;\n const cdNamespace = clusterDeployment.metadata?.namespace;\n const cpuArchitecture = getClusterDeploymentCpuArchitecture(clusterDeployment, infraEnv);\n\n const clusterAgents = React.useMemo(\n () => agents.filter((a) => isAgentOfCluster(a, cdName, cdNamespace)),\n [agents, cdName, cdNamespace],\n );\n\n const canContinue = canNextFromReviewStep(agentClusterInstall, clusterAgents);\n const { t } = useTranslation();\n const onNext = async () => {\n clearAlerts();\n setSubmitting(true);\n try {\n await onFinish();\n } catch (err) {\n addAlert({ title: err.message || t('ai:An error occured while starting installation.') });\n } finally {\n setSubmitting(false);\n }\n };\n\n const footer = (\n <ClusterDeploymentWizardFooter\n agentClusterInstall={agentClusterInstall}\n agents={clusterAgents}\n isSubmitting={isSubmitting}\n isNextDisabled={isSubmitting || !canContinue}\n onBack={onBack}\n onNext={onNext}\n onCancel={onClose}\n nextButtonText={t('ai:Install cluster')}\n />\n );\n\n const openShiftVersion = getSelectedVersion(clusterImages, agentClusterInstall);\n\n const cluster = React.useMemo(\n () => getAICluster({ clusterDeployment, agentClusterInstall, agents: clusterAgents }),\n [clusterDeployment, agentClusterInstall, clusterAgents],\n );\n\n return (\n <ClusterDeploymentWizardStep footer={footer}>\n <Grid hasGutter>\n <GridItem>\n <ClusterWizardStepHeader>Review and create</ClusterWizardStepHeader>\n </GridItem>\n <GridItem>\n <DetailList>\n <DetailItem\n title={t('ai:Cluster address')}\n value={`${clusterDeployment.metadata?.name}.${clusterDeployment.spec?.baseDomain}`}\n testId=\"cluster-address\"\n />\n <DetailItem\n title={t('ai:OpenShift version')}\n value={openShiftVersion}\n testId=\"openshift-version\"\n />\n <DetailItem\n title={t('ai:CPU architecture')}\n value={cpuArchitecture}\n testId=\"cpu-architecture\"\n />\n <DetailItem\n title={t('ai:API IP')}\n value={agentClusterInstall.spec?.apiVIP}\n testId=\"api-vip\"\n />\n <DetailItem\n title={t('ai:Ingress IP')}\n value={agentClusterInstall.spec?.ingressVIP}\n testId=\"ingress-vip\"\n />\n <DetailItem\n title={t('ai:Cluster summary')}\n testId=\"cluster-summary\"\n value={<ReviewHostsInventory hosts={cluster.hosts} />}\n />\n\n <DetailItem\n title={t('ai:Cluster validations')}\n value={\n <ClusterValidations<ClusterWizardStepsType>\n validationsInfo={cluster.validationsInfo}\n setCurrentStepId={setCurrentStepId}\n wizardStepNames={wizardStepNames(t)}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n }\n testId=\"cluster-validations\"\n />\n <DetailItem\n title={t('ai:Host validations')}\n value={\n <HostsValidations<ClusterWizardStepsType, typeof allClusterWizardSoftValidationIds>\n hosts={cluster.hosts}\n setCurrentStepId={setCurrentStepId}\n wizardStepNames={wizardStepNames(t)}\n allClusterWizardSoftValidationIds={allClusterWizardSoftValidationIds}\n wizardStepsValidationsMap={wizardStepsValidationsMap}\n />\n }\n testId=\"host-validations\"\n />\n </DetailList>\n </GridItem>\n </Grid>\n </ClusterDeploymentWizardStep>\n );\n};\n\nexport default ClusterDeploymentReviewStep;\n", "import * as React from 'react';\nimport MonacoEditor from 'react-monaco-editor';\nimport Measure from 'react-measure';\nimport {\n Alert,\n AlertActionCloseButton,\n ClipboardCopyButton,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { LoadingState } from '../../../common';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst options = { readOnly: true, scrollBeyondLastLine: false };\n\nconst theme = {\n base: 'vs',\n inherit: true,\n rules: [\n { background: 'e0e0e0' },\n { token: 'number', foreground: '000000' },\n { token: 'type', foreground: '000000' },\n { token: 'string', foreground: '000000' },\n { token: 'keyword', foreground: '0451a5' },\n ],\n colors: {\n 'editor.background': '#e0e0e0',\n 'editorGutter.background': '#e0e0e0', // no pf token defined\n 'editorLineNumber.activeForeground': '#000000',\n 'editorLineNumber.foreground': '#000000',\n },\n};\n\ntype YamlPreviewProps = {\n code: string;\n setPreviewOpen: (open: boolean) => void;\n loading: boolean;\n};\n\nconst YamlPreview: React.FC<YamlPreviewProps> = ({ children, code, setPreviewOpen, loading }) => {\n const editorDidMount = React.useCallback((editor) => {\n editor.layout();\n editor.focus();\n }, []);\n\n const editorWillMount = React.useCallback((monaco) => {\n monaco.editor.defineTheme('acm-console', theme);\n }, []);\n const { t } = useTranslation();\n return loading ? (\n <LoadingState content=\"Loading resources\" />\n ) : (\n <Stack>\n <StackItem>\n <div>\n <Alert\n isInline\n title={t('ai:The resource has been saved and the YAML is now read only.')}\n variant=\"info\"\n actionClose={<AlertActionCloseButton onClose={() => setPreviewOpen(false)} />}\n />\n <div className=\"readonly-editor-bar\">\n <div>{children}</div>\n <ClipboardCopyButton\n variant=\"plain\"\n id=\"copy\"\n textId=\"copy\"\n onClick={() => navigator.clipboard.writeText(code)}\n >\n <div />\n </ClipboardCopyButton>\n </div>\n </div>\n </StackItem>\n <StackItem isFilled>\n <Measure bounds>\n {({ measureRef, contentRect }) => (\n <div ref={measureRef} style={{ height: '100%' }}>\n {!!contentRect.bounds?.height && (\n <MonacoEditor\n language=\"yaml\"\n theme=\"acm-console\"\n height={contentRect.bounds?.height}\n value={code}\n options={options}\n editorDidMount={editorDidMount}\n editorWillMount={editorWillMount}\n />\n )}\n </div>\n )}\n </Measure>\n </StackItem>\n </Stack>\n );\n};\n\nexport default YamlPreview;\n", "import cloneDeep from 'lodash/cloneDeep';\nimport * as React from 'react';\nimport * as yaml from 'js-yaml';\nimport { K8sResourceCommon } from '@openshift-console/dynamic-plugin-sdk';\nimport {\n ClusterDeploymentK8sResource,\n AgentClusterInstallK8sResource,\n SecretK8sResource,\n} from '../../types';\n\ntype YamlPreviewArgs = {\n clusterDeployment: ClusterDeploymentK8sResource;\n agentClusterInstall: AgentClusterInstallK8sResource;\n fetchSecret: (namespace: string, bmhName: string) => Promise<SecretK8sResource>;\n fetchManagedClusters: () => Promise<K8sResourceCommon[]>;\n fetchKlusterletAddonConfig: () => Promise<K8sResourceCommon[]>;\n};\n\nconst resourceToString = (resource: K8sResourceCommon | undefined) => {\n if (!resource) {\n return undefined;\n }\n const resourceClone = cloneDeep(resource);\n // eslint-disable-next-line\n delete (resourceClone as any).status;\n resourceClone.metadata = {\n name: resourceClone.metadata?.name,\n namespace: resourceClone.metadata?.namespace,\n labels: resourceClone.metadata?.labels,\n };\n\n return yaml.dump(resourceClone);\n};\n\nexport const useYamlPreview = ({\n clusterDeployment,\n agentClusterInstall,\n fetchSecret,\n fetchManagedClusters,\n fetchKlusterletAddonConfig,\n}: YamlPreviewArgs) => {\n const [loadingResources, setLoadingResources] = React.useState(true);\n const [pullSecret, setPullSecret] = React.useState<SecretK8sResource>();\n const [managedCluster, setManagedCluster] = React.useState<K8sResourceCommon>();\n const [klusterlet, setKlusterlet] = React.useState<K8sResourceCommon>();\n\n const cdName = clusterDeployment.metadata?.name;\n const cdNamespace = clusterDeployment.metadata?.namespace;\n const secretName = clusterDeployment.spec?.pullSecretRef?.name;\n\n React.useEffect(() => {\n const fetch = async () => {\n const results = await Promise.allSettled([\n fetchSecret(cdNamespace || '', secretName || ''),\n fetchManagedClusters(),\n fetchKlusterletAddonConfig(),\n ]);\n\n const [secretResult, managedClustersResult, klusterletsResult] = results;\n\n if (secretResult.status === 'fulfilled') {\n setPullSecret(secretResult.value);\n }\n\n if (managedClustersResult.status === 'fulfilled') {\n setManagedCluster(\n managedClustersResult.value.find((mc) => mc.metadata?.labels?.name === cdName),\n );\n }\n\n if (klusterletsResult.status === 'fulfilled') {\n setKlusterlet(\n klusterletsResult.value.find(\n (kac) =>\n // eslint-disable-next-line\n (kac as any).spec.clusterName === cdName &&\n // eslint-disable-next-line\n (kac as any).spec.clusterNamespace === cdNamespace,\n ),\n );\n }\n\n setLoadingResources(false);\n };\n\n void fetch();\n }, [\n fetchSecret,\n cdNamespace,\n cdName,\n secretName,\n fetchManagedClusters,\n fetchKlusterletAddonConfig,\n ]);\n\n const code = React.useMemo(\n () =>\n [clusterDeployment, agentClusterInstall, pullSecret, managedCluster, klusterlet]\n .map(resourceToString)\n .filter((r) => !!r)\n .join(`\\n---\\n`),\n [clusterDeployment, agentClusterInstall, pullSecret, managedCluster, klusterlet],\n );\n\n return { code, loadingResources };\n};\n", "import React from 'react';\nimport { GridItem, Alert, AlertVariant, AlertActionLink } from '@patternfly/react-core';\nimport { toSentence } from '../../../common/components/ui/table/utils';\nimport { getReportIssueLink } from '../../../common/config';\nimport { AgentClusterInstallK8sResource } from '../../types';\nimport { getClusterStatus } from '../helpers';\nimport { LogsDownloadButton } from './LogsDownloadButton';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\ntype ClusterInstallationErrorProps = {\n agentClusterInstall?: AgentClusterInstallK8sResource;\n};\n\nconst getID = (suffix: string) => `cluster-install-error-${suffix}`;\n\nconst ClusterInstallationError: React.FC<ClusterInstallationErrorProps> = ({\n agentClusterInstall,\n}) => {\n const [clusterStatus, statusInfo] = getClusterStatus(agentClusterInstall);\n const { t } = useTranslation();\n const title =\n clusterStatus === 'cancelled'\n ? t('ai:Cluster installation was cancelled')\n : t('ai:Cluster installation failed');\n\n return (\n <GridItem>\n <Alert\n variant={AlertVariant.danger}\n title={title}\n actionLinks={\n <>\n <LogsDownloadButton\n id={getID('button-download-installation-logs')}\n Component={AlertActionLink}\n agentClusterInstall={agentClusterInstall}\n />\n <AlertActionLink\n onClick={() => window.open(getReportIssueLink(), '_blank')}\n id={getID('button-report-bug')}\n >\n {t('ai:Report a bug')}\n </AlertActionLink>\n </>\n }\n isInline\n >\n {toSentence(statusInfo)}\n </Alert>\n </GridItem>\n );\n};\n\nexport default ClusterInstallationError;\n", "import { Formik, FormikProps, useFormikContext } from 'formik';\nimport noop from 'lodash/noop';\nimport * as React from 'react';\nimport { Ref } from 'react';\nimport { ClusterDetailsValues, getRichTextValidation } from '../../../common';\nimport {\n AgentClusterInstallK8sResource,\n AgentK8sResource,\n ClusterDeploymentK8sResource,\n} from '../../types';\nimport { ClusterImageSetK8sResource } from '../../types/k8s/cluster-image-set';\nimport ClusterDeploymentDetailsForm from './ClusterDeploymentDetailsForm';\nimport { useDetailsFormik } from './ClusterDeploymentDetailsStep';\nimport { ClusterDetailsFormFieldsProps } from './ClusterDetailsFormFields';\n\ntype DetailsFormBodyProps = {\n clusterImages: ClusterImageSetK8sResource[];\n onValuesChanged: (values: ClusterDetailsValues, initRender: boolean) => void;\n clusterDeployment?: ClusterDeploymentK8sResource;\n agentClusterInstall?: AgentClusterInstallK8sResource;\n agents?: AgentK8sResource[];\n defaultBaseDomain?: string;\n pullSecret?: string;\n extensionAfter: ClusterDetailsFormFieldsProps['extensionAfter'];\n};\n\nconst DetailsFormBody: React.FC<DetailsFormBodyProps> = ({\n onValuesChanged,\n clusterDeployment,\n agentClusterInstall,\n clusterImages,\n pullSecret,\n extensionAfter,\n}) => {\n const { values } = useFormikContext<ClusterDetailsValues>();\n const initRenderRef = React.useRef(true);\n React.useEffect(() => onValuesChanged(values, initRenderRef.current), [onValuesChanged, values]);\n React.useEffect(() => {\n initRenderRef.current = false;\n }, []);\n\n return (\n <ClusterDeploymentDetailsForm\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n clusterImages={clusterImages}\n pullSecret={pullSecret}\n extensionAfter={extensionAfter}\n />\n );\n};\n\ntype ACMClusterDeploymentDetailsStepProps = DetailsFormBodyProps & {\n usedClusterNames: string[];\n formRef: Ref<FormikProps<ClusterDetailsValues>>;\n};\n\nconst ACMClusterDeploymentDetailsStep: React.FC<ACMClusterDeploymentDetailsStepProps> = ({\n clusterDeployment,\n agentClusterInstall,\n clusterImages,\n formRef,\n onValuesChanged,\n usedClusterNames,\n agents,\n defaultBaseDomain,\n pullSecret,\n extensionAfter,\n}) => {\n const [initialValues, validationSchema] = useDetailsFormik({\n clusterDeployment,\n agentClusterInstall,\n clusterImages,\n usedClusterNames,\n agents,\n defaultBaseDomain,\n pullSecret,\n });\n return (\n <Formik\n initialValues={initialValues}\n validate={getRichTextValidation(validationSchema)}\n innerRef={formRef}\n onSubmit={noop}\n >\n <DetailsFormBody\n clusterDeployment={clusterDeployment}\n agentClusterInstall={agentClusterInstall}\n onValuesChanged={onValuesChanged}\n clusterImages={clusterImages}\n pullSecret={pullSecret}\n extensionAfter={extensionAfter}\n />\n </Formik>\n );\n};\n\nexport default ACMClusterDeploymentDetailsStep;\n", "import * as React from 'react';\nimport { CheckCircleIcon } from '@patternfly/react-icons';\nimport { global_palette_green_500 as okColor } from '@patternfly/react-tokens/dist/js/global_palette_green_500';\nimport {\n Bullseye,\n Button,\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n EmptyStateSecondaryActions,\n Spinner,\n Title,\n} from '@patternfly/react-core';\nimport { isInstallationReady } from './helpers';\nimport { AgentClusterInstallK8sResource } from '../../types';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nconst GreenCheckCircleIcon: React.FC = (props) => (\n <CheckCircleIcon {...props} color={okColor.value} />\n);\n\ntype ClusterDeploymentCreateProgressProps = {\n agentClusterInstall: AgentClusterInstallK8sResource;\n toDetails: VoidFunction;\n toListView: VoidFunction;\n};\n\nconst ClusterDeploymentCreateProgress: React.FC<ClusterDeploymentCreateProgressProps> = ({\n agentClusterInstall,\n toDetails,\n toListView,\n}) => {\n const { t } = useTranslation();\n return (\n <Bullseye>\n <EmptyState>\n {isInstallationReady(agentClusterInstall) ? (\n <>\n <EmptyStateIcon icon={GreenCheckCircleIcon} />\n <Title headingLevel=\"h4\" size=\"lg\">\n {t('ai:Cluster is ready for installation')}\n </Title>\n <EmptyStateBody>\n <div>{t('ai:This cluster has been created and is ready to begin installation.')}</div>\n <div>{t('ai:To see the status of the installation see the details page.')}</div>\n </EmptyStateBody>\n </>\n ) : (\n <>\n <EmptyStateIcon icon={Spinner} />\n <Title headingLevel=\"h4\" size=\"lg\">\n {t('ai:Preparing cluster installation')}\n </Title>\n <EmptyStateBody>\n <div>\n {t('ai:This cluster is in the process of getting ready to start installation.')}\n </div>\n <div>\n {t(\n 'ai:If you exit this flow you can see its status in the list view or details page.',\n )}\n </div>\n </EmptyStateBody>\n </>\n )}\n <EmptyStateSecondaryActions>\n <Button variant=\"primary\" onClick={toDetails}>\n {t('ai:See cluster details')}\n </Button>\n <Button variant=\"link\" onClick={toListView}>\n {t('ai:Go to cluster list')}\n </Button>\n </EmptyStateSecondaryActions>\n </EmptyState>\n </Bullseye>\n );\n};\n\nexport default ClusterDeploymentCreateProgress;\n", "import * as React from 'react';\nimport { AgentClusterInstallK8sResource, AgentK8sResource } from '../../types';\nimport { AgentTableActions } from '../ClusterDeployment/types';\nimport DefaultEmptyState from '../../../common/components/ui/uiState/EmptyState';\nimport { ConnectedIcon } from '@patternfly/react-icons';\nimport { infraEnvColumn, agentStatusColumn, useAgentsTable } from './tableUtils';\nimport {\n cpuArchitectureColumn,\n cpuCoresColumn,\n disksColumn,\n hostnameColumn,\n memoryColumn,\n roleColumn,\n} from '../../../common/components/hosts/tableUtils';\nimport HostsTable, { DefaultExpandComponent } from '../../../common/components/hosts/HostsTable';\nimport { usePagination } from '../../../common/components/hosts/usePagination';\nimport { useTranslation } from '../../../common/hooks/use-translation-wrapper';\n\nexport const getAgentId = (agent: AgentK8sResource) => agent.metadata?.uid as string;\n\nexport const AgentTableEmptyState = () => {\n const { t } = useTranslation();\n return (\n <DefaultEmptyState\n icon={ConnectedIcon}\n title={t('ai:Waiting for hosts...')}\n content={t('ai:Hosts may take a few minutes to appear here after booting.')}\n />\n );\n};\n\nexport type AgentTableProps = Pick<AgentTableActions, 'onUnbindHost'> & {\n agents: AgentK8sResource[];\n agentClusterInstall: AgentClusterInstallK8sResource;\n className?: string;\n};\n\nconst AgentTable: React.FC<AgentTableProps> = ({\n agents,\n agentClusterInstall,\n className,\n onUnbindHost,\n}) => {\n const { t } = useTranslation();\n const agentClusterInstalls = React.useMemo(() => [agentClusterInstall], [agentClusterInstall]);\n const [hosts, hostActions, actionResolver] = useAgentsTable(\n { agents, agentClusterInstalls },\n {\n onUnbindHost,\n },\n );\n const content = React.useMemo(\n () => [\n hostnameColumn(t, hostActions.onEditHost),\n roleColumn(t),\n agentStatusColumn({\n agents,\n t,\n }),\n infraEnvColumn(agents, t),\n cpuArchitectureColumn(t),\n cpuCoresColumn,\n memoryColumn,\n disksColumn,\n ],\n [agents, hostActions, t],\n );\n\n const paginationProps = usePagination(agents.length);\n return (\n <HostsTable\n hosts={hosts}\n content={content}\n actionResolver={actionResolver}\n className={className}\n ExpandComponent={DefaultExpandComponent}\n {...paginationProps}\n >\n <AgentTableEmptyState />\n </HostsTable>\n );\n};\n\nexport default AgentTable;\n", "import { Formik } from 'formik';\nimport noop from 'lodash/noop';\nimport * as React from 'react';\nimport * as Yup from 'yup';\nimport {\n dnsNameValidationSchema,\n getDefaultOpenShiftVersion,\n nameValidationSchema,\n pullSecretValidationSchema,\n} from '../../../../../common';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\nimport { useSupportedOCPVersions } from '../../hooks/useSupportedOCPVersions';\nimport DetailsForm from './DetailsForm';\nimport { DetailsStepProps, UseDetailsFormik } from './types';\n\nconst useDetailsFormik: UseDetailsFormik = ({\n ocpVersions,\n usedClusterNames,\n initPullSecret = '',\n initBaseDomain = '',\n}) => {\n const { t } = useTranslation();\n const initialValues = React.useMemo(\n () => ({\n name: '',\n openshiftVersion: getDefaultOpenShiftVersion(ocpVersions),\n pullSecret: initPullSecret,\n baseDnsDomain: initBaseDomain,\n }),\n [], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const validationSchema = React.useMemo(\n () =>\n Yup.object({\n name: nameValidationSchema(t, usedClusterNames),\n baseDnsDomain: dnsNameValidationSchema.required('Required'),\n pullSecret: pullSecretValidationSchema.required('Required.'),\n }),\n [usedClusterNames, t],\n );\n\n return [initialValues, validationSchema];\n};\n\nconst DetailsStep: React.FC<DetailsStepProps> = ({\n usedClusterNames,\n clusterImages,\n onValuesChanged,\n extensionAfter,\n formRef,\n initBaseDomain,\n initPullSecret,\n supportedVersionsCM,\n}) => {\n const ocpVersions = useSupportedOCPVersions(clusterImages, supportedVersionsCM);\n const [initialValues, validationSchema] = useDetailsFormik({\n ocpVersions,\n usedClusterNames,\n initPullSecret,\n initBaseDomain,\n });\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={validationSchema}\n innerRef={formRef}\n onSubmit={noop}\n >\n <DetailsForm\n onValuesChanged={onValuesChanged}\n ocpVersions={ocpVersions}\n extensionAfter={extensionAfter}\n />\n </Formik>\n );\n};\n\nexport default DetailsStep;\n", "import * as React from 'react';\nimport { getErrorMessage } from '../../../../common/utils';\nimport { ClusterImageSetK8sResource, ConfigMapK8sResource } from '../../../types';\nimport { getOCPVersions } from '../../helpers';\n\nexport const getSupportedCM = (configMaps: ConfigMapK8sResource[]) =>\n configMaps.find(\n (cm) => cm.metadata?.labels?.['hypershift.openshift.io/supported-versions'] === 'true',\n );\n\nexport const useSupportedOCPVersions = (\n clusterImages: ClusterImageSetK8sResource[],\n supportedVersionsCM?: ConfigMapK8sResource,\n) => {\n return React.useMemo(() => {\n const ocpVersions = getOCPVersions(clusterImages);\n const supportedVersionsString = supportedVersionsCM?.data?.['supported-versions'];\n if (supportedVersionsString) {\n try {\n const supportedVersions = (JSON.parse(supportedVersionsString) as { versions: string[] })\n .versions;\n return ocpVersions.filter((v) => supportedVersions.find((sv) => v.version.startsWith(sv)));\n } catch (err) {\n console.error('Could not parse supported versions config map value.', getErrorMessage(err));\n }\n }\n return ocpVersions;\n }, [clusterImages, supportedVersionsCM]);\n};\n", "import { Form } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport * as React from 'react';\nimport { InputField, OpenShiftVersionSelect, PullSecret } from '../../../../../common';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\nimport { BaseDnsHelperText } from '../../../ClusterDeployment/ClusterDetailsFormFields';\nimport { useTemptiflySync } from '../../hooks/useTemptiflySync';\nimport { DetailsFormProps, DetailsFormValues } from './types';\n\nconst DetailsForm: React.FC<DetailsFormProps> = ({\n onValuesChanged,\n extensionAfter,\n ocpVersions,\n}) => {\n const { values } = useFormikContext<DetailsFormValues>();\n useTemptiflySync({ values, onValuesChanged });\n\n const nameInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n nameInputRef.current?.focus();\n }, []);\n\n const { t } = useTranslation();\n return (\n <Form>\n <InputField\n ref={nameInputRef}\n label={t('ai:Cluster name')}\n name=\"name\"\n placeholder={t('ai:Enter cluster name')}\n isRequired\n />\n {extensionAfter?.['name'] && extensionAfter['name']}\n <InputField\n label={t('ai:Base domain')}\n name=\"baseDnsDomain\"\n helperText={<BaseDnsHelperText name={values.name} baseDnsDomain={values.baseDnsDomain} />}\n placeholder=\"example.com\"\n isRequired\n />\n <OpenShiftVersionSelect versions={ocpVersions} />\n <PullSecret />\n </Form>\n );\n};\n\nexport default DetailsForm;\n", "import * as React from 'react';\n\ntype UseTemptiflySyncArgs<V> = {\n values: V;\n onValuesChanged: (values: V, initRender: boolean) => void;\n};\n\nexport const useTemptiflySync = <V>({ values, onValuesChanged }: UseTemptiflySyncArgs<V>) => {\n const initRenderRef = React.useRef(true);\n React.useEffect(() => onValuesChanged(values, initRenderRef.current), [onValuesChanged, values]);\n React.useEffect(() => {\n initRenderRef.current = false;\n }, []);\n\n const nameInputRef = React.useRef<HTMLInputElement>();\n React.useEffect(() => {\n nameInputRef.current?.focus();\n }, []);\n};\n", "import * as React from 'react';\nimport * as Yup from 'yup';\nimport { Formik } from 'formik';\nimport noop from 'lodash/noop';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport HostsForm from './HostsForm';\nimport { HostsStepProps, HostsFormValues, NodePoolFormValue } from './types';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\nimport { getAgentsForSelection } from '../../../helpers';\nimport { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../../../common';\nimport { TFunction } from 'i18next';\nimport { NodePoolK8sResource } from '../../types';\n\nconst validationSchema = (clusterName: string, nodePools: NodePoolK8sResource[], t: TFunction) =>\n Yup.lazy<HostsFormValues>((values) =>\n Yup.object<HostsFormValues>().shape({\n agentNamespace: Yup.string().required(t('ai:Required field')),\n nodePools: Yup.array().of(\n Yup.object<NodePoolFormValue>()\n .shape({\n name: Yup.string()\n .required(t('ai:Required field'))\n .test(t('ai:Must be unique'), t('ai:Must be unique'), (value) => {\n if (!value) {\n return true;\n }\n return (\n values.nodePools.filter(({ name }) => name === value).length === 1 &&\n !nodePools.some(\n ({ metadata }) =>\n metadata?.name === value && metadata?.namespace === clusterName,\n )\n );\n }),\n clusterName: Yup.string().required(t('ai:Required field')),\n count: Yup.number(),\n releaseImage: Yup.string().required(t('ai:Required field')),\n })\n .required(t('ai:Required field')),\n ),\n }),\n );\n\nconst HostsStep: React.FC<HostsStepProps> = ({\n formRef,\n onValuesChanged,\n infraEnvs,\n agents,\n clusterName,\n initInfraEnv,\n initNodePools,\n initReleaseImage,\n nodePools,\n}) => {\n const { t } = useTranslation();\n const availableAgents = getAgentsForSelection(agents);\n\n const infraEnvsWithAgents = infraEnvs.filter((ie) =>\n availableAgents.some(\n (a) =>\n a.metadata?.labels?.[INFRAENV_AGENTINSTALL_LABEL_KEY] === ie.metadata?.name &&\n a.metadata?.namespace === ie.metadata?.namespace &&\n !a.spec.clusterDeploymentName,\n ),\n );\n return (\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:Define the quantity of worker nodes and nodepools to create for your cluster. Additional worker nodes and nodepools can be added after the cluster is created.',\n )}\n </StackItem>\n <StackItem>\n <Formik<HostsFormValues>\n initialValues={{\n agentNamespace: initInfraEnv || infraEnvsWithAgents[0]?.metadata?.namespace || '',\n nodePools: initNodePools || [\n {\n name: `nodepool-${clusterName}-1`,\n count: 1,\n agentLabels: [],\n releaseImage: initReleaseImage,\n clusterName,\n },\n ],\n }}\n validationSchema={validationSchema(clusterName, nodePools, t)}\n innerRef={formRef}\n onSubmit={noop}\n >\n <HostsForm\n onValuesChanged={onValuesChanged}\n infraEnvs={infraEnvsWithAgents}\n agents={agents}\n clusterName={clusterName}\n initReleaseImage={initReleaseImage}\n />\n </Formik>\n </StackItem>\n </Stack>\n );\n};\n\nexport default HostsStep;\n", "import * as React from 'react';\nimport { FieldArray, useFormikContext } from 'formik';\nimport { PlusCircleIcon } from '@patternfly/react-icons';\nimport { Alert, Button, Form, Grid, GridItem } from '@patternfly/react-core';\n\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\nimport { PopoverIcon, SelectField } from '../../../../../common';\nimport { getRandomString } from '../../../../../common/utils';\nimport { useTemptiflySync } from '../../hooks/useTemptiflySync';\n\nimport NodePoolForm from './NodePoolForm';\nimport { HostsFormValues, HostsFormProps, NodePoolFormValue } from './types';\n\nconst HostsForm: React.FC<HostsFormProps> = ({\n onValuesChanged,\n infraEnvs,\n agents,\n clusterName,\n initReleaseImage,\n}) => {\n const { values } = useFormikContext<HostsFormValues>();\n useTemptiflySync({ values, onValuesChanged });\n\n const { t } = useTranslation();\n const infraEnvOptions = infraEnvs.length\n ? infraEnvs.map((ie) => ({\n label: ie.metadata?.namespace || '',\n value: ie.metadata?.namespace || '',\n }))\n : [\n {\n label: t('ai:No namespace with hosts is available'),\n value: 'NOT_AVAILABLE',\n },\n ];\n\n const totalHosts = values.nodePools.reduce((acc, nodePool) => {\n acc += nodePool.count;\n return acc;\n }, 0);\n\n return (\n <Form>\n <Grid hasGutter>\n <GridItem>\n <SelectField\n label={t('ai:Namespace')}\n name=\"agentNamespace\"\n options={infraEnvOptions}\n isRequired\n isDisabled={!infraEnvs.length}\n labelIcon={\n <PopoverIcon\n position=\"right\"\n bodyContent={t(\n 'ai:Choose a namespace from your existing host inventory in order to select hosts for your node pools. The namespace will be composed of 1 or more infrastructure environments. After the cluster is created, a host will become a worker node.',\n )}\n />\n }\n />\n </GridItem>\n {totalHosts === 0 && (\n <GridItem>\n <Alert\n isInline\n variant=\"warning\"\n title={t('ai:The cluster has 0 hosts. No workloads will be able to run.')}\n />\n </GridItem>\n )}\n <FieldArray name=\"nodePools\">\n {({ remove, push }) => (\n <>\n {values.nodePools.map((nodePool, index) => (\n <GridItem key={index}>\n <NodePoolForm\n index={index}\n agents={agents}\n infraEnvs={infraEnvs}\n onRemove={() => remove(index)}\n />\n </GridItem>\n ))}\n <GridItem>\n <Button\n variant=\"link\"\n icon={<PlusCircleIcon />}\n iconPosition=\"right\"\n onClick={() => {\n const uniquePoolName = `nodepool-${clusterName}-${getRandomString(5)}`;\n push({\n name: uniquePoolName,\n count: 1,\n agentLabels: [],\n releaseImage: initReleaseImage,\n clusterName,\n } as NodePoolFormValue);\n }}\n >\n {t('ai:Add Nodepool')}\n </Button>\n </GridItem>\n </>\n )}\n </FieldArray>\n </Grid>\n </Form>\n );\n};\n\nexport default HostsForm;\n", "import {\n Button,\n Divider,\n ExpandableSectionToggle,\n Flex,\n FlexItem,\n Label,\n Level,\n LevelItem,\n Split,\n SplitItem,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport * as React from 'react';\nimport { TrashIcon } from '@patternfly/react-icons';\nimport isMatch from 'lodash/isMatch';\nimport { PencilEditField } from '../../../../../common';\nimport { AgentK8sResource, InfraEnvK8sResource } from '../../../../types';\nimport { isAgentOfInfraEnv } from '../../../ClusterDeployment';\nimport { HostsFormValues } from './types';\nimport { useFormikContext } from 'formik';\nimport { getAgentsForSelection } from '../../../helpers';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\nimport { useFormikHelpers } from '../../../../../common/hooks/useFormikHelpers';\n\nimport './NodePoolForm.css';\nimport NodePoolAgentsForm from '../../forms/NodePoolAgentsForm';\n\ntype NodePoolFormProps = {\n infraEnvs: InfraEnvK8sResource[];\n agents: AgentK8sResource[];\n index: number;\n onRemove: VoidFunction;\n};\n\nconst NodePoolForm: React.FC<NodePoolFormProps> = ({ infraEnvs, agents, index, onRemove }) => {\n const { t } = useTranslation();\n const { values } = useFormikContext<HostsFormValues>();\n const { setValue } = useFormikHelpers(`nodePools[${index}].count`);\n const [isExpanded, setExpanded] = React.useState(true);\n const infraEnvAgents = React.useMemo(() => {\n const infraEnv = infraEnvs.find((ie) => ie.metadata?.namespace === values.agentNamespace);\n return agents.filter((agent) => isAgentOfInfraEnv(infraEnv, agent));\n }, [infraEnvs, agents, values.agentNamespace]);\n\n const { agentLabels } = values.nodePools[index];\n\n const availableAgents = getAgentsForSelection(infraEnvAgents);\n\n const matchingAgents = availableAgents.filter((agent) => {\n const labels = agentLabels.reduce<{ [key: string]: string }>((acc, { key, value }) => {\n acc[key] = value;\n return acc;\n }, {});\n return (\n isMatch(agent.metadata?.labels || {}, labels) &&\n !agent.spec.clusterDeploymentName?.name &&\n !agent.spec.clusterDeploymentName?.namespace\n );\n });\n\n let previousNodePoolsCount = 0;\n\n for (let i = 0; i < index; i++) {\n previousNodePoolsCount += values.nodePools[i].count;\n }\n\n const maxAgents = Math.max(\n 0,\n Math.min(matchingAgents.length, availableAgents.length - previousNodePoolsCount),\n );\n\n const currentCount = values.nodePools[index].count;\n React.useEffect(() => {\n if (currentCount > maxAgents) {\n void setValue(maxAgents);\n }\n }, [maxAgents, setValue, currentCount]);\n\n return (\n <Stack hasGutter>\n <StackItem>\n <Level hasGutter>\n <LevelItem>\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n spaceItems={{ default: 'spaceItemsMd' }}\n flexWrap={{ default: 'wrap' }}\n >\n <FlexItem>\n <Split className=\"ai-node-pool__header\">\n <SplitItem>\n <ExpandableSectionToggle\n className=\"ai-node-pool__expandable-button\"\n isExpanded={isExpanded}\n onToggle={setExpanded}\n />\n </SplitItem>\n <SplitItem>\n <PencilEditField\n name={`nodePools.${index}.name`}\n isRequired\n showErrorMessage={false}\n />\n </SplitItem>\n </Split>\n </FlexItem>\n {!isExpanded && (\n <>\n <FlexItem>\n <Divider isVertical />\n </FlexItem>\n <FlexItem>\n <Label variant=\"outline\">\n {t('ai:{{count}} filtering label', {\n count: values.nodePools[index].agentLabels.length,\n })}\n </Label>\n </FlexItem>\n </>\n )}\n </Flex>\n </LevelItem>\n {index !== 0 && (\n <LevelItem>\n <Button variant=\"link\" icon={<TrashIcon />} onClick={onRemove} />\n </LevelItem>\n )}\n </Level>\n </StackItem>\n {isExpanded && (\n <StackItem className=\"ai-node-pool__section\">\n <NodePoolAgentsForm\n agents={infraEnvAgents}\n countName={`nodePools.${index}.count`}\n labelName={`nodePools.${index}.agentLabels`}\n maxAgents={maxAgents}\n />\n </StackItem>\n )}\n </Stack>\n );\n};\n\nexport default NodePoolForm;\n", "import { Grid, GridItem } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { NumberInputField, PopoverIcon } from '../../../../common';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { AgentK8sResource } from '../../../types';\nimport { LabelSelectorGroup } from '../../ClusterDeployment/LabelsSelector';\n\ntype NodePoolAgentsFormProps = {\n agents: AgentK8sResource[];\n labelName: string;\n countName: string;\n maxAgents: number;\n isEdit?: boolean;\n};\n\nconst NodePoolAgentsForm = ({\n agents,\n labelName,\n countName,\n maxAgents,\n isEdit,\n}: NodePoolAgentsFormProps) => {\n const { t } = useTranslation();\n return (\n <Grid hasGutter>\n {!isEdit && (\n <GridItem>\n <LabelSelectorGroup agents={agents} name={labelName} />\n </GridItem>\n )}\n <GridItem>\n <NumberInputField\n label={t('ai:Number of hosts')}\n idPostfix=\"count\"\n name={countName}\n isRequired\n minValue={0}\n maxValue={maxAgents}\n helperText={\n <>\n {t('ai:Maximum availability {{maxAgents}}', { maxAgents })}{' '}\n <PopoverIcon\n bodyContent={t(\n 'ai:Maximum availability is based on the number of hosts available in a given namespace. The number changes dynamically depending on the filtering labels added above.',\n )}\n />\n </>\n }\n />\n </GridItem>\n </Grid>\n );\n};\n\nexport default NodePoolAgentsForm;\n", "import * as React from 'react';\nimport { Formik } from 'formik';\nimport noop from 'lodash/noop';\nimport * as Yup from 'yup';\nimport NetworkForm from './NetworkForm';\nimport { TFunction } from 'i18next';\nimport { NetworkStepProps, NetworkFormValues } from './types';\nimport {\n day2ApiVipValidationSchema,\n hostPrefixValidationSchema,\n httpProxyValidationSchema,\n ipBlockValidationSchema,\n noProxyValidationSchema,\n sshPublicKeyValidationSchema,\n} from '../../../../../common';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\n\nconst getValidationSchema = (t: TFunction) =>\n Yup.lazy<NetworkFormValues>((values) =>\n Yup.object<NetworkFormValues>().shape({\n sshPublicKey: sshPublicKeyValidationSchema.required(t('ai:Required field')),\n clusterNetworkCidr: values.isAdvanced\n ? ipBlockValidationSchema(values.serviceNetworkCidr)\n : Yup.string(),\n serviceNetworkCidr: values.isAdvanced\n ? ipBlockValidationSchema(values.clusterNetworkCidr)\n : Yup.string(),\n clusterNetworkHostPrefix: values.isAdvanced\n ? hostPrefixValidationSchema(values.clusterNetworkCidr)\n : Yup.number(),\n httpProxy: httpProxyValidationSchema(values, 'httpsProxy'),\n httpsProxy: httpProxyValidationSchema(values, 'httpProxy'), // share the schema, httpS is currently not supported\n noProxy: noProxyValidationSchema,\n nodePortAddress:\n values.apiPublishingStrategy === 'NodePort'\n ? day2ApiVipValidationSchema.required(t('ai:Required field'))\n : Yup.string(),\n }),\n );\n\nconst NetworkStep: React.FC<NetworkStepProps> = ({ formRef, onValuesChanged, initialValues }) => {\n const { t } = useTranslation();\n\n return (\n <Formik<NetworkFormValues>\n initialValues={initialValues}\n validationSchema={getValidationSchema(t)}\n innerRef={formRef}\n onSubmit={noop}\n >\n <NetworkForm onValuesChanged={onValuesChanged} />\n </Formik>\n );\n};\n\nexport default NetworkStep;\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport * as React from 'react';\nimport { NetworkFormProps, NetworkFormValues } from './types';\nimport { Form, FormGroup, Grid, GridItem } from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\nimport { Address6 } from 'ip-address';\nimport {\n CheckboxField,\n InputField,\n NumberInputField,\n PopoverIcon,\n ProxyFields,\n RadioField,\n UploadSSH,\n} from '../../../../../common';\nimport { useTemptiflySync } from '../../hooks/useTemptiflySync';\nimport { useTranslation } from '../../../../../common/hooks/use-translation-wrapper';\n\nimport './NetworkForm.css';\nimport AdvancedNetworkFields from '../../../../../common/components/clusterConfiguration/AdvancedNetworkFields';\n\nconst NetworkForm: React.FC<NetworkFormProps> = ({ onValuesChanged }) => {\n const { values } = useFormikContext<NetworkFormValues>();\n useTemptiflySync({ values, onValuesChanged });\n\n const isClusterCIDRIPv6 = Address6.isValid(values.clusterNetworkCidr || '');\n\n const { t } = useTranslation();\n return (\n <Form>\n <FormGroup label={t('ai:API server publishing strategy')}>\n <Grid hasGutter>\n <GridItem>\n <RadioField\n name=\"apiPublishingStrategy\"\n label=\"LoadBalancer\"\n value=\"LoadBalancer\"\n description={t(\n `ai:Exposes the service externally using a cloud provider's load balancer`,\n )}\n />\n </GridItem>\n <GridItem>\n <RadioField\n name=\"apiPublishingStrategy\"\n label=\"NodePort\"\n value=\"NodePort\"\n className=\"ai-nodeport-fields\"\n description={t(`ai:Exposes the service on each node's IP at a static port`)}\n body={\n values.apiPublishingStrategy === 'NodePort' && (\n <Grid hasGutter>\n <GridItem>\n <InputField\n isRequired\n name=\"nodePortAddress\"\n label={t('ai:Host address')}\n labelIcon={\n <PopoverIcon\n position=\"right\"\n bodyContent={t(\n 'ai:Address is the host/ip that the NodePort service is exposed over.',\n )}\n />\n }\n />\n </GridItem>\n <GridItem>\n <NumberInputField\n label={t('ai:Host port')}\n idPostfix=\"nodePortPort\"\n name=\"nodePortPort\"\n minValue={0}\n maxValue={65535}\n labelIcon={\n <PopoverIcon\n position=\"right\"\n bodyContent={t(\n 'ai:Port of the NodePort service. If set to 0, the port is dynamically assigned when the service is created.',\n )}\n />\n }\n />\n </GridItem>\n </Grid>\n )\n }\n />\n </GridItem>\n </Grid>\n </FormGroup>\n <CheckboxField\n name=\"isAdvanced\"\n label={t('ai:Use advanced networking')}\n className=\"ai-advanced-fields\"\n body={\n values.isAdvanced && (\n <AdvancedNetworkFields isSDNSelectable={false} isClusterCIDRIPv6={isClusterCIDRIPv6} />\n )\n }\n helperText={t('ai:Configure advanced networking properties (e.g. CIDR ranges).')}\n />\n <ProxyFields />\n <UploadSSH isRequired />\n </Form>\n );\n};\n\nexport default NetworkForm;\n", "import * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Button, Label, Popover, Stack, StackItem } from '@patternfly/react-core';\nimport { PlusCircleIcon } from '@patternfly/react-icons';\nimport {\n breakWord,\n expandable,\n sortable,\n TableComposable,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n} from '@patternfly/react-table';\nimport classnames from 'classnames';\n\nimport { TableRow } from '../../../../common/components/hosts/AITable';\nimport { getHostRowHardwareInfo } from '../../../../common/components/hosts/hardwareInfo';\nimport { AgentK8sResource, ConfigMapK8sResource } from '../../../types';\nimport AgentStatus from '../../Agent/AgentStatus';\nimport { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../../common';\nimport ManageHostsModal from '../modals/ManageHostsModal';\nimport AddNodePoolModal from '../modals/AddNodePoolModal';\nimport { AgentMachineK8sResource, HostedClusterK8sResource, NodePoolK8sResource } from '../types';\nimport RemoveNodePoolModal from '../modals/RemoveNodePoolModal';\nimport NodePoolStatus from './NodePoolStatus';\nimport { fileSize } from '../../../../common';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { getNodepoolAgents } from '../utils';\n\nimport './NodePoolsTable.css';\n\ntype NodePoolsTableProps = {\n nodePools: NodePoolK8sResource[];\n agents: AgentK8sResource[];\n onRemoveNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n onUpdateNodePool: (\n nodePool: NodePoolK8sResource,\n nodePoolPatches: {\n op: string;\n value: unknown;\n path: string;\n }[],\n ) => Promise<unknown>;\n hostedCluster: HostedClusterK8sResource;\n onAddNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n agentMachines: AgentMachineK8sResource[];\n supportedVersionsCM?: ConfigMapK8sResource;\n};\n\ntype NodePoolWithAgents = {\n nodePool: NodePoolK8sResource;\n agents: AgentK8sResource[];\n};\n\nexport const nodePoolNameColumn = (): TableRow<NodePoolWithAgents> => {\n return {\n header: {\n title: 'Nodepool',\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: ({ nodePool }) => {\n return {\n title: nodePool.metadata?.name,\n props: { 'data-testid': 'nodepool-name' },\n sortableValue: nodePool.metadata?.name,\n };\n },\n };\n};\n\nconst NodePoolsTable = ({\n nodePools,\n agents,\n onRemoveNodePool,\n onUpdateNodePool,\n hostedCluster,\n onAddNodePool,\n agentMachines,\n supportedVersionsCM,\n}: NodePoolsTableProps): JSX.Element => {\n const { t } = useTranslation();\n const [manageHostsOpen, setManageHostsOpen] = React.useState<string>();\n const [addNodePool, setAddNodePool] = React.useState(false);\n const [removeNodePoolOpen, setRemoveNodePoolOpen] = React.useState<string>();\n const [expandedNodePools, setExpandedNodePools] = React.useState<string[]>([]);\n\n const manageNodePool = nodePools.find((np) => np.metadata?.uid === manageHostsOpen);\n const removeNodePool = nodePools.find((np) => np.metadata?.uid === removeNodePoolOpen);\n\n return (\n <>\n <Stack hasGutter>\n <StackItem>\n <TableComposable variant=\"compact\">\n <Thead>\n <Tr>\n <Th />\n <Th>{t('ai:Nodepool')}</Th>\n <Th>{t('ai:Hostname')}</Th>\n <Th>{t('ai:Status')}</Th>\n <Th>{t('ai:Infrastructure env')}</Th>\n <Th>{t('ai:CPU cores')}</Th>\n <Th>{t('ai:Memory')}</Th>\n <Th>{t('ai:Total storage')}</Th>\n <Th />\n </Tr>\n </Thead>\n <Tbody>\n {...nodePools.reduce<JSX.Element[]>((rows, np) => {\n const nodePoolAgents = getNodepoolAgents(np, agents, agentMachines, hostedCluster);\n const isExpanded = expandedNodePools.some((uid) => uid === np.metadata?.uid);\n\n const totals = nodePoolAgents.reduce(\n (acc, agent) => {\n const { memory, cores, disk } = getHostRowHardwareInfo(\n agent.status?.inventory || {},\n );\n acc.memory += +memory.sortableValue;\n acc.cores += +cores.sortableValue;\n acc.disk += +disk.sortableValue;\n return acc;\n },\n { memory: 0, cores: 0, disk: 0 },\n );\n\n rows.push(\n <Tr\n key={np.metadata?.uid}\n className={isExpanded ? 'ai-nodepools-table__no-border' : undefined}\n >\n <Td\n expand={\n nodePoolAgents.length\n ? {\n isExpanded,\n rowIndex: 0,\n onToggle: () =>\n isExpanded\n ? setExpandedNodePools(\n expandedNodePools.filter((uid) => uid !== np.metadata?.uid),\n )\n : setExpandedNodePools([\n ...expandedNodePools,\n np.metadata?.uid || '',\n ]),\n }\n : undefined\n }\n />\n <Td>{np.metadata?.name}</Td>\n <Td>\n <Popover\n aria-label=\"node pool hosts\"\n hasAutoWidth\n bodyContent={t('ai:{{agents}} of {{count}} host requested is available', {\n agents: nodePoolAgents.length,\n count: np.spec.replicas,\n })}\n >\n <Label variant=\"outline\">\n {t('ai:{{count}} host requested', { count: np.spec.replicas })}\n </Label>\n </Popover>\n </Td>\n <Td>\n <NodePoolStatus nodePool={np} agents={nodePoolAgents} />\n </Td>\n <Td>-</Td>\n <Td>{nodePoolAgents.length ? totals.cores : '-'}</Td>\n <Td>{nodePoolAgents.length ? fileSize(totals.memory, 2, 'iec') : '-'}</Td>\n <Td>{nodePoolAgents.length ? fileSize(totals.disk, 2, 'si') : '-'}</Td>\n <Td\n actions={{\n items: [\n {\n title: t('ai:Manage hosts'),\n onClick: () => setManageHostsOpen(np.metadata?.uid),\n },\n {\n title: t('ai:Remove Nodepool'),\n onClick: () => setRemoveNodePoolOpen(np.metadata?.uid),\n },\n ],\n }}\n />\n </Tr>,\n );\n if (expandedNodePools.find((uid) => uid === np.metadata?.uid)) {\n nodePoolAgents.forEach((agent, index) => {\n const { memory, cores, disk } = getHostRowHardwareInfo(\n agent.status?.inventory || {},\n );\n rows.push(\n <Tr\n key={agent.metadata?.uid}\n className={classnames({\n 'ai-nodepools-table__no-border': index < nodePoolAgents.length - 1,\n })}\n >\n <Td />\n <Td />\n <Td>{agent.spec.hostname || agent.status?.inventory.hostname}</Td>\n <Td>\n <AgentStatus agent={agent} isDay2 />\n </Td>\n <Td>\n <Link\n to={`/multicloud/infrastructure/environments/details/${\n agent.metadata?.namespace || ''\n }/${agent.metadata?.labels?.[INFRAENV_AGENTINSTALL_LABEL_KEY] || ''}`}\n >\n {agent.metadata?.labels?.[INFRAENV_AGENTINSTALL_LABEL_KEY]}\n </Link>\n </Td>\n <Td>{cores.title}</Td>\n <Td>{memory.title}</Td>\n <Td>{disk.title}</Td>\n </Tr>,\n );\n });\n }\n return rows;\n }, [])}\n </Tbody>\n </TableComposable>\n </StackItem>\n <StackItem>\n <Button\n variant=\"link\"\n icon={<PlusCircleIcon />}\n iconPosition=\"right\"\n onClick={() => setAddNodePool(true)}\n >\n {t('ai:Add Nodepool')}\n </Button>\n </StackItem>\n </Stack>\n {manageNodePool && (\n <ManageHostsModal\n hostedCluster={hostedCluster}\n agents={agents}\n nodePool={manageNodePool}\n onClose={() => setManageHostsOpen(undefined)}\n onSubmit={onUpdateNodePool}\n agentMachines={agentMachines}\n />\n )}\n {addNodePool && (\n <AddNodePoolModal\n onClose={() => setAddNodePool(false)}\n onSubmit={onAddNodePool}\n agentsNamespace={hostedCluster.spec.platform.agent?.agentNamespace || ''}\n agents={agents}\n hostedCluster={hostedCluster}\n supportedVersionsCM={supportedVersionsCM}\n />\n )}\n {removeNodePool && (\n <RemoveNodePoolModal\n onClose={() => setRemoveNodePoolOpen(undefined)}\n onRemove={onRemoveNodePool}\n nodePool={removeNodePool}\n />\n )}\n </>\n );\n};\n\nexport default NodePoolsTable;\n", "import {\n Alert,\n Button,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Spinner,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik, FormikConfig } from 'formik';\nimport * as React from 'react';\nimport { AgentK8sResource } from '../../../types';\nimport { NodePoolK8sResource, HostedClusterK8sResource, AgentMachineK8sResource } from '../types';\nimport NodePoolForm, { NodePoolFormValues } from './NodePoolForm';\nimport { formikLabelsToLabels, labelsToFormikValue } from '../utils';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { getErrorMessage } from '../../../../common/utils';\n\ntype ManageHostsModalProps = {\n hostedCluster: HostedClusterK8sResource;\n agents: AgentK8sResource[];\n nodePool: NodePoolK8sResource;\n onClose: VoidFunction;\n onSubmit: (\n nodePool: NodePoolK8sResource,\n nodePoolPatches: {\n op: string;\n value: unknown;\n path: string;\n }[],\n ) => Promise<unknown>;\n agentMachines: AgentMachineK8sResource[];\n};\n\nconst ManageHostsModal = ({\n onClose,\n nodePool,\n hostedCluster,\n agents,\n onSubmit,\n agentMachines,\n}: ManageHostsModalProps) => {\n const { t } = useTranslation();\n const [error, setError] = React.useState<string>();\n const namespaceAgents = agents.filter(\n (a) => a.metadata?.namespace === hostedCluster.spec.platform.agent?.agentNamespace,\n );\n const handleSubmit: FormikConfig<NodePoolFormValues>['onSubmit'] = async (values) => {\n setError(undefined);\n const patches = [];\n if (values.count !== nodePool.spec.replicas) {\n patches.push({\n op: 'replace',\n value: values.count,\n path: '/spec/replicas',\n });\n }\n patches.push({\n op: 'replace',\n value: formikLabelsToLabels(values.agentLabels),\n path: '/spec/platform/agent/agentLabelSelector/matchLabels',\n });\n try {\n await onSubmit(nodePool, patches);\n onClose();\n } catch (err) {\n setError(getErrorMessage(err));\n }\n };\n\n return (\n <Modal\n aria-label=\"Manage hosts dialog\"\n title={t('ai:Manage hosts')}\n isOpen\n onClose={onClose}\n variant={ModalVariant.medium}\n hasNoBodyWrapper\n >\n <Formik<NodePoolFormValues>\n initialValues={{\n nodePoolName: nodePool.metadata?.name || '',\n agentLabels: labelsToFormikValue(\n nodePool.spec.platform?.agent?.agentLabelSelector?.matchLabels || {},\n ),\n count: nodePool.spec.replicas,\n }}\n isInitialValid={false}\n onSubmit={handleSubmit}\n >\n {({ isSubmitting, isValid, submitForm }) => (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <NodePoolForm\n agents={namespaceAgents}\n agentMachines={agentMachines}\n nodePool={nodePool}\n hostedCluster={hostedCluster}\n />\n </StackItem>\n {error && (\n <StackItem>\n <Alert variant=\"danger\" title={error} isInline />\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n onClick={submitForm}\n isDisabled={!isValid || isSubmitting}\n icon={isSubmitting ? <Spinner size=\"md\" /> : undefined}\n >\n {t('ai:Update')}\n </Button>\n <Button variant=\"link\" onClick={onClose}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n )}\n </Formik>\n </Modal>\n );\n};\n\nexport default ManageHostsModal;\n", "import * as React from 'react';\nimport {\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n Form,\n Grid,\n GridItem,\n} from '@patternfly/react-core';\nimport { useFormikContext } from 'formik';\n\nimport { InputField } from '../../../../common';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { AgentK8sResource } from '../../../types';\nimport { getAgentsForSelection, getVersionFromReleaseImage } from '../../helpers';\nimport NodePoolAgentsForm from '../forms/NodePoolAgentsForm';\nimport { AgentMachineK8sResource, HostedClusterK8sResource, NodePoolK8sResource } from '../types';\nimport { getNodepoolAgents } from '../utils';\n\nexport type NodePoolFormValues = {\n nodePoolName: string;\n agentLabels: {\n key: string;\n value: string;\n }[];\n count: number;\n};\n\ntype NodePoolFormProps = {\n agents: AgentK8sResource[];\n agentMachines?: AgentMachineK8sResource[];\n hostedCluster: HostedClusterK8sResource;\n nodePool?: NodePoolK8sResource;\n};\n\nconst NodePoolForm = ({ agents, nodePool, hostedCluster, agentMachines }: NodePoolFormProps) => {\n const { t } = useTranslation();\n const { values } = useFormikContext<NodePoolFormValues>();\n\n const isEdit = !!nodePool && !!agentMachines;\n\n let maxAgents = 0;\n\n const availableAgents = getAgentsForSelection(agents).filter(\n (agent) =>\n values.agentLabels.every(({ key, value }) => agent.metadata?.labels?.[key] === value) &&\n !agent.spec.clusterDeploymentName,\n );\n\n const ocpVersion = getVersionFromReleaseImage(hostedCluster.spec.release.image);\n\n if (isEdit) {\n const nodePoolAgents = getNodepoolAgents(nodePool, agents, agentMachines, hostedCluster);\n maxAgents =\n nodePoolAgents.length +\n availableAgents.filter(\n (agent) => !nodePoolAgents.find((a) => a.metadata?.uid === agent.metadata?.uid),\n ).length;\n } else {\n maxAgents += availableAgents.length;\n }\n\n return (\n <Form>\n <Grid hasGutter>\n <GridItem>\n <DescriptionList isHorizontal>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Host namespace')}</DescriptionListTerm>\n <DescriptionListDescription>\n {hostedCluster.spec.platform.agent?.agentNamespace}\n </DescriptionListDescription>\n </DescriptionListGroup>\n </DescriptionList>\n </GridItem>\n <GridItem>\n {nodePool ? (\n <DescriptionList isHorizontal>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:Nodepool')}</DescriptionListTerm>\n <DescriptionListDescription>{nodePool.metadata?.name}</DescriptionListDescription>\n </DescriptionListGroup>\n </DescriptionList>\n ) : (\n <InputField name=\"nodePoolName\" isRequired label={t('ai:Nodepool name')} />\n )}\n </GridItem>\n <GridItem>\n <NodePoolAgentsForm\n agents={agents}\n countName=\"count\"\n labelName=\"agentLabels\"\n maxAgents={maxAgents}\n isEdit={isEdit}\n />\n </GridItem>\n <GridItem>\n <DescriptionList isHorizontal>\n <DescriptionListGroup>\n <DescriptionListTerm>{t('ai:OpenShift version')}</DescriptionListTerm>\n <DescriptionListDescription>{ocpVersion}</DescriptionListDescription>\n </DescriptionListGroup>\n </DescriptionList>\n </GridItem>\n </Grid>\n </Form>\n );\n};\n\nexport default NodePoolForm;\n", "export const labelsToFormikValue = (labels: { [key: string]: string }) =>\n Object.keys(labels).map((key) => ({\n key,\n value: labels[key],\n }));\n\nexport const formikLabelsToLabels = (labels: { key: string; value: string }[]) =>\n labels.reduce((acc, curr) => {\n acc[curr.key] = curr.value;\n return acc;\n }, {});\n", "import { AgentK8sResource } from '../../../types';\nimport { AgentMachineK8sResource, HostedClusterK8sResource, NodePoolK8sResource } from '../types';\n\nconst CLUSTER_NAME_LABEL = 'cluster.x-k8s.io/cluster-name';\nconst NODEPOOL_NAME_ANNOTATION = 'cluster.x-k8s.io/cloned-from-name';\n\nexport const getNodepoolAgents = (\n nodePool: NodePoolK8sResource,\n agents: AgentK8sResource[],\n agentMachines: AgentMachineK8sResource[],\n hostedCluster: HostedClusterK8sResource,\n) => {\n const nodePoolAgentMachines = agentMachines\n .filter(\n (am) =>\n am.metadata?.namespace ===\n `${hostedCluster.metadata?.namespace || ''}-${hostedCluster.metadata?.name || ''}` &&\n am.metadata?.labels?.[CLUSTER_NAME_LABEL] === hostedCluster.metadata?.name &&\n am.metadata?.annotations?.[NODEPOOL_NAME_ANNOTATION] === nodePool.metadata?.name &&\n am.status?.agentRef?.name &&\n am.status?.agentRef?.namespace,\n )\n .reduce((acc, curr) => {\n acc[curr.status?.agentRef?.name || ''] = curr.status?.agentRef?.namespace;\n return acc;\n }, {});\n\n return agents.filter(\n (a) => nodePoolAgentMachines[a.metadata?.name || ''] === a.metadata?.namespace,\n );\n};\n", "import { CheckCircleIcon, ExclamationCircleIcon, InProgressIcon } from '@patternfly/react-icons';\nimport React from 'react';\nimport {\n global_palette_green_500 as okColor,\n global_danger_color_100 as dangerColor,\n global_warning_color_100 as warningColor,\n} from '@patternfly/react-tokens';\nimport { AgentK8sResource } from '../../../types';\nimport { getAgentStatus } from '../../helpers';\nimport { NodePoolK8sResource } from '../types';\nimport { TFunction } from 'i18next';\n\nexport type NodePoolStatus = {\n type: 'error' | 'pending' | 'ok' | 'warning';\n text: string;\n icon: React.ReactNode;\n};\n\nexport const getNodePoolStatus = (\n nodePool: NodePoolK8sResource,\n agents: AgentK8sResource[],\n t: TFunction,\n): NodePoolStatus => {\n if (!agents.length && nodePool.spec.replicas) {\n return {\n type: 'pending',\n icon: <InProgressIcon />,\n text: t('ai:Pending host assignment'),\n };\n }\n\n const agentStatuses = agents.map((a) => getAgentStatus(a));\n\n const hasErrorAgents = agentStatuses.some(({ status }) => status.key === 'error');\n\n if (hasErrorAgents) {\n return {\n type: 'error',\n icon: <ExclamationCircleIcon color={dangerColor.value} />,\n text: t('ai:Error'),\n };\n }\n\n const hasWarningAgents = agentStatuses.some(({ status }) =>\n [\n 'pending-for-input',\n 'insufficient',\n 'insufficient-unbound',\n 'disconnected-unbound',\n 'disconnected',\n ].includes(status.key),\n );\n\n if (hasWarningAgents) {\n return {\n type: 'warning',\n icon: <ExclamationCircleIcon color={warningColor.value} />,\n text: t('ai:Warning'),\n };\n }\n\n return nodePool.status?.conditions?.find(({ type }) => type === 'Ready')?.status === 'True'\n ? {\n type: 'ok',\n icon: <CheckCircleIcon color={okColor.value} />,\n text: t('ai:Ready'),\n }\n : {\n type: 'pending',\n icon: <InProgressIcon />,\n text: t('ai:Not ready'),\n };\n};\n", "import * as React from 'react';\nimport {\n Alert,\n Button,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Spinner,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { Formik } from 'formik';\n\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { getErrorMessage } from '../../../../common/utils';\nimport { AgentK8sResource, ConfigMapK8sResource } from '../../../types';\nimport { HostedClusterK8sResource, NodePoolK8sResource } from '../types';\nimport { formikLabelsToLabels } from '../utils';\nimport NodePoolForm, { NodePoolFormValues } from './NodePoolForm';\n\ntype AddNodePoolModalProps = {\n agentsNamespace: string;\n onSubmit: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n onClose: VoidFunction;\n agents: AgentK8sResource[];\n hostedCluster: HostedClusterK8sResource;\n supportedVersionsCM?: ConfigMapK8sResource;\n};\n\nconst AddNodePoolModal = ({\n onSubmit,\n onClose,\n agents,\n hostedCluster,\n agentsNamespace,\n}: AddNodePoolModalProps) => {\n const { t } = useTranslation();\n const [error, setError] = React.useState<string>();\n const namespaceAgents = agents.filter((a) => a.metadata?.namespace === agentsNamespace);\n const handleSubmit = async (values: NodePoolFormValues) => {\n setError(undefined);\n const nodePool: NodePoolK8sResource = {\n apiVersion: 'hypershift.openshift.io/v1alpha1',\n kind: 'NodePool',\n metadata: {\n name: values.nodePoolName,\n namespace: hostedCluster.metadata?.namespace,\n },\n spec: {\n clusterName: hostedCluster.metadata?.name || '',\n replicas: values.count,\n management: {\n autoRepair: false,\n upgradeType: 'InPlace',\n },\n platform: {\n type: 'Agent',\n agent: {\n agentLabelSelector: {\n matchLabels: formikLabelsToLabels(values.agentLabels),\n },\n },\n },\n release: {\n image: hostedCluster.spec.release.image,\n },\n },\n };\n try {\n await onSubmit(nodePool);\n onClose();\n } catch (err) {\n setError(getErrorMessage(err));\n }\n };\n\n return (\n <Modal\n aria-label=\"add node pool dialog\"\n title={t('ai:Add Nodepool')}\n isOpen\n onClose={onClose}\n variant={ModalVariant.medium}\n hasNoBodyWrapper\n >\n <Formik<NodePoolFormValues>\n initialValues={{\n nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Math.floor(\n Math.random() * 100,\n )}`,\n agentLabels: [],\n count: 1,\n }}\n onSubmit={handleSubmit}\n >\n {({ isSubmitting, isValid, submitForm }) => (\n <>\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n <NodePoolForm agents={namespaceAgents} hostedCluster={hostedCluster} />\n </StackItem>\n {error && (\n <StackItem>\n <Alert variant=\"danger\" isInline title={error} />\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n onClick={submitForm}\n isDisabled={!isValid || isSubmitting}\n icon={isSubmitting ? <Spinner size=\"md\" /> : undefined}\n >\n {t('ai:Create')}\n </Button>\n <Button variant=\"link\" onClick={onClose}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </>\n )}\n </Formik>\n </Modal>\n );\n};\n\nexport default AddNodePoolModal;\n", "import * as React from 'react';\nimport {\n Alert,\n Button,\n Modal,\n ModalBoxBody,\n ModalBoxFooter,\n ModalVariant,\n Spinner,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { NodePoolK8sResource } from '../types';\nimport { getErrorMessage } from '../../../../common/utils';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\ntype RemoveNodePoolModalProps = {\n nodePool: NodePoolK8sResource;\n onClose: VoidFunction;\n onRemove: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n};\n\nconst RemoveNodePoolModal = ({ onClose, onRemove, nodePool }: RemoveNodePoolModalProps) => {\n const { t } = useTranslation();\n const [isRemoving, setIsRemoving] = React.useState(false);\n const [error, setError] = React.useState<string>();\n return (\n <Modal\n aria-label=\"remove node pool dialog\"\n title={t('ai:Remove nodepool')}\n isOpen\n onClose={onClose}\n variant={ModalVariant.small}\n hasNoBodyWrapper\n titleIconVariant=\"warning\"\n >\n <ModalBoxBody>\n <Stack hasGutter>\n <StackItem>\n {t(\n 'ai:Removing {{name}} will remove the association with {{count}} host. These hosts will become available for other nodepools.',\n { name: nodePool.metadata?.name || '', count: nodePool.spec.replicas },\n )}\n </StackItem>\n {error && (\n <StackItem>\n <Alert variant=\"danger\" isInline title={error} />\n </StackItem>\n )}\n </Stack>\n </ModalBoxBody>\n <ModalBoxFooter>\n <Button\n onClick={() => {\n const remove = async () => {\n try {\n setError(undefined);\n setIsRemoving(true);\n await onRemove(nodePool);\n onClose();\n } catch (err) {\n setError(getErrorMessage(err));\n } finally {\n setIsRemoving(false);\n }\n };\n void remove();\n }}\n isDisabled={isRemoving}\n variant=\"danger\"\n icon={isRemoving ? <Spinner size=\"md\" /> : undefined}\n >\n {t('ai:Remove')}\n </Button>\n <Button variant=\"link\" onClick={onClose}>\n {t('ai:Cancel')}\n </Button>\n </ModalBoxFooter>\n </Modal>\n );\n};\n\nexport default RemoveNodePoolModal;\n", "import { Alert, Button, Flex, FlexItem, Popover, Stack, StackItem } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { NodePoolK8sResource } from '../types';\nimport { AgentK8sResource } from '../../../types';\nimport { getNodePoolStatus } from '../utils';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport ConditionsTable from './ConditionsTable';\nimport ValidationsRunningAlert from '../../common/ValidationsRunningAlert';\n\ntype NodePoolStatusProps = {\n nodePool: NodePoolK8sResource;\n agents: AgentK8sResource[];\n};\n\nconst NodePoolStatus = ({ nodePool, agents }: NodePoolStatusProps) => {\n const { t } = useTranslation();\n const status = getNodePoolStatus(nodePool, agents, t);\n return (\n <Flex alignItems={{ default: 'alignItemsCenter' }} spaceItems={{ default: 'spaceItemsXs' }}>\n <FlexItem>{status.icon}</FlexItem>\n <FlexItem>\n <Popover\n aria-label=\"node pool status\"\n headerContent={<div>{t('ai:Nodepool conditions')}</div>}\n hasAutoWidth\n showClose={false}\n bodyContent={\n <Stack hasGutter>\n {status.type === 'error' && (\n <>\n <StackItem>\n <ValidationsRunningAlert />\n </StackItem>\n <StackItem>\n <Alert\n variant=\"danger\"\n isInline\n title={t('ai:Some hosts are in an error state.')}\n />\n </StackItem>\n </>\n )}\n {status.type === 'warning' && (\n <>\n <StackItem>\n <ValidationsRunningAlert />\n </StackItem>\n <StackItem>\n <Alert\n variant=\"warning\"\n isInline\n title={t('ai:Some hosts are in a warning state.')}\n />\n </StackItem>\n </>\n )}\n <StackItem>\n <ConditionsTable conditions={nodePool.status?.conditions} isDone />\n </StackItem>\n </Stack>\n }\n >\n <Button variant=\"link\" isInline>\n {status.text}\n </Button>\n </Popover>\n </FlexItem>\n </Flex>\n );\n};\n\nexport default NodePoolStatus;\n", "import { Flex, FlexItem } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InProgressIcon,\n UnknownIcon,\n} from '@patternfly/react-icons';\nimport { TableComposable, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';\nimport {\n global_palette_green_500 as okColor,\n global_danger_color_100 as dangerColor,\n} from '@patternfly/react-tokens';\nimport * as React from 'react';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\nimport './ConditionsTable.css';\n\nconst ignoredConditions = ['Progressing'];\nconst reversedConditions = ['Degraded'];\n\ntype ConditionsTableProps = {\n conditions?: {\n status: string;\n type: string;\n message: string;\n }[];\n isDone: boolean;\n};\n\nconst ConditionsTable = ({ conditions, isDone }: ConditionsTableProps) => {\n const { t } = useTranslation();\n return (\n <TableComposable variant=\"compact\">\n <Thead>\n <Tr>\n <Th width={25}>{t('ai:Condition')}</Th>\n <Th>{t('ai:Message')}</Th>\n </Tr>\n </Thead>\n <Tbody>\n {conditions\n ?.filter(({ type }) => !ignoredConditions.includes(type))\n .map((c) => {\n let icon = <UnknownIcon />;\n\n const { okStatus, nokStatus } = reversedConditions.includes(c.type)\n ? { okStatus: 'False', nokStatus: 'True' }\n : { okStatus: 'True', nokStatus: 'False' };\n\n if (c.type.endsWith('Progressing')) {\n // progressing conditions have no error status\n icon =\n c.status === okStatus ? (\n <InProgressIcon />\n ) : (\n <CheckCircleIcon color={okColor.value} />\n );\n } else {\n if (c.status === okStatus) {\n icon = <CheckCircleIcon color={okColor.value} />;\n } else if (c.status === nokStatus) {\n icon = isDone ? (\n <ExclamationCircleIcon color={dangerColor.value} size=\"sm\" />\n ) : (\n <InProgressIcon />\n );\n }\n }\n return (\n <Tr key={c.type} className=\"ai-conditions-table__no-border\">\n <Td>\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n spaceItems={{ default: 'spaceItemsXs' }}\n >\n <FlexItem>{icon}</FlexItem>\n <FlexItem>{c.type}</FlexItem>\n </Flex>\n </Td>\n <Td span={8}>{c.message}</Td>\n </Tr>\n );\n })}\n </Tbody>\n </TableComposable>\n );\n};\n\nexport default ConditionsTable;\n", "import * as React from 'react';\nimport { ProgressStepper, Stack, StackItem } from '@patternfly/react-core';\nimport { AgentK8sResource, ConfigMapK8sResource, SecretK8sResource } from '../../../types';\nimport { AgentMachineK8sResource, HostedClusterK8sResource, NodePoolK8sResource } from '../types';\nimport HypershiftKubeconfigDownload from './HypershiftKubeconfigDownload';\nimport HostedClusterProgress from './HostedClusterProgress';\nimport NodePoolsProgress from './NodePoolsProgress';\n\nimport './ClusterInstallationProgress.css';\n\ntype ClusterInstallationProgressProps = {\n agents: AgentK8sResource[];\n agentMachines: AgentMachineK8sResource[];\n hostedCluster: HostedClusterK8sResource;\n fetchSecret: (name: string, namespace: string) => Promise<SecretK8sResource>;\n nodePools: NodePoolK8sResource[];\n onRemoveNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n onUpdateNodePool: (\n nodePool: NodePoolK8sResource,\n nodePoolPatches: {\n op: string;\n value: unknown;\n path: string;\n }[],\n ) => Promise<unknown>;\n onAddNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n launchToOCP: (urlSuffix: string, newTab: boolean) => void;\n supportedVersionsCM?: ConfigMapK8sResource;\n};\n\nconst ClusterInstallationProgress = ({\n hostedCluster,\n fetchSecret,\n launchToOCP,\n ...rest\n}: ClusterInstallationProgressProps) => (\n <Stack hasGutter>\n <StackItem>\n <ProgressStepper isVertical>\n <HostedClusterProgress hostedCluster={hostedCluster} launchToOCP={launchToOCP} />\n <NodePoolsProgress hostedCluster={hostedCluster} {...rest} />\n </ProgressStepper>\n </StackItem>\n <StackItem>\n <HypershiftKubeconfigDownload hostedCluster={hostedCluster} fetchSecret={fetchSecret} />\n </StackItem>\n </Stack>\n);\n\nexport default ClusterInstallationProgress;\n", "import React from 'react';\nimport { saveAs } from 'file-saver';\nimport { HostedClusterK8sResource } from '../types';\nimport { SecretK8sResource } from '../../../types';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\n\ntype HypershiftKubeconfigDownloadProps = {\n hostedCluster: HostedClusterK8sResource;\n fetchSecret: (name: string, namespace: string) => Promise<SecretK8sResource>;\n};\n\nconst HypershiftKubeconfigDownload = ({\n hostedCluster,\n fetchSecret,\n}: HypershiftKubeconfigDownloadProps) => {\n const { t } = useTranslation();\n const handleKubeconfigDownload = async () => {\n const kubeconfigSecretName = hostedCluster.status?.kubeconfig?.name;\n const kubeconfigSecretNamespace = hostedCluster.metadata?.namespace;\n\n if (kubeconfigSecretName && kubeconfigSecretNamespace) {\n try {\n const kubeconfigSecret = await fetchSecret(kubeconfigSecretName, kubeconfigSecretNamespace);\n const kubeconfig = kubeconfigSecret.data?.kubeconfig;\n\n if (!kubeconfig) {\n throw new Error('Kubeconfig is empty.');\n }\n\n const blob = new Blob([atob(kubeconfig)], { type: 'text/plain;charset=utf-8' });\n saveAs(blob, 'kubeconfig.yaml');\n } catch (e) {\n console.error('Failed to fetch kubeconfig secret.', e);\n }\n }\n };\n\n return (\n <Button\n variant={ButtonVariant.secondary}\n onClick={handleKubeconfigDownload}\n isDisabled={!hostedCluster.status?.kubeconfig?.name}\n >\n {t('ai:Download kubeconfig')}\n </Button>\n );\n};\n\nexport default HypershiftKubeconfigDownload;\n", "import * as React from 'react';\nimport {\n ExpandableSectionToggle,\n ProgressStep,\n Spinner,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport {\n global_palette_green_500 as okColor,\n global_danger_color_100 as dangerColor,\n} from '@patternfly/react-tokens';\nimport { CheckCircleIcon, ExclamationCircleIcon } from '@patternfly/react-icons';\nimport { HostedClusterK8sResource } from '../types';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport { ExternalLink } from '../../../../common';\nimport ConditionsTable from './ConditionsTable';\n\ntype HostedClusterProgressProps = {\n hostedCluster: HostedClusterK8sResource;\n launchToOCP: (urlSuffix: string, newTab: boolean) => void;\n};\n\nconst HostedClusterProgress = ({ hostedCluster, launchToOCP }: HostedClusterProgressProps) => {\n const { t } = useTranslation();\n const [isExpanded, setExpanded] = React.useState(true);\n\n const availableCondtion = hostedCluster.status?.conditions?.find((c) => c.type === 'Available');\n const progressingCondtion = hostedCluster.status?.conditions?.find(\n (c) => c.type === 'Progressing',\n );\n\n let progressIcon = <Spinner size=\"md\" />;\n\n if (progressingCondtion?.status === 'False') {\n progressIcon =\n availableCondtion?.status === 'True' ? (\n <CheckCircleIcon color={okColor.value} />\n ) : (\n <ExclamationCircleIcon color={dangerColor.value} size=\"sm\" />\n );\n }\n\n return (\n <ProgressStep icon={progressIcon}>\n <Stack hasGutter>\n <StackItem>\n <ExpandableSectionToggle\n isExpanded={isExpanded}\n onToggle={setExpanded}\n className=\"ai-progress-item__header\"\n >\n {t('ai:Control plane')}\n </ExpandableSectionToggle>\n </StackItem>\n {isExpanded && (\n <>\n <StackItem className=\"ai-progress-item__body\">\n <ConditionsTable\n conditions={hostedCluster.status?.conditions}\n isDone={progressingCondtion?.status === 'False'}\n />\n </StackItem>\n <StackItem className=\"ai-progress-item__body\">\n <ExternalLink\n onClick={() =>\n launchToOCP(\n `k8s/ns/${hostedCluster.metadata?.namespace || ''}-${\n hostedCluster.metadata?.name || ''\n }/pods`,\n true,\n )\n }\n >\n {t('ai:Control plane pods')}\n </ExternalLink>\n </StackItem>\n </>\n )}\n </Stack>\n </ProgressStep>\n );\n};\n\nexport default HostedClusterProgress;\n", "import * as React from 'react';\nimport {\n ExpandableSectionToggle,\n ProgressStep,\n Spinner,\n Stack,\n StackItem,\n} from '@patternfly/react-core';\nimport { TFunction } from 'i18next';\nimport { global_palette_green_500 as okColor } from '@patternfly/react-tokens';\nimport { CheckCircleIcon } from '@patternfly/react-icons';\n\nimport { AgentMachineK8sResource, HostedClusterK8sResource, NodePoolK8sResource } from '../types';\nimport { AgentK8sResource, ConfigMapK8sResource } from '../../../types';\nimport { getNodepoolAgents, getNodePoolStatus, NodePoolStatus } from '../utils';\nimport { useTranslation } from '../../../../common/hooks/use-translation-wrapper';\nimport NodePoolsTable from './NodePoolsTable';\n\nconst getNodePoolsStatus = (\n agentMachines: AgentMachineK8sResource[],\n hostedCluster: HostedClusterK8sResource,\n nodePools: NodePoolK8sResource[],\n agents: AgentK8sResource[],\n t: TFunction,\n): React.ReactNode => {\n const nodePoolMap = nodePools.reduce<{\n [key: string]: { agents: AgentK8sResource[]; status: NodePoolStatus };\n }>((acc, np) => {\n const nodePoolAgents = getNodepoolAgents(np, agents, agentMachines, hostedCluster);\n const status = getNodePoolStatus(np, nodePoolAgents, t);\n acc[np.metadata?.uid || ''] = {\n agents: nodePoolAgents,\n status,\n };\n return acc;\n }, {});\n\n const nodePoolsStatus: { type: string; icon: React.ReactNode } = {\n type: 'ok',\n icon: <CheckCircleIcon color={okColor.value} />,\n };\n\n for (const property in nodePoolMap) {\n const { status } = nodePoolMap[property];\n if (status.type === 'error') {\n nodePoolsStatus.type = 'error';\n nodePoolsStatus.icon = status.icon;\n break;\n }\n if (status.type === 'warning') {\n nodePoolsStatus.type = 'warning';\n nodePoolsStatus.icon = status.icon;\n }\n if (status.type === 'pending' && nodePoolsStatus.type !== 'warning') {\n nodePoolsStatus.type = 'pending';\n nodePoolsStatus.icon = <Spinner size=\"md\" />;\n }\n }\n return nodePoolsStatus.icon;\n};\n\ntype NodePoolsProgressProps = {\n agents: AgentK8sResource[];\n nodePools: NodePoolK8sResource[];\n agentMachines: AgentMachineK8sResource[];\n hostedCluster: HostedClusterK8sResource;\n onRemoveNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n onUpdateNodePool: (\n nodePool: NodePoolK8sResource,\n nodePoolPatches: {\n op: string;\n value: unknown;\n path: string;\n }[],\n ) => Promise<unknown>;\n onAddNodePool: (nodePool: NodePoolK8sResource) => Promise<unknown>;\n supportedVersionsCM?: ConfigMapK8sResource;\n};\n\nconst NodePoolsProgress = ({\n nodePools,\n agentMachines,\n hostedCluster,\n agents,\n ...rest\n}: NodePoolsProgressProps) => {\n const { t } = useTranslation();\n const [isExpanded, setExpanded] = React.useState(true);\n\n return (\n <ProgressStep icon={getNodePoolsStatus(agentMachines, hostedCluster, nodePools, agents, t)}>\n <Stack hasGutter>\n <StackItem>\n <ExpandableSectionToggle\n isExpanded={isExpanded}\n onToggle={setExpanded}\n className=\"ai-progress-item__header\"\n >\n {t('ai:Cluster nodepools')}\n </ExpandableSectionToggle>\n </StackItem>\n {isExpanded && (\n <StackItem className=\"ai-progress-item__body\">\n <NodePoolsTable\n nodePools={nodePools}\n agents={agents}\n hostedCluster={hostedCluster}\n agentMachines={agentMachines}\n {...rest}\n />\n </StackItem>\n )}\n </Stack>\n </ProgressStep>\n );\n};\n\nexport default NodePoolsProgress;\n"],
5
- "mappings": "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",
6
- "names": []
7
- }