@openshift-assisted/ui-lib
Version:
React component library for the Assisted Installer UI
461 lines • 25.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.IPv4ValidationSchema = exports.dualStackValidationSchema = exports.serviceNetworkValidationSchema = exports.clusterNetworksValidationSchema = exports.machineNetworksValidationSchema = exports.locationValidationSchema = exports.bmcAddressValidationSchema = exports.day2ApiVipValidationSchema = exports.ntpSourceValidationSchema = exports.noProxyValidationSchema = exports.httpProxyValidationSchema = exports.richHostnameValidationSchema = exports.richNameValidationSchema = exports.hostPrefixValidationSchema = exports.baseDomainValidationSchema = exports.dnsNameValidationSchema = exports.ipBlockValidationSchema = exports.vipArrayValidationSchema = exports.vipNoSuffixValidationSchema = exports.vipValidationSchema = exports.hostSubnetValidationSchema = exports.vipRangeValidationSchema = exports.macAddressValidationSchema = exports.ipNoSuffixValidationSchema = exports.ipValidationSchema = exports.pullSecretValidationSchema = exports.sshPublicKeyListValidationSchema = exports.sshPublicKeyValidationSchema = exports.nameValidationSchema = void 0;
const tslib_1 = require("tslib");
const cidr_tools_1 = require("cidr-tools");
const ip_address_1 = require("ip-address");
const is_cidr_1 = tslib_1.__importDefault(require("is-cidr"));
const is_in_subnet_1 = require("is-in-subnet");
const Yup = tslib_1.__importStar(require("yup"));
const lodash_es_1 = require("lodash-es");
const parse_url_1 = tslib_1.__importDefault(require("parse-url"));
const constants_1 = require("../../../config/constants");
const utils_1 = require("../../clusterConfiguration/utils");
const constants_2 = require("./constants");
const utils_2 = require("./utils");
const selectors_1 = require("../../../selectors");
const ALPHANUMERIC_REGEX = /^[a-zA-Z0-9]+$/;
const NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;
const NAME_CHARS_REGEX = /^[a-z0-9-.]*$/;
const CLUSTER_NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/;
const CLUSTER_NAME_VALID_CHARS_REGEX = /^[a-z0-9-]*$/;
const SSH_PUBLIC_KEY_REGEX = /^(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}( .*)?$/;
const DNS_NAME_REGEX = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/;
const PROXY_DNS_REGEX = /(^\.?([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*$)/;
const IP_V4_ZERO = '0.0.0.0';
const IP_V6_ZERO = '0000:0000:0000:0000:0000:0000:0000:0000';
const MAC_REGEX = /^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/;
const HOST_NAME_REGEX = /^[^.]{1,63}(?:[.][^.]{1,63})*$/;
const LOCATION_CHARS_REGEX = /^[a-zA-Z0-9-._]*$/;
const nameValidationSchema = (t, usedClusterNames, baseDnsDomain = '', validateUniqueName, isOcm = false) => {
const clusterNameValidationMessagesList = (0, constants_2.clusterNameValidationMessages)(t);
return Yup.string()
.required('Required')
.matches(CLUSTER_NAME_VALID_CHARS_REGEX, {
message: clusterNameValidationMessagesList.INVALID_VALUE,
excludeEmptyString: true,
})
.matches(CLUSTER_NAME_START_END_REGEX, {
message: clusterNameValidationMessagesList.INVALID_START_END,
excludeEmptyString: true,
})
.min(isOcm ? 1 : 2, isOcm
? clusterNameValidationMessagesList.INVALID_LENGTH_OCM
: clusterNameValidationMessagesList.INVALID_LENGTH_ACM)
.max(constants_2.CLUSTER_NAME_MAX_LENGTH, isOcm
? clusterNameValidationMessagesList.INVALID_LENGTH_OCM
: clusterNameValidationMessagesList.INVALID_LENGTH_ACM)
.when('useRedHatDnsService', {
is: (useRedHatDnsService) => useRedHatDnsService === true,
then: (schema) => schema.test('is-name-unique', clusterNameValidationMessagesList.NOT_UNIQUE, (value) => {
const clusterFullName = `${value || ''}.${baseDnsDomain}`;
return !value || !usedClusterNames.includes(clusterFullName);
}),
otherwise: (schema) => schema.test('is-name-unique', clusterNameValidationMessagesList.NOT_UNIQUE, (value) => {
// in CIM cluster name is ClusterDeployment CR name which must be unique
return validateUniqueName ? !value || !usedClusterNames.includes(value) : true;
}),
});
};
exports.nameValidationSchema = nameValidationSchema;
exports.sshPublicKeyValidationSchema = Yup.string().test('ssh-public-key', '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.', (value) => {
if (!value) {
return true;
}
return !!(0, utils_2.trimSshPublicKey)(value).match(SSH_PUBLIC_KEY_REGEX);
});
exports.sshPublicKeyListValidationSchema = Yup.string()
.test('ssh-public-keys', 'SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT].', (value) => {
if (!value) {
return true;
}
return !!(0, utils_2.trimSshPublicKey)(value).match(SSH_PUBLIC_KEY_REGEX);
// disable until mutliple keys are supported (https://issues.redhat.com/browse/METAL-250)
// return (
// trimSshPublicKey(value)
// .split('\n')
// .find((line: string) => !line.match(SSH_PUBLIC_KEY_REGEX)) === undefined
// );
})
.test('ssh-public-keys-unique', 'SSH public keys must be unique.', (value) => {
if (!value) {
return true;
}
const keyList = (0, utils_2.trimSshPublicKey)(value).split('\n');
return new Set(keyList).size === keyList.length;
});
exports.pullSecretValidationSchema = Yup.string().test('is-well-formed-json', "Invalid pull secret format. You must use your Red Hat account's pull secret.", (value) => {
const isValid = true;
if (!value)
return isValid;
try {
const pullSecret = JSON.parse(value);
return (pullSecret.constructor.name === 'Object' &&
!!(pullSecret === null || pullSecret === void 0 ? void 0 : pullSecret.auths) &&
pullSecret.auths.constructor.name === 'Object');
}
catch (_a) {
return !isValid;
}
});
const isValidIpWithoutSuffix = (addr) => {
const address = (0, utils_2.getAddress)(addr);
return !!address && address.address === address.addressMinusSuffix;
};
exports.ipValidationSchema = Yup.string().test('ip-validation', 'Not a valid IP address', (value) => ip_address_1.Address4.isValid(value || '') || ip_address_1.Address6.isValid(value || ''));
exports.ipNoSuffixValidationSchema = Yup.string().test('ip-validation-no-suffix', 'Not a valid IP address', (value) => {
return isValidIpWithoutSuffix(value || '');
});
exports.macAddressValidationSchema = Yup.string().matches(MAC_REGEX, {
message: 'Value "${value}" is not valid MAC address.',
excludeEmptyString: true,
});
const vipRangeValidationSchema = (hostSubnets, { machineNetworks, hostSubnet }, allowSuffix) => Yup.string().test('vip-validation', 'IP Address is outside of selected subnet', (value) => {
if (!value) {
return true;
}
try {
const validator = allowSuffix ? exports.ipValidationSchema : exports.ipNoSuffixValidationSchema;
validator.validateSync(value);
}
catch (err) {
return true;
}
const foundHostSubnets = [];
if (machineNetworks) {
const cidrs = machineNetworks === null || machineNetworks === void 0 ? void 0 : machineNetworks.map((network) => network.cidr);
foundHostSubnets.push(...hostSubnets.filter((hn) => cidrs === null || cidrs === void 0 ? void 0 : cidrs.includes(hn.subnet)));
}
else {
const subnet = hostSubnets.find((hn) => hn.subnet === hostSubnet);
if (subnet) {
foundHostSubnets.push(subnet);
}
}
for (const hostSubnet of foundHostSubnets) {
if (hostSubnet === null || hostSubnet === void 0 ? void 0 : hostSubnet.subnet) {
// Workaround for bug in CIM backend. hostIDs are empty
if (!hostSubnet.hostIDs.length) {
return true;
}
else if ((0, is_in_subnet_1.isInSubnet)(value, hostSubnet.subnet)) {
return true;
}
}
}
return false;
});
exports.vipRangeValidationSchema = vipRangeValidationSchema;
const vipUniqueValidationSchema = ({ ingressVips, apiVips, apiVip, ingressVip }, useIPArray) => Yup.string().test('vip-uniqueness-validation', 'The Ingress and API IP addresses cannot be the same.', (value) => {
if (useIPArray) {
if (!value || (ingressVips === null || ingressVips === void 0 ? void 0 : ingressVips.length) === 0 || (apiVips === null || apiVips === void 0 ? void 0 : apiVips.length) === 0) {
return true;
}
return (0, selectors_1.selectApiVip)({ apiVips }) !== (0, selectors_1.selectIngressVip)({ ingressVips });
}
else {
if (!value) {
return true;
}
return apiVip !== ingressVip;
}
});
const vipBroadcastValidationSchema = ({ machineNetworks }) => Yup.string().test('vip-no-broadcast', 'The IP address cannot be a network or broadcast address', (value) => {
var _a;
const vipAddress = (_a = (0, utils_2.getAddress)(value || '')) === null || _a === void 0 ? void 0 : _a.address;
const machineNetwork = (0, utils_2.getAddress)(((machineNetworks === null || machineNetworks === void 0 ? void 0 : machineNetworks.length) && machineNetworks[0].cidr) || '');
const machineNetworkBroadcast = machineNetwork === null || machineNetwork === void 0 ? void 0 : machineNetwork.endAddress().address;
const machineNetworkAddress = machineNetwork === null || machineNetwork === void 0 ? void 0 : machineNetwork.startAddress().address;
return vipAddress !== machineNetworkBroadcast && vipAddress !== machineNetworkAddress;
});
// like .required() but passes for initially empty field
const requiredOnceSet = (initialValue, message) => Yup.string().test('required-once-set', message || 'The value is required.', (value) => !!value || !initialValue);
exports.hostSubnetValidationSchema = Yup.string().when(['managedNetworkingType'], {
is: (managedNetworkingType) => managedNetworkingType === 'clusterManaged',
then: () => Yup.string().notOneOf([constants_1.NO_SUBNET_SET], 'Host subnet must be selected.'),
});
const vipValidationSchema = (hostSubnets, values, initialValue) => Yup.mixed().when(['vipDhcpAllocation', 'managedNetworkingType'], {
is: (vipDhcpAllocation, managedNetworkingType) => !vipDhcpAllocation && managedNetworkingType !== 'userManaged',
then: () => requiredOnceSet(initialValue, 'Required. Please provide an IP address')
.concat((0, exports.vipRangeValidationSchema)(hostSubnets, values, true))
.concat(vipUniqueValidationSchema(values, false)),
});
exports.vipValidationSchema = vipValidationSchema;
const vipNoSuffixValidationSchema = (hostSubnets, values, initialValues) => Yup.mixed().when(['vipDhcpAllocation', 'managedNetworkingType'], {
is: (vipDhcpAllocation, managedNetworkingType) => !vipDhcpAllocation && managedNetworkingType !== 'userManaged',
then: () => {
var _a;
return requiredOnceSet((_a = (0, lodash_es_1.head)(initialValues)) === null || _a === void 0 ? void 0 : _a.ip, 'Required. Please provide an IP address')
.concat(exports.ipNoSuffixValidationSchema)
.concat((0, exports.vipRangeValidationSchema)(hostSubnets, values, false))
.concat(vipBroadcastValidationSchema(values))
.concat(vipUniqueValidationSchema(values, true));
},
});
exports.vipNoSuffixValidationSchema = vipNoSuffixValidationSchema;
const vipArrayValidationSchema = (hostSubnets, values, initialValues) => (values.managedNetworkingType === 'clusterManaged'
? Yup.array().of(Yup.object({
clusterId: Yup.string(),
ip: (0, exports.vipNoSuffixValidationSchema)(hostSubnets, values, initialValues),
}))
: Yup.array()).test('vips-length', 'Both API and ingress APIs must be provided.', (_value) => { var _a, _b; return ((_a = values.apiVips) === null || _a === void 0 ? void 0 : _a.length) === ((_b = values.ingressVips) === null || _b === void 0 ? void 0 : _b.length); });
exports.vipArrayValidationSchema = vipArrayValidationSchema;
const ipBlockValidationSchema = (reservedCidrs) => Yup.string()
.required('A value is required.')
.test('valid-ip-address', 'Invalid IP address block. Expected value is a network expressed in CIDR notation (IP/netmask). For example: 123.123.123.0/24, 2055:d7a::/116', (value) => !!value && (is_cidr_1.default.v4(value) || is_cidr_1.default.v6(value)))
.test('valid-netmask', 'IPv4 netmask must be between 1-25 and include at least 128 addresses.\nIPv6 netmask must be between 8-128 and include at least 256 addresses.', (value) => {
const suffix = parseInt((value || '').split('/')[1]);
return ((is_cidr_1.default.v4(value || '') && 0 < suffix && suffix < 26) ||
(is_cidr_1.default.v6(value || '') && 7 < suffix && suffix < 129));
})
.test('cidr-is-not-unspecified', 'The specified CIDR is invalid because its resulting routing prefix matches the unspecified address.', (cidr) => {
const ip = (0, utils_1.getSubnet)(cidr);
if (ip === null) {
return false;
}
// The first address is used to represent the network
const startAddress = ip.startAddress().address;
return startAddress !== IP_V4_ZERO && startAddress !== IP_V6_ZERO;
})
.test('valid-cidr-base-address', ({ value }) => `${value} is not a valid CIDR`, (cidr) => {
const ip = (0, utils_1.getSubnet)(cidr);
if (ip === null) {
return false;
}
const networkAddress = ip.startAddress().parsedAddress;
const ipAddress = ip.parsedAddress;
const result = ipAddress.every((part, idx) => part === networkAddress[idx]);
return result;
})
.test('cidrs-can-not-overlap', 'Provided CIDRs can not overlap.', (cidr) => {
try {
if (cidr && reservedCidrs && reservedCidrs.length > 0) {
return !(0, cidr_tools_1.overlap)(cidr, reservedCidrs);
}
}
catch (_a) {
return false;
}
// passing by default
return true;
});
exports.ipBlockValidationSchema = ipBlockValidationSchema;
exports.dnsNameValidationSchema = Yup.string()
.test('dns-name-label-length', 'Single label of the DNS name can not be longer than 63 characters.', (value) => (value || '').split('.').every((label) => label.length <= 63))
.matches(DNS_NAME_REGEX, {
message: 'Value "${value}" is not valid DNS name. Example: basedomain.example.com',
excludeEmptyString: true,
});
exports.baseDomainValidationSchema = Yup.string().test('dns-name-label-length', 'Every single host component in the base domain name cannot contain more than 63 characters and must not contain spaces.', (value) => {
// Check if the value contains any spaces
if (/\s/.test(value)) {
return false; // Value contains spaces, validation fails
}
// Check the label lengths
const labels = (value || '').split('.');
return labels.every((label) => label.length <= 63);
});
const hostPrefixValidationSchema = (clusterNetworkCidr) => {
const requiredText = 'The host prefix is required.';
const minMaxText = 'The host prefix is a number between 1 and 32 for IPv4 and between 8 and 128 for IPv6.';
const netBlock = (clusterNetworkCidr || '').split('/')[1];
if (!netBlock) {
return Yup.number().required(requiredText).min(1, minMaxText).max(32, minMaxText);
}
let netBlockNumber = parseInt(netBlock);
if (isNaN(netBlockNumber)) {
netBlockNumber = 1;
}
const errorMsgPrefix = 'The host prefix is a number between size of the cluster network CIDR range';
const errorMsgIPv4 = `${errorMsgPrefix} (${netBlockNumber}) and 25.`;
const errorMsgIPv6 = `${errorMsgPrefix} (8) and 128.`;
if (ip_address_1.Address6.isValid(clusterNetworkCidr || '')) {
return Yup.number().required(requiredText).min(8, errorMsgIPv6).max(128, errorMsgIPv6);
}
if (ip_address_1.Address4.isValid(clusterNetworkCidr || '')) {
return Yup.number()
.required(requiredText)
.min(netBlockNumber, errorMsgIPv4)
.max(25, errorMsgIPv4);
}
return Yup.number().required(requiredText);
};
exports.hostPrefixValidationSchema = hostPrefixValidationSchema;
const richNameValidationSchema = (t, usedNames, origName) => {
const nameValidationMessagesList = (0, constants_2.nameValidationMessages)(t);
return Yup.string()
.min(1, nameValidationMessagesList.INVALID_LENGTH)
.max(253, nameValidationMessagesList.INVALID_LENGTH)
.test(nameValidationMessagesList.INVALID_START_END, nameValidationMessagesList.INVALID_START_END, (value) => {
const trimmed = value === null || value === void 0 ? void 0 : value.trim();
if (!trimmed) {
return true;
}
return (!!trimmed[0].match(NAME_START_END_REGEX) &&
(trimmed[trimmed.length - 1]
? !!trimmed[trimmed.length - 1].match(NAME_START_END_REGEX)
: true));
})
.matches(HOST_NAME_REGEX, nameValidationMessagesList.INVALID_FORMAT)
.matches(NAME_CHARS_REGEX, {
message: nameValidationMessagesList.INVALID_VALUE,
excludeEmptyString: true,
})
.test(nameValidationMessagesList.NOT_UNIQUE, nameValidationMessagesList.NOT_UNIQUE, (value) => {
if (!value || value === origName) {
return true;
}
return !usedNames.find((n) => n === value);
})
.notOneOf(constants_2.FORBIDDEN_HOSTNAMES, (0, constants_2.hostnameValidationMessages)(t).LOCALHOST_ERR);
};
exports.richNameValidationSchema = richNameValidationSchema;
const richHostnameValidationSchema = (t, usedNames, origName) => {
const hostnameValidationMessagesList = (0, constants_2.hostnameValidationMessages)(t);
return Yup.string()
.min(1, hostnameValidationMessagesList.INVALID_LENGTH)
.max(63, hostnameValidationMessagesList.INVALID_LENGTH)
.test(hostnameValidationMessagesList.INVALID_START_END, hostnameValidationMessagesList.INVALID_START_END, (value) => {
const trimmed = value === null || value === void 0 ? void 0 : value.trim();
if (!trimmed) {
return true;
}
return (!!trimmed[0].match(NAME_START_END_REGEX) &&
(trimmed[trimmed.length - 1]
? !!trimmed[trimmed.length - 1].match(NAME_START_END_REGEX)
: true));
})
.matches(NAME_CHARS_REGEX, {
message: hostnameValidationMessagesList.INVALID_VALUE,
excludeEmptyString: true,
})
.test(hostnameValidationMessagesList.NOT_UNIQUE, hostnameValidationMessagesList.NOT_UNIQUE, (value) => {
if (!value || value === origName) {
return true;
}
return !usedNames.find((n) => n === value);
})
.notOneOf(constants_2.FORBIDDEN_HOSTNAMES, hostnameValidationMessagesList.LOCALHOST_ERR);
};
exports.richHostnameValidationSchema = richHostnameValidationSchema;
const httpProxyValidationMessage = 'Provide a valid HTTP URL.';
const httpProxyValidationSchema = ({ values, pairValueName, allowEmpty, }) => {
const validation = Yup.string().test('http-proxy-validation', httpProxyValidationMessage, (value) => {
if (!value) {
return true;
}
if (!value.startsWith('http://')) {
return false;
}
try {
new URL(value);
}
catch (_a) {
return false;
}
return true;
});
if (allowEmpty) {
return validation;
}
return validation.test('http-proxy-no-empty-validation', 'At least one of the HTTP or HTTPS proxy URLs is required.', (value) => !values.enableProxy || !!value || !!values[pairValueName]);
};
exports.httpProxyValidationSchema = httpProxyValidationSchema;
const isIPorDN = (value, dnsRegex = DNS_NAME_REGEX) => {
if (value.match(dnsRegex)) {
return true;
}
try {
exports.ipValidationSchema.validateSync(value);
return true;
}
catch (err) {
return false;
}
};
exports.noProxyValidationSchema = Yup.string().test('no-proxy-validation', 'Provide a comma separated list of valid DNS names or IP addresses.', (value) => {
if (!value || value === '*') {
return true;
}
// 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
// A comma-separated list of destination domain names, domains, IP addresses, or other network CIDRs to exclude proxying.
// Preface a domain with . to match subdomains only. For example, .y.com matches x.y.com, but not y.com.
// Use * to bypass proxy for all destinations.
const noProxyList = (0, utils_2.trimCommaSeparatedList)(value).split(',');
return noProxyList.every((p) => isIPorDN(p, PROXY_DNS_REGEX));
});
exports.ntpSourceValidationSchema = Yup.string()
.test('ntp-source-validation', 'Provide a comma separated list of valid DNS names or IP addresses.', (value) => {
if (!value || value === '') {
return true;
}
return (0, utils_2.trimCommaSeparatedList)(value)
.split(',')
.every((v) => isIPorDN(v));
})
.test('ntp-source-validation-unique', 'DNS names and IP addresses must be unique.', (value) => {
if (!value || value === '') {
return true;
}
const arr = (0, utils_2.trimCommaSeparatedList)(value).split(',');
return arr.length === new Set(arr).size;
});
exports.day2ApiVipValidationSchema = Yup.string().test('day2-api-vip', 'Provide a valid DNS name or IP Address', (value) => {
if (!value) {
return true;
}
return isIPorDN(value);
});
const bmcAddressValidationSchema = (t) => {
const bmcAddressValidationMessagesList = (0, constants_2.bmcAddressValidationMessages)(t);
return Yup.string()
.required()
.test('valid-bmc-address', bmcAddressValidationMessagesList.INVALID_VALUE, (val) => {
try {
const url = (0, parse_url_1.default)(val);
return ['redfish-virtualmedia', 'idrac-virtualmedia'].includes(url.protocol);
}
catch (error) {
return false;
}
});
};
exports.bmcAddressValidationSchema = bmcAddressValidationSchema;
const locationValidationSchema = (t) => {
const locationValidationMessagesList = (0, constants_2.locationValidationMessages)(t);
return Yup.string()
.min(1, locationValidationMessagesList.INVALID_LENGTH)
.max(63, locationValidationMessagesList.INVALID_LENGTH)
.test(locationValidationMessagesList.INVALID_START_END, locationValidationMessagesList.INVALID_START_END, (value) => {
const trimmed = value === null || value === void 0 ? void 0 : value.trim();
if (!trimmed) {
return true;
}
return (!!trimmed[0].match(ALPHANUMERIC_REGEX) &&
(trimmed[trimmed.length - 1]
? !!trimmed[trimmed.length - 1].match(ALPHANUMERIC_REGEX)
: true));
})
.matches(LOCATION_CHARS_REGEX, {
message: locationValidationMessagesList.INVALID_VALUE,
excludeEmptyString: true,
});
};
exports.locationValidationSchema = locationValidationSchema;
exports.machineNetworksValidationSchema = Yup.array().of(Yup.object({ cidr: exports.hostSubnetValidationSchema, clusterId: Yup.string() }));
exports.clusterNetworksValidationSchema = Yup.array().of(Yup.lazy((values) => Yup.object({
cidr: (0, exports.ipBlockValidationSchema)(undefined /* So far used in OCM only and so validated by backend */),
hostPrefix: (0, exports.hostPrefixValidationSchema)(values.cidr),
clusterId: Yup.string(),
})));
exports.serviceNetworkValidationSchema = Yup.array().of(Yup.object({
cidr: (0, exports.ipBlockValidationSchema)(undefined /* So far used in OCM only and so validated by backend */),
clusterId: Yup.string(),
}));
const dualStackValidationSchema = (field) => Yup.array()
.max(2, `Maximum number of ${field} subnets in dual stack is 2.`)
.test('dual-stack-ipv4', 'First network has to be IPv4 subnet.', (values) => !!(values === null || values === void 0 ? void 0 : values[0].cidr) && ip_address_1.Address4.isValid(values[0].cidr))
.test('dual-stack-ipv6', 'Second network has to be IPv6 subnet.', (values) => !!(values === null || values === void 0 ? void 0 : values[1].cidr) && ip_address_1.Address6.isValid(values[1].cidr));
exports.dualStackValidationSchema = dualStackValidationSchema;
exports.IPv4ValidationSchema = Yup.array().test('single-stack', `All network subnets must be IPv4.`, (values) => (0, utils_2.allSubnetsIPv4)(values));
//# sourceMappingURL=validationSchemas.js.map
;