@openshift-assisted/ui-lib 2.17.1-cim → 2.17.3-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/clusterDetails/ClusterDeploymentDetailsForm.d.ts.map +1 -1
- package/build/@types/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.d.ts +0 -1
- package/build/@types/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.d.ts.map +1 -1
- package/build/@types/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.d.ts.map +1 -1
- package/build/@types/cim/components/ClusterDeployment/use-networking-formik.d.ts.map +1 -1
- package/build/@types/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.d.ts.map +1 -1
- package/build/@types/cim/components/InfraEnv/InfraEnvFormPage.d.ts.map +1 -1
- package/build/@types/cim/components/helpers/versions.d.ts +1 -1
- package/build/@types/cim/components/helpers/versions.d.ts.map +1 -1
- package/build/@types/cim/components/modals/CimConfiguration/CimConfigurationModal.d.ts.map +1 -1
- package/build/@types/cim/components/modals/EditProxyModal.d.ts.map +1 -1
- package/build/@types/cim/components/modals/EditSSHKeyModal.d.ts.map +1 -1
- package/build/@types/common/components/clusterConfiguration/DiscoveryImageConfigForm.d.ts.map +1 -1
- package/build/@types/common/components/clusterWizard/clusterDetailsValidation.d.ts.map +1 -1
- package/build/@types/common/components/hosts/AdditionalNTPSourcesDialog.d.ts.map +1 -1
- package/build/@types/common/components/hosts/EditHostForm.d.ts.map +1 -1
- package/build/@types/common/components/hosts/MassChangeHostnameModal.d.ts.map +1 -1
- package/build/@types/common/components/ui/formik/index.d.ts +0 -2
- package/build/@types/common/components/ui/formik/index.d.ts.map +1 -1
- package/build/@types/common/index.d.ts +1 -0
- package/build/@types/common/index.d.ts.map +1 -1
- package/build/@types/common/utils.d.ts +2 -2
- package/build/@types/common/utils.d.ts.map +1 -1
- package/build/@types/common/validationSchemas/addressValidation.d.ts +18 -0
- package/build/@types/common/validationSchemas/addressValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/clusterDetailsValidation.d.ts +8 -0
- package/build/@types/common/validationSchemas/clusterDetailsValidation.d.ts.map +1 -0
- package/build/@types/common/{components/ui/formik → validationSchemas}/constants.d.ts +1 -3
- package/build/@types/common/validationSchemas/constants.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/hostnameValidation.d.ts +4 -0
- package/build/@types/common/validationSchemas/hostnameValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/index.d.ts +11 -0
- package/build/@types/common/validationSchemas/index.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/networkingValidation.d.ts +18 -0
- package/build/@types/common/validationSchemas/networkingValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/ntpValidation.d.ts +4 -0
- package/build/@types/common/validationSchemas/ntpValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/proxyValidation.d.ts +11 -0
- package/build/@types/common/validationSchemas/proxyValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/pullSecretValidation.d.ts +4 -0
- package/build/@types/common/validationSchemas/pullSecretValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/regexes.d.ts +14 -0
- package/build/@types/common/validationSchemas/regexes.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/sshValidation.d.ts +5 -0
- package/build/@types/common/validationSchemas/sshValidation.d.ts.map +1 -0
- package/build/@types/common/validationSchemas/utils.d.ts +7 -0
- package/build/@types/common/validationSchemas/utils.d.ts.map +1 -0
- package/build/@types/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.d.ts +2 -1
- package/build/@types/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts +2 -1
- package/build/@types/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.d.ts +2 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.d.ts +2 -1
- package/build/@types/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.d.ts.map +1 -1
- package/build/@types/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.d.ts.map +1 -1
- package/build/@types/ocm/components/hosts/UpdateDay2ApiVipForm.d.ts.map +1 -1
- package/build/cjs/cim/components/Agent/BMCForm.js +3 -3
- package/build/cjs/cim/components/Agent/BMCForm.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.js +9 -15
- package/build/cjs/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.js +8 -6
- package/build/cjs/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.js +1 -3
- package/build/cjs/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.js.map +1 -1
- package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js +16 -15
- package/build/cjs/cim/components/ClusterDeployment/use-networking-formik.js.map +1 -1
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.js +2 -2
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.js.map +1 -1
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.js +2 -11
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.js.map +1 -1
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.js +8 -8
- package/build/cjs/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.js.map +1 -1
- package/build/cjs/cim/components/InfraEnv/InfraEnvFormPage.js +8 -6
- package/build/cjs/cim/components/InfraEnv/InfraEnvFormPage.js.map +1 -1
- package/build/cjs/cim/components/helpers/versions.js +42 -27
- package/build/cjs/cim/components/helpers/versions.js.map +1 -1
- package/build/cjs/cim/components/modals/CimConfiguration/CimConfigurationModal.js +9 -3
- package/build/cjs/cim/components/modals/CimConfiguration/CimConfigurationModal.js.map +1 -1
- package/build/cjs/cim/components/modals/EditProxyModal.js +5 -3
- package/build/cjs/cim/components/modals/EditProxyModal.js.map +1 -1
- package/build/cjs/cim/components/modals/EditPullSecretModal.js +1 -1
- package/build/cjs/cim/components/modals/EditPullSecretModal.js.map +1 -1
- package/build/cjs/cim/components/modals/EditSSHKeyModal.js +3 -3
- package/build/cjs/cim/components/modals/EditSSHKeyModal.js.map +1 -1
- package/build/cjs/common/components/clusterConfiguration/DiscoveryImageConfigForm.js +7 -6
- package/build/cjs/common/components/clusterConfiguration/DiscoveryImageConfigForm.js.map +1 -1
- package/build/cjs/common/components/clusterWizard/clusterDetailsValidation.js +8 -8
- package/build/cjs/common/components/clusterWizard/clusterDetailsValidation.js.map +1 -1
- package/build/cjs/common/components/hosts/AdditionalNTPSourcesDialog.js +2 -1
- package/build/cjs/common/components/hosts/AdditionalNTPSourcesDialog.js.map +1 -1
- package/build/cjs/common/components/hosts/EditHostForm.js +3 -2
- package/build/cjs/common/components/hosts/EditHostForm.js.map +1 -1
- package/build/cjs/common/components/hosts/MassChangeHostnameModal.js +6 -5
- package/build/cjs/common/components/hosts/MassChangeHostnameModal.js.map +1 -1
- package/build/cjs/common/components/ui/formik/index.js +0 -2
- package/build/cjs/common/components/ui/formik/index.js.map +1 -1
- package/build/cjs/common/config/docs_links.js +1 -1
- package/build/cjs/common/index.js +1 -0
- package/build/cjs/common/index.js.map +1 -1
- package/build/cjs/common/utils.js +5 -3
- package/build/cjs/common/utils.js.map +1 -1
- package/build/cjs/common/validationSchemas/addressValidation.js +246 -0
- package/build/cjs/common/validationSchemas/addressValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/clusterDetailsValidation.js +104 -0
- package/build/cjs/common/validationSchemas/clusterDetailsValidation.js.map +1 -0
- package/build/cjs/common/{components/ui/formik → validationSchemas}/constants.js +3 -5
- package/build/cjs/common/validationSchemas/constants.js.map +1 -0
- package/build/cjs/common/validationSchemas/hostnameValidation.js +36 -0
- package/build/cjs/common/validationSchemas/hostnameValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/index.js +17 -0
- package/build/cjs/common/validationSchemas/index.js.map +1 -0
- package/build/cjs/common/validationSchemas/networkingValidation.js +74 -0
- package/build/cjs/common/validationSchemas/networkingValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/ntpValidation.js +25 -0
- package/build/cjs/common/validationSchemas/ntpValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/proxyValidation.js +43 -0
- package/build/cjs/common/validationSchemas/proxyValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/pullSecretValidation.js +21 -0
- package/build/cjs/common/validationSchemas/pullSecretValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/regexes.js +17 -0
- package/build/cjs/common/validationSchemas/regexes.js.map +1 -0
- package/build/cjs/common/validationSchemas/sshValidation.js +32 -0
- package/build/cjs/common/validationSchemas/sshValidation.js.map +1 -0
- package/build/cjs/common/validationSchemas/utils.js +40 -0
- package/build/cjs/common/validationSchemas/utils.js.map +1 -0
- package/build/cjs/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.js +7 -6
- package/build/cjs/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.js +4 -2
- package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.js +7 -6
- package/build/cjs/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js +2 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js +11 -11
- package/build/cjs/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.js +3 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.js +6 -6
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.js +3 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.js.map +1 -1
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.js +12 -12
- package/build/cjs/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.js.map +1 -1
- package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js +4 -3
- package/build/cjs/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.js.map +1 -1
- package/build/cjs/ocm/components/hosts/UpdateDay2ApiVipForm.js +2 -1
- package/build/cjs/ocm/components/hosts/UpdateDay2ApiVipForm.js.map +1 -1
- package/lib/cim/components/Agent/BMCForm.tsx +3 -3
- package/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDeploymentDetailsForm.tsx +8 -18
- package/lib/cim/components/ClusterDeployment/clusterDetails/ClusterDetailsFormFields.tsx +7 -10
- package/lib/cim/components/ClusterDeployment/hostSelection/ClusterDeploymentHostSelectionStep.tsx +1 -3
- package/lib/cim/components/ClusterDeployment/use-networking-formik.ts +19 -15
- package/lib/cim/components/Hypershift/HostedClusterWizard/DetailsStep/DetailsStep.tsx +2 -2
- package/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsStep.tsx +2 -13
- package/lib/cim/components/Hypershift/HostedClusterWizard/NetworkStep/NetworkStep.tsx +8 -8
- package/lib/cim/components/InfraEnv/InfraEnvFormPage.tsx +8 -6
- package/lib/cim/components/helpers/versions.ts +51 -34
- package/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx +9 -3
- package/lib/cim/components/modals/EditProxyModal.tsx +6 -3
- package/lib/cim/components/modals/EditPullSecretModal.tsx +1 -1
- package/lib/cim/components/modals/EditSSHKeyModal.tsx +8 -6
- package/lib/common/components/clusterConfiguration/DiscoveryImageConfigForm.tsx +9 -8
- package/lib/common/components/clusterWizard/clusterDetailsValidation.ts +21 -11
- package/lib/common/components/hosts/AdditionalNTPSourcesDialog.tsx +3 -6
- package/lib/common/components/hosts/EditHostForm.tsx +2 -8
- package/lib/common/components/hosts/MassChangeHostnameModal.tsx +4 -6
- package/lib/common/components/ui/formik/index.tsx +0 -2
- package/lib/common/config/docs_links.ts +1 -1
- package/lib/common/index.ts +2 -0
- package/lib/common/utils.ts +5 -7
- package/lib/common/{components/ui/formik → validationSchemas}/_validationSchemas.test.ts +51 -39
- package/lib/common/validationSchemas/addressValidation.tsx +349 -0
- package/lib/common/validationSchemas/clusterDetailsValidation.tsx +168 -0
- package/lib/common/{components/ui/formik → validationSchemas}/constants.tsx +3 -6
- package/lib/common/validationSchemas/hostnameValidation.tsx +46 -0
- package/lib/common/validationSchemas/index.tsx +11 -0
- package/lib/common/validationSchemas/networkingValidation.tsx +113 -0
- package/lib/common/validationSchemas/ntpValidation.tsx +30 -0
- package/lib/common/validationSchemas/proxyValidation.tsx +67 -0
- package/lib/common/validationSchemas/pullSecretValidation.tsx +24 -0
- package/lib/common/validationSchemas/regexes.tsx +22 -0
- package/lib/common/validationSchemas/sshValidation.tsx +46 -0
- package/lib/common/validationSchemas/utils.tsx +36 -0
- package/lib/ocm/components/clusterConfiguration/OcmDiscoveryImageConfigForm.tsx +17 -15
- package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/CustomManifests.tsx +4 -2
- package/lib/ocm/components/clusterConfiguration/manifestsConfiguration/components/customManifestsValidationSchema.tsx +31 -31
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx +9 -2
- package/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts +14 -16
- package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.tsx +3 -1
- package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/formViewHostsValidationSchema.tsx +11 -6
- package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/YamlView.tsx +5 -1
- package/lib/ocm/components/clusterConfiguration/staticIp/components/YamlView/yamlViewValidationSchema.tsx +33 -28
- package/lib/ocm/components/clusterWizard/disconnected/OptionalConfigurationsStep.tsx +5 -3
- package/lib/ocm/components/hosts/UpdateDay2ApiVipForm.tsx +3 -7
- package/package.json +3 -3
- package/build/@types/common/components/ui/formik/constants.d.ts.map +0 -1
- package/build/@types/common/components/ui/formik/validationSchemas.d.ts +0 -50
- package/build/@types/common/components/ui/formik/validationSchemas.d.ts.map +0 -1
- package/build/cjs/common/components/ui/formik/constants.js.map +0 -1
- package/build/cjs/common/components/ui/formik/validationSchemas.js +0 -553
- package/build/cjs/common/components/ui/formik/validationSchemas.js.map +0 -1
- package/lib/common/components/ui/formik/validationSchemas.ts +0 -803
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import isCIDR from 'is-cidr';
|
|
3
|
+
import { TFunction } from 'i18next';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
ClusterNetwork,
|
|
7
|
+
MachineNetwork,
|
|
8
|
+
ServiceNetwork,
|
|
9
|
+
} from '@openshift-assisted/types/./assisted-installer-service';
|
|
10
|
+
import {
|
|
11
|
+
hostPrefixValidationSchema,
|
|
12
|
+
hostSubnetValidationSchema,
|
|
13
|
+
ipBlockValidationSchema,
|
|
14
|
+
} from './addressValidation';
|
|
15
|
+
import { isMajorMinorVersionEqualOrGreater } from '../utils';
|
|
16
|
+
import { allSubnetsIPv4 } from '../components/ui/formik/utils';
|
|
17
|
+
|
|
18
|
+
export const machineNetworksValidationSchema = Yup.array().of(
|
|
19
|
+
Yup.object({ cidr: hostSubnetValidationSchema, clusterId: Yup.string() }),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const clusterNetworksValidationSchema = (t: TFunction) =>
|
|
23
|
+
Yup.array().of(
|
|
24
|
+
Yup.lazy((values: ClusterNetwork) =>
|
|
25
|
+
Yup.object({
|
|
26
|
+
cidr: ipBlockValidationSchema(
|
|
27
|
+
undefined /* So far used in OCM only and so validated by backend */,
|
|
28
|
+
t,
|
|
29
|
+
),
|
|
30
|
+
hostPrefix: hostPrefixValidationSchema(values.cidr, t),
|
|
31
|
+
clusterId: Yup.string(),
|
|
32
|
+
}),
|
|
33
|
+
),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
export const serviceNetworkValidationSchema = (t: TFunction) =>
|
|
37
|
+
Yup.array().of(
|
|
38
|
+
Yup.object({
|
|
39
|
+
cidr: ipBlockValidationSchema(
|
|
40
|
+
undefined /* So far used in OCM only and so validated by backend */,
|
|
41
|
+
t,
|
|
42
|
+
),
|
|
43
|
+
clusterId: Yup.string(),
|
|
44
|
+
}),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
export const dualStackValidationSchema = (field: string, t: TFunction, openshiftVersion?: string) =>
|
|
48
|
+
Yup.array()
|
|
49
|
+
.max(2, t('ai:Maximum number of {{field}} subnets in dual stack is 2.', { field }))
|
|
50
|
+
.test(
|
|
51
|
+
'dual-stack-ipv4',
|
|
52
|
+
openshiftVersion && isMajorMinorVersionEqualOrGreater(openshiftVersion, '4.12')
|
|
53
|
+
? t('ai:First network has to be a valid IPv4 or IPv6 subnet.')
|
|
54
|
+
: t('ai:First network has to be IPv4 subnet.'),
|
|
55
|
+
(values?: { cidr: MachineNetwork['cidr'] }[]): boolean => {
|
|
56
|
+
// For OCP versions > 4.11, allow IPv6 as primary network
|
|
57
|
+
if (openshiftVersion && isMajorMinorVersionEqualOrGreater(openshiftVersion, '4.12')) {
|
|
58
|
+
return !!values?.[0].cidr && (isCIDR.v4(values[0].cidr) || isCIDR.v6(values[0].cidr));
|
|
59
|
+
}
|
|
60
|
+
// For older versions, require IPv4 as primary network
|
|
61
|
+
return !!values?.[0].cidr && isCIDR.v4(values[0].cidr);
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
|
+
.test(
|
|
65
|
+
'dual-stack-unique-cidrs',
|
|
66
|
+
t('ai:Provided {{field}} subnets must be unique.', { field }),
|
|
67
|
+
(values?: { cidr?: MachineNetwork['cidr'] }[]) => {
|
|
68
|
+
if (!values || values.length < 2) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const first = values[0]?.cidr || '';
|
|
72
|
+
const second = values[1]?.cidr || '';
|
|
73
|
+
if (!first || !second) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
const firstIsCidr = isCIDR.v4(first) || isCIDR.v6(first);
|
|
77
|
+
const secondIsCidr = isCIDR.v4(second) || isCIDR.v6(second);
|
|
78
|
+
if (!firstIsCidr || !secondIsCidr) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return first !== second;
|
|
82
|
+
},
|
|
83
|
+
)
|
|
84
|
+
.test(
|
|
85
|
+
'dual-stack-opposite-families',
|
|
86
|
+
t('ai:When two {{field}} values are provided, one must be IPv4 and the other IPv6.', {
|
|
87
|
+
field,
|
|
88
|
+
}),
|
|
89
|
+
(values?: { cidr?: MachineNetwork['cidr'] }[]) => {
|
|
90
|
+
if (!values || values.length < 2) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
const a = values[0]?.cidr || '';
|
|
94
|
+
const b = values[1]?.cidr || '';
|
|
95
|
+
if (!a || !b) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
const a4 = isCIDR.v4(a);
|
|
99
|
+
const a6 = isCIDR.v6(a);
|
|
100
|
+
const b4 = isCIDR.v4(b);
|
|
101
|
+
const b6 = isCIDR.v6(b);
|
|
102
|
+
if (!((a4 || a6) && (b4 || b6))) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return (a4 && b6) || (a6 && b4);
|
|
106
|
+
},
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
export const IPv4ValidationSchema = Yup.array().test(
|
|
110
|
+
'single-stack',
|
|
111
|
+
`All network subnets must be IPv4.`,
|
|
112
|
+
(values?: (MachineNetwork | ClusterNetwork | ServiceNetwork)[]) => allSubnetsIPv4(values),
|
|
113
|
+
);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import { trimCommaSeparatedList } from '../components/ui/formik/utils';
|
|
3
|
+
import { isIPorDN } from './utils';
|
|
4
|
+
import { TFunction } from 'i18next';
|
|
5
|
+
|
|
6
|
+
export const ntpSourceValidationSchema = (t: TFunction) =>
|
|
7
|
+
Yup.string()
|
|
8
|
+
.test(
|
|
9
|
+
'ntp-source-validation',
|
|
10
|
+
t('ai:Provide a comma separated list of valid DNS names or IP addresses.'),
|
|
11
|
+
(value?: string) => {
|
|
12
|
+
if (!value || value === '') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return trimCommaSeparatedList(value)
|
|
16
|
+
.split(',')
|
|
17
|
+
.every((v) => isIPorDN(v));
|
|
18
|
+
},
|
|
19
|
+
)
|
|
20
|
+
.test(
|
|
21
|
+
'ntp-source-validation-unique',
|
|
22
|
+
t('ai:DNS names and IP addresses must be unique.'),
|
|
23
|
+
(value?: string) => {
|
|
24
|
+
if (!value || value === '') {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const arr = trimCommaSeparatedList(value).split(',');
|
|
28
|
+
return arr.length === new Set(arr).size;
|
|
29
|
+
},
|
|
30
|
+
);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
3
|
+
import { ProxyFieldsType } from '../types';
|
|
4
|
+
import { trimCommaSeparatedList } from '../components/ui/formik/utils';
|
|
5
|
+
import { PROXY_DNS_REGEX } from './regexes';
|
|
6
|
+
import { isIPorDN } from './utils';
|
|
7
|
+
|
|
8
|
+
export const httpProxyValidationSchema = ({
|
|
9
|
+
values,
|
|
10
|
+
pairValueName,
|
|
11
|
+
allowEmpty,
|
|
12
|
+
t,
|
|
13
|
+
}: {
|
|
14
|
+
values: ProxyFieldsType;
|
|
15
|
+
pairValueName: 'httpProxy' | 'httpsProxy';
|
|
16
|
+
allowEmpty?: boolean;
|
|
17
|
+
t: TFunction;
|
|
18
|
+
}) => {
|
|
19
|
+
const validation = Yup.string().test(
|
|
20
|
+
'http-proxy-validation',
|
|
21
|
+
t('ai:Provide a valid HTTP URL.'),
|
|
22
|
+
(value?: string) => {
|
|
23
|
+
if (!value) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!value.startsWith('http://')) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
new URL(value);
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
if (allowEmpty) {
|
|
41
|
+
return validation;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return validation.test(
|
|
45
|
+
'http-proxy-no-empty-validation',
|
|
46
|
+
t('ai:At least one of the HTTP or HTTPS proxy URLs is required.'),
|
|
47
|
+
(value) => !values.enableProxy || !!value || !!values[pairValueName],
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const noProxyValidationSchema = (t: TFunction) =>
|
|
52
|
+
Yup.string().test(
|
|
53
|
+
'no-proxy-validation',
|
|
54
|
+
t('ai:Provide a comma separated list of valid DNS names or IP addresses.'),
|
|
55
|
+
(value?: string) => {
|
|
56
|
+
if (!value || value === '*') {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// https://docs.openshift.com/container-platform/4.5/installing/installing_bare_metal/installing-restricted-networks-bare-metal.html#installation-configure-proxy_installing-restricted-networks-bare-metal
|
|
61
|
+
// A comma-separated list of destination domain names, domains, IP addresses, or other network CIDRs to exclude proxying.
|
|
62
|
+
// Preface a domain with . to match subdomains only. For example, .y.com matches x.y.com, but not y.com.
|
|
63
|
+
// Use * to bypass proxy for all destinations.
|
|
64
|
+
const noProxyList = trimCommaSeparatedList(value).split(',');
|
|
65
|
+
return noProxyList.every((p) => isIPorDN(p, PROXY_DNS_REGEX));
|
|
66
|
+
},
|
|
67
|
+
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
3
|
+
|
|
4
|
+
export const pullSecretValidationSchema = (t: TFunction) =>
|
|
5
|
+
Yup.string().test(
|
|
6
|
+
'is-well-formed-json',
|
|
7
|
+
t("ai:Invalid pull secret format. You must use your Red Hat account's pull secret."),
|
|
8
|
+
(value?: string) => {
|
|
9
|
+
const isValid = true;
|
|
10
|
+
if (!value) return isValid;
|
|
11
|
+
try {
|
|
12
|
+
const pullSecret = JSON.parse(value) as {
|
|
13
|
+
auths: string;
|
|
14
|
+
};
|
|
15
|
+
return (
|
|
16
|
+
pullSecret.constructor.name === 'Object' &&
|
|
17
|
+
!!pullSecret?.auths &&
|
|
18
|
+
pullSecret.auths.constructor.name === 'Object'
|
|
19
|
+
);
|
|
20
|
+
} catch {
|
|
21
|
+
return !isValid;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const ALPHANUMERIC_REGEX = /^[a-zA-Z0-9]+$/;
|
|
2
|
+
|
|
3
|
+
export const CLUSTER_NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;
|
|
4
|
+
export const CLUSTER_NAME_VALID_CHARS_REGEX = /^[a-z0-9-]*$/;
|
|
5
|
+
|
|
6
|
+
export const DNS_NAME_REGEX = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/;
|
|
7
|
+
export const NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;
|
|
8
|
+
export const NAME_CHARS_REGEX = /^[a-z0-9-.]*$/;
|
|
9
|
+
|
|
10
|
+
export const HOST_NAME_REGEX = /^[^.]{1,63}(?:[.][^.]{1,63})*$/;
|
|
11
|
+
export const SSH_PUBLIC_KEY_REGEX =
|
|
12
|
+
/^(ssh-rsa AAAAB3NzaC1yc2|ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNT|ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzOD|ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1Mj|ssh-ed25519 AAAAC3NzaC1lZDI1NTE5|ssh-dss AAAAB3NzaC1kc3)[0-9A-Za-z+/]+[=]{0,3}( .*)?$/;
|
|
13
|
+
|
|
14
|
+
export const PROXY_DNS_REGEX =
|
|
15
|
+
/(^\.?([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*$)/;
|
|
16
|
+
|
|
17
|
+
export const IP_V4_ZERO = '0.0.0.0';
|
|
18
|
+
export const IP_V6_ZERO = '0000:0000:0000:0000:0000:0000:0000:0000';
|
|
19
|
+
|
|
20
|
+
export const MAC_REGEX = /^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/;
|
|
21
|
+
|
|
22
|
+
export const LOCATION_CHARS_REGEX = /^[a-zA-Z0-9-._]*$/;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
3
|
+
import { trimSshPublicKey } from '../components/ui/formik/utils';
|
|
4
|
+
import { SSH_PUBLIC_KEY_REGEX } from './regexes';
|
|
5
|
+
|
|
6
|
+
export const sshPublicKeyValidationSchema = (t: TFunction) =>
|
|
7
|
+
Yup.string().test(
|
|
8
|
+
'ssh-public-key',
|
|
9
|
+
t(
|
|
10
|
+
'ai:SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT]. A single key can be provided only.',
|
|
11
|
+
),
|
|
12
|
+
(value?: string) => {
|
|
13
|
+
if (!value) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return !!trimSshPublicKey(value).match(SSH_PUBLIC_KEY_REGEX);
|
|
18
|
+
},
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const sshPublicKeyListValidationSchema = (t: TFunction) =>
|
|
22
|
+
Yup.string()
|
|
23
|
+
.test(
|
|
24
|
+
'ssh-public-keys',
|
|
25
|
+
t(
|
|
26
|
+
'ai:SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT].',
|
|
27
|
+
),
|
|
28
|
+
(value?: string) => {
|
|
29
|
+
if (!value) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
trimSshPublicKey(value)
|
|
35
|
+
.split('\n')
|
|
36
|
+
.find((line: string) => !line.match(SSH_PUBLIC_KEY_REGEX)) === undefined
|
|
37
|
+
);
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
.test('ssh-public-keys-unique', t('ai:SSH public keys must be unique.'), (value?: string) => {
|
|
41
|
+
if (!value) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const keyList = trimSshPublicKey(value).split('\n');
|
|
45
|
+
return new Set(keyList).size === keyList.length;
|
|
46
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as Yup from 'yup';
|
|
2
|
+
import { Address4, Address6 } from 'ip-address';
|
|
3
|
+
import { DNS_NAME_REGEX } from './regexes';
|
|
4
|
+
|
|
5
|
+
export const isIPorDN = (value?: string, dnsRegex = DNS_NAME_REGEX) => {
|
|
6
|
+
if ((value as string).match(dnsRegex)) {
|
|
7
|
+
return true;
|
|
8
|
+
} else if (value) {
|
|
9
|
+
return Address4.isValid(value) || Address6.isValid(value);
|
|
10
|
+
} else {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// Helpers to classify literal IPs more robustly
|
|
16
|
+
export const isIPv4Address = (ip?: string) => {
|
|
17
|
+
if (!ip) return false;
|
|
18
|
+
return ip.includes('.') && Address4.isValid(ip);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const isIPv6Address = (ip?: string) => {
|
|
22
|
+
if (!ip) return false;
|
|
23
|
+
return ip.includes(':') && Address6.isValid(ip);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const alwaysRequired = (message?: string) =>
|
|
27
|
+
Yup.string().test(
|
|
28
|
+
'always-required',
|
|
29
|
+
message || 'The value is required.',
|
|
30
|
+
(value?: string): boolean => !!value,
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
export const getArrayIndexFromPath = (path: string): number => {
|
|
34
|
+
const match = path.match(/\[(\d+)\][^\[]*$/); // Prefer the last [...] occurrence for nested array paths like "foo[0].bar[1].ip"
|
|
35
|
+
return match ? parseInt(match[1], 10) : NaN;
|
|
36
|
+
};
|
|
@@ -13,18 +13,14 @@ import {
|
|
|
13
13
|
FlexItem,
|
|
14
14
|
} from '@patternfly/react-core';
|
|
15
15
|
import { Formik, FormikHelpers } from 'formik';
|
|
16
|
+
import { TFunction } from 'i18next';
|
|
16
17
|
import {
|
|
17
18
|
HostStaticNetworkConfig,
|
|
18
19
|
ImageType,
|
|
19
20
|
InfraEnv,
|
|
20
21
|
Proxy,
|
|
21
22
|
} from '@openshift-assisted/types/assisted-installer-service';
|
|
22
|
-
import {
|
|
23
|
-
AlertFormikError,
|
|
24
|
-
httpProxyValidationSchema,
|
|
25
|
-
noProxyValidationSchema,
|
|
26
|
-
sshPublicKeyValidationSchema,
|
|
27
|
-
} from '../../../common/components/ui';
|
|
23
|
+
import { AlertFormikError } from '../../../common/components/ui';
|
|
28
24
|
import {
|
|
29
25
|
DiscoveryImageType,
|
|
30
26
|
ProxyFieldsType,
|
|
@@ -37,6 +33,11 @@ import UploadSSH from '../../../common/components/clusterConfiguration/UploadSSH
|
|
|
37
33
|
import { useTranslation } from '../../../common/hooks/use-translation-wrapper';
|
|
38
34
|
import DiscoveryImageTypeDropdown, { discoveryImageTypes } from './DiscoveryImageTypeDropdown';
|
|
39
35
|
import CertificateFields from '../../../common/components/clusterConfiguration/CertificateFields';
|
|
36
|
+
import {
|
|
37
|
+
httpProxyValidationSchema,
|
|
38
|
+
noProxyValidationSchema,
|
|
39
|
+
sshPublicKeyValidationSchema,
|
|
40
|
+
} from '../../../common';
|
|
40
41
|
|
|
41
42
|
export interface OcmImageCreateParams {
|
|
42
43
|
/**
|
|
@@ -54,14 +55,15 @@ export type OcmDiscoveryImageFormValues = OcmImageCreateParams &
|
|
|
54
55
|
ProxyFieldsType &
|
|
55
56
|
TrustedCertificateFieldsType;
|
|
56
57
|
|
|
57
|
-
const validationSchema =
|
|
58
|
-
Yup.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
)
|
|
58
|
+
const validationSchema = (t: TFunction) =>
|
|
59
|
+
Yup.lazy((values: OcmDiscoveryImageFormValues) =>
|
|
60
|
+
Yup.object<OcmDiscoveryImageFormValues>().shape({
|
|
61
|
+
sshPublicKey: sshPublicKeyValidationSchema(t),
|
|
62
|
+
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy', t }),
|
|
63
|
+
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy', t }), // share the schema, httpS is currently not supported
|
|
64
|
+
noProxy: noProxyValidationSchema(t),
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
65
67
|
|
|
66
68
|
type OcmDiscoveryImageConfigFormProps = Proxy & {
|
|
67
69
|
onCancel: () => void;
|
|
@@ -137,7 +139,7 @@ export const OcmDiscoveryImageConfigForm = ({
|
|
|
137
139
|
<Formik
|
|
138
140
|
initialValues={initialValues}
|
|
139
141
|
initialStatus={{ error: null }}
|
|
140
|
-
validationSchema={validationSchema}
|
|
142
|
+
validationSchema={validationSchema(t)}
|
|
141
143
|
onSubmit={handleSubmit}
|
|
142
144
|
>
|
|
143
145
|
{({ submitForm, isSubmitting, status, setStatus }) => {
|
|
@@ -5,6 +5,7 @@ import { getFormViewManifestsValidationSchema } from './customManifestsValidatio
|
|
|
5
5
|
import { CustomManifestsForm } from './CustomManifestsForm';
|
|
6
6
|
import { getEmptyManifestsValues, getManifestValues } from './utils';
|
|
7
7
|
import { Cluster } from '@openshift-assisted/types/assisted-installer-service';
|
|
8
|
+
import { useTranslation } from '../../../../../common';
|
|
8
9
|
|
|
9
10
|
export const CustomManifests = ({
|
|
10
11
|
cluster,
|
|
@@ -13,12 +14,13 @@ export const CustomManifests = ({
|
|
|
13
14
|
cluster: Cluster;
|
|
14
15
|
onFormStateChange: (formState: CustomManifestFormState) => void;
|
|
15
16
|
}) => {
|
|
17
|
+
const { t } = useTranslation();
|
|
16
18
|
const [formProps, setFormProps] = React.useState<CustomManifestsFormProps>();
|
|
17
19
|
|
|
18
20
|
React.useEffect(() => {
|
|
19
21
|
setFormProps({
|
|
20
22
|
onFormStateChange: onFormStateChange,
|
|
21
|
-
validationSchema: getFormViewManifestsValidationSchema,
|
|
23
|
+
validationSchema: getFormViewManifestsValidationSchema(t),
|
|
22
24
|
|
|
23
25
|
getInitialValues: (customManifests: ListManifestsExtended) => {
|
|
24
26
|
return getManifestValues(customManifests);
|
|
@@ -27,7 +29,7 @@ export const CustomManifests = ({
|
|
|
27
29
|
showEmptyValues: true,
|
|
28
30
|
cluster: cluster,
|
|
29
31
|
});
|
|
30
|
-
}, [cluster, onFormStateChange]);
|
|
32
|
+
}, [cluster, onFormStateChange, t]);
|
|
31
33
|
|
|
32
34
|
if (!formProps) {
|
|
33
35
|
return null;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import * as Yup from 'yup';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
2
3
|
import { CustomManifestValues, ManifestFormData } from '../data/dataTypes';
|
|
3
4
|
import {
|
|
4
5
|
getMaxFileSizeMessage,
|
|
5
6
|
validateFileSize,
|
|
6
7
|
validateFileName,
|
|
7
8
|
validateFileType,
|
|
8
|
-
INCORRECT_TYPE_FILE_MESSAGE,
|
|
9
9
|
} from '../../../../../common/utils';
|
|
10
|
-
|
|
11
|
-
import * as yup from 'yup';
|
|
10
|
+
import { getIncorrectFileTypeMessage } from '../../../../../common';
|
|
12
11
|
|
|
13
12
|
/* eslint-disable */
|
|
14
13
|
type CustomManifestMapper = (a: CustomManifestValues) => string;
|
|
@@ -33,7 +32,7 @@ Yup.addMethod(
|
|
|
33
32
|
if (!list) return true;
|
|
34
33
|
|
|
35
34
|
const seen = new Set();
|
|
36
|
-
const errors:
|
|
35
|
+
const errors: Yup.ValidationError[] = [];
|
|
37
36
|
|
|
38
37
|
list.forEach((item, index) => {
|
|
39
38
|
const mappedValue = mapper(item);
|
|
@@ -49,7 +48,7 @@ Yup.addMethod(
|
|
|
49
48
|
});
|
|
50
49
|
|
|
51
50
|
if (errors.length > 0) {
|
|
52
|
-
throw new
|
|
51
|
+
throw new Yup.ValidationError(errors);
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
return true;
|
|
@@ -62,31 +61,32 @@ const INCORRECT_FILENAME =
|
|
|
62
61
|
|
|
63
62
|
const UNIQUE_FOLDER_FILENAME = 'Ensure unique file names to avoid conflicts and errors.';
|
|
64
63
|
|
|
65
|
-
export const getFormViewManifestsValidationSchema =
|
|
66
|
-
|
|
67
|
-
.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
export const getFormViewManifestsValidationSchema = (t: TFunction) =>
|
|
65
|
+
Yup.object<ManifestFormData>({
|
|
66
|
+
manifests: Yup.array<CustomManifestValues>()
|
|
67
|
+
.of(
|
|
68
|
+
Yup.object({
|
|
69
|
+
folder: Yup.mixed().required('Required'),
|
|
70
|
+
filename: Yup.string()
|
|
71
|
+
.required('Required')
|
|
72
|
+
.min(1, 'Number of characters must be 1-255')
|
|
73
|
+
.max(255, 'Number of characters must be 1-255')
|
|
74
|
+
.test('not-correct-filename', INCORRECT_FILENAME, (value: string) => {
|
|
75
|
+
return validateFileName(value);
|
|
76
|
+
}),
|
|
77
|
+
manifestYaml: Yup.string().when('filename', {
|
|
78
|
+
is: (filename: string) => !filename.includes('patch'),
|
|
79
|
+
then: () =>
|
|
80
|
+
Yup.string()
|
|
81
|
+
.required('Required')
|
|
82
|
+
.test('not-big-file', getMaxFileSizeMessage(t), validateFileSize)
|
|
83
|
+
.test('not-valid-file', getIncorrectFileTypeMessage(t), validateFileType),
|
|
84
|
+
otherwise: () =>
|
|
85
|
+
Yup.string()
|
|
86
|
+
.required('Required')
|
|
87
|
+
.test('not-big-file', getMaxFileSizeMessage(t), validateFileSize), // Validation of file content is not required if filename contains 'patch'
|
|
76
88
|
}),
|
|
77
|
-
manifestYaml: Yup.string().when('filename', {
|
|
78
|
-
is: (filename: string) => !filename.includes('patch'),
|
|
79
|
-
then: () =>
|
|
80
|
-
Yup.string()
|
|
81
|
-
.required('Required')
|
|
82
|
-
.test('not-big-file', getMaxFileSizeMessage, validateFileSize)
|
|
83
|
-
.test('not-valid-file', INCORRECT_TYPE_FILE_MESSAGE, validateFileType),
|
|
84
|
-
otherwise: () =>
|
|
85
|
-
Yup.string()
|
|
86
|
-
.required('Required')
|
|
87
|
-
.test('not-big-file', getMaxFileSizeMessage, validateFileSize), // Validation of file content is not required if filename contains 'patch'
|
|
88
89
|
}),
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
90
|
+
)
|
|
91
|
+
.uniqueManifestFiles(UNIQUE_FOLDER_FILENAME, (val: CustomManifestValues) => val.filename),
|
|
92
|
+
});
|
package/lib/ocm/components/clusterConfiguration/networkConfiguration/NetworkConfigurationForm.tsx
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
useAlerts,
|
|
18
18
|
useFormikAutoSave,
|
|
19
19
|
ClustersAPI,
|
|
20
|
+
useTranslation,
|
|
20
21
|
} from '../../../../common';
|
|
21
22
|
import { useDefaultConfiguration } from '../ClusterDefaultConfigurationContext';
|
|
22
23
|
import { useClusterWizardContext } from '../../clusterWizard/ClusterWizardContext';
|
|
@@ -163,6 +164,7 @@ const NetworkConfigurationForm: React.FC<{
|
|
|
163
164
|
};
|
|
164
165
|
|
|
165
166
|
const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
|
|
167
|
+
const { t } = useTranslation();
|
|
166
168
|
const pullSecret = usePullSecret();
|
|
167
169
|
const {
|
|
168
170
|
infraEnv,
|
|
@@ -201,8 +203,13 @@ const NetworkConfigurationPage = ({ cluster }: { cluster: Cluster }) => {
|
|
|
201
203
|
|
|
202
204
|
const memoizedValidationSchema = React.useMemo(
|
|
203
205
|
() =>
|
|
204
|
-
getNetworkConfigurationValidationSchema(
|
|
205
|
-
|
|
206
|
+
getNetworkConfigurationValidationSchema(
|
|
207
|
+
initialValues,
|
|
208
|
+
hostSubnets,
|
|
209
|
+
t,
|
|
210
|
+
cluster.openshiftVersion,
|
|
211
|
+
),
|
|
212
|
+
[initialValues, hostSubnets, t, cluster.openshiftVersion],
|
|
206
213
|
);
|
|
207
214
|
|
|
208
215
|
React.useEffect(() => {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Yup from 'yup';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
2
3
|
import {
|
|
3
4
|
clusterNetworksValidationSchema,
|
|
4
5
|
dualStackValidationSchema,
|
|
@@ -72,13 +73,14 @@ export const getNetworkInitialValues = (
|
|
|
72
73
|
export const getNetworkConfigurationValidationSchema = (
|
|
73
74
|
initialValues: NetworkConfigurationValues,
|
|
74
75
|
hostSubnets: HostSubnets,
|
|
76
|
+
t: TFunction,
|
|
75
77
|
openshiftVersion?: string,
|
|
76
78
|
) =>
|
|
77
79
|
Yup.lazy((values: NetworkConfigurationValues) =>
|
|
78
80
|
Yup.object<NetworkConfigurationValues>().shape({
|
|
79
|
-
apiVips: vipArrayValidationSchema<ApiVip>(hostSubnets, values),
|
|
80
|
-
ingressVips: vipArrayValidationSchema<IngressVip>(hostSubnets, values),
|
|
81
|
-
sshPublicKey: sshPublicKeyValidationSchema,
|
|
81
|
+
apiVips: vipArrayValidationSchema<ApiVip>(hostSubnets, values, t),
|
|
82
|
+
ingressVips: vipArrayValidationSchema<IngressVip>(hostSubnets, values, t),
|
|
83
|
+
sshPublicKey: sshPublicKeyValidationSchema(t),
|
|
82
84
|
machineNetworks:
|
|
83
85
|
values.managedNetworkingType === 'userManaged'
|
|
84
86
|
? Yup.array()
|
|
@@ -88,25 +90,21 @@ export const getNetworkConfigurationValidationSchema = (
|
|
|
88
90
|
otherwise: () =>
|
|
89
91
|
values.machineNetworks && values.machineNetworks?.length >= 2
|
|
90
92
|
? machineNetworksValidationSchema.concat(
|
|
91
|
-
dualStackValidationSchema('machine networks', openshiftVersion),
|
|
93
|
+
dualStackValidationSchema('machine networks', t, openshiftVersion),
|
|
92
94
|
)
|
|
93
95
|
: Yup.array(),
|
|
94
96
|
}),
|
|
95
|
-
clusterNetworks: clusterNetworksValidationSchema.when('stackType', {
|
|
97
|
+
clusterNetworks: clusterNetworksValidationSchema(t).when('stackType', {
|
|
96
98
|
is: (stackType: NetworkConfigurationValues['stackType']) => stackType === IPV4_STACK,
|
|
97
|
-
then: () =>
|
|
98
|
-
otherwise: () =>
|
|
99
|
-
|
|
100
|
-
dualStackValidationSchema('cluster network', openshiftVersion),
|
|
101
|
-
),
|
|
99
|
+
then: (schema) => schema.concat(IPv4ValidationSchema),
|
|
100
|
+
otherwise: (schema) =>
|
|
101
|
+
schema.concat(dualStackValidationSchema('cluster network', t, openshiftVersion)),
|
|
102
102
|
}),
|
|
103
|
-
serviceNetworks: serviceNetworkValidationSchema.when('stackType', {
|
|
103
|
+
serviceNetworks: serviceNetworkValidationSchema(t).when('stackType', {
|
|
104
104
|
is: (stackType: NetworkConfigurationValues['stackType']) => stackType === IPV4_STACK,
|
|
105
|
-
then: () =>
|
|
106
|
-
otherwise: () =>
|
|
107
|
-
|
|
108
|
-
dualStackValidationSchema('service network', openshiftVersion),
|
|
109
|
-
),
|
|
105
|
+
then: (schema) => schema.concat(IPv4ValidationSchema),
|
|
106
|
+
otherwise: (schema) =>
|
|
107
|
+
schema.concat(dualStackValidationSchema('service network', t, openshiftVersion)),
|
|
110
108
|
}),
|
|
111
109
|
}),
|
|
112
110
|
);
|
package/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewHosts/FormViewHosts.tsx
CHANGED
|
@@ -9,8 +9,10 @@ import { formViewHostsToInfraEnvField } from '../../data/formDataToInfraEnvField
|
|
|
9
9
|
import { getEmptyFormViewHostsValues } from '../../data/emptyData';
|
|
10
10
|
import { getFormViewHostsValues, getFormViewNetworkWideValues } from '../../data/fromInfraEnv';
|
|
11
11
|
import { InfraEnv } from '@openshift-assisted/types/assisted-installer-service';
|
|
12
|
+
import { useTranslation } from '../../../../../../common';
|
|
12
13
|
|
|
13
14
|
export const FormViewHosts: React.FC<StaticIpViewProps> = ({ infraEnv, ...props }) => {
|
|
15
|
+
const { t } = useTranslation();
|
|
14
16
|
const [protocolType, setProtocolType] = React.useState<StaticProtocolType>();
|
|
15
17
|
const [formProps, setFormProps] = React.useState<StaticIpFormProps<FormViewHostsValues>>();
|
|
16
18
|
React.useEffect(() => {
|
|
@@ -20,7 +22,7 @@ export const FormViewHosts: React.FC<StaticIpViewProps> = ({ infraEnv, ...props
|
|
|
20
22
|
if (networkWideValues) {
|
|
21
23
|
setFormProps({
|
|
22
24
|
infraEnv,
|
|
23
|
-
validationSchema: getFormViewHostsValidationSchema(networkWideValues),
|
|
25
|
+
validationSchema: getFormViewHostsValidationSchema(networkWideValues, t),
|
|
24
26
|
getInitialValues: (infraEnv: InfraEnv) => {
|
|
25
27
|
return getFormViewHostsValues(infraEnv);
|
|
26
28
|
},
|