refactor #1
1 changed files with 128 additions and 0 deletions
128
junos/interfaces.nix
Normal file
128
junos/interfaces.nix
Normal file
|
@ -0,0 +1,128 @@
|
|||
{ 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: "<members>${builtins.toString vlan}</members>"
|
||||
) config.family.ethernet-switching.vlans;
|
||||
eth = optionalString config.family.ethernet-switching.enable ''
|
||||
<ethernet-switching>
|
||||
<interface-mode>${config.family.ethernet-switching.interface-mode}</interface-mode>
|
||||
<vlan>${builtins.concatStringsSep "" members}</vlan>
|
||||
<storm-control><profile-name>default</profile-name></storm-control>
|
||||
</ethernet-switching>
|
||||
'';
|
||||
|
||||
addr4 = map (addr: "<name>${addr}</name>") config.family.inet.address;
|
||||
inet = optionalString config.family.inet.enable ''
|
||||
<inet>
|
||||
<address>${builtins.concatStringsSep "" addr4}</address>
|
||||
</inet>
|
||||
'';
|
||||
|
||||
addr6 = map (addr: "<name>${addr}</name>") config.family.inet6.address;
|
||||
inet6 = optionalString config.family.inet6.enable ''
|
||||
<inet6>
|
||||
<address>${builtins.concatStringsSep "" addr6}</address>
|
||||
</inet6>
|
||||
'';
|
||||
in
|
||||
''
|
||||
<unit>
|
||||
<name>${name}</name>
|
||||
${optionalString (!config.enable) "<disable/>"}
|
||||
<family>
|
||||
${eth}${inet}${inet6}
|
||||
</family>
|
||||
</unit>'';
|
||||
};
|
||||
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
|
||||
''
|
||||
<interface>
|
||||
<name>${name}</name>
|
||||
${optionalString (!config.enable) "<disable/>"}
|
||||
${builtins.concatStringsSep "" units}
|
||||
</interface>
|
||||
'';
|
||||
};
|
||||
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 = ''
|
||||
<interfaces operation="replace">
|
||||
${
|
||||
builtins.concatStringsSep "" (attrsets.mapAttrsToList (_: intf: intf.xml) config.interfaces)
|
||||
}
|
||||
</interfaces>
|
||||
'';
|
||||
}
|
Loading…
Reference in a new issue