in desktop/src/app/components/pool/network-configuration/pool-endpoint-helper.ts [101:149]
export function frontendPortRangeValidator(frontendPortRangeStart: string,
frontendPortRangeEnd: string,
inboundNATPools: InboundNATPoolAttributes[]) {
return (group: FormGroup): {[key: string]: any} => {
const start = group.controls[frontendPortRangeStart];
const end = group.controls[frontendPortRangeEnd];
if (start.value === null || end.value === null) {
return null;
}
// Basic validation
if (start.value >= end.value) {
return {
invalidFrontEnd: true,
};
}
// Front end port should satisfy minimum amount of port
if ((end.value - start.value + 1) < MINIMUM_FRONTEND_PORT_RANGE) {
return {
insufficientPorts: true,
};
}
// Check whether front end port overlapped or not
let hasOverlap = false;
let overlapStart = null;
let overlapEnd = null;
if (inboundNATPools) {
for (const pool of inboundNATPools) {
// Overlap algorithm can be defined like:
// bool overlap = a.start <= b.end && b.start <= a.end; (inclusive)
if (start.value <= pool.frontendPortRangeEnd &&
end.value >= pool.frontendPortRangeStart) {
hasOverlap = true;
overlapStart = pool.frontendPortRangeStart;
overlapEnd = pool.frontendPortRangeEnd;
break;
}
}
}
if (hasOverlap) {
return {
overlappedRange: {
start: overlapStart,
end: overlapEnd,
},
};
}
return null;
};
}