Browse Source

feat(routes): diff desired vs current routes

pull/2679/head
noderaven 2 weeks ago
parent
commit
7911e9ec84
  1. 20
      src/server/utils/routes.ts
  2. 35
      src/test/unit/routes.spec.ts

20
src/server/utils/routes.ts

@ -130,9 +130,29 @@ function parseDeviceRoutes(output: string): DeviceRoute[] {
return result;
}
/**
* Compute which routes to add and which managed routes to remove. A desired
* route already present in any form (including a kernel route) is not re-added;
* only managed routes are removed.
*/
function diffRoutes(
desired: Set<string>,
current: DeviceRoute[]
): { toAdd: string[]; toDel: string[] } {
const currentCidrs = new Set(current.map((route) => route.cidr));
const toAdd = [...desired].filter((cidr) => !currentCidrs.has(cidr));
const toDel = current
.filter((route) => route.managed && !desired.has(route.cidr))
.map((route) => route.cidr);
return { toAdd, toDel };
}
export const routesTestExports = {
normalizeRoute,
isManageable,
collectDesiredRoutes,
parseDeviceRoutes,
diffRoutes,
};

35
src/test/unit/routes.spec.ts

@ -7,6 +7,7 @@ const {
isManageable,
collectDesiredRoutes,
parseDeviceRoutes,
diffRoutes,
} = routesTestExports;
describe('routes', () => {
@ -144,4 +145,38 @@ describe('routes', () => {
]);
});
});
describe('diffRoutes', () => {
test('adds desired routes that are not present', () => {
const current = [{ cidr: '100.255.1.0/24', managed: false }];
const { toAdd, toDel } = diffRoutes(
new Set(['192.168.120.0/22']),
current
);
expect(toAdd).toEqual(['192.168.120.0/22']);
expect(toDel).toEqual([]);
});
test('removes stale managed routes', () => {
const current = [
{ cidr: '192.168.120.0/22', managed: true },
{ cidr: '10.10.0.0/24', managed: true },
];
const { toAdd, toDel } = diffRoutes(
new Set(['192.168.120.0/22']),
current
);
expect(toAdd).toEqual([]);
expect(toDel).toEqual(['10.10.0.0/24']);
});
test('never removes unmanaged routes', () => {
const current = [{ cidr: '100.255.1.0/24', managed: false }];
const { toDel } = diffRoutes(new Set(), current);
expect(toDel).toEqual([]);
});
test('does not re-add a route already present as a kernel route', () => {
const current = [{ cidr: '100.255.1.0/24', managed: false }];
const { toAdd } = diffRoutes(new Set(['100.255.1.0/24']), current);
expect(toAdd).toEqual([]);
});
});
});

Loading…
Cancel
Save