@openshift-assisted/ui-lib 2.17.4-cim → 2.17.7-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.
- package/build/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts +1 -1
- package/build/@types/cim/components/ClusterDeployment/NetworkConfiguration.d.ts.map +1 -1
- package/build/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts +1 -1
- package/build/@types/cim/components/ClusterDeployment/networkConfigurationValidation.d.ts.map +1 -1
- package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts +4 -4
- package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts.map +1 -1
- package/build/@types/cim/components/helpers/clusterDeployment.d.ts.map +1 -1
- package/build/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts +2 -1
- package/build/@types/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.d.ts.map +1 -1
- package/build/@types/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.d.ts +2 -1
- package/build/@types/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.d.ts.map +1 -1
- package/build/@types/common/components/ui/OpenShiftVersionDropdown.d.ts.map +1 -1
- package/build/@types/common/components/ui/formik/utils.d.ts +1 -0
- package/build/@types/common/components/ui/formik/utils.d.ts.map +1 -1
- package/build/@types/common/components/ui/utils.d.ts +3 -0
- package/build/@types/common/components/ui/utils.d.ts.map +1 -1
- package/build/@types/common/config/constants.d.ts +2 -2
- package/build/@types/common/config/constants.d.ts.map +1 -1
- package/build/@types/common/validationSchemas/networkingValidation.d.ts +10 -0
- package/build/@types/common/validationSchemas/networkingValidation.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/NetworkConfiguration.js +44 -5
- package/build/cjs/cim/components/ClusterDeployment/NetworkConfiguration.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/networkConfigurationValidation.js +27 -11
- package/build/cjs/cim/components/ClusterDeployment/networkConfigurationValidation.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js +13 -18
- package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js.map +1 -1
- package/build/cjs/cim/components/helpers/clusterDeployment.js +14 -10
- package/build/cjs/cim/components/helpers/clusterDeployment.js.map +1 -1
- package/build/cjs/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js +8 -2
- package/build/cjs/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.js.map +1 -1
- package/build/cjs/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.js +29 -19
- package/build/cjs/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.js.map +1 -1
- package/build/cjs/common/components/ui/OpenShiftVersionDropdown.js +13 -16
- package/build/cjs/common/components/ui/OpenShiftVersionDropdown.js.map +1 -1
- package/build/cjs/common/components/ui/formik/utils.js +5 -1
- package/build/cjs/common/components/ui/formik/utils.js.map +1 -1
- package/build/cjs/common/components/ui/utils.js +5 -1
- package/build/cjs/common/components/ui/utils.js.map +1 -1
- package/build/cjs/common/config/constants.js +9 -2
- package/build/cjs/common/config/constants.js.map +1 -1
- package/build/cjs/common/validationSchemas/networkingValidation.js +19 -1
- package/build/cjs/common/validationSchemas/networkingValidation.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js +4 -4
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js.map +1 -1
- package/lib/cim/components/ClusterDeployment/NetworkConfiguration.tsx +51 -3
- package/lib/cim/components/ClusterDeployment/networkConfigurationValidation.ts +22 -8
- package/lib/cim/components/ClusterDeployment/use-networking-formik.ts +14 -22
- package/lib/cim/components/helpers/clusterDeployment.ts +9 -4
- package/lib/common/components/clusterWizard/networkingSteps/AvailableSubnetsControl.tsx +8 -1
- package/lib/common/components/clusterWizard/networkingSteps/StackTypeControlGroup.tsx +37 -27
- package/lib/common/components/ui/OpenShiftVersionDropdown.tsx +20 -28
- package/lib/common/components/ui/formik/utils.ts +6 -0
- package/lib/common/components/ui/utils.ts +7 -0
- package/lib/common/config/constants.ts +10 -1
- package/lib/common/validationSchemas/networkingValidation.tsx +39 -1
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx +2 -2
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts +6 -5
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkConfigurationValidation.js","sourceRoot":"","sources":["../../../../../../lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts"],"names":[],"mappings":";;;;AAAA,iDAA2B;AAE3B,+CAe4B;AAQrB,MAAM,uBAAuB,GAAG,CACrC,OAAgB,EAChB,oBAMC,EACD,qCAA8C,EAClB,EAAE;;IAC9B,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,CAAC;IAE7C,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,qBAAqB,EACnB,CAAA,MAAA,OAAO,CAAC,QAAQ,0CAAE,IAAI,MAAK,MAAM;YACjC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,qCAAqC,CAAC;YAC1F,YAAY;YACV,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,gBAAgB;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,yBAAgB;QACpD,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;QAC9C,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,mBAAU,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"networkConfigurationValidation.js","sourceRoot":"","sources":["../../../../../../lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useCallback } from 'react';
|
|
2
2
|
import { useFormikContext } from 'formik';
|
|
3
|
+
import isCIDR from 'is-cidr';
|
|
3
4
|
import { Checkbox, Grid } from '@patternfly/react-core';
|
|
4
5
|
import { NetworkConfigurationValues } from '../../../common/types/clusters';
|
|
5
6
|
import {
|
|
@@ -27,8 +28,10 @@ export type NetworkConfigurationProps = VirtualIPControlGroupProps & {
|
|
|
27
28
|
defaultNetworkSettings: Pick<
|
|
28
29
|
ClusterDefaultConfig,
|
|
29
30
|
| 'clusterNetworksIpv4'
|
|
31
|
+
| 'clusterNetworksIpv6'
|
|
30
32
|
| 'clusterNetworksDualstack'
|
|
31
33
|
| 'serviceNetworksIpv4'
|
|
34
|
+
| 'serviceNetworksIpv6'
|
|
32
35
|
| 'serviceNetworksDualstack'
|
|
33
36
|
>;
|
|
34
37
|
hideManagedNetworking?: boolean;
|
|
@@ -63,11 +66,23 @@ const NetworkConfiguration = ({
|
|
|
63
66
|
setAdvanced(checked);
|
|
64
67
|
|
|
65
68
|
if (!checked) {
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
const primaryCidr = values.machineNetworks?.[0]?.cidr;
|
|
70
|
+
const useIPv6Defaults = primaryCidr && isCIDR.v6(primaryCidr);
|
|
71
|
+
setFieldValue(
|
|
72
|
+
'clusterNetworks',
|
|
73
|
+
useIPv6Defaults
|
|
74
|
+
? defaultNetworkSettings.clusterNetworksIpv6
|
|
75
|
+
: defaultNetworkSettings.clusterNetworksIpv4,
|
|
76
|
+
);
|
|
77
|
+
setFieldValue(
|
|
78
|
+
'serviceNetworks',
|
|
79
|
+
useIPv6Defaults
|
|
80
|
+
? defaultNetworkSettings.serviceNetworksIpv6
|
|
81
|
+
: defaultNetworkSettings.serviceNetworksIpv4,
|
|
82
|
+
);
|
|
68
83
|
}
|
|
69
84
|
},
|
|
70
|
-
[setFieldValue, defaultNetworkSettings],
|
|
85
|
+
[setFieldValue, defaultNetworkSettings, values.machineNetworks],
|
|
71
86
|
);
|
|
72
87
|
|
|
73
88
|
// Auto-enable advanced networking when switching to dual-stack
|
|
@@ -77,6 +92,37 @@ const NetworkConfiguration = ({
|
|
|
77
92
|
}
|
|
78
93
|
}, [isDualStack, toggleAdvConfiguration]);
|
|
79
94
|
|
|
95
|
+
// Sync cluster/service networks to match primary machine network family when single-stack (fix mismatch)
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (isDualStack) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const primaryCidr = values.machineNetworks?.[0]?.cidr;
|
|
101
|
+
const firstClusterCidr = values.clusterNetworks?.[0]?.cidr;
|
|
102
|
+
if (!primaryCidr || !firstClusterCidr) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const primaryIsIPv6 = isCIDR.v6(primaryCidr);
|
|
106
|
+
const primaryIsIPv4 = isCIDR.v4(primaryCidr);
|
|
107
|
+
const clusterIsIPv6 = isCIDR.v6(firstClusterCidr);
|
|
108
|
+
const clusterIsIPv4 = isCIDR.v4(firstClusterCidr);
|
|
109
|
+
|
|
110
|
+
if (primaryIsIPv4 && clusterIsIPv6) {
|
|
111
|
+
setFieldValue('clusterNetworks', defaultNetworkSettings.clusterNetworksIpv4);
|
|
112
|
+
setFieldValue('serviceNetworks', defaultNetworkSettings.serviceNetworksIpv4);
|
|
113
|
+
} else if (primaryIsIPv6 && clusterIsIPv4) {
|
|
114
|
+
setFieldValue('clusterNetworks', defaultNetworkSettings.clusterNetworksIpv6);
|
|
115
|
+
setFieldValue('serviceNetworks', defaultNetworkSettings.serviceNetworksIpv6);
|
|
116
|
+
}
|
|
117
|
+
}, [
|
|
118
|
+
isDualStack,
|
|
119
|
+
values.machineNetworks,
|
|
120
|
+
values.clusterNetworks,
|
|
121
|
+
values.serviceNetworks,
|
|
122
|
+
setFieldValue,
|
|
123
|
+
defaultNetworkSettings,
|
|
124
|
+
]);
|
|
125
|
+
|
|
80
126
|
const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';
|
|
81
127
|
const primaryMachineNetwork = values.machineNetworks?.[0]?.cidr;
|
|
82
128
|
|
|
@@ -134,6 +180,7 @@ const NetworkConfiguration = ({
|
|
|
134
180
|
isDualStackSelectable={isDualStackSelectable}
|
|
135
181
|
hostSubnets={hostSubnets}
|
|
136
182
|
defaultNetworkValues={defaultNetworkSettings}
|
|
183
|
+
allowSingleStackIPv6
|
|
137
184
|
/>
|
|
138
185
|
)}
|
|
139
186
|
|
|
@@ -148,6 +195,7 @@ const NetworkConfiguration = ({
|
|
|
148
195
|
openshiftVersion={cluster.openshiftVersion}
|
|
149
196
|
hosts={cluster.hosts || []}
|
|
150
197
|
isMultiNodeCluster={isMultiNodeCluster}
|
|
198
|
+
allowSingleStackIPv6
|
|
151
199
|
/>
|
|
152
200
|
)}
|
|
153
201
|
|
|
@@ -1,36 +1,50 @@
|
|
|
1
|
+
import isCIDR from 'is-cidr';
|
|
1
2
|
import {
|
|
2
3
|
Cluster,
|
|
3
4
|
ClusterDefaultConfig,
|
|
4
5
|
} from '@openshift-assisted/types/assisted-installer-service';
|
|
5
6
|
import { NetworkConfigurationValues } from '../../../common/types/clusters';
|
|
6
7
|
import { isDualStack } from '../../../common/components/clusterConfiguration/utils';
|
|
7
|
-
import { DUAL_STACK,
|
|
8
|
+
import { DUAL_STACK, NETWORK_TYPE_OVN, SINGLE_STACK } from '../../../common';
|
|
8
9
|
|
|
9
10
|
export const getNetworkInitialValues = (
|
|
10
11
|
cluster: Cluster,
|
|
11
12
|
defaultNetworkSettings: Pick<
|
|
12
13
|
ClusterDefaultConfig,
|
|
13
14
|
| 'clusterNetworksIpv4'
|
|
15
|
+
| 'clusterNetworksIpv6'
|
|
14
16
|
| 'clusterNetworksDualstack'
|
|
15
17
|
| 'serviceNetworksIpv4'
|
|
18
|
+
| 'serviceNetworksIpv6'
|
|
16
19
|
| 'serviceNetworksDualstack'
|
|
17
20
|
>,
|
|
18
21
|
): NetworkConfigurationValues => {
|
|
19
22
|
const managedNetworkingType = cluster.userManagedNetworking ? 'userManaged' : 'clusterManaged';
|
|
20
23
|
const isDualStackCluster = isDualStack(cluster);
|
|
24
|
+
const primaryMachineCidr = cluster.machineNetworks?.[0]?.cidr;
|
|
25
|
+
const isSingleStackIPv6 =
|
|
26
|
+
!isDualStackCluster && primaryMachineCidr && isCIDR.v6(primaryMachineCidr);
|
|
21
27
|
|
|
22
28
|
let clusterNetworks = cluster.clusterNetworks;
|
|
23
29
|
if (!cluster.clusterNetworks?.length) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
if (isDualStackCluster) {
|
|
31
|
+
clusterNetworks = defaultNetworkSettings.clusterNetworksDualstack;
|
|
32
|
+
} else if (isSingleStackIPv6) {
|
|
33
|
+
clusterNetworks = defaultNetworkSettings.clusterNetworksIpv6;
|
|
34
|
+
} else {
|
|
35
|
+
clusterNetworks = defaultNetworkSettings.clusterNetworksIpv4;
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
let serviceNetworks = cluster.serviceNetworks;
|
|
30
40
|
if (!serviceNetworks?.length) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
41
|
+
if (isDualStackCluster) {
|
|
42
|
+
serviceNetworks = defaultNetworkSettings.serviceNetworksDualstack;
|
|
43
|
+
} else if (isSingleStackIPv6) {
|
|
44
|
+
serviceNetworks = defaultNetworkSettings.serviceNetworksIpv6;
|
|
45
|
+
} else {
|
|
46
|
+
serviceNetworks = defaultNetworkSettings.serviceNetworksIpv4;
|
|
47
|
+
}
|
|
34
48
|
}
|
|
35
49
|
|
|
36
50
|
const machineNetworks = cluster.machineNetworks || [];
|
|
@@ -45,6 +59,6 @@ export const getNetworkInitialValues = (
|
|
|
45
59
|
vipDhcpAllocation: cluster.vipDhcpAllocation,
|
|
46
60
|
managedNetworkingType,
|
|
47
61
|
networkType: cluster.networkType || NETWORK_TYPE_OVN,
|
|
48
|
-
stackType: isDualStackCluster ? DUAL_STACK :
|
|
62
|
+
stackType: isDualStackCluster ? DUAL_STACK : SINGLE_STACK,
|
|
49
63
|
};
|
|
50
64
|
};
|
|
@@ -20,12 +20,8 @@ import {
|
|
|
20
20
|
httpProxyValidationSchema,
|
|
21
21
|
noProxyValidationSchema,
|
|
22
22
|
CLUSTER_DEFAULT_NETWORK_SETTINGS,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
dualStackValidationSchema,
|
|
26
|
-
IPv4ValidationSchema,
|
|
27
|
-
IPV4_STACK,
|
|
28
|
-
NetworkConfigurationValues,
|
|
23
|
+
clusterNetworksSchema,
|
|
24
|
+
serviceNetworksSchema,
|
|
29
25
|
} from '../../../common';
|
|
30
26
|
import { ClusterDeploymentNetworkingValues } from './types';
|
|
31
27
|
import { useTranslation } from '../../../common/hooks/use-translation-wrapper';
|
|
@@ -53,22 +49,18 @@ const getNetworkConfigurationValidationSchema = (
|
|
|
53
49
|
) =>
|
|
54
50
|
Yup.lazy((values: ClusterDeploymentNetworkingValues) =>
|
|
55
51
|
Yup.object<ClusterDeploymentNetworkingValues>().shape({
|
|
56
|
-
clusterNetworks:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
serviceNetworkValidationSchema(t).concat(
|
|
69
|
-
dualStackValidationSchema(t('ai:service network'), t, openshiftVersion),
|
|
70
|
-
),
|
|
71
|
-
}),
|
|
52
|
+
clusterNetworks: clusterNetworksSchema(
|
|
53
|
+
t,
|
|
54
|
+
values.stackType ?? '',
|
|
55
|
+
values.machineNetworks?.[0]?.cidr,
|
|
56
|
+
openshiftVersion,
|
|
57
|
+
),
|
|
58
|
+
serviceNetworks: serviceNetworksSchema(
|
|
59
|
+
t,
|
|
60
|
+
values.stackType ?? '',
|
|
61
|
+
values.machineNetworks?.[0]?.cidr,
|
|
62
|
+
openshiftVersion,
|
|
63
|
+
),
|
|
72
64
|
apiVips: vipArrayValidationSchema(hostSubnets, values, t),
|
|
73
65
|
ingressVips: vipArrayValidationSchema(hostSubnets, values, t),
|
|
74
66
|
sshPublicKey: sshPublicKeyListValidationSchema(t),
|
|
@@ -172,6 +172,11 @@ export const getClusterProperties = (
|
|
|
172
172
|
const serviceNetworks = agentClusterInstall.spec?.networking?.serviceNetwork;
|
|
173
173
|
const clusterNetworks = agentClusterInstall.spec?.networking?.clusterNetwork;
|
|
174
174
|
|
|
175
|
+
const apiIPs = agentClusterInstall.spec?.apiVIPs || [agentClusterInstall.spec?.apiVIP];
|
|
176
|
+
const ingressIPs = agentClusterInstall.spec?.ingressVIPs || [
|
|
177
|
+
agentClusterInstall.spec?.ingressVIP,
|
|
178
|
+
];
|
|
179
|
+
|
|
175
180
|
return {
|
|
176
181
|
// TODO: we should translate following keys since they are used "as it is" in AcmDescriptionList.tsx / List component of the stolostron project
|
|
177
182
|
name: {
|
|
@@ -191,12 +196,12 @@ export const getClusterProperties = (
|
|
|
191
196
|
value: clusterDeployment.spec?.baseDomain,
|
|
192
197
|
},
|
|
193
198
|
apiVip: {
|
|
194
|
-
key: 'API IP',
|
|
195
|
-
value:
|
|
199
|
+
key: apiIPs.length > 1 ? 'API IPs' : 'API IP',
|
|
200
|
+
value: apiIPs.join(', '),
|
|
196
201
|
},
|
|
197
202
|
ingressVip: {
|
|
198
|
-
key: 'Ingress IP',
|
|
199
|
-
value:
|
|
203
|
+
key: ingressIPs.length > 1 ? 'Ingress IPs' : 'Ingress IP',
|
|
204
|
+
value: ingressIPs.join(', '),
|
|
200
205
|
},
|
|
201
206
|
clusterNetworkCidr: {
|
|
202
207
|
key: (clusterNetworks?.length || 0) > 1 ? 'Cluster network CIDRs' : 'Cluster network CIDR',
|
|
@@ -59,6 +59,7 @@ export interface AvailableSubnetsControlProps {
|
|
|
59
59
|
isViewerMode?: boolean;
|
|
60
60
|
hosts?: Host[];
|
|
61
61
|
isMultiNodeCluster?: boolean;
|
|
62
|
+
allowSingleStackIPv6?: boolean;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
export const AvailableSubnetsControl = ({
|
|
@@ -70,6 +71,7 @@ export const AvailableSubnetsControl = ({
|
|
|
70
71
|
isViewerMode = false,
|
|
71
72
|
hosts,
|
|
72
73
|
isMultiNodeCluster = true,
|
|
74
|
+
allowSingleStackIPv6 = false,
|
|
73
75
|
}: AvailableSubnetsControlProps) => {
|
|
74
76
|
const { t } = useTranslation();
|
|
75
77
|
const { values, errors, setFieldValue } = useFormikContext<NetworkConfigurationValues>();
|
|
@@ -207,7 +209,12 @@ export const AvailableSubnetsControl = ({
|
|
|
207
209
|
isDualStack && values.machineNetworks && values.machineNetworks.length > 1;
|
|
208
210
|
|
|
209
211
|
// Determine available subnets for primary dropdown
|
|
210
|
-
|
|
212
|
+
let primaryMachineSubnets: HostSubnet[];
|
|
213
|
+
if ((isDualStack && supportsIPv6Primary) || (!isDualStack && allowSingleStackIPv6)) {
|
|
214
|
+
primaryMachineSubnets = allSubnets;
|
|
215
|
+
} else {
|
|
216
|
+
primaryMachineSubnets = IPv4Subnets;
|
|
217
|
+
}
|
|
211
218
|
|
|
212
219
|
// Determine available subnets for secondary dropdown
|
|
213
220
|
const secondaryMachineSubnets = React.useMemo(() => {
|
|
@@ -7,13 +7,14 @@ import { HostSubnets, NetworkConfigurationValues } from '../../../types';
|
|
|
7
7
|
import { getFieldId } from '../../ui';
|
|
8
8
|
import {
|
|
9
9
|
DUAL_STACK,
|
|
10
|
-
|
|
10
|
+
NO_SUBNET_SET,
|
|
11
|
+
SINGLE_STACK,
|
|
11
12
|
NETWORK_TYPE_OVN,
|
|
12
13
|
NETWORK_TYPE_SDN,
|
|
13
|
-
NO_SUBNET_SET,
|
|
14
14
|
} from '../../../config';
|
|
15
15
|
import { RadioField } from '../../ui/formik';
|
|
16
16
|
import { ConfirmationModal, PopoverIcon } from '../../ui';
|
|
17
|
+
import { useTranslation } from '../../../hooks/use-translation-wrapper';
|
|
17
18
|
import { reorderNetworksByCurrentPrimary } from './reorderNetworks';
|
|
18
19
|
import {
|
|
19
20
|
Cluster,
|
|
@@ -37,6 +38,7 @@ export type StackTypeControlGroupProps = {
|
|
|
37
38
|
hostSubnets: HostSubnets;
|
|
38
39
|
defaultNetworkValues: StackTypeDefaultNetworkValues;
|
|
39
40
|
isViewerMode?: boolean;
|
|
41
|
+
allowSingleStackIPv6?: boolean;
|
|
40
42
|
};
|
|
41
43
|
|
|
42
44
|
const hasDualStackConfigurationChanged = (
|
|
@@ -61,17 +63,21 @@ export const StackTypeControlGroup = ({
|
|
|
61
63
|
hostSubnets,
|
|
62
64
|
defaultNetworkValues,
|
|
63
65
|
isViewerMode = false,
|
|
66
|
+
allowSingleStackIPv6 = false,
|
|
64
67
|
}: StackTypeControlGroupProps) => {
|
|
68
|
+
const { t } = useTranslation();
|
|
65
69
|
const { setFieldValue, values, validateForm } = useFormikContext<NetworkConfigurationValues>();
|
|
66
70
|
const [openConfirmModal, setConfirmModal] = React.useState(false);
|
|
67
71
|
|
|
72
|
+
const singleStackLabel = allowSingleStackIPv6 ? t('ai:Single stack') : t('ai:IPv4');
|
|
73
|
+
|
|
68
74
|
const IPv6Subnets = hostSubnets.filter((subnet) => Address6.isValid(subnet.subnet));
|
|
69
75
|
const cidrIPv6 = IPv6Subnets.length >= 1 ? IPv6Subnets[0].subnet : NO_SUBNET_SET;
|
|
70
76
|
const shouldSetSingleStack =
|
|
71
77
|
!isViewerMode && !isDualStackSelectable && values.stackType === DUAL_STACK;
|
|
72
78
|
|
|
73
79
|
const setSingleStack = React.useCallback(() => {
|
|
74
|
-
setFieldValue('stackType',
|
|
80
|
+
setFieldValue('stackType', SINGLE_STACK);
|
|
75
81
|
|
|
76
82
|
// Determine whether the first machine network is IPv4
|
|
77
83
|
const firstNetwork = values.machineNetworks?.[0];
|
|
@@ -95,7 +101,8 @@ export const StackTypeControlGroup = ({
|
|
|
95
101
|
}
|
|
96
102
|
}
|
|
97
103
|
}
|
|
98
|
-
|
|
104
|
+
|
|
105
|
+
// Set cluster/service to IPv4 defaults when switching to single-stack
|
|
99
106
|
if (values.clusterNetworks && values.clusterNetworks.length >= 1) {
|
|
100
107
|
const defaultCluster =
|
|
101
108
|
defaultNetworkValues.clusterNetworksIpv4 && defaultNetworkValues.clusterNetworksIpv4[0];
|
|
@@ -197,28 +204,27 @@ export const StackTypeControlGroup = ({
|
|
|
197
204
|
}
|
|
198
205
|
}
|
|
199
206
|
if (values.clusterNetworks && values.clusterNetworks?.length < 2) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
);
|
|
207
|
+
const firstClusterCidr = values.clusterNetworks[0]?.cidr;
|
|
208
|
+
const isPrimaryIPv6 = firstClusterCidr && Address6.isValid(firstClusterCidr);
|
|
209
|
+
const missingFamilyNetworkDefault =
|
|
210
|
+
defaultNetworkValues.clusterNetworksDualstack?.[isPrimaryIPv6 ? 0 : 1];
|
|
211
|
+
const secondClusterNetwork = missingFamilyNetworkDefault ?? {
|
|
212
|
+
cidr: '',
|
|
213
|
+
hostPrefix: '',
|
|
214
|
+
clusterId: clusterId,
|
|
215
|
+
};
|
|
216
|
+
setFieldValue('clusterNetworks', [...values.clusterNetworks, secondClusterNetwork], false);
|
|
210
217
|
}
|
|
211
218
|
if (values.serviceNetworks && values.serviceNetworks?.length < 2) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
);
|
|
219
|
+
const firstServiceCidr = values.serviceNetworks[0]?.cidr;
|
|
220
|
+
const isPrimaryIPv6 = firstServiceCidr && Address6.isValid(firstServiceCidr);
|
|
221
|
+
const missingFamilyNetworkDefault =
|
|
222
|
+
defaultNetworkValues.serviceNetworksDualstack?.[isPrimaryIPv6 ? 0 : 1];
|
|
223
|
+
const secondServiceNetwork = missingFamilyNetworkDefault ?? {
|
|
224
|
+
cidr: '',
|
|
225
|
+
clusterId: clusterId,
|
|
226
|
+
};
|
|
227
|
+
setFieldValue('serviceNetworks', [...values.serviceNetworks, secondServiceNetwork], false);
|
|
222
228
|
}
|
|
223
229
|
// Initialize VIPs for dual-stack
|
|
224
230
|
if (values.apiVips && values.apiVips.length < 2) {
|
|
@@ -291,14 +297,18 @@ export const StackTypeControlGroup = ({
|
|
|
291
297
|
<SplitItem>
|
|
292
298
|
<RadioField
|
|
293
299
|
name={'stackType'}
|
|
294
|
-
value={
|
|
300
|
+
value={SINGLE_STACK}
|
|
295
301
|
isDisabled={!isDualStackSelectable || isViewerMode}
|
|
296
|
-
label=
|
|
302
|
+
label={`${singleStackLabel}\u00A0`}
|
|
297
303
|
/>
|
|
298
304
|
</SplitItem>
|
|
299
305
|
<SplitItem>
|
|
300
306
|
<PopoverIcon
|
|
301
|
-
bodyContent=
|
|
307
|
+
bodyContent={
|
|
308
|
+
allowSingleStackIPv6
|
|
309
|
+
? t('ai:Select a single address family (IPv4 or IPv6) for your machine network.')
|
|
310
|
+
: t('ai:Select this when your hosts are using only IPv4.')
|
|
311
|
+
}
|
|
302
312
|
buttonStyle={{ top: '-4px' }}
|
|
303
313
|
/>
|
|
304
314
|
</SplitItem>
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
FormGroup,
|
|
5
5
|
FormHelperText,
|
|
6
6
|
HelperTextItem,
|
|
7
|
-
Button,
|
|
8
7
|
DropdownItem,
|
|
9
8
|
MenuToggle,
|
|
10
9
|
MenuToggleElement,
|
|
11
10
|
Dropdown,
|
|
12
11
|
DropdownGroup,
|
|
13
12
|
Divider,
|
|
13
|
+
DropdownProps,
|
|
14
14
|
} from '@patternfly/react-core';
|
|
15
15
|
|
|
16
16
|
import { OpenshiftVersionOptionType } from '../../types';
|
|
@@ -20,6 +20,7 @@ import { getFieldId } from './formik';
|
|
|
20
20
|
import ExternalLink from './ExternalLink';
|
|
21
21
|
import { OCP_RELEASES_PAGE } from '../../config';
|
|
22
22
|
import { ClusterDetailsValues, ItemDropdown } from '../clusterWizard';
|
|
23
|
+
import { getVersionLabel } from './utils';
|
|
23
24
|
|
|
24
25
|
export type HelperTextType = (value: string | null, inModal?: boolean) => JSX.Element | null;
|
|
25
26
|
|
|
@@ -58,7 +59,13 @@ export const OpenShiftVersionDropdown = ({
|
|
|
58
59
|
const {
|
|
59
60
|
values: { customOpenshiftSelect },
|
|
60
61
|
} = useFormikContext<ClusterDetailsValues>();
|
|
61
|
-
const
|
|
62
|
+
const current = React.useMemo(
|
|
63
|
+
() =>
|
|
64
|
+
(customItem ? [...versions, customItem] : versions).find(
|
|
65
|
+
(item) => item.value === field.value,
|
|
66
|
+
),
|
|
67
|
+
[customItem, field.value, versions],
|
|
68
|
+
);
|
|
62
69
|
|
|
63
70
|
React.useEffect(() => {
|
|
64
71
|
let defaultVersion = versions.find((item) => item.default);
|
|
@@ -68,7 +75,6 @@ export const OpenShiftVersionDropdown = ({
|
|
|
68
75
|
defaultVersion = versions.find((item) => item.value === customOpenshiftSelect);
|
|
69
76
|
}
|
|
70
77
|
|
|
71
|
-
setCurrent(defaultVersion?.label || '');
|
|
72
78
|
setValue(defaultVersion?.value || '');
|
|
73
79
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
80
|
}, [customOpenshiftSelect]);
|
|
@@ -103,34 +109,20 @@ export const OpenShiftVersionDropdown = ({
|
|
|
103
109
|
</DropdownGroup>
|
|
104
110
|
),
|
|
105
111
|
<DropdownGroup key="all-available-versions">
|
|
106
|
-
<DropdownItem key="all-versions" id="all-versions"
|
|
107
|
-
<
|
|
108
|
-
variant="link"
|
|
109
|
-
isInline
|
|
110
|
-
onClick={() => {
|
|
111
|
-
setOpen(false);
|
|
112
|
-
showOpenshiftVersionModal();
|
|
113
|
-
}}
|
|
114
|
-
id="show-all-versions"
|
|
115
|
-
>
|
|
116
|
-
{t('ai:Show all available versions')}
|
|
117
|
-
</Button>
|
|
112
|
+
<DropdownItem key="all-versions" id="all-versions" value="all-versions">
|
|
113
|
+
<div className="pf-v6-u-text-color-link">{t('ai:Show all available versions')}</div>
|
|
118
114
|
</DropdownItem>
|
|
119
115
|
</DropdownGroup>,
|
|
120
116
|
].filter(Boolean);
|
|
121
117
|
|
|
122
|
-
const onSelect =
|
|
123
|
-
(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
[setValue],
|
|
133
|
-
);
|
|
118
|
+
const onSelect: DropdownProps['onSelect'] = (_, val) => {
|
|
119
|
+
if (val === 'all-versions') {
|
|
120
|
+
showOpenshiftVersionModal();
|
|
121
|
+
} else if (val) {
|
|
122
|
+
setValue(val as string);
|
|
123
|
+
}
|
|
124
|
+
setOpen(false);
|
|
125
|
+
};
|
|
134
126
|
|
|
135
127
|
const dropdownToggle = (toggleRef: React.Ref<MenuToggleElement>) => (
|
|
136
128
|
<MenuToggle
|
|
@@ -143,7 +135,7 @@ export const OpenShiftVersionDropdown = ({
|
|
|
143
135
|
isExpanded={isOpen}
|
|
144
136
|
data-testid="openshift-version-dropdown-toggle"
|
|
145
137
|
>
|
|
146
|
-
{current
|
|
138
|
+
{current ? getVersionLabel(current, t) : t('ai:OpenShift version')}
|
|
147
139
|
</MenuToggle>
|
|
148
140
|
);
|
|
149
141
|
|
|
@@ -126,6 +126,12 @@ export const allSubnetsIPv4 = (
|
|
|
126
126
|
return !!networks?.every((network) => network.cidr && Address4.isValid(network.cidr));
|
|
127
127
|
};
|
|
128
128
|
|
|
129
|
+
export const allSubnetsIPv6 = (
|
|
130
|
+
networks: (MachineNetwork | ClusterNetwork | ServiceNetwork)[] | undefined,
|
|
131
|
+
) => {
|
|
132
|
+
return !!networks?.every((network) => network.cidr && Address6.isValid(network.cidr));
|
|
133
|
+
};
|
|
134
|
+
|
|
129
135
|
export const labelsToArray = (labels: { [key in string]: string } = {}): string[] => {
|
|
130
136
|
const result: string[] = [];
|
|
131
137
|
for (const key in labels) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { DASH } from '../constants';
|
|
3
|
+
import { OpenshiftVersionOptionType } from '../../types';
|
|
4
|
+
import { TFunction } from 'i18next';
|
|
3
5
|
|
|
4
6
|
export const getHumanizedDateTime = (dateTime?: string) => {
|
|
5
7
|
if (!dateTime) return DASH;
|
|
@@ -20,3 +22,8 @@ export const isSelectEventChecked = (
|
|
|
20
22
|
const target = event?.target as { checked?: boolean };
|
|
21
23
|
return !!target?.checked;
|
|
22
24
|
};
|
|
25
|
+
|
|
26
|
+
export const getVersionLabel = (version: OpenshiftVersionOptionType, t: TFunction) =>
|
|
27
|
+
version.supportLevel === 'beta'
|
|
28
|
+
? version.label + ' - ' + t('ai:Developer preview release')
|
|
29
|
+
: version.label;
|
|
@@ -287,8 +287,10 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6 = {
|
|
|
287
287
|
export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
|
|
288
288
|
ClusterDefaultConfig,
|
|
289
289
|
| 'clusterNetworksIpv4'
|
|
290
|
+
| 'clusterNetworksIpv6'
|
|
290
291
|
| 'clusterNetworksDualstack'
|
|
291
292
|
| 'serviceNetworksIpv4'
|
|
293
|
+
| 'serviceNetworksIpv6'
|
|
292
294
|
| 'serviceNetworksDualstack'
|
|
293
295
|
> = {
|
|
294
296
|
clusterNetworksIpv4: [
|
|
@@ -297,6 +299,12 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
|
|
|
297
299
|
hostPrefix: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.clusterNetworkHostPrefix,
|
|
298
300
|
},
|
|
299
301
|
],
|
|
302
|
+
clusterNetworksIpv6: [
|
|
303
|
+
{
|
|
304
|
+
cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.clusterNetworkCidr,
|
|
305
|
+
hostPrefix: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.clusterNetworkHostPrefix,
|
|
306
|
+
},
|
|
307
|
+
],
|
|
300
308
|
clusterNetworksDualstack: [
|
|
301
309
|
{
|
|
302
310
|
cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.clusterNetworkCidr,
|
|
@@ -308,6 +316,7 @@ export const CLUSTER_DEFAULT_NETWORK_SETTINGS: Pick<
|
|
|
308
316
|
},
|
|
309
317
|
],
|
|
310
318
|
serviceNetworksIpv4: [{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.serviceNetworkCidr }],
|
|
319
|
+
serviceNetworksIpv6: [{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.serviceNetworkCidr }],
|
|
311
320
|
serviceNetworksDualstack: [
|
|
312
321
|
{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4.serviceNetworkCidr },
|
|
313
322
|
{ cidr: CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6.serviceNetworkCidr },
|
|
@@ -334,7 +343,7 @@ export const NO_SUBNET_SET = 'NO_SUBNET_SET';
|
|
|
334
343
|
export const NETWORK_TYPE_OVN = 'OVNKubernetes';
|
|
335
344
|
export const NETWORK_TYPE_SDN = 'OpenShiftSDN';
|
|
336
345
|
|
|
337
|
-
export const
|
|
346
|
+
export const SINGLE_STACK = 'singleStack';
|
|
338
347
|
export const DUAL_STACK = 'dualStack';
|
|
339
348
|
|
|
340
349
|
export const PREFIX_MAX_RESTRICTION = {
|
|
@@ -13,7 +13,8 @@ import {
|
|
|
13
13
|
ipBlockValidationSchema,
|
|
14
14
|
} from './addressValidation';
|
|
15
15
|
import { isMajorMinorVersionEqualOrGreater } from '../utils';
|
|
16
|
-
import { allSubnetsIPv4 } from '../components/ui/formik/utils';
|
|
16
|
+
import { allSubnetsIPv4, allSubnetsIPv6 } from '../components/ui/formik/utils';
|
|
17
|
+
import { SINGLE_STACK } from '../config';
|
|
17
18
|
|
|
18
19
|
export const machineNetworksValidationSchema = Yup.array().of(
|
|
19
20
|
Yup.object({ cidr: hostSubnetValidationSchema, clusterId: Yup.string() }),
|
|
@@ -111,3 +112,40 @@ export const IPv4ValidationSchema = Yup.array().test(
|
|
|
111
112
|
`All network subnets must be IPv4.`,
|
|
112
113
|
(values?: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv4(values),
|
|
113
114
|
);
|
|
115
|
+
|
|
116
|
+
export const IPv6ValidationSchema = Yup.array().test(
|
|
117
|
+
'single-stack-ipv6',
|
|
118
|
+
'All network subnets must be IPv6.',
|
|
119
|
+
(values?: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv6(values),
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
export const clusterNetworksSchema = (
|
|
123
|
+
t: TFunction,
|
|
124
|
+
stackType: string,
|
|
125
|
+
primaryCidr: string | undefined,
|
|
126
|
+
openshiftVersion?: string,
|
|
127
|
+
) => {
|
|
128
|
+
const singleStackFamilySchema =
|
|
129
|
+
primaryCidr && isCIDR.v6(primaryCidr) ? IPv6ValidationSchema : IPv4ValidationSchema;
|
|
130
|
+
|
|
131
|
+
const stackFamilySchema =
|
|
132
|
+
stackType === SINGLE_STACK
|
|
133
|
+
? singleStackFamilySchema
|
|
134
|
+
: dualStackValidationSchema(t('ai:cluster network'), t, openshiftVersion);
|
|
135
|
+
return clusterNetworksValidationSchema(t).concat(stackFamilySchema);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export const serviceNetworksSchema = (
|
|
139
|
+
t: TFunction,
|
|
140
|
+
stackType: string,
|
|
141
|
+
primaryCidr: string | undefined,
|
|
142
|
+
openshiftVersion?: string,
|
|
143
|
+
) => {
|
|
144
|
+
const singleStackFamilySchema =
|
|
145
|
+
primaryCidr && isCIDR.v6(primaryCidr) ? IPv6ValidationSchema : IPv4ValidationSchema;
|
|
146
|
+
const stackFamilySchema =
|
|
147
|
+
stackType === SINGLE_STACK
|
|
148
|
+
? singleStackFamilySchema
|
|
149
|
+
: dualStackValidationSchema(t('ai:service network'), t, openshiftVersion);
|
|
150
|
+
return serviceNetworkValidationSchema(t).concat(stackFamilySchema);
|
|
151
|
+
};
|
package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
getFormikErrorFields,
|
|
10
10
|
getHostSubnets,
|
|
11
11
|
HostSubnets,
|
|
12
|
-
|
|
12
|
+
SINGLE_STACK,
|
|
13
13
|
isSNO,
|
|
14
14
|
LoadingState,
|
|
15
15
|
NetworkConfigurationValues,
|
|
@@ -262,7 +262,7 @@ const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
|
|
|
262
262
|
if (values.vipDhcpAllocation) {
|
|
263
263
|
delete params.apiVips;
|
|
264
264
|
delete params.ingressVips;
|
|
265
|
-
} else if (values.stackType ===
|
|
265
|
+
} else if (values.stackType === SINGLE_STACK) {
|
|
266
266
|
// The API will rebuild the default machineNetwork
|
|
267
267
|
params.machineNetworks = [];
|
|
268
268
|
}
|