Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion modules/bmc/ssh.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
require 'ipaddr'
require 'resolv'

module Proxy
module BMC
class SSH < Base
Expand Down Expand Up @@ -62,7 +65,15 @@ def powercycle
end

def ip
host
IPAddr.new(host).to_s
rescue IPAddr::InvalidAddressError
begin
logger.debug("Host '#{host}' is not an IP address, attempting to resolve as FQDN.")
Resolv.getaddress(host)
rescue Resolv::ResolvError => e
logger.warn("Failed to resolve FQDN '#{host}': #{e.class} - #{e.message}")
''
end
end

# the following are dummy implementations
Expand Down
32 changes: 29 additions & 3 deletions test/bmc/bmc_api_ssh_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
require 'json'
require 'bmc/bmc_api'
require 'bmc/ssh'
require 'bmc/bmc_plugin'

ENV['RACK_ENV'] = 'test'

Expand Down Expand Up @@ -47,10 +48,35 @@ def test_powercycle
assert_equal 200, last_response.status
end

def test_lan_ip
Proxy::BMC::SSH.any_instance.expects(:ip).returns('')
get "/#{@host}/lan/ip", @args
def test_lan_ip_when_host_is_ip
host = "192.168.1.1"
get "/#{host}/lan/ip", @args
assert_equal 200, last_response.status
assert_equal host, JSON.parse(last_response.body)["result"]
end

def test_lan_ip_when_host_is_ipv6
host = '2001:db8::1'
get "/#{host}/lan/ip", @args
assert_equal 200, last_response.status
assert_equal host, JSON.parse(last_response.body)['result']
end

def test_lan_ip_when_host_is_resolvable_fqdn
host = "resolvable.example.com"
resolved_ip = "192.168.1.2"
Resolv.expects(:getaddress).with(host).returns(resolved_ip)
get "/#{host}/lan/ip", @args
assert_equal 200, last_response.status
assert_equal resolved_ip, JSON.parse(last_response.body)["result"]
end

def test_lan_ip_when_host_is_unresolvable_fqdn
host = "unresolvable.example.com"
Resolv.expects(:getaddress).with(host).raises(Resolv::ResolvError.new("no address for #{host}"))
get "/#{host}/lan/ip", @args
assert_equal 200, last_response.status
assert_equal "", JSON.parse(last_response.body)["result"]
end

def test_lan_mac
Expand Down