quality / commitlint (push) Skipped
CD / update-wiki (push) Failing after 8s
quality / changes (push) Successful in 5s
quality / docker-check (push) Skipped
quality / web (push) Successful in 50s
quality / api (push) Successful in 41s
CD / quality (push) Successful in 1m40s
CD / publish (push) Successful in 1m33s
- Introduced origin health check routes and integrated them into the application. - Updated health check configuration to include success recovery thresholds. - Expanded error handling with new error codes for health check failures. - Added new service routes for managing health checks, including creation and listing. - Improved health check service logic to track consecutive successes and failures. This commit enhances the health check capabilities, providing better monitoring and management of service health.
114 lines
3.2 KiB
TypeScript
114 lines
3.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
selectActiveIpsByMode,
|
|
type LbIpRow,
|
|
type LbTargetConfig,
|
|
} from "../src/services/service-config-service.js";
|
|
|
|
function row(
|
|
ip: string,
|
|
opts: Partial<Pick<LbIpRow, "weight" | "priority" | "health">> = {},
|
|
): LbIpRow {
|
|
return {
|
|
ip,
|
|
weight: opts.weight ?? 1,
|
|
priority: opts.priority ?? 1,
|
|
health: opts.health ?? "up",
|
|
};
|
|
}
|
|
|
|
describe("selectActiveIpsByMode", () => {
|
|
it("round_robin returns all healthy ips, falls back to all if none healthy", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "round_robin",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { health: "up" }),
|
|
row("2.2.2.2", { health: "down" }),
|
|
row("3.3.3.3", { health: "up" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows).sort()).toEqual([
|
|
"1.1.1.1",
|
|
"3.3.3.3",
|
|
]);
|
|
});
|
|
|
|
it("round_robin returns all ips when none checked (unknown)", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "round_robin",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { health: "unknown" }),
|
|
row("2.2.2.2", { health: "unknown" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows).sort()).toEqual([
|
|
"1.1.1.1",
|
|
"2.2.2.2",
|
|
]);
|
|
});
|
|
|
|
it("failover returns only min-priority healthy ips", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "failover",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { priority: 1, health: "up" }),
|
|
row("2.2.2.2", { priority: 2, health: "up" }),
|
|
row("3.3.3.3", { priority: 1, health: "down" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows)).toEqual(["1.1.1.1"]);
|
|
});
|
|
|
|
it("failover falls back to min-priority ip among all when none healthy", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "failover",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { priority: 3, health: "down" }),
|
|
row("2.2.2.2", { priority: 1, health: "down" }),
|
|
row("3.3.3.3", { priority: 2, health: "down" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows)).toEqual(["2.2.2.2"]);
|
|
});
|
|
|
|
it("weighted returns all healthy ips (one A per ip; weights stored for display)", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "weighted",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { weight: 3, health: "up" }),
|
|
row("2.2.2.2", { weight: 1, health: "up" }),
|
|
row("3.3.3.3", { weight: 2, health: "down" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows).sort()).toEqual([
|
|
"1.1.1.1",
|
|
"2.2.2.2",
|
|
]);
|
|
});
|
|
|
|
it("round_robin excludes unknown when another ip is up", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "round_robin",
|
|
health_check_enabled: true,
|
|
};
|
|
const rows = [
|
|
row("1.1.1.1", { health: "up" }),
|
|
row("2.2.2.2", { health: "unknown" }),
|
|
];
|
|
expect(selectActiveIpsByMode(config, rows)).toEqual(["1.1.1.1"]);
|
|
});
|
|
|
|
it("returns empty array for no rows", () => {
|
|
const config: LbTargetConfig = {
|
|
lb_mode: "round_robin",
|
|
health_check_enabled: true,
|
|
};
|
|
expect(selectActiveIpsByMode(config, [])).toEqual([]);
|
|
});
|
|
});
|