@openshift-assisted/ui-lib 2.47.0 → 2.47.2
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.
- package/build/@types/common/components/clusterConfiguration/utils.d.ts +1 -3
- package/build/@types/common/components/clusterConfiguration/utils.d.ts.map +1 -1
- package/build/@types/common/components/ui/formik/validationSchemas.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterDetail/ClusterProperties.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterWizard/OperatorsBundle.d.ts.map +1 -1
- package/build/cjs/common/components/clusterConfiguration/utils.js.map +1 -1
- package/build/cjs/common/components/ui/formik/validationSchemas.js +110 -6
- package/build/cjs/common/components/ui/formik/validationSchemas.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.js +31 -0
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.js +23 -4
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.js +9 -3
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.js +22 -4
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js +27 -9
- package/build/cjs/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.js.map +1 -1
- package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js +2 -2
- package/build/cjs/ocm/components/clusterDetail/ClusterProperties.js.map +1 -1
- package/build/cjs/ocm/components/clusterWizard/OperatorsBundle.js +3 -1
- package/build/cjs/ocm/components/clusterWizard/OperatorsBundle.js.map +1 -1
- package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js +1 -1
- package/build/cjs/ocm/components/clusters/AssistedInstallerHeader.js.map +1 -1
- package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js +0 -3
- package/build/cjs/ocm/components/featureSupportLevels/featureStateUtils.js.map +1 -1
- package/lib/common/components/clusterConfiguration/utils.ts +1 -3
- package/lib/common/components/ui/formik/validationSchemas.ts +132 -16
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/AvailableSubnetsControl.tsx +29 -0
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/StackTypeControl.tsx +25 -3
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/SubnetsDropdown.tsx +20 -4
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.tsx +66 -5
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts +1 -1
- package/lib/ocm/components/clusterConfiguration/review/ReviewNetworkingTable.tsx +39 -14
- package/lib/ocm/components/clusterDetail/ClusterProperties.tsx +2 -2
- package/lib/ocm/components/clusterWizard/OperatorsBundle.tsx +3 -1
- package/lib/ocm/components/clusters/AssistedInstallerHeader.tsx +1 -1
- package/lib/ocm/components/featureSupportLevels/featureStateUtils.ts +1 -3
- package/package.json +3 -3
|
@@ -68,11 +68,12 @@ export const StackTypeControlGroup = ({
|
|
|
68
68
|
const setSingleStack = React.useCallback(() => {
|
|
69
69
|
setFieldValue('stackType', IPV4_STACK);
|
|
70
70
|
|
|
71
|
+
// Determine whether the first machine network is IPv4
|
|
72
|
+
const firstNetwork = values.machineNetworks?.[0];
|
|
73
|
+
const isFirstIPv4 = Boolean(firstNetwork?.cidr && Address4.isValid(firstNetwork.cidr));
|
|
74
|
+
|
|
71
75
|
if (values.machineNetworks && values.machineNetworks?.length >= 2) {
|
|
72
76
|
// For single-stack IPv4, prefer IPv4 machine network
|
|
73
|
-
const firstNetwork = values.machineNetworks[0];
|
|
74
|
-
const isFirstIPv4 = firstNetwork?.cidr && Address4.isValid(firstNetwork.cidr);
|
|
75
|
-
|
|
76
77
|
if (isFirstIPv4) {
|
|
77
78
|
// Keep the first network if it's IPv4
|
|
78
79
|
setFieldValue('machineNetworks', [firstNetwork]);
|
|
@@ -123,6 +124,24 @@ export const StackTypeControlGroup = ({
|
|
|
123
124
|
setFieldValue('serviceNetworks', [ipv4Service]);
|
|
124
125
|
}
|
|
125
126
|
|
|
127
|
+
// Keep only IPv4 VIPs when switching to single-stack (unless DHCP allocation is used)
|
|
128
|
+
if (!values.vipDhcpAllocation) {
|
|
129
|
+
const pruneVips = (
|
|
130
|
+
vips?: { ip?: string; clusterId?: Cluster['id'] }[],
|
|
131
|
+
): { ip: string; clusterId: Cluster['id'] }[] => {
|
|
132
|
+
if (!vips || vips.length === 0) return [];
|
|
133
|
+
// Choose which index to keep based on whether the first network is IPv4
|
|
134
|
+
const keepIndex = isFirstIPv4 ? 0 : 1;
|
|
135
|
+
const chosen = vips[keepIndex];
|
|
136
|
+
return chosen && chosen.ip
|
|
137
|
+
? [{ ip: chosen.ip, clusterId: chosen.clusterId || clusterId }]
|
|
138
|
+
: [];
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
setFieldValue('apiVips', pruneVips(values.apiVips));
|
|
142
|
+
setFieldValue('ingressVips', pruneVips(values.ingressVips));
|
|
143
|
+
}
|
|
144
|
+
|
|
126
145
|
void validateForm();
|
|
127
146
|
}, [
|
|
128
147
|
setFieldValue,
|
|
@@ -133,6 +152,9 @@ export const StackTypeControlGroup = ({
|
|
|
133
152
|
values.clusterNetworks,
|
|
134
153
|
values.machineNetworks,
|
|
135
154
|
values.serviceNetworks,
|
|
155
|
+
values.apiVips,
|
|
156
|
+
values.ingressVips,
|
|
157
|
+
values.vipDhcpAllocation,
|
|
136
158
|
]);
|
|
137
159
|
|
|
138
160
|
const setDualStack = () => {
|
|
@@ -6,9 +6,16 @@ import {
|
|
|
6
6
|
MenuToggle,
|
|
7
7
|
MenuToggleElement,
|
|
8
8
|
MenuToggleProps,
|
|
9
|
+
Divider,
|
|
9
10
|
} from '@patternfly/react-core';
|
|
10
11
|
import { useField } from 'formik';
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
getFieldId,
|
|
14
|
+
HostSubnet,
|
|
15
|
+
NO_SUBNET_SET,
|
|
16
|
+
TechnologyPreview,
|
|
17
|
+
PreviewBadgePosition,
|
|
18
|
+
} from '../../../../common';
|
|
12
19
|
import { Address4, Address6 } from 'ip-address';
|
|
13
20
|
|
|
14
21
|
type SubnetsDropdownProps = {
|
|
@@ -62,7 +69,8 @@ export const SubnetsDropdown = ({
|
|
|
62
69
|
const ipv4Subnets = machineSubnets.filter((subnet) => Address4.isValid(subnet.subnet));
|
|
63
70
|
const ipv6Subnets = machineSubnets.filter((subnet) => Address6.isValid(subnet.subnet));
|
|
64
71
|
|
|
65
|
-
let currentDisplayValue =
|
|
72
|
+
let currentDisplayValue =
|
|
73
|
+
itemsSubnets.length > 1 ? itemsSubnets[1].label : itemsSubnets[0].label; // The placeholder is the fallback in some cases
|
|
66
74
|
if (field.value) {
|
|
67
75
|
const subnetItem = itemsSubnets.find((item) => item.value === field.value);
|
|
68
76
|
if (subnetItem) {
|
|
@@ -100,7 +108,7 @@ export const SubnetsDropdown = ({
|
|
|
100
108
|
{label}
|
|
101
109
|
</DropdownItem>
|
|
102
110
|
));
|
|
103
|
-
|
|
111
|
+
ipv4Items.push(<Divider key="ipv4-divider" />);
|
|
104
112
|
const ipv6Items = toFormSelectOptions(ipv6Subnets).map(({ value, label, isDisabled }) => (
|
|
105
113
|
<DropdownItem key={value} id={value} isDisabled={isDisabled} value={value}>
|
|
106
114
|
{label}
|
|
@@ -119,7 +127,7 @@ export const SubnetsDropdown = ({
|
|
|
119
127
|
<DropdownGroup label="IPv4" key="ipv4-group">
|
|
120
128
|
{ipv4Items}
|
|
121
129
|
</DropdownGroup>,
|
|
122
|
-
<DropdownGroup label="IPv6" key="ipv6-group">
|
|
130
|
+
<DropdownGroup label="IPv6 (Technology Preview)" key="ipv6-group">
|
|
123
131
|
{ipv6Items}
|
|
124
132
|
</DropdownGroup>,
|
|
125
133
|
];
|
|
@@ -138,6 +146,9 @@ export const SubnetsDropdown = ({
|
|
|
138
146
|
setOpen(false);
|
|
139
147
|
};
|
|
140
148
|
|
|
149
|
+
const currentItem = itemsSubnets.find((i) => i.label === currentDisplayValue);
|
|
150
|
+
const showBadge = Boolean(currentItem && Address6.isValid(currentItem.value));
|
|
151
|
+
|
|
141
152
|
const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (
|
|
142
153
|
<MenuToggle
|
|
143
154
|
ref={toggleRef}
|
|
@@ -150,6 +161,11 @@ export const SubnetsDropdown = ({
|
|
|
150
161
|
{...props}
|
|
151
162
|
>
|
|
152
163
|
{currentDisplayValue}
|
|
164
|
+
{showBadge && (
|
|
165
|
+
<span onClick={(e) => e.stopPropagation()}>
|
|
166
|
+
<TechnologyPreview position={PreviewBadgePosition.inlineRight} />
|
|
167
|
+
</span>
|
|
168
|
+
)}
|
|
153
169
|
</MenuToggle>
|
|
154
170
|
);
|
|
155
171
|
|
package/lib/ocm/components/clusterConfiguration/networkConfiguration/VirtualIPControlGroup.tsx
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
NetworkConfigurationValues,
|
|
15
15
|
FormikStaticField,
|
|
16
16
|
NETWORK_TYPE_SDN,
|
|
17
|
+
DUAL_STACK,
|
|
17
18
|
selectMachineNetworkCIDR,
|
|
18
19
|
getVipValidationsById,
|
|
19
20
|
PopoverIcon,
|
|
@@ -24,7 +25,12 @@ import { selectCurrentClusterPermissionsState } from '../../../store/slices/curr
|
|
|
24
25
|
import { OcmCheckboxField, OcmInputField } from '../../ui/OcmFormFields';
|
|
25
26
|
import { useTranslation } from '../../../../common/hooks/use-translation-wrapper';
|
|
26
27
|
import NewFeatureSupportLevelBadge from '../../../../common/components/newFeatureSupportLevels/NewFeatureSupportLevelBadge';
|
|
27
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
ApiVip,
|
|
30
|
+
Cluster,
|
|
31
|
+
Ip,
|
|
32
|
+
SupportLevel,
|
|
33
|
+
} from '@openshift-assisted/types/assisted-installer-service';
|
|
28
34
|
|
|
29
35
|
interface VipStaticValueProps {
|
|
30
36
|
id?: string;
|
|
@@ -96,6 +102,7 @@ export const VirtualIPControlGroup = ({
|
|
|
96
102
|
);
|
|
97
103
|
|
|
98
104
|
const enableAllocation = values.networkType === NETWORK_TYPE_SDN;
|
|
105
|
+
const isDualStack = values.stackType === DUAL_STACK;
|
|
99
106
|
|
|
100
107
|
React.useEffect(() => {
|
|
101
108
|
if (!isViewerMode && !enableAllocation) {
|
|
@@ -112,8 +119,20 @@ export const VirtualIPControlGroup = ({
|
|
|
112
119
|
[cluster.apiVips, cluster.ingressVips, setFieldValue],
|
|
113
120
|
);
|
|
114
121
|
|
|
115
|
-
const
|
|
116
|
-
|
|
122
|
+
const setVipValueAtIndex = (
|
|
123
|
+
field: 'apiVips' | 'ingressVips',
|
|
124
|
+
index: number,
|
|
125
|
+
e: React.ChangeEvent<HTMLInputElement>,
|
|
126
|
+
) => {
|
|
127
|
+
const fieldArray: ApiVip[] =
|
|
128
|
+
field === 'apiVips' ? values.apiVips || [] : values.ingressVips || [];
|
|
129
|
+
const next: ApiVip[] = Array.isArray(fieldArray) ? [...fieldArray] : [];
|
|
130
|
+
// Ensure array has the desired length
|
|
131
|
+
while (next.length <= index) {
|
|
132
|
+
next.push({ ip: '', clusterId: cluster.id });
|
|
133
|
+
}
|
|
134
|
+
next[index] = { ip: e.target.value, clusterId: cluster.id };
|
|
135
|
+
setFieldValue(field, next, true);
|
|
117
136
|
};
|
|
118
137
|
|
|
119
138
|
return (
|
|
@@ -194,11 +213,30 @@ export const VirtualIPControlGroup = ({
|
|
|
194
213
|
name="apiVips.0.ip"
|
|
195
214
|
helperText={ipHelperText}
|
|
196
215
|
isRequired
|
|
216
|
+
labelInfo={isDualStack ? 'Primary' : undefined}
|
|
197
217
|
onChange={(e) =>
|
|
198
|
-
|
|
218
|
+
setVipValueAtIndex('apiVips', 0, e as React.ChangeEvent<HTMLInputElement>)
|
|
199
219
|
}
|
|
200
220
|
/>
|
|
201
221
|
</StackItem>
|
|
222
|
+
{isDualStack && (
|
|
223
|
+
<StackItem>
|
|
224
|
+
<OcmInputField
|
|
225
|
+
label={
|
|
226
|
+
<>
|
|
227
|
+
<span>API IP</span> <PopoverIcon bodyContent={ipPopoverContent} />
|
|
228
|
+
</>
|
|
229
|
+
}
|
|
230
|
+
name="apiVips.1.ip"
|
|
231
|
+
helperText={ipHelperText}
|
|
232
|
+
isRequired
|
|
233
|
+
labelInfo={'Secondary'}
|
|
234
|
+
onChange={(e) =>
|
|
235
|
+
setVipValueAtIndex('apiVips', 1, e as React.ChangeEvent<HTMLInputElement>)
|
|
236
|
+
}
|
|
237
|
+
/>
|
|
238
|
+
</StackItem>
|
|
239
|
+
)}
|
|
202
240
|
<StackItem>
|
|
203
241
|
<OcmInputField
|
|
204
242
|
name="ingressVips.0.ip"
|
|
@@ -209,11 +247,34 @@ export const VirtualIPControlGroup = ({
|
|
|
209
247
|
}
|
|
210
248
|
helperText={ipHelperText}
|
|
211
249
|
isRequired
|
|
250
|
+
labelInfo={isDualStack ? 'Primary' : undefined}
|
|
212
251
|
onChange={(e) =>
|
|
213
|
-
|
|
252
|
+
setVipValueAtIndex('ingressVips', 0, e as React.ChangeEvent<HTMLInputElement>)
|
|
214
253
|
}
|
|
215
254
|
/>
|
|
216
255
|
</StackItem>
|
|
256
|
+
{isDualStack && (
|
|
257
|
+
<StackItem>
|
|
258
|
+
<OcmInputField
|
|
259
|
+
name="ingressVips.1.ip"
|
|
260
|
+
label={
|
|
261
|
+
<>
|
|
262
|
+
<span>Ingress IP</span> <PopoverIcon bodyContent={ipPopoverContent} />
|
|
263
|
+
</>
|
|
264
|
+
}
|
|
265
|
+
helperText={ipHelperText}
|
|
266
|
+
isRequired
|
|
267
|
+
labelInfo={'Secondary'}
|
|
268
|
+
onChange={(e) =>
|
|
269
|
+
setVipValueAtIndex(
|
|
270
|
+
'ingressVips',
|
|
271
|
+
1,
|
|
272
|
+
e as React.ChangeEvent<HTMLInputElement>,
|
|
273
|
+
)
|
|
274
|
+
}
|
|
275
|
+
/>
|
|
276
|
+
</StackItem>
|
|
277
|
+
)}
|
|
217
278
|
</Stack>
|
|
218
279
|
)}
|
|
219
280
|
</FieldArray>
|
|
@@ -34,7 +34,7 @@ export const getNetworkInitialValues = (
|
|
|
34
34
|
isClusterManagedNetworkingUnsupported: boolean,
|
|
35
35
|
): NetworkConfigurationValues => {
|
|
36
36
|
const isSNOCluster = isSNO(cluster);
|
|
37
|
-
const isDualStackType = isDualStack(
|
|
37
|
+
const isDualStackType = isDualStack(cluster);
|
|
38
38
|
|
|
39
39
|
return {
|
|
40
40
|
apiVips: cluster.apiVips,
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { Title } from '@patternfly/react-core';
|
|
2
2
|
import { Table, TableVariant, Tbody, Td, Tr } from '@patternfly/react-table';
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
genericTableRowKey,
|
|
6
|
-
isDualStack,
|
|
7
|
-
selectApiVip,
|
|
8
|
-
selectIngressVip,
|
|
9
|
-
} from '../../../../common';
|
|
4
|
+
import { genericTableRowKey, isDualStack } from '../../../../common';
|
|
10
5
|
import {
|
|
11
6
|
getManagementType,
|
|
12
7
|
getStackTypeLabel,
|
|
@@ -58,7 +53,7 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
58
53
|
)),
|
|
59
54
|
props: { 'data-testid': 'machine-networks' },
|
|
60
55
|
},
|
|
61
|
-
isDualStack(
|
|
56
|
+
isDualStack(cluster)
|
|
62
57
|
? {
|
|
63
58
|
title: cluster.machineNetworks?.map((network, index) => (
|
|
64
59
|
<span key={network.cidr}>
|
|
@@ -78,9 +73,24 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
78
73
|
cells: [
|
|
79
74
|
{ title: 'API IP' },
|
|
80
75
|
{
|
|
81
|
-
title:
|
|
82
|
-
|
|
76
|
+
title: cluster.apiVips?.map((apiVip) => (
|
|
77
|
+
<span key={apiVip.ip}>
|
|
78
|
+
{apiVip.ip}
|
|
79
|
+
<br />
|
|
80
|
+
</span>
|
|
81
|
+
)),
|
|
82
|
+
props: { 'data-testid': 'api-vip' },
|
|
83
83
|
},
|
|
84
|
+
isDualStack(cluster)
|
|
85
|
+
? {
|
|
86
|
+
title: cluster.apiVips?.map((apiVip, index) => (
|
|
87
|
+
<span key={apiVip.ip}>
|
|
88
|
+
{index === 0 ? 'Primary' : 'Secondary'}
|
|
89
|
+
<br />
|
|
90
|
+
</span>
|
|
91
|
+
)),
|
|
92
|
+
}
|
|
93
|
+
: { title: '' },
|
|
84
94
|
],
|
|
85
95
|
});
|
|
86
96
|
|
|
@@ -91,9 +101,24 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
91
101
|
cells: [
|
|
92
102
|
{ title: 'Ingress IP' },
|
|
93
103
|
{
|
|
94
|
-
title:
|
|
95
|
-
|
|
104
|
+
title: cluster.ingressVips?.map((ingressVip) => (
|
|
105
|
+
<span key={ingressVip.ip}>
|
|
106
|
+
{ingressVip.ip}
|
|
107
|
+
<br />
|
|
108
|
+
</span>
|
|
109
|
+
)),
|
|
110
|
+
props: { 'data-testid': 'ingress-vip' },
|
|
96
111
|
},
|
|
112
|
+
isDualStack(cluster)
|
|
113
|
+
? {
|
|
114
|
+
title: cluster.ingressVips?.map((ingressVip, index) => (
|
|
115
|
+
<span key={ingressVip.ip}>
|
|
116
|
+
{index === 0 ? 'Primary' : 'Secondary'}
|
|
117
|
+
<br />
|
|
118
|
+
</span>
|
|
119
|
+
)),
|
|
120
|
+
}
|
|
121
|
+
: { title: '' },
|
|
97
122
|
],
|
|
98
123
|
});
|
|
99
124
|
|
|
@@ -115,7 +140,7 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
115
140
|
)),
|
|
116
141
|
props: { 'data-testid': 'cluster-network-cidr' },
|
|
117
142
|
},
|
|
118
|
-
isDualStack(
|
|
143
|
+
isDualStack(cluster) && {
|
|
119
144
|
title: cluster.clusterNetworks?.map((network, index) => (
|
|
120
145
|
<span key={network.cidr}>
|
|
121
146
|
{index === 0 ? 'Primary' : 'Secondary'}
|
|
@@ -138,7 +163,7 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
138
163
|
)),
|
|
139
164
|
props: { 'data-testid': 'cluster-network-prefix' },
|
|
140
165
|
},
|
|
141
|
-
isDualStack(
|
|
166
|
+
isDualStack(cluster) && {
|
|
142
167
|
title: cluster.clusterNetworks?.map((network, index) => (
|
|
143
168
|
<span key={network.hostPrefix}>
|
|
144
169
|
{index === 0 ? 'Primary' : 'Secondary'}
|
|
@@ -161,7 +186,7 @@ export const ReviewNetworkingTable = ({ cluster }: { cluster: Cluster }) => {
|
|
|
161
186
|
)),
|
|
162
187
|
props: { 'data-testid': 'service-network-cidr' },
|
|
163
188
|
},
|
|
164
|
-
isDualStack(
|
|
189
|
+
isDualStack(cluster) && {
|
|
165
190
|
title: cluster.serviceNetworks?.map((network, index) => (
|
|
166
191
|
<span key={network.cidr}>
|
|
167
192
|
{index === 0 ? 'Primary' : 'Secondary'}
|
|
@@ -41,7 +41,7 @@ export const getManagementType = ({ userManagedNetworking }: Cluster): string =>
|
|
|
41
41
|
};
|
|
42
42
|
|
|
43
43
|
export const getStackTypeLabel = (cluster: Cluster): string =>
|
|
44
|
-
isDualStack(
|
|
44
|
+
isDualStack(cluster) ? 'Dual-stack' : 'IPv4';
|
|
45
45
|
|
|
46
46
|
export const getDiskEncryptionEnabledOnStatus = (diskEncryption: DiskEncryption['enableOn']) => {
|
|
47
47
|
let diskEncryptionType = null;
|
|
@@ -67,7 +67,7 @@ export const getDiskEncryptionEnabledOnStatus = (diskEncryption: DiskEncryption[
|
|
|
67
67
|
|
|
68
68
|
const ClusterProperties = ({ cluster, externalMode = false }: ClusterPropertiesProps) => {
|
|
69
69
|
const { t } = useTranslation();
|
|
70
|
-
const isDualStackType = isDualStack(
|
|
70
|
+
const isDualStackType = isDualStack(cluster);
|
|
71
71
|
const featureSupportLevelContext = useNewFeatureSupportLevel();
|
|
72
72
|
|
|
73
73
|
const activeFeatureConfiguration = featureSupportLevelContext.activeFeatureConfiguration;
|
|
@@ -106,7 +106,9 @@ const BundleCard = ({
|
|
|
106
106
|
const disabledReason = hasUnsupportedOperators
|
|
107
107
|
? 'Some operators in this bundle are not supported with the current configuration.'
|
|
108
108
|
: isSNO && bundleSpec?.noSNO
|
|
109
|
-
?
|
|
109
|
+
? bundle.id === 'openshift-ai'
|
|
110
|
+
? 'This bundle is not available when deploying a Single Node OpenShift, but you can use the standalone operator instead.'
|
|
111
|
+
: 'This bundle is not available when deploying a Single Node OpenShift.'
|
|
110
112
|
: incompatibleBundle
|
|
111
113
|
? `Bundle cannot be installed together with ${
|
|
112
114
|
bundles.find(({ id }) => id === incompatibleBundle)?.title || incompatibleBundle
|
|
@@ -24,7 +24,7 @@ export const AssistedInstallerHeader = () => {
|
|
|
24
24
|
</SplitItem>
|
|
25
25
|
{isInOcm && (
|
|
26
26
|
<SplitItem>
|
|
27
|
-
<Content component="a" data-testid="whats-new-link">
|
|
27
|
+
<Content component="a" data-testid="whats-new-link" hidden={true}>
|
|
28
28
|
What's new in Assisted Installer?
|
|
29
29
|
</Content>
|
|
30
30
|
</SplitItem>
|
|
@@ -294,9 +294,7 @@ const getOpenShiftAIDisabledReason = (
|
|
|
294
294
|
if (isArm) {
|
|
295
295
|
return `${operatorTitle} is not available when ARM CPU architecture is selected.`;
|
|
296
296
|
}
|
|
297
|
-
|
|
298
|
-
return `${operatorTitle} is not available when deploying a Single Node OpenShift.`;
|
|
299
|
-
}
|
|
297
|
+
|
|
300
298
|
if (!isSupported) {
|
|
301
299
|
return `The installer cannot currently enable ${operatorTitle} with the selected OpenShift version, but it can be enabled later through the OpenShift Console once the installation is complete.`;
|
|
302
300
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
-
"@openshift-assisted/locales": "2.47.
|
|
4
|
-
"@openshift-assisted/types": "2.47.
|
|
3
|
+
"@openshift-assisted/locales": "2.47.2",
|
|
4
|
+
"@openshift-assisted/types": "2.47.2",
|
|
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.47.
|
|
143
|
+
"version": "2.47.2"
|
|
144
144
|
}
|