@openshift-assisted/ui-lib 2.48.3 → 2.48.4

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 (91) hide show
  1. package/build/@types/common/api/assisted-service/ClustersAPI.d.ts +0 -4
  2. package/build/@types/common/api/assisted-service/ClustersAPI.d.ts.map +1 -1
  3. package/build/@types/common/api/assisted-service/HostsAPI.d.ts +1 -0
  4. package/build/@types/common/api/assisted-service/HostsAPI.d.ts.map +1 -1
  5. package/build/@types/common/components/ui/formik/PullSecretField.d.ts.map +1 -1
  6. package/build/@types/ocm/components/Routes.d.ts.map +1 -1
  7. package/build/@types/ocm/components/clusterWizard/ClusterDetailsForm.d.ts.map +1 -1
  8. package/build/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts +0 -3
  9. package/build/@types/ocm/components/clusterWizard/ClusterWizardContext.d.ts.map +1 -1
  10. package/build/@types/ocm/components/clusterWizard/ClusterWizardContextProvider.d.ts.map +1 -1
  11. package/build/@types/ocm/components/clusterWizard/ClusterWizardFooter.d.ts +1 -2
  12. package/build/@types/ocm/components/clusterWizard/ClusterWizardFooter.d.ts.map +1 -1
  13. package/build/@types/ocm/components/clusterWizard/NewClusterWizard.d.ts.map +1 -1
  14. package/build/@types/ocm/components/clusterWizard/constants.d.ts.map +1 -1
  15. package/build/@types/ocm/components/clusterWizard/disconnected/BasicStep.d.ts.map +1 -1
  16. package/build/@types/ocm/components/clusterWizard/disconnected/InstallDisconnectedSwitch.d.ts.map +1 -1
  17. package/build/@types/ocm/components/clusterWizard/disconnected/ReviewStep.d.ts.map +1 -1
  18. package/build/@types/ocm/components/clusterWizard/index.d.ts +0 -1
  19. package/build/@types/ocm/components/clusterWizard/index.d.ts.map +1 -1
  20. package/build/@types/ocm/components/clusterWizard/wizardTransition.d.ts +1 -1
  21. package/build/@types/ocm/components/clusterWizard/wizardTransition.d.ts.map +1 -1
  22. package/build/@types/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts +1 -1
  23. package/build/@types/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.d.ts.map +1 -1
  24. package/build/@types/ocm/services/ClustersService.d.ts +0 -4
  25. package/build/@types/ocm/services/ClustersService.d.ts.map +1 -1
  26. package/build/@types/ocm/services/HostsService.d.ts +1 -0
  27. package/build/@types/ocm/services/HostsService.d.ts.map +1 -1
  28. package/build/cjs/common/api/assisted-service/ClustersAPI.js +0 -3
  29. package/build/cjs/common/api/assisted-service/ClustersAPI.js.map +1 -1
  30. package/build/cjs/common/api/assisted-service/HostsAPI.js +3 -0
  31. package/build/cjs/common/api/assisted-service/HostsAPI.js.map +1 -1
  32. package/build/cjs/common/components/ui/WizardFooter.js +1 -1
  33. package/build/cjs/common/components/ui/WizardFooter.js.map +1 -1
  34. package/build/cjs/common/components/ui/formik/PullSecretField.js.map +1 -1
  35. package/build/cjs/ocm/components/Routes.js +1 -2
  36. package/build/cjs/ocm/components/Routes.js.map +1 -1
  37. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js +5 -4
  38. package/build/cjs/ocm/components/clusterWizard/ClusterDetailsForm.js.map +1 -1
  39. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContext.js.map +1 -1
  40. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContextProvider.js +0 -4
  41. package/build/cjs/ocm/components/clusterWizard/ClusterWizardContextProvider.js.map +1 -1
  42. package/build/cjs/ocm/components/clusterWizard/ClusterWizardFooter.js +6 -21
  43. package/build/cjs/ocm/components/clusterWizard/ClusterWizardFooter.js.map +1 -1
  44. package/build/cjs/ocm/components/clusterWizard/NewClusterWizard.js +0 -3
  45. package/build/cjs/ocm/components/clusterWizard/NewClusterWizard.js.map +1 -1
  46. package/build/cjs/ocm/components/clusterWizard/constants.js +0 -1
  47. package/build/cjs/ocm/components/clusterWizard/constants.js.map +1 -1
  48. package/build/cjs/ocm/components/clusterWizard/disconnected/BasicStep.js +8 -51
  49. package/build/cjs/ocm/components/clusterWizard/disconnected/BasicStep.js.map +1 -1
  50. package/build/cjs/ocm/components/clusterWizard/disconnected/InstallDisconnectedSwitch.js +1 -1
  51. package/build/cjs/ocm/components/clusterWizard/disconnected/InstallDisconnectedSwitch.js.map +1 -1
  52. package/build/cjs/ocm/components/clusterWizard/disconnected/ReviewStep.js +8 -43
  53. package/build/cjs/ocm/components/clusterWizard/disconnected/ReviewStep.js.map +1 -1
  54. package/build/cjs/ocm/components/clusterWizard/index.js +1 -3
  55. package/build/cjs/ocm/components/clusterWizard/index.js.map +1 -1
  56. package/build/cjs/ocm/components/clusterWizard/wizardTransition.js +0 -3
  57. package/build/cjs/ocm/components/clusterWizard/wizardTransition.js.map +1 -1
  58. package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js +1 -1
  59. package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js.map +1 -1
  60. package/build/cjs/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js +4 -14
  61. package/build/cjs/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.js.map +1 -1
  62. package/build/cjs/ocm/services/ClustersService.js +0 -6
  63. package/build/cjs/ocm/services/ClustersService.js.map +1 -1
  64. package/build/cjs/ocm/services/HostsService.js +6 -0
  65. package/build/cjs/ocm/services/HostsService.js.map +1 -1
  66. package/lib/common/api/assisted-service/ClustersAPI.ts +0 -6
  67. package/lib/common/api/assisted-service/HostsAPI.ts +5 -0
  68. package/lib/common/components/ui/WizardFooter.tsx +1 -1
  69. package/lib/common/components/ui/formik/PullSecretField.tsx +0 -1
  70. package/lib/ocm/components/Routes.tsx +1 -3
  71. package/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +10 -9
  72. package/lib/ocm/components/clusterWizard/ClusterWizardContext.tsx +0 -3
  73. package/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx +0 -6
  74. package/lib/ocm/components/clusterWizard/ClusterWizardFooter.tsx +5 -26
  75. package/lib/ocm/components/clusterWizard/NewClusterWizard.tsx +0 -3
  76. package/lib/ocm/components/clusterWizard/constants.ts +0 -1
  77. package/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx +13 -63
  78. package/lib/ocm/components/clusterWizard/disconnected/InstallDisconnectedSwitch.tsx +1 -0
  79. package/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx +11 -43
  80. package/lib/ocm/components/clusterWizard/index.ts +0 -1
  81. package/lib/ocm/components/clusterWizard/wizardTransition.ts +1 -5
  82. package/lib/ocm/components/clusters/AssistedInstallerHeader.tsx +2 -2
  83. package/lib/ocm/components/featureSupportLevels/ReviewClusterFeatureSupportLevels.tsx +4 -23
  84. package/lib/ocm/services/ClustersService.ts +0 -6
  85. package/lib/ocm/services/HostsService.ts +8 -0
  86. package/package.json +3 -3
  87. package/build/@types/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.d.ts +0 -4
  88. package/build/@types/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.d.ts.map +0 -1
  89. package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js +0 -128
  90. package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js.map +0 -1
  91. package/lib/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.tsx +0 -201
@@ -17,8 +17,6 @@ import { onFetchEvents } from '../fetching/fetchEvents';
17
17
  import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
18
18
  import { useFeature } from '../../hooks/use-feature';
19
19
  import { useModalDialogsContext } from '../hosts/ModalDialogsContext';
20
- import ClustersService from '../../services/ClustersService';
21
- import { handleApiError, getApiErrorMessage } from '../../../common/api';
22
20
 
23
21
  type ClusterValidationSectionProps = {
24
22
  cluster?: Cluster;
@@ -73,7 +71,6 @@ type ClusterWizardFooterProps = WizardFooterGenericProps & {
73
71
  errorFields?: string[];
74
72
  alertTitle?: string;
75
73
  alertContent?: string | null;
76
- disconnectedClusterId?: string;
77
74
  };
78
75
 
79
76
  const ClusterWizardFooter = ({
@@ -83,37 +80,19 @@ const ClusterWizardFooter = ({
83
80
  alertTitle,
84
81
  alertContent,
85
82
  onCancel,
86
- disconnectedClusterId,
87
83
  ...rest
88
84
  }: ClusterWizardFooterProps) => {
89
- const { alerts, addAlert } = useAlerts();
85
+ const { alerts } = useAlerts();
90
86
  const navigate = useNavigate();
91
87
  const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE');
92
88
  const { currentStepId } = useClusterWizardContext();
93
89
  const { resetSingleClusterDialog } = useModalDialogsContext();
94
- const { setDisconnectedInfraEnv } = useClusterWizardContext();
95
90
 
96
- const handleCancel = React.useCallback(async () => {
97
- if (disconnectedClusterId) {
98
- try {
99
- await ClustersService.remove(disconnectedClusterId);
100
- } catch (e) {
101
- handleApiError(e, () =>
102
- addAlert({
103
- title: 'Failed to remove cluster',
104
- message: getApiErrorMessage(e),
105
- }),
106
- );
107
- }
108
- }
109
- setDisconnectedInfraEnv(undefined);
110
- navigate('/cluster-list');
111
- }, [navigate, setDisconnectedInfraEnv, addAlert, disconnectedClusterId]);
91
+ const handleCancel = React.useCallback(() => navigate('/cluster-list'), [navigate]);
112
92
 
113
- const handleReset = React.useCallback(
114
- () => resetSingleClusterDialog.open({ cluster }),
115
- [resetSingleClusterDialog, cluster],
116
- );
93
+ const handleReset = React.useCallback(() => {
94
+ resetSingleClusterDialog.open({ cluster });
95
+ }, [resetSingleClusterDialog, cluster]);
117
96
 
118
97
  const alertsSection = alerts.length ? <Alerts /> : undefined;
119
98
 
@@ -4,7 +4,6 @@ import ClusterDetails from './ClusterDetails';
4
4
  import { useClusterWizardContext } from './ClusterWizardContext';
5
5
  import ReviewStep from './disconnected/ReviewStep';
6
6
  import BasicStep from './disconnected/BasicStep';
7
- import OptionalConfigurationsStep from './disconnected/OptionalConfigurationsStep';
8
7
  import { ClusterWizardStepsType } from './wizardTransition';
9
8
 
10
9
  const getCurrentStep = (currentStepId: ClusterWizardStepsType) => {
@@ -13,8 +12,6 @@ const getCurrentStep = (currentStepId: ClusterWizardStepsType) => {
13
12
  return <ReviewStep />;
14
13
  case 'disconnected-basic':
15
14
  return <BasicStep />;
16
- case 'disconnected-optional-configurations':
17
- return <OptionalConfigurationsStep />;
18
15
  default:
19
16
  return <ClusterDetails />;
20
17
  }
@@ -14,7 +14,6 @@ export const wizardStepNames: { [key in ClusterWizardStepsType]: string } = {
14
14
  'credentials-download': 'Download credentials',
15
15
  'disconnected-review': 'Review and download ISO',
16
16
  'disconnected-basic': 'Basic information',
17
- 'disconnected-optional-configurations': 'Optional configurations',
18
17
  };
19
18
 
20
19
  export const defaultWizardSteps: ClusterWizardStepsType[] = [
@@ -1,13 +1,13 @@
1
1
  import * as React from 'react';
2
2
  import {
3
3
  ClusterWizardStep,
4
- TechnologyPreview,
4
+ DeveloperPreview,
5
5
  ExternalLink,
6
6
  OCP_RELEASES_PAGE,
7
7
  StaticTextField,
8
8
  useTranslation,
9
9
  } from '../../../../common';
10
- import { Flex, Grid, GridItem, Form, Content } from '@patternfly/react-core';
10
+ import { Split, SplitItem, Grid, GridItem, Form, Content } from '@patternfly/react-core';
11
11
  import OcmOpenShiftVersion from '../../clusterConfiguration/OcmOpenShiftVersion';
12
12
  import { useClusterWizardContext } from '../ClusterWizardContext';
13
13
  import ClusterWizardFooter from '../ClusterWizardFooter';
@@ -15,53 +15,10 @@ import ClusterWizardNavigation from '../ClusterWizardNavigation';
15
15
  import { WithErrorBoundary } from '../../../../common/components/ErrorHandling/WithErrorBoundary';
16
16
  import InstallDisconnectedSwitch from './InstallDisconnectedSwitch';
17
17
  import { Formik } from 'formik';
18
- import ClustersService from '../../../services/ClustersService';
19
- import { handleApiError, getApiErrorMessage } from '../../../../common/api';
20
- import { useAlerts } from '../../../../common/components/AlertsContextProvider';
21
- import { AlertVariant } from '@patternfly/react-core';
22
- import { ClusterWizardFlowStateNew } from '../wizardTransition';
23
- import { useLocation, useNavigate } from 'react-router-dom-v5-compat';
24
- import { AxiosResponse } from 'axios';
25
- import { Cluster } from '@openshift-assisted/types//assisted-installer-service';
26
18
 
27
19
  const BasicStep = () => {
28
20
  const { t } = useTranslation();
29
21
  const { moveNext } = useClusterWizardContext();
30
- const { addAlert } = useAlerts();
31
- const [isSubmitting, setIsSubmitting] = React.useState(false);
32
- const navigate = useNavigate();
33
- const location = useLocation();
34
- const currentPath = location.pathname;
35
- let disconnectedClusterId: string | undefined;
36
-
37
- const onNext = async () => {
38
- try {
39
- setIsSubmitting(true);
40
- // Create cluster only - infraEnv will be created in OptionalConfigurationsStep
41
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
42
- const { data: disconnectedCluster }: AxiosResponse<Cluster> =
43
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
44
- await ClustersService.registerDisconnected({
45
- name: 'disconnected-cluster',
46
- openshiftVersion: '4.20',
47
- });
48
- disconnectedClusterId = disconnectedCluster.id;
49
- navigate(`${currentPath}/${disconnectedClusterId}`, {
50
- state: ClusterWizardFlowStateNew,
51
- });
52
- moveNext();
53
- } catch (error: unknown) {
54
- handleApiError(error, () => {
55
- addAlert({
56
- title: 'Failed to create disconnected cluster',
57
- message: getApiErrorMessage(error),
58
- variant: AlertVariant.danger,
59
- });
60
- });
61
- } finally {
62
- setIsSubmitting(false);
63
- }
64
- };
65
22
 
66
23
  return (
67
24
  <Formik
@@ -72,33 +29,26 @@ const BasicStep = () => {
72
29
  >
73
30
  <ClusterWizardStep
74
31
  navigation={<ClusterWizardNavigation />}
75
- footer={
76
- <ClusterWizardFooter
77
- onNext={() => {
78
- void onNext();
79
- }}
80
- isSubmitting={isSubmitting}
81
- disconnectedClusterId={disconnectedClusterId}
82
- />
83
- }
32
+ footer={<ClusterWizardFooter onNext={moveNext} />}
84
33
  >
85
34
  <WithErrorBoundary title="Failed to load Basic step">
86
35
  <Grid hasGutter>
87
36
  <GridItem>
88
- <Content component="h2">Basic information</Content>
37
+ <Split>
38
+ <SplitItem>
39
+ <Content component="h2">Basic information</Content>
40
+ </SplitItem>
41
+ <SplitItem>
42
+ <DeveloperPreview />
43
+ </SplitItem>
44
+ </Split>
89
45
  </GridItem>
90
46
  <GridItem>
91
- <Flex alignItems={{ default: 'alignItemsCenter' }} gap={{ default: 'gapSm' }}>
92
- <TechnologyPreview />
93
- <InstallDisconnectedSwitch />
94
- <span>
95
- {t("ai:I'm installing on a disconnected/air-gapped/secured environment")}
96
- </span>
97
- </Flex>
47
+ <InstallDisconnectedSwitch />
98
48
  </GridItem>
99
49
  <GridItem>
100
50
  <Form id="wizard-cluster-basic-info__form">
101
- <OcmOpenShiftVersion openshiftVersion="4.20" withPreviewText withMultiText>
51
+ <OcmOpenShiftVersion openshiftVersion="4.19" withPreviewText withMultiText>
102
52
  <ExternalLink href={`${window.location.origin}/${OCP_RELEASES_PAGE}`}>
103
53
  <span data-ouia-id="openshift-releases-link">
104
54
  {t('ai:Learn more about OpenShift releases')}
@@ -10,6 +10,7 @@ const InstallDisconnectedSwitch = ({ isDisabled }: { isDisabled?: boolean }) =>
10
10
  const switchBtn = (
11
11
  <Switch
12
12
  id="disconnected-install-switch"
13
+ label={t("ai:I'm installing on a disconnected/air-gapped/secured environment")}
13
14
  isChecked={installDisconnected}
14
15
  onChange={(_, checked) => setInstallDisconnected(checked)}
15
16
  ouiaId="DisconnectedInstall"
@@ -3,7 +3,7 @@ import ClusterWizardFooter from '../ClusterWizardFooter';
3
3
  import { useClusterWizardContext } from '../ClusterWizardContext';
4
4
  import {
5
5
  ClusterWizardStep,
6
- TechnologyPreview,
6
+ DeveloperPreview,
7
7
  PULL_SECRET_INFO_LINK,
8
8
  singleClusterOperators,
9
9
  } from '../../../../common';
@@ -26,18 +26,15 @@ import {
26
26
  } from '@patternfly/react-core';
27
27
  import { Formik } from 'formik';
28
28
  import { saveAs } from 'file-saver';
29
- import { useNavigate, useParams } from 'react-router-dom-v5-compat';
29
+ import { useNavigate } from 'react-router-dom-v5-compat';
30
30
 
31
31
  import { getOperatorSpecs } from '../../../../common/components/operators/operatorSpecs';
32
- import ClustersService from '../../../services/ClustersService';
33
- import { handleApiError, getApiErrorMessage } from '../../../../common/api';
34
- import { useAlerts } from '../../../../common/components/AlertsContextProvider';
35
- import { AlertVariant } from '@patternfly/react-core';
32
+
33
+ const downloadUrl =
34
+ 'https://mirror.openshift.com/pub/cgw/assisted-installer-disconnected/latest/agent-ove.x86_64.iso';
36
35
 
37
36
  const ReviewStep = () => {
38
- const { moveBack, disconnectedInfraEnv, setDisconnectedInfraEnv } = useClusterWizardContext();
39
- const { clusterId } = useParams<{ clusterId: string }>();
40
- const { addAlert } = useAlerts();
37
+ const { moveBack } = useClusterWizardContext();
41
38
  const opSpecs = getOperatorSpecs(() => undefined);
42
39
  const navigate = useNavigate();
43
40
 
@@ -53,40 +50,11 @@ const ReviewStep = () => {
53
50
  footer={
54
51
  <ClusterWizardFooter
55
52
  onNext={() => {
56
- void (async () => {
57
- if (disconnectedInfraEnv?.downloadUrl) {
58
- saveAs(disconnectedInfraEnv.downloadUrl);
59
- }
60
- if (clusterId) {
61
- try {
62
- await ClustersService.remove(clusterId);
63
- // Remove infraEnv from wizard context after successful deregistration
64
- setDisconnectedInfraEnv(undefined);
65
- // Navigate to cluster-list only after successful deregistration
66
- navigate('/cluster-list');
67
- } catch (error) {
68
- handleApiError(error, () => {
69
- addAlert({
70
- title: 'Failed to deregister cluster',
71
- message: getApiErrorMessage(error),
72
- variant: AlertVariant.danger,
73
- });
74
- });
75
- // Error handling: continue with navigation even if deregistration fails
76
- // Still clear the context to avoid stale data
77
- setDisconnectedInfraEnv(undefined);
78
- // Navigate even on error to avoid getting stuck
79
- navigate('/cluster-list');
80
- }
81
- } else {
82
- // If there's no cluster to deregister, navigate immediately
83
- navigate('/cluster-list');
84
- }
85
- })();
53
+ downloadUrl && saveAs(downloadUrl);
54
+ navigate('/cluster-list');
86
55
  }}
87
56
  onBack={moveBack}
88
57
  nextButtonText="Download ISO"
89
- disconnectedClusterId={clusterId}
90
58
  />
91
59
  }
92
60
  >
@@ -97,7 +65,7 @@ const ReviewStep = () => {
97
65
  <Content component="h2">Review and download ISO</Content>
98
66
  </SplitItem>
99
67
  <SplitItem>
100
- <TechnologyPreview />
68
+ <DeveloperPreview />
101
69
  </SplitItem>
102
70
  </Split>
103
71
  <Alert isInline variant="info" title="Discovery ISO boot instructions">
@@ -130,7 +98,7 @@ const ReviewStep = () => {
130
98
  <DescriptionList isHorizontal>
131
99
  <DescriptionListGroup>
132
100
  <DescriptionListTerm>OpenShift version</DescriptionListTerm>
133
- <DescriptionListDescription>4.20</DescriptionListDescription>
101
+ <DescriptionListDescription>4.19</DescriptionListDescription>
134
102
  </DescriptionListGroup>
135
103
  <DescriptionListGroup>
136
104
  <DescriptionListTerm>CPU architecture</DescriptionListTerm>
@@ -138,7 +106,7 @@ const ReviewStep = () => {
138
106
  </DescriptionListGroup>
139
107
  <DescriptionListGroup>
140
108
  <DescriptionListTerm>ISO size</DescriptionListTerm>
141
- <DescriptionListDescription>approx. 43.5GB</DescriptionListDescription>
109
+ <DescriptionListDescription>approx. 35GB</DescriptionListDescription>
142
110
  </DescriptionListGroup>
143
111
  </DescriptionList>
144
112
  </Grid>
@@ -2,5 +2,4 @@ export { default as ClusterDetailsForm } from './ClusterDetailsForm';
2
2
  export { default as NewClusterWizard } from './NewClusterWizard';
3
3
  export { default as ClusterWizard } from './ClusterWizard';
4
4
  export { default as ClusterWizardContextProvider } from './ClusterWizardContextProvider';
5
- export { useClusterWizardContext } from './ClusterWizardContext';
6
5
  export { OpenShiftVersionsContextProvider } from './OpenShiftVersionsContext';
@@ -31,8 +31,7 @@ export type ClusterWizardStepsType =
31
31
  | 'custom-manifests'
32
32
  | 'credentials-download'
33
33
  | 'disconnected-basic'
34
- | 'disconnected-review'
35
- | 'disconnected-optional-configurations';
34
+ | 'disconnected-review';
36
35
 
37
36
  const wizardStepsOrder: ClusterWizardStepsType[] = [
38
37
  'cluster-details',
@@ -50,7 +49,6 @@ const wizardStepsOrder: ClusterWizardStepsType[] = [
50
49
 
51
50
  export const disconnectedSteps: ClusterWizardStepsType[] = [
52
51
  'disconnected-basic',
53
- 'disconnected-optional-configurations',
54
52
  'disconnected-review',
55
53
  ];
56
54
 
@@ -262,7 +260,6 @@ const credentialsValidationMap = buildEmptyValidationsMap();
262
260
  const customManifestsValidationsMap = buildEmptyValidationsMap();
263
261
  const disconnectedReviewValidationsMap = buildEmptyValidationsMap();
264
262
  const disconnectedBasicValidationsMap = buildEmptyValidationsMap();
265
- const disconnectedOptionalConfigurationsValidationsMap = buildEmptyValidationsMap();
266
263
 
267
264
  export const wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardStepsType> = {
268
265
  'cluster-details': clusterDetailsStepValidationsMap,
@@ -278,7 +275,6 @@ export const wizardStepsValidationsMap: WizardStepsValidationMap<ClusterWizardSt
278
275
  'credentials-download': credentialsValidationMap,
279
276
  'disconnected-review': disconnectedReviewValidationsMap,
280
277
  'disconnected-basic': disconnectedBasicValidationsMap,
281
- 'disconnected-optional-configurations': disconnectedOptionalConfigurationsValidationsMap,
282
278
  };
283
279
 
284
280
  export const allClusterWizardSoftValidationIds =
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { Content, Split, SplitItem } from '@patternfly/react-core';
3
3
  import {
4
4
  ASSISTED_INSTALLER_DOCUMENTATION_LINK,
5
- TechnologyPreview,
5
+ DeveloperPreview,
6
6
  ExternalLink,
7
7
  isInOcm,
8
8
  } from '../../../common';
@@ -15,7 +15,7 @@ export const AssistedInstallerHeader = () => {
15
15
  <Content component="h1" className="pf-v6-u-display-inline">
16
16
  Install OpenShift with the Assisted Installer
17
17
  </Content>
18
- {isSingleClusterFeatureEnabled && <TechnologyPreview />}
18
+ {isSingleClusterFeatureEnabled && <DeveloperPreview />}
19
19
  <Split hasGutter>
20
20
  <SplitItem>
21
21
  <ExternalLink href={ASSISTED_INSTALLER_DOCUMENTATION_LINK}>
@@ -23,7 +23,6 @@ import {
23
23
  NewFeatureSupportLevelData,
24
24
  useNewFeatureSupportLevel,
25
25
  } from '../../../common/components/newFeatureSupportLevels';
26
- import { useFeature } from '../../hooks/use-feature';
27
26
 
28
27
  const getFeatureReviewText = (featureId: FeatureId): string => {
29
28
  switch (featureId) {
@@ -128,7 +127,6 @@ export const getSupportLevelInfo = (
128
127
  featureSupportLevelData: NewFeatureSupportLevelData,
129
128
  isSupportedOpenShiftVersion: (version?: string) => boolean,
130
129
  t: TFunction,
131
- isSingleClusterFeatureEnabled?: boolean,
132
130
  ) => {
133
131
  const limitedClusterFeatures = getLimitedFeatureSupportLevels(
134
132
  cluster,
@@ -139,10 +137,7 @@ export const getSupportLevelInfo = (
139
137
  return {
140
138
  limitedClusterFeatures,
141
139
  hasSupportedVersion,
142
- isFullySupported:
143
- hasSupportedVersion &&
144
- Object.keys(limitedClusterFeatures || {}).length === 0 &&
145
- !isSingleClusterFeatureEnabled,
140
+ isFullySupported: hasSupportedVersion && Object.keys(limitedClusterFeatures || {}).length === 0,
146
141
  };
147
142
  };
148
143
 
@@ -150,25 +145,11 @@ const SupportLevel = ({ cluster }: SupportLevelProps) => {
150
145
  const { t } = useTranslation();
151
146
  const featureSupportLevelData = useNewFeatureSupportLevel();
152
147
  const { isSupportedOpenShiftVersion } = useOpenShiftVersionsContext();
153
- const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE');
154
148
 
155
149
  const { limitedClusterFeatures, hasSupportedVersion, isFullySupported } =
156
150
  React.useMemo<SupportLevelMemo>(
157
- () =>
158
- getSupportLevelInfo(
159
- cluster,
160
- featureSupportLevelData,
161
- isSupportedOpenShiftVersion,
162
- t,
163
- isSingleClusterFeatureEnabled,
164
- ),
165
- [
166
- cluster,
167
- featureSupportLevelData,
168
- t,
169
- isSupportedOpenShiftVersion,
170
- isSingleClusterFeatureEnabled,
171
- ],
151
+ () => getSupportLevelInfo(cluster, featureSupportLevelData, isSupportedOpenShiftVersion, t),
152
+ [cluster, featureSupportLevelData, t, isSupportedOpenShiftVersion],
172
153
  );
173
154
 
174
155
  if (!limitedClusterFeatures) {
@@ -184,7 +165,7 @@ const SupportLevel = ({ cluster }: SupportLevelProps) => {
184
165
  ) : (
185
166
  <LimitedSupportedCluster
186
167
  clusterFeatureSupportLevels={limitedClusterFeatures}
187
- showVersionWarning={!hasSupportedVersion || isSingleClusterFeatureEnabled}
168
+ showVersionWarning={!hasSupportedVersion}
188
169
  />
189
170
  )
190
171
  }
@@ -171,11 +171,5 @@ const ClustersService = {
171
171
  this.getUpdateManifestParams(existingManifest, updatedManifest),
172
172
  );
173
173
  },
174
- registerDisconnected(params: { name: string; openshiftVersion: string }) {
175
- return ClustersAPI.registerDisconnected({
176
- name: params.name,
177
- openshiftVersion: params.openshiftVersion,
178
- });
179
- },
180
174
  };
181
175
  export default ClustersService;
@@ -93,6 +93,14 @@ const HostsService = {
93
93
  return HostsAPI.bindHost(host.infraEnvId, host.id, clusterId);
94
94
  },
95
95
 
96
+ unbind(host: Host) {
97
+ if (!host.infraEnvId) {
98
+ throw new Error(`Cannot unbind host ${host.id}, missing infraEnvId`);
99
+ }
100
+
101
+ return HostsAPI.unbindHost(host.infraEnvId, host.id);
102
+ },
103
+
96
104
  installAll(hosts: Host[]) {
97
105
  const promises = [];
98
106
  for (const host of hosts) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
- "@openshift-assisted/locales": "2.48.3",
4
- "@openshift-assisted/types": "2.48.3",
3
+ "@openshift-assisted/locales": "2.48.4",
4
+ "@openshift-assisted/types": "2.48.4",
5
5
  "@openshift-console/dynamic-plugin-sdk": "0.0.3",
6
6
  "@patternfly/patternfly": "6.2.3",
7
7
  "@patternfly/react-code-editor": "6.2.2",
@@ -140,5 +140,5 @@
140
140
  ]
141
141
  }
142
142
  },
143
- "version": "2.48.3"
143
+ "version": "2.48.4"
144
144
  }
@@ -1,4 +0,0 @@
1
- import * as React from 'react';
2
- declare const OptionalConfigurationsStep: () => React.JSX.Element;
3
- export default OptionalConfigurationsStep;
4
- //# sourceMappingURL=OptionalConfigurationsStep.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionalConfigurationsStep.d.ts","sourceRoot":"","sources":["../../../../../../lib/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA6C/B,QAAA,MAAM,0BAA0B,yBAyJ/B,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -1,128 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const React = tslib_1.__importStar(require("react"));
5
- const formik_1 = require("formik");
6
- const Yup = tslib_1.__importStar(require("yup"));
7
- const common_1 = require("../../../../common");
8
- const react_core_1 = require("@patternfly/react-core");
9
- const ClusterWizardContext_1 = require("../ClusterWizardContext");
10
- const ClusterWizardFooter_1 = tslib_1.__importDefault(require("../ClusterWizardFooter"));
11
- const ClusterWizardNavigation_1 = tslib_1.__importDefault(require("../ClusterWizardNavigation"));
12
- const WithErrorBoundary_1 = require("../../../../common/components/ErrorHandling/WithErrorBoundary");
13
- const UploadSSH_1 = tslib_1.__importDefault(require("../../../../common/components/clusterConfiguration/UploadSSH"));
14
- const PullSecretField_1 = tslib_1.__importDefault(require("../../../../common/components/ui/formik/PullSecretField"));
15
- const api_1 = require("../../../../common/api");
16
- const AlertsContextProvider_1 = require("../../../../common/components/AlertsContextProvider");
17
- const react_core_2 = require("@patternfly/react-core");
18
- const InfraEnvsService_1 = tslib_1.__importDefault(require("../../../services/InfraEnvsService"));
19
- const apis_1 = require("../../../services/apis");
20
- const usePullSecret_1 = tslib_1.__importDefault(require("../../../hooks/usePullSecret"));
21
- const react_router_dom_v5_compat_1 = require("react-router-dom-v5-compat");
22
- const ClustersService_1 = tslib_1.__importDefault(require("../../../services/ClustersService"));
23
- const PullSecretSync = ({ pullSecret }) => {
24
- const { setFieldValue } = (0, formik_1.useFormikContext)();
25
- React.useEffect(() => {
26
- if (pullSecret !== undefined) {
27
- setFieldValue('pullSecret', pullSecret);
28
- }
29
- }, [pullSecret, setFieldValue]);
30
- return null;
31
- };
32
- const OptionalConfigurationsStep = () => {
33
- const pullSecret = (0, usePullSecret_1.default)() || '';
34
- const { clusterId } = (0, react_router_dom_v5_compat_1.useParams)();
35
- const [cluster, setCluster] = React.useState(null);
36
- const { moveNext, moveBack, setDisconnectedInfraEnv, disconnectedInfraEnv } = (0, ClusterWizardContext_1.useClusterWizardContext)();
37
- const { addAlert } = (0, AlertsContextProvider_1.useAlerts)();
38
- const [editPullSecret, setEditPullSecret] = React.useState(false);
39
- React.useEffect(() => {
40
- const fetchCluster = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
41
- if (!clusterId) {
42
- return;
43
- }
44
- try {
45
- const fetchedCluster = yield ClustersService_1.default.get(clusterId);
46
- setCluster(fetchedCluster);
47
- }
48
- catch (error) {
49
- (0, api_1.handleApiError)(error, () => {
50
- addAlert({
51
- title: 'Failed to fetch cluster',
52
- message: (0, api_1.getApiErrorMessage)(error),
53
- variant: react_core_2.AlertVariant.danger,
54
- });
55
- });
56
- }
57
- });
58
- void fetchCluster();
59
- }, [clusterId, addAlert]);
60
- const validationSchema = React.useMemo(() => Yup.object().shape({
61
- sshPublicKey: common_1.sshPublicKeyValidationSchema,
62
- pullSecret: common_1.pullSecretValidationSchema,
63
- }), []);
64
- const initialValues = {
65
- sshPublicKey: '',
66
- pullSecret: pullSecret,
67
- };
68
- return (React.createElement(formik_1.Formik, { initialValues: initialValues, validate: (0, common_1.getRichTextValidation)(validationSchema), onSubmit: (values) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
69
- if (!cluster || !cluster.id) {
70
- addAlert({
71
- title: 'Missing cluster',
72
- message: 'Cluster must be created before configuring infrastructure environment',
73
- variant: react_core_2.AlertVariant.danger,
74
- });
75
- return;
76
- }
77
- try {
78
- // Check if infraEnv already exists
79
- if (disconnectedInfraEnv && disconnectedInfraEnv.id) {
80
- // Update existing infraEnv
81
- const updateParams = Object.assign({ pullSecret: values.pullSecret || pullSecret }, (values.sshPublicKey && { sshAuthorizedKey: values.sshPublicKey }));
82
- const { data: updatedInfraEnv } = yield apis_1.InfraEnvsAPI.update(disconnectedInfraEnv.id, updateParams);
83
- setDisconnectedInfraEnv(updatedInfraEnv);
84
- moveNext();
85
- }
86
- else {
87
- // Create infraEnv with all params
88
- const createParams = Object.assign({ name: `disconnected-cluster_infra-env`, pullSecret: values.pullSecret || pullSecret, clusterId: cluster.id, openshiftVersion: cluster.openshiftVersion, cpuArchitecture: 'x86_64' }, (values.sshPublicKey && { sshAuthorizedKey: values.sshPublicKey }));
89
- const createdInfraEnv = yield InfraEnvsService_1.default.create(createParams);
90
- setDisconnectedInfraEnv(createdInfraEnv);
91
- moveNext();
92
- }
93
- }
94
- catch (error) {
95
- (0, api_1.handleApiError)(error, () => {
96
- addAlert({
97
- title: disconnectedInfraEnv && disconnectedInfraEnv.id
98
- ? 'Failed to update infrastructure environment'
99
- : 'Failed to create infrastructure environment',
100
- message: (0, api_1.getApiErrorMessage)(error),
101
- variant: react_core_2.AlertVariant.danger,
102
- });
103
- });
104
- }
105
- }) }, ({ submitForm, isValid, errors, touched, isSubmitting }) => {
106
- const errorFields = (0, common_1.getFormikErrorFields)(errors, touched);
107
- const handleNext = () => {
108
- void submitForm(); // This will trigger onSubmit
109
- };
110
- return (React.createElement(common_1.ClusterWizardStep, { navigation: React.createElement(ClusterWizardNavigation_1.default, null), footer: React.createElement(ClusterWizardFooter_1.default, { disconnectedClusterId: clusterId, onNext: handleNext, onBack: moveBack, isNextDisabled: !isValid, errorFields: errorFields, isSubmitting: isSubmitting }) },
111
- React.createElement(WithErrorBoundary_1.WithErrorBoundary, { title: "Failed to load Optional Configurations step" },
112
- React.createElement(PullSecretSync, { pullSecret: pullSecret }),
113
- React.createElement(react_core_1.Grid, { hasGutter: true },
114
- React.createElement(react_core_1.GridItem, null,
115
- React.createElement(react_core_1.Split, null,
116
- React.createElement(react_core_1.SplitItem, null,
117
- React.createElement(react_core_1.Content, { component: "h2" }, "Optional configurations")),
118
- React.createElement(react_core_1.SplitItem, null,
119
- React.createElement(common_1.TechnologyPreview, null)))),
120
- React.createElement(react_core_1.GridItem, null,
121
- React.createElement(react_core_1.Form, { id: "wizard-cluster-optional-configurations__form" },
122
- React.createElement(UploadSSH_1.default, null),
123
- React.createElement(react_core_1.Checkbox, { label: "Edit pull secret", isChecked: editPullSecret, onChange: (_, checked) => setEditPullSecret(checked), id: "edit-pull-secret-checkbox" }),
124
- (editPullSecret || !pullSecret) && React.createElement(PullSecretField_1.default, { isOcm: api_1.isInOcm })))))));
125
- }));
126
- };
127
- exports.default = OptionalConfigurationsStep;
128
- //# sourceMappingURL=OptionalConfigurationsStep.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionalConfigurationsStep.js","sourceRoot":"","sources":["../../../../../../lib/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.tsx"],"names":[],"mappings":"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"}