diff --git a/Gemfile b/Gemfile index 778247058e8337ae0858c91798bb8e286bf4e728..06fb443cd683164ece14fec5ba4aab703a9156d7 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ source :rubygems gem 'json_pure', '~> 1.5' -gem 'net-ssh' \ No newline at end of file +gem 'net-ssh' diff --git a/data/grid5000/sites/orsay/orsay.json b/data/grid5000/sites/orsay/orsay.json index 200637b60b2683e443f4d438c20ebcdd050076ad..8c1413ed6780043602b38972b5c3ff13dbb62591 100755 --- a/data/grid5000/sites/orsay/orsay.json +++ b/data/grid5000/sites/orsay/orsay.json @@ -1,4 +1,14 @@ { + "description": "", + "email_contact": null, + "latitude": 48.7, + "location": "Orsay, France", + "longitude": 2.2, + "name": "Orsay", + "security_contact": null, + "sys_admin_contact": null, "type": "site", - "uid": "orsay" + "uid": "orsay", + "user_support_contact": null, + "web": null } \ No newline at end of file diff --git a/generators/input/orsay-gdx.rb b/generators/input/orsay-gdx.rb index 30c062d747600f3fa39f89212c703ea0284bb93b..a86ec844d54e8e085eb7d24c7fd3a20896d0211e 100644 --- a/generators/input/orsay-gdx.rb +++ b/generators/input/orsay-gdx.rb @@ -10,9 +10,8 @@ def get_switch_for_node(switches,id) lookup('orsay-network',"switch-nil").merge({:nodes=>[0,0]}) end -site :orsay do |site_uid| +site :orsay, {:discard_content => true} do |site_uid| ssh = Net::SSH.start("frontend.#{site_uid}.grid5000.fr","g5kadmin") - cluster :gdx do |cluster_uid| model "IBM eServer 326m" created_at nil diff --git a/generators/input/orsay-netgdx.rb b/generators/input/orsay-netgdx.rb index c2d119342b8242b0c9a1ca04f217e6f9b430ae34..10a32e7710454ab93626cbe8eac4c1274841fecf 100644 --- a/generators/input/orsay-netgdx.rb +++ b/generators/input/orsay-netgdx.rb @@ -1,5 +1,16 @@ require 'net/ssh' -site :orsay do |site_uid| + +def switch_match_node(switch,id); switch != nil and (switch[:nodes][0] <= id and id <= switch[:nodes][1]); end +def get_switch_for_node(switches,id) + switches.each{|k,v| + arr = v.split(",").map{|s| s.to_i} + next if id < arr[0] or arr[1] < id + return lookup('orsay-network',k).merge({:nodes=>arr}) + } + lookup('orsay-network',"switch-nil").merge({:nodes=>[0,0]}) +end + +site :orsay, {:discard_content => true} do |site_uid| ssh = Net::SSH.start("frontend.#{site_uid}.grid5000.fr","g5kadmin") cluster :netgdx do |cluster_uid| diff --git a/generators/input/orsay.rb b/generators/input/orsay.rb index e7f6ea52d8ac5920abfdccf9df426350c21f9a27..634b6383bce4dfdaa04247201efd6991c907af40 100755 --- a/generators/input/orsay.rb +++ b/generators/input/orsay.rb @@ -1,6 +1,6 @@ site :orsay do |site_uid| name "Orsay" - location "Orsay, France" + location "Orsay, France" web description "" latitude 48.7000 diff --git a/generators/lib/g5k_generator.rb b/generators/lib/g5k_generator.rb index 21eab7af9d058dbafb71943ac69112021e2b200b..ac3bd9ac3fee8b88ea0cbda90b492f971f340828 100755 --- a/generators/lib/g5k_generator.rb +++ b/generators/lib/g5k_generator.rb @@ -59,6 +59,48 @@ module G5K def method_missing(method, *args) @context.recursive_merge!(method.to_sym => args.first) end + + # Remotly execute commands, and retrieve stdout, stderr, exit code and exit signal. + def ssh_exec!(ssh, command) + stdout_data = "" + stderr_data = "" + exit_code = nil + exit_signal = nil + ssh.open_channel do |channel| + channel.exec(command) do |ch, success| + unless success + abort "FAILED: couldn't execute command (ssh.channel.exec)" + end + channel.on_data do |ch,data| + stdout_data+=data + end + + channel.on_extended_data do |ch,type,data| + stderr_data+=data + end + + channel.on_request("exit-status") do |ch,data| + exit_code = data.read_long + end + + channel.on_request("exit-signal") do |ch, data| + exit_signal = data.read_long + end + end + end + ssh.loop + [stdout_data, stderr_data, exit_code, exit_signal] + end + + # Get the IP address corresponding to the host fqdn throught ssh channel + def dns_lookup_through_ssh(ssh,fqdn) + results = ssh_exec! ssh, "host #{fqdn}" + if results[2] == 0 + results[0].split(" ").reverse[0] + else + fail "Failed to get ip address of '#{fqdn}' : #{results[1]}" + end + end def dns_lookup(network_address) Resolv.getaddress(network_address) @@ -93,6 +135,22 @@ module G5K raise ArgumentError, "Cannot fetch the values for '#{keys.inspect}' in the input file '#{filename}'. The config files you gave to me are: '#{config.keys.inspect}'." end end + + # This method is used exclusivly for environments. Example: + # environment 'squeeze-x64-xen-0.8' do + # available_on %w{bordeaux grenoble lille lyon nancy orsay rennes sophia toulouse} + # end + def available_on(sites_uid) + env_uid = @context[:uid] + old_context = @context + @context = @data + sites_uid.each{|site_uid| + site site_uid.to_sym, {:discard_content => true} do + environment "#{env_uid}", :refer_to => "grid5000/environments/#{env_uid}" + end + } + @context = old_context + end # This doesn't work with Ruby < 1.8.7. Replaced by a call to build_context (see below). # # %w{site cluster environment node service}.each do |method| @@ -136,17 +194,6 @@ module G5K def service(uid, *options, &block) build_context(:services, uid, *options, &block) end - def available_on(sites_uid) - env_uid = @context[:uid] - old_context = @context - @context = @data - sites_uid.each{|site_uid| - site site_uid.to_sym, {:discard_content => true} do - environment "#{env_uid}", :refer_to => "grid5000/environments/#{env_uid}" - end - } - @context = old_context - end def build_context(key, uid, *options, &block) type = key.to_s.chop uid = uid.to_s