diff --git a/data/grid5000/sites/lyon/network_equipments/salome.json b/data/grid5000/sites/lyon/network_equipments/salome.json index 08c2e5dc47edf6e9bd29514a38a1b13c6571c286..e16786b8d89ca5f823e499face7b854793a09565 100644 --- a/data/grid5000/sites/lyon/network_equipments/salome.json +++ b/data/grid5000/sites/lyon/network_equipments/salome.json @@ -17,6 +17,7 @@ "kind": "router", "port": "0:24", "snmp_name": "GigabitEthernet1", + "ssh_name": "1", "uid": "gw" }, { @@ -63,24 +64,28 @@ "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet22", + "ssh_name": "22", "uid": "sagittaire-2" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet23", + "ssh_name": "23", "uid": "sagittaire-3" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet24", + "ssh_name": "24", "uid": "sagittaire-4" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet25", + "ssh_name": "25", "uid": "sagittaire-5" }, { @@ -91,36 +96,42 @@ "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet28", + "ssh_name": "28", "uid": "sagittaire-11" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet29", + "ssh_name": "29", "uid": "sagittaire-12" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet30", + "ssh_name": "30", "uid": "sagittaire-13" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet31", + "ssh_name": "31", "uid": "sagittaire-14" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet32", + "ssh_name": "32", "uid": "sagittaire-15" }, { "kind": "node", "port": "eth1", "snmp_name": "GigabitEthernet33", + "ssh_name": "33", "uid": "sagittaire-16" } ], diff --git a/data/grid5000/sites/rennes/network_equipments/gw.json b/data/grid5000/sites/rennes/network_equipments/gw.json index 114a8cb7f9494370dab405d03f88ff7cfa7920f5..ca8c5cd3b34de6852362d3a64ea48e9a39342057 100644 --- a/data/grid5000/sites/rennes/network_equipments/gw.json +++ b/data/grid5000/sites/rennes/network_equipments/gw.json @@ -4,31 +4,36 @@ ], "backplane_bps": 1440000000000, "channels": { - "lag 1": { + "lag1": { "kind": "switch", - "port": "lag 1", + "port": "lag1", "rate": 200000000000, + "ssh_name": "lag 1", "uid": "sw-1" }, - "lag 2": { + "lag2": { "kind": "server", - "port": "lag 2", + "port": "lag2", "rate": 50000000000, + "ssh_name": "lag 2", "uid": "srv-data" }, - "lag 3": { + "lag3": { "kind": "switch", "port": "port-channel286", "rate": 20000000000, + "ssh_name": "lag 3", "uid": "swcore-01-rba" }, - "lag 4": { + "lag4": { "kind": "server", - "port": "lag 4", + "port": "lag4", "rate": 50000000000, + "ssh_name": "lag 4", "uid": "srv-data2" } }, + "channels_ssh_pattern": "#{/\\D+/.match(\"%CHANNEL%\")} #{/\\d+/.match(\"%CHANNEL%\")}", "ip": "172.16.111.254", "ip6": "2001:660:4406:700::ffff:ffff", "kind": "router", @@ -99,12 +104,12 @@ { "kind": "channel", "snmp_name": "1/1/29", - "uid": "lag 4" + "uid": "lag4" }, { "kind": "channel", "snmp_name": "1/1/30", - "uid": "lag 4" + "uid": "lag4" }, { "kind": "server", @@ -126,12 +131,12 @@ { "kind": "channel", "snmp_name": "1/1/35", - "uid": "lag 2" + "uid": "lag2" }, { "kind": "channel", "snmp_name": "1/1/36", - "uid": "lag 2" + "uid": "lag2" }, { }, @@ -174,25 +179,25 @@ "kind": "channel", "rate": 10000000000, "snmp_name": "1/1/47", - "uid": "lag 3" + "uid": "lag3" }, { "kind": "channel", "rate": 10000000000, "snmp_name": "1/1/48", - "uid": "lag 3" + "uid": "lag3" }, { "kind": "channel", "rate": 100000000000, "snmp_name": "1/1/49", - "uid": "lag 1" + "uid": "lag1" }, { "kind": "channel", "rate": 100000000000, "snmp_name": "1/1/50", - "uid": "lag 1" + "uid": "lag1" } ], "rate": 25000000000, diff --git a/data/grid5000/sites/rennes/network_equipments/sw-1.json b/data/grid5000/sites/rennes/network_equipments/sw-1.json index d3e20c4ad259f409e876e7f251e5a783f35a3edd..d41cab7ba8080755d760db81ab2d114b22bba004 100644 --- a/data/grid5000/sites/rennes/network_equipments/sw-1.json +++ b/data/grid5000/sites/rennes/network_equipments/sw-1.json @@ -1,9 +1,9 @@ { "backplane_bps": 1440000000000, "channels": { - "lag 1": { + "lag1": { "kind": "switch", - "port": "lag 1", + "port": "lag1", "rate": 200000000000, "uid": "gw" } @@ -247,13 +247,13 @@ "kind": "channel", "rate": 100000000000, "snmp_name": "1/1/49", - "uid": "lag 1" + "uid": "lag1" }, { "kind": "channel", "rate": 100000000000, "snmp_name": "1/1/50", - "uid": "lag 1" + "uid": "lag1" } ], "rate": 25000000000, diff --git a/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json b/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json index da9e652d2d5909b7d231b155476e908b7a45d20e..400c54178ec7a6873de0616d3b60043d5b18a836 100644 --- a/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json +++ b/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json @@ -2,7 +2,7 @@ "channels": { "port-channel286": { "kind": "router", - "port": "lag 3", + "port": "lag3", "rate": 20000000000, "uid": "gw" }, diff --git a/data/grid5000/sites/toulouse/network_equipments/gw.json b/data/grid5000/sites/toulouse/network_equipments/gw.json index 9d61d806337590d72fff047e2e8cb34460dc3799..6ae7e1099a8acb0c35721b1b7a1e1bc2b4f4d454 100644 --- a/data/grid5000/sites/toulouse/network_equipments/gw.json +++ b/data/grid5000/sites/toulouse/network_equipments/gw.json @@ -3,19 +3,22 @@ "gw-toulouse" ], "channels": { - "lag 1": { + "lag1": { "kind": "server", "port": "port-channel1", "rate": 20000000000, + "ssh_name": "lag 1", "uid": "nfs" }, - "lag 2": { + "lag2": { "kind": "switch", "port": "lacp key 1", "rate": 20000000000, + "ssh_name": "lag 2", "uid": "sw-estats" } }, + "channels_ssh_pattern": "#{/\\D+/.match(\"%CHANNEL%\")} #{/\\d+/.match(\"%CHANNEL%\")}", "ip": "172.16.127.254", "ip6": "2001:660:4406:900::ffff:ffff", "kind": "router", @@ -99,12 +102,12 @@ { "kind": "channel", "snmp_name": "1/1/15", - "uid": "lag 2" + "uid": "lag2" }, { "kind": "channel", "snmp_name": "1/1/16", - "uid": "lag 2" + "uid": "lag2" }, { "kind": "server", @@ -119,12 +122,12 @@ { "kind": "channel", "snmp_name": "1/1/19", - "uid": "lag 1" + "uid": "lag1" }, { "kind": "channel", "snmp_name": "1/1/20", - "uid": "lag 1" + "uid": "lag1" } ], "rate": 10000000000, diff --git a/data/grid5000/sites/toulouse/network_equipments/sw-estats.json b/data/grid5000/sites/toulouse/network_equipments/sw-estats.json index a05ab575cb158f31eff7667a01b989c3ea12eb88..0d9d0a591040787895da9e87a01caba219371065 100644 --- a/data/grid5000/sites/toulouse/network_equipments/sw-estats.json +++ b/data/grid5000/sites/toulouse/network_equipments/sw-estats.json @@ -5,7 +5,7 @@ "channels": { "lacp key 1": { "kind": "router", - "port": "lag 2", + "port": "lag2", "rate": 20000000000, "uid": "gw" } diff --git a/input/grid5000/sites/rennes/networks/gw-rennes.yaml b/input/grid5000/sites/rennes/networks/gw-rennes.yaml index 9a6f4ba1940e6f80ade9ba60b4f0d40965b54468..d8cf8e3071ef640a24639a66f0ca314c196e35e2 100644 --- a/input/grid5000/sites/rennes/networks/gw-rennes.yaml +++ b/input/grid5000/sites/rennes/networks/gw-rennes.yaml @@ -70,10 +70,10 @@ gw: rate: 25000000000 ports: 29: - uid: lag 4 + uid: lag4 kind: channel 30: - uid: lag 4 + uid: lag4 kind: channel 31: uid: srv-1 @@ -85,10 +85,10 @@ gw: uid: srv-3 kind: server 35: - uid: lag 2 + uid: lag2 kind: channel 36: - uid: lag 2 + uid: lag2 kind: channel 43: uid: sw-adm-1 @@ -108,39 +108,40 @@ gw: kind: backbone rate: 10000000000 47: - uid: lag 3 + uid: lag3 kind: channel rate: 10000000000 48: - uid: lag 3 + uid: lag3 kind: channel rate: 10000000000 49: - uid: lag 1 + uid: lag1 kind: channel rate: 100000000000 50: - uid: lag 1 + uid: lag1 kind: channel rate: 100000000000 + channels_ssh_pattern: '#{/\D+/.match("%CHANNEL%")} #{/\d+/.match("%CHANNEL%")}' channels: - lag 1: + lag1: kind: switch rate: 200000000000 uid: sw-1 - port: lag 1 - lag 2: + port: lag1 + lag2: kind: server rate: 50000000000 uid: srv-data - port: lag 2 - lag 3: + port: lag2 + lag3: kind: switch rate: 20000000000 uid: swcore-01-rba port: port-channel286 - lag 4: + lag4: kind: server rate: 50000000000 uid: srv-data2 - port: lag 4 + port: lag4 diff --git a/input/grid5000/sites/rennes/networks/sw-1.yaml b/input/grid5000/sites/rennes/networks/sw-1.yaml index 5eec6ef290ab5a29d69035348f8de931571c80a7..defd51c5cdd9e1c39d166351766c6e6f1e63e9c2 100644 --- a/input/grid5000/sites/rennes/networks/sw-1.yaml +++ b/input/grid5000/sites/rennes/networks/sw-1.yaml @@ -80,16 +80,16 @@ sw-1: 32: uid: paradoxe-32 49: - uid: lag 1 + uid: lag1 kind: channel rate: 100000000000 50: - uid: lag 1 + uid: lag1 kind: channel rate: 100000000000 channels: - lag 1: + lag1: kind: switch rate: 200000000000 uid: gw - port: lag 1 + port: lag1 diff --git a/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml b/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml index ca49c4c379b3ce5f8c15fc8e2c8635a0001f46a9..2aea7f2d408d08e2f4ac3527bda9c094435afee5 100644 --- a/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml +++ b/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml @@ -51,5 +51,5 @@ swcore-01-rba: port-channel286: uid: gw kind: router - port: lag 3 + port: lag3 rate: 20000000000 diff --git a/input/grid5000/sites/toulouse/networks/gw.yaml b/input/grid5000/sites/toulouse/networks/gw.yaml index 223b052ad845993a22c1e70072bba11b0965f7c1..6258a4cc8da235ea3c86a27b12b7e568c7e9ec37 100644 --- a/input/grid5000/sites/toulouse/networks/gw.yaml +++ b/input/grid5000/sites/toulouse/networks/gw.yaml @@ -79,10 +79,10 @@ gw: 9: montcalm-9 10: montcalm-10 15: - uid: lag 2 + uid: lag2 kind: channel 16: - uid: lag 2 + uid: lag2 kind: channel 17: uid: pve-1 @@ -91,18 +91,19 @@ gw: uid: pve-2 kind: server 19: - uid: lag 1 + uid: lag1 kind: channel 20: - uid: lag 1 + uid: lag1 kind: channel + channels_ssh_pattern: '#{/\D+/.match("%CHANNEL%")} #{/\d+/.match("%CHANNEL%")}' channels: - lag 1: + lag1: uid: nfs kind: server rate: 20000000000 port: port-channel1 - lag 2: + lag2: uid: sw-estats kind: switch rate: 20000000000 diff --git a/input/grid5000/sites/toulouse/networks/sw-estats.yaml b/input/grid5000/sites/toulouse/networks/sw-estats.yaml index 298870592cb9a355fce1242579df4c91057d32f8..1d3d28c1c44f190e9255e19b09a9802fed3925cb 100644 --- a/input/grid5000/sites/toulouse/networks/sw-estats.yaml +++ b/input/grid5000/sites/toulouse/networks/sw-estats.yaml @@ -43,4 +43,4 @@ sw-estats: uid: gw kind: router rate: 20000000000 - port: lag 2 + port: lag2 diff --git a/lib/refrepo/gen/puppet/kavlanngg5k.rb b/lib/refrepo/gen/puppet/kavlanngg5k.rb index 972a5e16fbde823e304302404d3bb580010f152e..8ece2ea077ad75aac149a8c6d1445b0ca4017dad 100644 --- a/lib/refrepo/gen/puppet/kavlanngg5k.rb +++ b/lib/refrepo/gen/puppet/kavlanngg5k.rb @@ -96,25 +96,32 @@ def gen_kavlanapi_g5k_desc(output_path, options) end end -def get_port_name(port_index, port, linecard_index, linecard) - pattern = nil - if linecard.has_key?('kavlan_pattern') - pattern = linecard['kavlan_pattern'] - end - if linecard.has_key?('snmp_pattern') - pattern = linecard['snmp_pattern'] - end - if port.has_key?('snmp_name') - pattern = port['snmp_name'] - end - if linecard.has_key?('ssh_pattern') - pattern = linecard['ssh_pattern'] +# compute the port name for NGS ssh commands, based on device, +# linecard, port, using refapi ssh/kavlan/snmp patterns (with +# %LINECARD%, %PORT% substitutions), and interpolating the string for +# ssh_pattern +def get_port_name(_refapi, site_name, device_name, linecard_index, linecard, port_index, port) + # try different possibilities, by order of precedence + if port.has_key?('ssh_name') + return port['ssh_name'] + elsif port.has_key?('snmp_name') + return port['snmp_name'] + elsif linecard.has_key?('kavlan_pattern') + return get_port_pattern_subst(linecard['kavlan_pattern'], linecard_index, port_index) + else + puts "WARNING #{site_name}/#{device_name}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname, fallback to port's uid: #{port['uid']}" + return port['uid'] end - if pattern - port_name = pattern.sub("%LINECARD%",linecard_index.to_s).sub("%PORT%",port_index.to_s) - return port_name +end + +# compute the channel name for NGS ssh commands, based on device, +# using refapi channel_ssh_pattern (with %CHANNEL% substitution), and +# interpolating the string +def get_channel_name(_refapi, _site_name, _device_name, channel, channel_name) + if channel.has_key?('ssh_name') + return channel['ssh_name'] else - return nil + return channel_name end end @@ -126,6 +133,8 @@ def gen_sites_ngs_device_configs(input_path, output_path, options) refapi = load_data_hierarchy network_devices_data = YAML::load(File.read(input_path)) network_devices_data.delete_if { |s| !options[:sites].include? s } + + # match devices in kavlanng conf and in refapi network_devices_data.each do |site, site_data| if options[:verbose] puts " #{site}" @@ -170,59 +179,61 @@ def gen_sites_ngs_device_configs(input_path, output_path, options) site_ngs_conf.puts("ngs_save_configuration = False") site_ngs_conf.puts("ngs_manage_vlans = True") site_ngs_conf.puts("ngs_physical_networks = g5k, #{site}") + + # trunk ports ngs_trunk_ports = [] + + # from ports if refapi['sites'][site]['network_equipments'][refapi_device].has_key? 'linecards' refapi['sites'][site]['network_equipments'][refapi_device]['linecards'].each_with_index do |lc, lc_index| if lc.has_key?('ports') lc['ports'].each_with_index do |port, port_index| if port.has_key? 'trunk' if port['trunk'] - portname = get_port_name(port_index, port, lc_index, lc) - if not portname - puts "ERROR #{site}/#{refapi_device}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname" - else - if options[:verbose] - puts " trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}" - end - ngs_trunk_ports.push portname + portname = get_port_name(refapi, site, refapi_device, lc_index, lc, port_index, port) + if options[:verbose] + puts " trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}" end + ngs_trunk_ports.push portname end elsif port.has_key? 'kind' if TRUNK_KINDS.include? port['kind'] - portname = get_port_name(port_index, port, lc_index, lc) - if not portname - puts "ERROR #{site}/#{refapi_device}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname" - else - if options[:verbose] - puts " trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}" - end - ngs_trunk_ports.push portname + portname = get_port_name(refapi, site, refapi_device, lc_index, lc, port_index, port) + if options[:verbose] + puts " trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}" end + ngs_trunk_ports.push portname end end end end end end + + # from channels if refapi['sites'][site]['network_equipments'][refapi_device].has_key? 'channels' refapi['sites'][site]['network_equipments'][refapi_device]['channels'].each do |channelname, channel| if channel.has_key? 'trunk' if channel['trunk'] + actual_channel_name = get_channel_name(refapi, site, refapi_device, channel, channelname) if options[:verbose] - puts " trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{channelname}" + puts " trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{actual_channel_name}" end - ngs_trunk_ports.push channelname + ngs_trunk_ports.push actual_channel_name end elsif channel.has_key? 'kind' if TRUNK_KINDS.include? channel['kind'] + actual_channel_name = get_channel_name(refapi, site, refapi_device, channel, channelname) if options[:verbose] - puts " trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{channelname}" + puts " trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{actual_channel_name}" end - ngs_trunk_ports.push channelname + ngs_trunk_ports.push actual_channel_name end end end end + + # additional trunk ports if device_data.has_key? 'additional_trunk_ports' device_data['additional_trunk_ports'].each do |additional_trunk_port| if options[:verbose] diff --git a/lib/refrepo/input_loader.rb b/lib/refrepo/input_loader.rb index 7c5860d1665b3dda4828121a65858c7022c54175..ed1732ee73e2aff1a372792c181d2e84fccdf5e6 100644 --- a/lib/refrepo/input_loader.rb +++ b/lib/refrepo/input_loader.rb @@ -788,6 +788,28 @@ def add_gpu_information(h) end end +def get_port_pattern_subst(pattern, linecard_index, port_index) + return pattern.gsub("%LINECARD%", linecard_index.to_s).sub("%PORT%", port_index.to_s) +end + +def get_port_pattern_interpolation(pattern, linecard_index, port_index) + # reimplement with eval the ruby string interpolation mechanism (#{}) + # WARNING: it means that code from the input yaml will be executed (thus input yamls may be used as attack vectors) + #return eval('"' + get_port_pattern_subst(pattern, linecard_index, port_index).gsub(/"/, '\"') + '"') + return eval('"' + get_port_pattern_subst(pattern, linecard_index, port_index) + '"') +end + +def get_channel_pattern_subst(pattern, channel_name) + return pattern.gsub("%CHANNEL%", channel_name) +end + +def get_channel_pattern_interpolation(pattern, channel_name) + # reimplement with eval the ruby string interpolation mechanism (#{}) + # WARNING: it means that code from the input yaml will be executed (thus input yamls may be used as attack vectors) + #return eval('"' + get_channel_pattern_subst(pattern, channel_name).gsub(/"/, '\"') + '"') + return eval('"' + get_channel_pattern_subst(pattern, channel_name) + '"') +end + def complete_one_network_equipment(network_uid, network) network["type"] = "network_equipment" network["uid"] = network_uid @@ -810,10 +832,16 @@ def complete_one_network_equipment(network_uid, network) port['snmp_pattern'] = linecard['snmp_pattern'] end if port['snmp_pattern'] - port['snmp_name'] = port['snmp_pattern'] - .sub('%LINECARD%',linecard_index.to_s).sub('%PORT%',port_index.to_s) + port['snmp_name'] = get_port_pattern_subst(port['snmp_pattern'], linecard_index, port_index) port.delete('snmp_pattern') end + if port['ssh_pattern'].nil? and linecard['ssh_pattern'] + port['ssh_pattern'] = linecard['ssh_pattern'] + end + if port['ssh_pattern'] + port['ssh_name'] = get_port_pattern_interpolation(port['ssh_pattern'], linecard_index, port_index) + port.delete('ssh_pattern') + end if ((!linecard['kind'].nil? && port['kind'].nil? && linecard['kind'] == 'node') || @@ -830,6 +858,19 @@ def complete_one_network_equipment(network_uid, network) linecards_array[linecard_index] = linecard end network["linecards"] = linecards_array.map{|l| l || {}} + + # Channels + if network.key?('channels') + network['channels'].each do |channel_name, channel| + if channel['ssh_pattern'].nil? and network['channels_ssh_pattern'] + channel['ssh_pattern'] = network['channels_ssh_pattern'] + end + if channel['ssh_pattern'] + channel['ssh_name'] = get_channel_pattern_interpolation(channel['ssh_pattern'], channel_name) + channel.delete('ssh_pattern') + end + end + end end def complete_network_equipments(h) diff --git a/lib/refrepo/valid/input/lib/custom_validators.rb b/lib/refrepo/valid/input/lib/custom_validators.rb index 475324e7b529ab5f6507a8f55a5bc942421d46c5..1eff15fb3df81a4f4cbd4cdbb9c7d3c0b048ecb6 100644 --- a/lib/refrepo/valid/input/lib/custom_validators.rb +++ b/lib/refrepo/valid/input/lib/custom_validators.rb @@ -15,6 +15,7 @@ class HashValidator::Validator::LinecardPortValidator < HashValidator::Validator 'snmp_pattern' => HashValidator.optional('string'), 'snmp_name' => HashValidator.optional('string'), 'kavlan_pattern' => HashValidator.optional('string'), + 'ssh_name' => HashValidator.optional('string'), } end diff --git a/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml b/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml index 8e909d9187b2b3d5dd6dfa38d6bf00c9510f4c2b..06567195f5bc665ffbb90b7dcfe647db2c5b7121 100644 --- a/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml +++ b/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml @@ -39,6 +39,7 @@ linecards: port: optional_string ports: <optional_array>: linecard_port +channels_ssh_pattern: optional_string channels: <optional_hash>: <multi>: @@ -47,6 +48,7 @@ channels: kind: string rate: integer trunk: optional_boolean + ssh_name: optional_string metrics: optional_array uid: string type: string