40 lines
1.3 KiB
Nix
40 lines
1.3 KiB
Nix
let
|
|
lib = import <nixpkgs/lib>;
|
|
net = import ../config/network.nix;
|
|
networkDevicesValidation = import ../validation/network_devices.nix;
|
|
|
|
devices = networkDevicesValidation.getDevices net;
|
|
localDevices = networkDevicesValidation.getLocalDevices devices;
|
|
|
|
reservationRecords = lib.concatLists (lib.mapAttrsToList (deviceName: device:
|
|
if device ? reservation then
|
|
let
|
|
reservation = networkDevicesValidation.validateReservationShape deviceName device.reservation;
|
|
in
|
|
[
|
|
{
|
|
ip-address = device.ip;
|
|
hw-address = reservation.hw_address;
|
|
hostname = reservation.hostname;
|
|
}
|
|
]
|
|
else
|
|
[]
|
|
) localDevices);
|
|
|
|
ensureUnique = fieldName: values:
|
|
let
|
|
uniqueValues = lib.unique values;
|
|
in
|
|
if builtins.length uniqueValues != builtins.length values then
|
|
throw "Duplicate DHCP reservation ${fieldName} found."
|
|
else
|
|
null;
|
|
|
|
_uniqueIps = ensureUnique "ip-address" (map (reservation: reservation.ip-address) reservationRecords);
|
|
_uniqueHwAddresses = ensureUnique "hw-address" (map (reservation: reservation.hw-address) reservationRecords);
|
|
_uniqueHostnames = ensureUnique "hostname" (map (reservation: reservation.hostname) reservationRecords);
|
|
in
|
|
rec {
|
|
reservations = reservationRecords;
|
|
}
|