export function frontendPortRangeValidator()

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;
    };
}