{ lib, config, ... }:
with lib;
let
interface =
{ name, config, ... }:
let
intf-name = name;
unit =
{ name, config, ... }:
{
options = {
enable = mkEnableOption "the logical interface ${intf-name}.${name}" // {
default = true;
};
family = {
ethernet-switching = {
enable = mkEnableOption "the ethernet on the logical interface ${intf-name}.${name}";
interface-mode = mkOption {
type = types.nullOr (
types.enum [
"trunk"
"access"
]
);
default = null;
};
vlans = mkOption {
type = types.listOf (types.either types.str types.ints.unsigned);
default = [ ];
};
};
#TODO : DHCP
inet = {
enable = mkEnableOption "the IPv4 configuration of the logical interface ${intf-name}.${name}";
address = mkOption {
type = types.listOf types.str;
default = [ ];
};
};
inet6 = {
enable = mkEnableOption "the IPv6 configuration of the logical interface ${intf-name}.${name}";
address = mkOption {
type = types.listOf types.str;
default = [ ];
};
};
};
xml = mkOption {
type = types.str;
visible = false;
readOnly = true;
};
};
config.xml =
let
members = map (
vlan: "${builtins.toString vlan}"
) config.family.ethernet-switching.vlans;
eth = optionalString config.family.ethernet-switching.enable ''
${config.family.ethernet-switching.interface-mode}
${builtins.concatStringsSep "" members}
default
'';
addr4 = map (addr: "${addr}") config.family.inet.address;
inet = optionalString config.family.inet.enable ''
${builtins.concatStringsSep "" addr4}
'';
addr6 = map (addr: "${addr}") config.family.inet6.address;
inet6 = optionalString config.family.inet6.enable ''
${builtins.concatStringsSep "" addr6}
'';
in
''
${name}
${optionalString (!config.enable) ""}
${eth}${inet}${inet6}
'';
};
in
{
options = {
enable = mkEnableOption "the physical interface ${intf-name}";
unit = mkOption {
type = types.attrsOf (types.submodule unit);
default = { };
};
xml = mkOption {
type = types.str;
visible = false;
readOnly = true;
};
};
config.xml =
let
units = attrsets.mapAttrsToList (_: unit: unit.xml) config.unit;
in
''
${name}
${optionalString (!config.enable) ""}
${builtins.concatStringsSep "" units}
'';
};
in
{
options = {
interfaces = mkOption { type = types.attrsOf (types.submodule interface); };
netconf.xmls.interfaces = mkOption {
type = types.str;
visible = false;
readOnly = true;
};
};
config.netconf.xmls.interfaces = ''
${builtins.concatStringsSep "" (attrsets.mapAttrsToList (_: intf: intf.xml) config.interfaces)}
'';
}