@openshift-assisted/ui-lib 2.42.0 → 2.42.1

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 (55) hide show
  1. package/build/@types/common/components/newFeatureSupportLevels/types.d.ts +1 -1
  2. package/build/@types/common/components/newFeatureSupportLevels/types.d.ts.map +1 -1
  3. package/build/@types/common/components/operators/operatorDescriptions.d.ts +23 -0
  4. package/build/@types/common/components/operators/operatorDescriptions.d.ts.map +1 -0
  5. package/build/@types/common/components/operators/operatorSpecs.d.ts +25 -4
  6. package/build/@types/common/components/operators/operatorSpecs.d.ts.map +1 -1
  7. package/build/@types/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.d.ts +2 -0
  8. package/build/@types/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.d.ts.map +1 -1
  9. package/build/@types/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.d.ts.map +1 -1
  10. package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.d.ts.map +1 -1
  11. package/build/@types/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.d.ts.map +1 -1
  12. package/build/@types/ocm/components/clusterWizard/OperatorsBundle.d.ts.map +1 -1
  13. package/build/@types/ocm/components/clusterWizard/OperatorsSelect.d.ts.map +1 -1
  14. package/build/@types/ocm/components/featureSupportLevels/featureStateUtils.d.ts.map +1 -1
  15. package/build/cjs/common/components/clusterDetail/OperatorsProgressItem.js +1 -1
  16. package/build/cjs/common/components/clusterDetail/OperatorsProgressItem.js.map +1 -1
  17. package/build/cjs/common/components/operators/operatorDescriptions.js +26 -0
  18. package/build/cjs/common/components/operators/operatorDescriptions.js.map +1 -0
  19. package/build/cjs/common/components/operators/operatorSpecs.js +331 -190
  20. package/build/cjs/common/components/operators/operatorSpecs.js.map +1 -1
  21. package/build/cjs/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.js +7 -6
  22. package/build/cjs/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.js.map +1 -1
  23. package/build/cjs/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js +16 -0
  24. package/build/cjs/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.js.map +1 -1
  25. package/build/cjs/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js +1 -1
  26. package/build/cjs/ocm/components/clusterConfiguration/OcmOperatorProgressItem.js.map +1 -1
  27. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.js +1 -1
  28. package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.js.map +1 -1
  29. package/build/cjs/ocm/components/clusterConfiguration/operators/OperatorCheckbox.js +1 -1
  30. package/build/cjs/ocm/components/clusterConfiguration/operators/OperatorCheckbox.js.map +1 -1
  31. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.js +1 -1
  32. package/build/cjs/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.js.map +1 -1
  33. package/build/cjs/ocm/components/clusterDetail/ProgressBarAlerts.js +1 -1
  34. package/build/cjs/ocm/components/clusterDetail/ProgressBarAlerts.js.map +1 -1
  35. package/build/cjs/ocm/components/clusterWizard/OperatorsBundle.js +9 -10
  36. package/build/cjs/ocm/components/clusterWizard/OperatorsBundle.js.map +1 -1
  37. package/build/cjs/ocm/components/clusterWizard/OperatorsSelect.js +11 -14
  38. package/build/cjs/ocm/components/clusterWizard/OperatorsSelect.js.map +1 -1
  39. package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js +5 -15
  40. package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js.map +1 -1
  41. package/lib/common/components/clusterDetail/OperatorsProgressItem.tsx +1 -1
  42. package/lib/common/components/newFeatureSupportLevels/types.ts +1 -0
  43. package/lib/common/components/operators/operatorDescriptions.tsx +58 -0
  44. package/lib/common/components/operators/operatorSpecs.tsx +422 -257
  45. package/lib/ocm/components/clusterConfiguration/ControlPlaneNodesDropdown.tsx +5 -5
  46. package/lib/ocm/components/clusterConfiguration/OcmClusterDetailsFormFields.tsx +33 -1
  47. package/lib/ocm/components/clusterConfiguration/OcmOperatorProgressItem.tsx +1 -1
  48. package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/FolderDropdown.tsx +1 -0
  49. package/lib/ocm/components/clusterConfiguration/operators/OperatorCheckbox.tsx +1 -1
  50. package/lib/ocm/components/clusterConfiguration/review/ReviewOperatorsTable.tsx +2 -1
  51. package/lib/ocm/components/clusterDetail/ProgressBarAlerts.tsx +1 -1
  52. package/lib/ocm/components/clusterWizard/OperatorsBundle.tsx +11 -17
  53. package/lib/ocm/components/clusterWizard/OperatorsSelect.tsx +28 -26
  54. package/lib/ocm/components/featureSupportLevels/featureStateUtils.ts +7 -18
  55. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
2
+ import { Cluster, SupportLevel } from '@openshift-assisted/types/assisted-installer-service';
3
3
  import { FeatureId } from '../../types';
4
4
  import {
5
5
  OPERATOR_NAME_AMD_GPU,
@@ -53,7 +53,31 @@ import {
53
53
  SERVERLESS_OPERATOR_LINK,
54
54
  } from '../../config';
55
55
  import { getMajorMinorVersion } from '../../utils';
56
- import { useNewFeatureSupportLevel } from '../newFeatureSupportLevels';
56
+ import { GetFeatureSupportLevel, useNewFeatureSupportLevel } from '../newFeatureSupportLevels';
57
+ import {
58
+ DESCRIPTION_AMD_GPU,
59
+ DESCRIPTION_AUTHORINO,
60
+ DESCRIPTION_LSO,
61
+ DESCRIPTION_MTV,
62
+ DESCRIPTION_CNV,
63
+ DESCRIPTION_FENCE_AGENTS_REMEDIATION,
64
+ DESCRIPTION_KMM,
65
+ DESCRIPTION_KUBE_DESCHEDULER,
66
+ DESCRIPTION_MCE,
67
+ DESCRIPTION_NMSTATE,
68
+ DESCRIPTION_NODE_FEATURE_DISCOVERY,
69
+ DESCRIPTION_NODE_HEALTHCHECK,
70
+ DESCRIPTION_NODE_MAINTENANCE,
71
+ DESCRIPTION_NVIDIA_GPU,
72
+ DESCRIPTION_ODF,
73
+ DESCRIPTION_OPENSHIFT_AI,
74
+ DESCRIPTION_OSC,
75
+ DESCRIPTION_PIPELINES,
76
+ DESCRIPTION_SELF_NODE_REMEDIATION,
77
+ DESCRIPTION_SERVERLESS,
78
+ DESCRIPTION_SERVICEMESH,
79
+ DESCRIPTION_LVM,
80
+ } from './operatorDescriptions';
57
81
 
58
82
  // TODO check if it's unused and it can be deleted in favor of "isMajorMinorVersionEqualOrGreater"
59
83
  export const isOCPVersionEqualsOrMore = (
@@ -69,279 +93,420 @@ export const isOCPVersionEqualsOrMore = (
69
93
  };
70
94
 
71
95
  export type OperatorSpec = {
96
+ operatorKey: string;
72
97
  title: string;
73
98
  featureId: FeatureId;
99
+ descriptionText?: string;
74
100
  Description?: React.ComponentType<{ openshiftVersion?: string }>;
75
101
  notStandalone?: boolean;
76
102
  Requirements?: React.ComponentType<{ cluster: Cluster }>;
103
+ category: string;
104
+ supportLevel?: SupportLevel | undefined;
77
105
  };
78
106
 
79
- export const getOperatorSpecs = (useLVMS?: boolean): { [key: string]: OperatorSpec } => {
107
+ export const getOperatorSpecs = (
108
+ getFeatureSupportLevel: GetFeatureSupportLevel,
109
+ useLVMS?: boolean,
110
+ ): { [category: string]: OperatorSpec[] } => {
80
111
  return {
81
- [OPERATOR_NAME_MTV]: {
82
- title: 'Migration Toolkit for Virtualization',
83
- featureId: 'MTV',
84
- Description: () => (
85
- <>
86
- This Toolkit (MTV) enables you to migrate virtual machines from VMware vSphere, Red Hat
87
- Virtualization, or OpenStack to OpenShift Virtualization running on Red Hat OpenShift.{' '}
88
- <ExternalLink href={MTV_LINK}>Learn more</ExternalLink>
89
- </>
90
- ),
91
- },
92
- [OPERATOR_NAME_AMD_GPU]: {
93
- title: 'AMD GPU',
94
- featureId: 'AMD_GPU',
95
- Requirements: () => <>Requires at least one supported AMD GPU</>,
96
- Description: () => (
97
- <>
98
- Automate the management of AMD software components needed to provision and monitor GPUs.
99
- </>
100
- ),
101
- },
102
- [OPERATOR_NAME_LSO]: {
103
- title: 'Local Storage Operator',
104
- featureId: 'LSO',
105
- Description: ({ openshiftVersion }) => (
106
- <>
107
- Allows provisioning of persistent storage by using local volumes.{' '}
108
- <ExternalLink href={getLsoLink(openshiftVersion)}>Learn more</ExternalLink>
109
- </>
110
- ),
111
- notStandalone: true,
112
- },
113
- [OPERATOR_NAME_AUTHORINO]: {
114
- title: 'Authorino',
115
- featureId: 'AUTHORINO',
116
- Description: () => (
117
- <>
118
- Lightweight external authorization service for tailor-made Zero Trust API security.{' '}
119
- <ExternalLink href={AUTHORINO_OPERATOR_LINK}>Learn more</ExternalLink>
120
- </>
121
- ),
122
- notStandalone: true,
123
- },
124
- [OPERATOR_NAME_CNV]: {
125
- title: 'OpenShift Virtualization',
126
- featureId: 'CNV',
127
- Requirements: () => (
128
- <>Enabled CPU virtualization support in BIOS (Intel-VT / AMD-V) on all nodes</>
129
- ),
130
- Description: () => (
131
- <>
132
- Run virtual machines alongside containers on one platform.{' '}
133
- <ExternalLink href={CNV_LINK}>Learn more</ExternalLink>
134
- </>
135
- ),
136
- },
137
- [OPERATOR_NAME_FENCE_AGENTS_REMEDIATION]: {
138
- title: 'Fence Agents Remediation',
139
- featureId: 'FENCE_AGENTS_REMEDIATION',
140
- Description: () => (
141
- <>
142
- Externally fences failed nodes using power controllers.{' '}
143
- <ExternalLink href={FENCE_AGENTS_REMEDIATION_LINK}>Learn more</ExternalLink>
144
- </>
145
- ),
146
- notStandalone: true,
147
- },
148
- [OPERATOR_NAME_KMM]: {
149
- title: 'Kernel Module Management',
150
- featureId: 'KMM',
151
- Description: ({ openshiftVersion }) => (
152
- <>
153
- Management of kernel modules.{' '}
154
- <ExternalLink href={getKmmDocsLink(openshiftVersion)}>Learn more</ExternalLink>
155
- </>
156
- ),
157
- },
158
- [OPERATOR_NAME_KUBE_DESCHEDULER]: {
159
- title: 'Kube Descheduler',
160
- featureId: 'KUBE_DESCHEDULER',
161
- Description: ({ openshiftVersion }) => (
162
- <>
163
- Evicts pods to reschedule them onto more suitable nodes.{' '}
164
- <ExternalLink href={getKubeDeschedulerLink(openshiftVersion)}>Learn more</ExternalLink>
165
- </>
166
- ),
167
- notStandalone: true,
168
- },
169
- [OPERATOR_NAME_MCE]: {
170
- title: 'Multicluster engine',
171
- featureId: 'MCE',
172
- Description: ({ openshiftVersion }) => (
173
- <>
174
- Create, import, and manage multiple clusters from this cluster.{' '}
175
- <ExternalLink href={getMceDocsLink(openshiftVersion)}>Learn more</ExternalLink>
176
- </>
177
- ),
178
- },
179
- [OPERATOR_NAME_NMSTATE]: {
180
- title: 'NMState',
181
- featureId: 'NMSTATE',
182
- Description: ({ openshiftVersion }) => (
183
- <>
184
- Provides users with functionality to configure various network interface types, DNS, and
185
- routing on cluster nodes.{' '}
186
- <ExternalLink href={getNmstateLink(openshiftVersion)}>Learn more</ExternalLink>
187
- </>
188
- ),
189
- },
190
- [OPERATOR_NAME_NODE_FEATURE_DISCOVERY]: {
191
- title: 'Node Feature Discovery',
192
- featureId: 'NODE_FEATURE_DISCOVERY',
193
- Description: ({ openshiftVersion }) => (
194
- <>
195
- Manage the detection of hardware features and configuration by labeling nodes with
196
- hardware-specific information.{' '}
197
- <ExternalLink href={getNodeFeatureDiscoveryLink(openshiftVersion)}>
198
- Learn more
112
+ [categories[Category.STORAGE]]: [
113
+ {
114
+ operatorKey: OPERATOR_NAME_LSO,
115
+ title: 'Local Storage Operator',
116
+ featureId: 'LSO',
117
+ descriptionText: DESCRIPTION_LSO,
118
+ Description: ({ openshiftVersion }) => (
119
+ <>
120
+ {DESCRIPTION_LSO}{' '}
121
+ <ExternalLink href={getLsoLink(openshiftVersion)}>Learn more</ExternalLink>
122
+ </>
123
+ ),
124
+ notStandalone: true,
125
+ category: categories[Category.STORAGE],
126
+ supportLevel: getFeatureSupportLevel('LSO'),
127
+ },
128
+ {
129
+ operatorKey: OPERATOR_NAME_LVM,
130
+ title: useLVMS ? 'Logical Volume Manager Storage' : 'Logical Volume Manager',
131
+ featureId: 'LVM',
132
+ descriptionText: DESCRIPTION_LVM,
133
+ Description: ({ openshiftVersion }) =>
134
+ useLVMS ? (
135
+ <>
136
+ {DESCRIPTION_LVM}{' '}
137
+ <ExternalLink href={getLvmsDocsLink(openshiftVersion)}>Learn more</ExternalLink>
138
+ </>
139
+ ) : (
140
+ <>{DESCRIPTION_LVM}</>
141
+ ),
142
+ category: categories[Category.STORAGE],
143
+ supportLevel: getFeatureSupportLevel('LVM'),
144
+ },
145
+ {
146
+ operatorKey: OPERATOR_NAME_ODF,
147
+ title: 'OpenShift Data Foundation',
148
+ featureId: 'ODF',
149
+ descriptionText: DESCRIPTION_ODF,
150
+ Requirements: () => (
151
+ <ExternalLink href={ODF_REQUIREMENTS_LINK}>
152
+ Learn more about the requirements for OpenShift Data Foundation
199
153
  </ExternalLink>
200
- </>
201
- ),
202
- },
203
- [OPERATOR_NAME_NODE_HEALTHCHECK]: {
204
- title: 'Node Healthcheck',
205
- featureId: 'NODE_HEALTHCHECK',
206
- Description: () => (
207
- <>
208
- Identify Unhealthy Nodes.{' '}
209
- <ExternalLink href={NODE_HEALTHCHECK_LINK}>Learn more</ExternalLink>
210
- </>
211
- ),
212
- notStandalone: true,
213
- },
214
- [OPERATOR_NAME_NODE_MAINTENANCE]: {
215
- title: 'Node Maintenance',
216
- featureId: 'NODE_MAINTENANCE',
217
- Description: () => (
218
- <>
219
- Place nodes in maintenance mode.{' '}
220
- <ExternalLink href={NODE_MAINTENANCE_LINK}>Learn more</ExternalLink>
221
- </>
222
- ),
223
- notStandalone: true,
224
- },
225
- [OPERATOR_NAME_NVIDIA_GPU]: {
226
- title: 'NVIDIA GPU',
227
- featureId: 'NVIDIA_GPU',
228
- Requirements: () => <>Requires at least one supported NVIDIA GPU</>,
229
- Description: ({ openshiftVersion }) => (
230
- <>
231
- Automate the management of NVIDIA software components needed to provision and monitor
232
- GPUs. <ExternalLink href={getNvidiaGpuLink(openshiftVersion)}>Learn more</ExternalLink>
233
- </>
234
- ),
235
- },
236
- [OPERATOR_NAME_ODF]: {
237
- title: 'OpenShift Data Foundation',
238
- featureId: 'ODF',
239
- Requirements: () => (
240
- <ExternalLink href={ODF_REQUIREMENTS_LINK}>
241
- Learn more about the requirements for OpenShift Data Foundation
242
- </ExternalLink>
243
- ),
244
- Description: () => (
245
- <>
246
- Persistent software-defined storage for hybrid applications.{' '}
247
- <ExternalLink href={ODF_LINK}>Learn more</ExternalLink>
248
- </>
249
- ),
250
- },
251
- [OPERATOR_NAME_OPENSHIFT_AI]: {
252
- title: 'OpenShift AI',
253
- featureId: 'OPENSHIFT_AI',
254
- Requirements: () => (
255
- <ExternalLink href={OPENSHIFT_AI_REQUIREMENTS_LINK}>Learn more</ExternalLink>
256
- ),
257
- Description: () => (
258
- <>
259
- Train, serve, monitor and manage AI/ML models and applications.{' '}
260
- <ExternalLink href={OPENSHIFT_AI_LINK}>Learn more</ExternalLink>
261
- </>
262
- ),
263
- },
264
- [OPERATOR_NAME_OSC]: {
265
- title: 'OpenShift sandboxed containers',
266
- featureId: 'OSC',
267
- Requirements: () => (
268
- <ExternalLink href={OSC_REQUIREMENTS_LINK}>
269
- Learn more about the requirements for OpenShift sandboxed containers
270
- </ExternalLink>
271
- ),
272
- Description: () => (
273
- <>
274
- OpenShift sandboxed containers support for OpenShift Container Platform provides users
275
- with built-in support for running Kata Containers as an additional optional runtime. It
276
- provides an additional virtualization machine(VM) isolation layer for pods.{' '}
277
- <ExternalLink href={OSC_LINK}>Learn more</ExternalLink>
278
- </>
279
- ),
280
- },
281
- [OPERATOR_NAME_PIPELINES]: {
282
- title: 'Pipelines',
283
- featureId: 'PIPELINES',
284
- Description: () => (
285
- <>
286
- Cloud-native continuous integration and delivery (CI/CD) solution for building pipelines
287
- using Tekton. <ExternalLink href={PIPELINES_OPERATOR_LINK}>Learn more</ExternalLink>
288
- </>
289
- ),
290
- notStandalone: true,
291
- },
292
- [OPERATOR_NAME_SELF_NODE_REMEDIATION]: {
293
- title: 'Self Node Remediation',
294
- featureId: 'SELF_NODE_REMEDIATION',
295
- Description: () => (
296
- <>
297
- Allows nodes to reboot themselves when they become unhealthy.{' '}
298
- <ExternalLink href={SELF_NODE_REMEDIATION_LINK}>Learn more</ExternalLink>
299
- </>
300
- ),
301
- notStandalone: true,
302
- },
303
- [OPERATOR_NAME_SERVERLESS]: {
304
- title: 'Serverless',
305
- featureId: 'SERVERLESS',
306
- Description: () => (
307
- <>
308
- Deploy workflow applications based on the CNCF Serverless Workflow specification.{' '}
309
- <ExternalLink href={SERVERLESS_OPERATOR_LINK}>Learn more</ExternalLink>
310
- </>
311
- ),
312
- notStandalone: true,
313
- },
314
- [OPERATOR_NAME_SERVICEMESH]: {
315
- title: 'Service Mesh',
316
- featureId: 'SERVICEMESH',
317
- Description: ({ openshiftVersion }) => (
318
- <>
319
- Platform that provides behavioral insight and operational control over a service mesh.{' '}
320
- <ExternalLink href={getServiceMeshLink(openshiftVersion)}>Learn more</ExternalLink>
321
- </>
322
- ),
323
- notStandalone: true,
324
- },
325
- [OPERATOR_NAME_LVM]: {
326
- title: useLVMS ? 'Logical Volume Manager Storage' : 'Logical Volume Manager',
327
- featureId: 'LVM',
328
- Description: ({ openshiftVersion }) =>
329
- useLVMS ? (
154
+ ),
155
+ Description: () => (
330
156
  <>
331
- Storage virtualization that offers a more flexible approach for disk space management.{' '}
332
- <ExternalLink href={getLvmsDocsLink(openshiftVersion)}>Learn more</ExternalLink>
157
+ {DESCRIPTION_ODF} <ExternalLink href={ODF_LINK}>Learn more</ExternalLink>
333
158
  </>
334
- ) : (
159
+ ),
160
+ category: categories[Category.STORAGE],
161
+ supportLevel: getFeatureSupportLevel('ODF'),
162
+ },
163
+ ],
164
+ [categories[Category.VIRT]]: [
165
+ {
166
+ operatorKey: OPERATOR_NAME_CNV,
167
+ title: 'OpenShift Virtualization',
168
+ featureId: 'CNV',
169
+ descriptionText: DESCRIPTION_CNV,
170
+ Requirements: () => (
171
+ <>Enabled CPU virtualization support in BIOS (Intel-VT / AMD-V) on all nodes</>
172
+ ),
173
+ Description: () => (
174
+ <>
175
+ {DESCRIPTION_CNV} <ExternalLink href={CNV_LINK}>Learn more</ExternalLink>
176
+ </>
177
+ ),
178
+ category: categories[Category.VIRT],
179
+ supportLevel: getFeatureSupportLevel('CNV'),
180
+ },
181
+ {
182
+ operatorKey: OPERATOR_NAME_MTV,
183
+ title: 'Migration Toolkit for Virtualization',
184
+ featureId: 'MTV',
185
+ descriptionText: DESCRIPTION_MTV,
186
+ Description: () => (
335
187
  <>
336
- Storage virtualization that offers a more flexible approach for disk space management.
188
+ {DESCRIPTION_MTV} <ExternalLink href={MTV_LINK}>Learn more</ExternalLink>
337
189
  </>
338
190
  ),
339
- },
191
+ category: categories[Category.VIRT],
192
+ supportLevel: getFeatureSupportLevel('MTV'),
193
+ },
194
+ ],
195
+ [categories[Category.AI]]: [
196
+ {
197
+ operatorKey: OPERATOR_NAME_OPENSHIFT_AI,
198
+ title: 'OpenShift AI',
199
+ featureId: 'OPENSHIFT_AI',
200
+ descriptionText: DESCRIPTION_OPENSHIFT_AI,
201
+ Requirements: () => (
202
+ <ExternalLink href={OPENSHIFT_AI_REQUIREMENTS_LINK}>Learn more</ExternalLink>
203
+ ),
204
+ Description: () => (
205
+ <>
206
+ {DESCRIPTION_OPENSHIFT_AI}{' '}
207
+ <ExternalLink href={OPENSHIFT_AI_LINK}>Learn more</ExternalLink>
208
+ </>
209
+ ),
210
+ category: categories[Category.AI],
211
+ supportLevel: getFeatureSupportLevel('OPENSHIFT_AI'),
212
+ },
213
+ {
214
+ operatorKey: OPERATOR_NAME_AMD_GPU,
215
+ title: 'AMD GPU',
216
+ featureId: 'AMD_GPU',
217
+ descriptionText: DESCRIPTION_AMD_GPU,
218
+ Requirements: () => <>Requires at least one supported AMD GPU</>,
219
+ Description: () => <>{DESCRIPTION_AMD_GPU}</>,
220
+ category: categories[Category.AI],
221
+ supportLevel: getFeatureSupportLevel('AMD_GPU'),
222
+ },
223
+ {
224
+ operatorKey: OPERATOR_NAME_NVIDIA_GPU,
225
+ title: 'NVIDIA GPU',
226
+ featureId: 'NVIDIA_GPU',
227
+ descriptionText: DESCRIPTION_NVIDIA_GPU,
228
+ Requirements: () => <>Requires at least one supported NVIDIA GPU</>,
229
+ Description: ({ openshiftVersion }) => (
230
+ <>
231
+ {DESCRIPTION_NVIDIA_GPU}
232
+ <ExternalLink href={getNvidiaGpuLink(openshiftVersion)}>Learn more</ExternalLink>
233
+ </>
234
+ ),
235
+ category: categories[Category.AI],
236
+ supportLevel: getFeatureSupportLevel('NVIDIA_GPU'),
237
+ },
238
+ ],
239
+ [categories[Category.NETWORK]]: [
240
+ {
241
+ operatorKey: OPERATOR_NAME_NMSTATE,
242
+ title: 'NMState',
243
+ featureId: 'NMSTATE',
244
+ descriptionText: DESCRIPTION_NMSTATE,
245
+ Description: ({ openshiftVersion }) => (
246
+ <>
247
+ {DESCRIPTION_NMSTATE}{' '}
248
+ <ExternalLink href={getNmstateLink(openshiftVersion)}>Learn more</ExternalLink>
249
+ </>
250
+ ),
251
+ category: categories[Category.NETWORK],
252
+ supportLevel: getFeatureSupportLevel('NMSTATE'),
253
+ },
254
+ {
255
+ operatorKey: OPERATOR_NAME_SERVICEMESH,
256
+ title: 'Service Mesh',
257
+ featureId: 'SERVICEMESH',
258
+ descriptionText: DESCRIPTION_SERVICEMESH,
259
+ Description: ({ openshiftVersion }) => (
260
+ <>
261
+ {DESCRIPTION_SERVICEMESH}{' '}
262
+ <ExternalLink href={getServiceMeshLink(openshiftVersion)}>Learn more</ExternalLink>
263
+ </>
264
+ ),
265
+ notStandalone: true,
266
+ category: categories[Category.NETWORK],
267
+ supportLevel: getFeatureSupportLevel('SERVICEMESH'),
268
+ },
269
+ ],
270
+ [categories[Category.REMEDIATION]]: [
271
+ {
272
+ operatorKey: OPERATOR_NAME_FENCE_AGENTS_REMEDIATION,
273
+ title: 'Fence Agents Remediation',
274
+ featureId: 'FENCE_AGENTS_REMEDIATION',
275
+ descriptionText: DESCRIPTION_FENCE_AGENTS_REMEDIATION,
276
+ Description: () => (
277
+ <>
278
+ {DESCRIPTION_FENCE_AGENTS_REMEDIATION}{' '}
279
+ <ExternalLink href={FENCE_AGENTS_REMEDIATION_LINK}>Learn more</ExternalLink>
280
+ </>
281
+ ),
282
+ notStandalone: true,
283
+ category: categories[Category.REMEDIATION],
284
+ supportLevel: getFeatureSupportLevel('FENCE_AGENTS_REMEDIATION'),
285
+ },
286
+ {
287
+ operatorKey: OPERATOR_NAME_NODE_HEALTHCHECK,
288
+ title: 'Node Healthcheck',
289
+ featureId: 'NODE_HEALTHCHECK',
290
+ descriptionText: DESCRIPTION_NODE_HEALTHCHECK,
291
+ Description: () => (
292
+ <>
293
+ {DESCRIPTION_NODE_HEALTHCHECK}{' '}
294
+ <ExternalLink href={NODE_HEALTHCHECK_LINK}>Learn more</ExternalLink>
295
+ </>
296
+ ),
297
+ notStandalone: true,
298
+ category: categories[Category.REMEDIATION],
299
+ supportLevel: getFeatureSupportLevel('NODE_HEALTHCHECK'),
300
+ },
301
+ {
302
+ operatorKey: OPERATOR_NAME_SELF_NODE_REMEDIATION,
303
+ title: 'Self Node Remediation',
304
+ featureId: 'SELF_NODE_REMEDIATION',
305
+ descriptionText: DESCRIPTION_SELF_NODE_REMEDIATION,
306
+ Description: () => (
307
+ <>
308
+ {DESCRIPTION_SELF_NODE_REMEDIATION}{' '}
309
+ <ExternalLink href={SELF_NODE_REMEDIATION_LINK}>Learn more</ExternalLink>
310
+ </>
311
+ ),
312
+ notStandalone: true,
313
+ category: categories[Category.REMEDIATION],
314
+ supportLevel: getFeatureSupportLevel('SELF_NODE_REMEDIATION'),
315
+ },
316
+ ],
317
+ [categories[Category.OTHER]]: [
318
+ {
319
+ operatorKey: OPERATOR_NAME_AUTHORINO,
320
+ title: 'Authorino',
321
+ featureId: 'AUTHORINO',
322
+ descriptionText: DESCRIPTION_AUTHORINO,
323
+ Description: () => (
324
+ <>
325
+ {DESCRIPTION_AUTHORINO}{' '}
326
+ <ExternalLink href={AUTHORINO_OPERATOR_LINK}>Learn more</ExternalLink>
327
+ </>
328
+ ),
329
+ notStandalone: true,
330
+ category: categories[Category.OTHER],
331
+ supportLevel: getFeatureSupportLevel('AUTHORINO'),
332
+ },
333
+ {
334
+ operatorKey: OPERATOR_NAME_NODE_FEATURE_DISCOVERY,
335
+ title: 'Node Feature Discovery',
336
+ featureId: 'NODE_FEATURE_DISCOVERY',
337
+ descriptionText: DESCRIPTION_NODE_FEATURE_DISCOVERY,
338
+ Description: ({ openshiftVersion }) => (
339
+ <>
340
+ {DESCRIPTION_NODE_FEATURE_DISCOVERY}{' '}
341
+ <ExternalLink href={getNodeFeatureDiscoveryLink(openshiftVersion)}>
342
+ Learn more
343
+ </ExternalLink>
344
+ </>
345
+ ),
346
+ category: categories[Category.OTHER],
347
+ supportLevel: getFeatureSupportLevel('NODE_FEATURE_DISCOVERY'),
348
+ },
349
+ {
350
+ operatorKey: OPERATOR_NAME_PIPELINES,
351
+ title: 'Pipelines',
352
+ featureId: 'PIPELINES',
353
+ descriptionText: DESCRIPTION_PIPELINES,
354
+ Description: () => (
355
+ <>
356
+ {DESCRIPTION_PIPELINES}{' '}
357
+ <ExternalLink href={PIPELINES_OPERATOR_LINK}>Learn more</ExternalLink>
358
+ </>
359
+ ),
360
+ notStandalone: true,
361
+ category: categories[Category.OTHER],
362
+ supportLevel: getFeatureSupportLevel('PIPELINES'),
363
+ },
364
+ {
365
+ operatorKey: OPERATOR_NAME_SERVERLESS,
366
+ title: 'Serverless',
367
+ featureId: 'SERVERLESS',
368
+ descriptionText: DESCRIPTION_SERVERLESS,
369
+ Description: () => (
370
+ <>
371
+ {DESCRIPTION_SERVERLESS}{' '}
372
+ <ExternalLink href={SERVERLESS_OPERATOR_LINK}>Learn more</ExternalLink>
373
+ </>
374
+ ),
375
+ notStandalone: true,
376
+ category: categories[Category.OTHER],
377
+ supportLevel: getFeatureSupportLevel('SERVERLESS'),
378
+ },
379
+ {
380
+ operatorKey: OPERATOR_NAME_KMM,
381
+ title: 'Kernel Module Management',
382
+ featureId: 'KMM',
383
+ descriptionText: DESCRIPTION_KMM,
384
+ Description: ({ openshiftVersion }) => (
385
+ <>
386
+ {DESCRIPTION_KMM}{' '}
387
+ <ExternalLink href={getKmmDocsLink(openshiftVersion)}>Learn more</ExternalLink>
388
+ </>
389
+ ),
390
+ category: categories[Category.OTHER],
391
+ supportLevel: getFeatureSupportLevel('KMM'),
392
+ },
393
+ {
394
+ operatorKey: OPERATOR_NAME_MCE,
395
+ title: 'Multicluster engine',
396
+ featureId: 'MCE',
397
+ descriptionText: DESCRIPTION_MCE,
398
+ Description: ({ openshiftVersion }) => (
399
+ <>
400
+ {DESCRIPTION_MCE}{' '}
401
+ <ExternalLink href={getMceDocsLink(openshiftVersion)}>Learn more</ExternalLink>
402
+ </>
403
+ ),
404
+ category: categories[Category.OTHER],
405
+ supportLevel: getFeatureSupportLevel('MCE'),
406
+ },
407
+ {
408
+ operatorKey: OPERATOR_NAME_OSC,
409
+ title: 'OpenShift sandboxed containers',
410
+ featureId: 'OSC',
411
+ descriptionText: DESCRIPTION_OSC,
412
+ Requirements: () => (
413
+ <ExternalLink href={OSC_REQUIREMENTS_LINK}>
414
+ Learn more about the requirements for OpenShift sandboxed containers
415
+ </ExternalLink>
416
+ ),
417
+ Description: () => (
418
+ <>
419
+ {DESCRIPTION_OSC} <ExternalLink href={OSC_LINK}>Learn more</ExternalLink>
420
+ </>
421
+ ),
422
+ category: categories[Category.OTHER],
423
+ supportLevel: getFeatureSupportLevel('OSC'),
424
+ },
425
+ {
426
+ operatorKey: OPERATOR_NAME_KUBE_DESCHEDULER,
427
+ title: 'Kube Descheduler',
428
+ featureId: 'KUBE_DESCHEDULER',
429
+ descriptionText: DESCRIPTION_KUBE_DESCHEDULER,
430
+ Description: ({ openshiftVersion }) => (
431
+ <>
432
+ {DESCRIPTION_KUBE_DESCHEDULER}{' '}
433
+ <ExternalLink href={getKubeDeschedulerLink(openshiftVersion)}>Learn more</ExternalLink>
434
+ </>
435
+ ),
436
+ notStandalone: true,
437
+ category: categories[Category.OTHER],
438
+ supportLevel: getFeatureSupportLevel('KUBE_DESCHEDULER'),
439
+ },
440
+
441
+ {
442
+ operatorKey: OPERATOR_NAME_NODE_MAINTENANCE,
443
+ title: 'Node Maintenance',
444
+ featureId: 'NODE_MAINTENANCE',
445
+ descriptionText: DESCRIPTION_NODE_MAINTENANCE,
446
+ Description: () => (
447
+ <>
448
+ {DESCRIPTION_NODE_MAINTENANCE}{' '}
449
+ <ExternalLink href={NODE_MAINTENANCE_LINK}>Learn more</ExternalLink>
450
+ </>
451
+ ),
452
+ notStandalone: true,
453
+ category: categories[Category.OTHER],
454
+ supportLevel: getFeatureSupportLevel('NODE_MAINTENANCE'),
455
+ },
456
+ ],
340
457
  };
341
458
  };
342
459
 
343
460
  export const useOperatorSpecs = () => {
344
461
  const { getFeatureSupportLevel } = useNewFeatureSupportLevel();
345
462
  const useLVMS = getFeatureSupportLevel('LVM') === 'supported';
346
- return React.useMemo(() => getOperatorSpecs(useLVMS), [useLVMS]);
463
+
464
+ // Grouped by category
465
+ const byCategory = React.useMemo(
466
+ () => getOperatorSpecs(getFeatureSupportLevel, useLVMS),
467
+ [getFeatureSupportLevel, useLVMS],
468
+ );
469
+
470
+ // Flat map operatorKey -> spec
471
+ const byKey: Record<string, OperatorSpec> = React.useMemo(() => {
472
+ return Object.values(byCategory).reduce((acc, specs) => {
473
+ specs.forEach((spec) => {
474
+ acc[spec.operatorKey] = spec;
475
+ });
476
+ return acc;
477
+ }, {} as Record<string, OperatorSpec>);
478
+ }, [byCategory]);
479
+
480
+ return { byCategory, byKey };
481
+ };
482
+
483
+ export const getOperatorTitleByFeatureId = (featureId: FeatureId): string | undefined => {
484
+ const allSpecs = getOperatorSpecs(() => undefined);
485
+
486
+ for (const categorySpecs of Object.values(allSpecs)) {
487
+ const spec = categorySpecs.find((s) => s.featureId === featureId);
488
+ if (spec) {
489
+ return spec.title;
490
+ }
491
+ }
492
+
493
+ return undefined;
494
+ };
495
+
496
+ enum Category {
497
+ STORAGE,
498
+ VIRT,
499
+ AI,
500
+ NETWORK,
501
+ REMEDIATION,
502
+ OTHER,
503
+ }
504
+
505
+ export const categories: { [key in Category]: string } = {
506
+ [Category.STORAGE]: 'Storage',
507
+ [Category.VIRT]: 'Virtualization',
508
+ [Category.AI]: 'AI',
509
+ [Category.NETWORK]: 'Network',
510
+ [Category.REMEDIATION]: 'Remediation',
511
+ [Category.OTHER]: 'Other',
347
512
  };