diff --git a/default.nix b/default.nix index a479d6b..61bd20a 100644 --- a/default.nix +++ b/default.nix @@ -55,7 +55,7 @@ let }; modules = [ ./junos - ./ex2300.nix + ./dgn-module.nix hive_mod module_inst ]; diff --git a/dgn-module.nix b/dgn-module.nix index d4164ec..616d9d5 100644 --- a/dgn-module.nix +++ b/dgn-module.nix @@ -2,36 +2,67 @@ with lib; let intf-mod = - { name, ... }: + { name, config, ... }: { options = { - enable = mkEnableOption "The interface ${name}."; - poe = mkEnableOption "The PoE on interface ${name}."; + enable = mkEnableOption "this interface" // { + default = config.inet.enable || config.inet6.enable || config.ethernet-switching.enable; + defaultText = ''config.inet.enable || config.inet6.enable || config.ethernet-switching.enable''; + }; + poe = mkEnableOption "the PoE on this interface"; ethernet-switching = { - enable = mkEnableOption "The ethernet switching on interface ${name}."; + enable = mkEnableOption "the ethernet switching on this interface" // { + default = config.ethernet-switching.interface-mode != null; + defaultText = ''config.ethernet-switching.interface-mode != null''; + }; interface-mode = mkOption { - type = types.enum [ - "trunk" - "access" - ]; + type = types.nullOr ( + types.enum [ + "trunk" + "access" + ] + ); + default = null; + description = '' + Mode of operation for vlan addressing of this interface. + "trunk" means that the traffic is tagged, "access" means the + traffic is tagged by the switch. + Use null to desactivate the switching. + ''; }; vlans = mkOption { type = types.listOf (types.either types.str types.ints.unsigned); default = [ ]; + description = '' + Vlans that can be used on this interface. + Only one ID should be here for "access" mode of operation. + ''; }; }; inet = { - enable = mkEnableOption "The ipv4 on the interface ${name}."; - address = mkOption { + enable = mkEnableOption "the ipv4 on this interface" // { + default = config.inet.addresses != [ ]; + defaultText = ''config.inet.addresses != [ ]''; + }; + addresses = mkOption { type = types.listOf types.str; default = [ ]; + description = '' + ipv4 addresses of this interface. + ''; }; }; inet6 = { - enable = mkEnableOption "The ipv6 on the interface ${name}."; - address = mkOption { + enable = mkEnableOption "the ipv6 on this interface" // { + default = config.inet6.addresses != [ ]; + defaultText = ''config.inet6.addresses != [ ]''; + }; + addresses = mkOption { type = types.listOf types.str; default = [ ]; + description = '' + ipv6 addresses of this interface. + ''; }; }; }; @@ -44,12 +75,20 @@ in options.dgn-interfaces = mkOption { type = types.attrsOf (types.submodule intf-mod); default = { }; + description = '' + Unified configuration of interfaces adapted to DGNum usage: + - each interfaces have only one logical subinterface; + - enabling ethernet-switching also enable RSTP; + - automatic enabling interface and relevant config family when configuring; + - allows enabling PoE along other configurations. + ''; }; config = { interfaces = mapAttrs (_: intf: { inherit (intf) enable; unit."0".family = { - inherit (intf) inet inet6 ethernet-switching; + inherit (intf) inet inet6; + ethernet-switching = mkIf intf.ethernet-switching.enable intf.ethernet-switching; }; }) cfg; poe.interfaces = filterAttrs ( diff --git a/junos/interfaces.nix b/junos/interfaces.nix index 0b7313a..b83d636 100644 --- a/junos/interfaces.nix +++ b/junos/interfaces.nix @@ -40,7 +40,7 @@ let #TODO : DHCP inet = { enable = mkEnableOption "the IPv4 configuration of this logical interface"; - address = mkOption { + addresses = mkOption { type = types.listOf types.str; default = [ ]; description = '' @@ -50,7 +50,7 @@ let }; inet6 = { enable = mkEnableOption "the IPv6 configuration of this logical interface"; - address = mkOption { + addresses = mkOption { type = types.listOf types.str; default = [ ]; description = '' @@ -78,14 +78,14 @@ let ''; - addr4 = map (addr: "${addr}") config.family.inet.address; + addr4 = map (addr: "${addr}") config.family.inet.addresses; inet = optionalString config.family.inet.enable ''
${builtins.concatStringsSep "" addr4}
''; - addr6 = map (addr: "${addr}") config.family.inet6.address; + addr6 = map (addr: "${addr}") config.family.inet6.addresses; inet6 = optionalString config.family.inet6.enable ''
${builtins.concatStringsSep "" addr6}
diff --git a/netconf-hive.nix b/netconf-hive.nix index 51fa3cf..08eb756 100644 --- a/netconf-hive.nix +++ b/netconf-hive.nix @@ -17,9 +17,8 @@ let "ap-staging".id = 2000; }; AP = { - enable = true; + poe = true; ethernet-switching = { - enable = true; interface-mode = "trunk"; vlans = [ "users" @@ -28,10 +27,8 @@ let }; }; AP-staging = { - enable = true; poe = true; ethernet-switching = { - enable = true; interface-mode = "access"; vlans = [ "ap-staging" ]; }; @@ -40,7 +37,7 @@ in { netcore02 = { deployment.targetHost = "netcore02.dgn"; - imports = [ ./dgn-module.nix ]; + imports = [ ./ex2300.nix ]; vlans = vlansPlan; dgn-interfaces = { # "ge-0/0/0" = AP-staging; @@ -62,88 +59,54 @@ in # "ge-0/0/16" = AP-staging; # "ge-0/0/17" = AP-staging; - "ge-0/0/42" = { - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "trunk"; - vlans = [ "all" ]; - }; + # oob + "ge-0/0/42".ethernet-switching = { + interface-mode = "trunk"; + vlans = [ "all" ]; }; + # AP de test "ge-0/0/43" = AP-staging; - "ge-0/0/46" = { - # uplink oob - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "access"; - vlans = [ 500 ]; - }; + # uplink oob + "ge-0/0/46".ethernet-switching = { + interface-mode = "access"; + vlans = [ 500 ]; }; - "ge-0/0/47" = { - # ilo - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "access"; - vlans = [ "admin-core" ]; - }; + # ilo + "ge-0/0/47".ethernet-switching = { + interface-mode = "access"; + vlans = [ "admin-core" ]; }; - "xe-0/1/0" = { - # router - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "trunk"; - vlans = [ "all" ]; - }; + # router + "xe-0/1/0".ethernet-switching = { + interface-mode = "trunk"; + vlans = [ "all" ]; }; - "xe-0/1/1" = { - # netaccess01 - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "trunk"; - vlans = [ - "users" - "ap-staging" - "admin-ap" - "admin-core" - ]; - }; + # netaccess01 + "xe-0/1/1".ethernet-switching = { + interface-mode = "trunk"; + vlans = [ + "users" + "ap-staging" + "admin-ap" + "admin-core" + ]; }; - "ge-0/1/3" = { - # uplink - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "trunk"; - vlans = [ "uplink-cri" ]; - }; + # uplink + "ge-0/1/3".ethernet-switching = { + interface-mode = "trunk"; + vlans = [ "uplink-cri" ]; }; - "me0" = { - enable = true; - inet = { - enable = true; - address = [ "192.168.42.6/24" ]; - }; - }; - - "irb" = { - enable = true; - inet6 = { - enable = true; - address = [ "fd26:baf9:d250:8000::1001/64" ]; - }; - }; + # management + "me0".inet.addresses = [ "192.168.42.6/24" ]; + "irb".inet6.addresses = [ "fd26:baf9:d250:8000::1001/64" ]; }; }; netaccess01 = { deployment.targetHost = "netaccess01.dgn"; - imports = [ ./dgn-module.nix ]; + imports = [ ./ex2300.nix ]; vlans = vlansPlan; dgn-interfaces = { @@ -154,30 +117,15 @@ in # "ge-0/0/4" = AP-staging; # "ge-0/0/5" = AP-staging; - "xe-0/1/0" = { - enable = true; - ethernet-switching = { - enable = true; - interface-mode = "trunk"; - vlans = [ "all" ]; - }; + # netcore02 + "xe-0/1/0".ethernet-switching = { + interface-mode = "trunk"; + vlans = [ "all" ]; }; - "me0" = { - enable = true; - inet = { - enable = true; - address = [ "192.168.42.6/24" ]; - }; - }; - - "irb" = { - enable = true; - inet6 = { - enable = true; - address = [ "fd26:baf9:d250:8000::2001/64" ]; - }; - }; + # management + "me0".inet.addresses = [ "192.168.42.6/24" ]; + "irb".inet6.addresses = [ "fd26:baf9:d250:8000::2001/64" ]; }; }; }