summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith84@gmail.com>2016-04-15 10:49:08 -0700
committerTim Smith <tsmith84@gmail.com>2016-04-15 10:49:08 -0700
commita9a9690da2c29fc440d016b7a715b178982f548e (patch)
treebe0e490584dd3a8b602727976b73c2edbfad714d
parentb30c75a12b8a78392fc1ac96511b4bcc46e1ee5d (diff)
downloadohai-plugins.tar.gz
Correct the version detection of erlangplugins
We weren't correctly identifying the erlang version. Instead we were detecting the erts version. Old result: ```javascript "erlang": { "version": "7.3", "options": [ "SMP", "ASYNC_THREADS", "HIPE" ], "emulator": "BEAM" }, ``` New result ```javascript "erlang": { "version": "18", "erts_version": "7.3", "nif_version": "2.10", "options": [ "SMP", "ASYNC_THREADS", "HIPE" ], "emulator": "BEAM" }, ```
-rw-r--r--lib/ohai/plugins/erlang.rb45
-rw-r--r--spec/unit/plugins/erlang_spec.rb52
2 files changed, 60 insertions, 37 deletions
diff --git a/lib/ohai/plugins/erlang.rb b/lib/ohai/plugins/erlang.rb
index fc947bee..93295ee7 100644
--- a/lib/ohai/plugins/erlang.rb
+++ b/lib/ohai/plugins/erlang.rb
@@ -18,26 +18,43 @@
Ohai.plugin(:Erlang) do
provides "languages/erlang"
-
depends "languages"
collect_data do
- output = nil
+ begin
+ so = shell_out("erl -eval 'erlang:display(erlang:system_info(otp_release)), erlang:display(erlang:system_info(version)), erlang:display(erlang:system_info(nif_version)), halt().' -noshell")
+ # Sample output:
+ # "18"
+ # "7.3"
+ # "2.10"
+ if so.exitstatus == 0
+ erlang = Mash.new
+ output = so.stdout.split(/\r\n/).map! { |x| x.delete('\\"') }
+ erlang[:version] = output[0]
+ erlang[:erts_version] = output[1]
+ erlang[:nif_version] = output[2]
+ end
+ rescue Ohai::Exceptions::Exec
+ Ohai::Log.debug('Erlang plugin: Could not shell_out "erl -eval \'erlang:display(erlang:system_info(otp_release)), erlang:display(erlang:system_info(version)), erlang:display(erlang:system_info(nif_version)), halt().\' -noshell". Skipping plugin')
+ end
- erlang = Mash.new
- so = shell_out("erl +V")
- if so.exitstatus == 0
- output = so.stderr.split
- if output.length >= 6
- options = output[1]
- options.gsub!(/(\(|\))/, "")
- erlang[:version] = output[5]
- erlang[:options] = options.split(",")
- erlang[:emulator] = output[2].gsub!(/(\(|\))/, "")
- if erlang[:version] && erlang[:options] && erlang[:emulator]
- languages[:erlang] = erlang
+ begin
+ so = shell_out("erl +V")
+ # Sample output:
+ # Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 7.3
+ if so.exitstatus == 0
+ output = so.stderr.split
+ if output.length >= 6
+ options = output[1]
+ options.gsub!(/(\(|\))/, "")
+ erlang[:options] = options.split(",")
+ erlang[:emulator] = output[2].gsub!(/(\(|\))/, "")
end
end
+ rescue Ohai::Exceptions::Exec
+ Ohai::Log.debug('Erlang plugin: Could not shell_out "erl +V". Skipping plugin')
end
+
+ languages[:erlang] = erlang unless erlang.empty?
end
end
diff --git a/spec/unit/plugins/erlang_spec.rb b/spec/unit/plugins/erlang_spec.rb
index cdb0a340..0f407b69 100644
--- a/spec/unit/plugins/erlang_spec.rb
+++ b/spec/unit/plugins/erlang_spec.rb
@@ -20,41 +20,47 @@
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper.rb")
describe Ohai::System, "plugin erlang" do
+ let(:plugin) { get_plugin("erlang") }
before(:each) do
- @plugin = get_plugin("erlang")
- @plugin[:languages] = Mash.new
- @stderr = "Erlang (ASYNC_THREADS,SMP,HIPE) (BEAM) emulator version 5.6.2\n"
- allow(@plugin).to receive(:shell_out).with("erl +V").and_return(mock_shell_out(0, "", @stderr))
+ plugin[:languages] = Mash.new
+ erl_v_output = "Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 7.3\n"
+ erl_systeminfo_output = "\"18\"\r\n\"7.3\"\r\n\"2.10\"\r\n"
+ allow(plugin).to receive(:shell_out).with("erl +V")
+ .and_return(mock_shell_out(0, "", erl_v_output))
+ allow(plugin).to receive(:shell_out).with("erl -eval 'erlang:display(erlang:system_info(otp_release)), erlang:display(erlang:system_info(version)), erlang:display(erlang:system_info(nif_version)), halt().' -noshell")
+ .and_return(mock_shell_out(0, erl_systeminfo_output, ""))
end
- it "should get the erlang version from erl +V" do
- expect(@plugin).to receive(:shell_out).with("erl +V").and_return(mock_shell_out(0, "", @stderr))
- @plugin.run
+ it "sets languages[:erlang][:options]" do
+ plugin.run
+ expect(plugin.languages[:erlang][:options]).to eql(%w{SMP ASYNC_THREADS HIPE})
end
- it "should set languages[:erlang][:version]" do
- @plugin.run
- expect(@plugin.languages[:erlang][:version]).to eql("5.6.2")
+ it "sets languages[:erlang][:emulator]" do
+ plugin.run
+ expect(plugin.languages[:erlang][:emulator]).to eql("BEAM")
end
- it "should set languages[:erlang][:options]" do
- @plugin.run
- expect(@plugin.languages[:erlang][:options]).to eql(%w{ASYNC_THREADS SMP HIPE})
+ it "sets languages[:erlang][:version]" do
+ plugin.run
+ expect(plugin.languages[:erlang][:version]).to eql("18")
end
- it "should set languages[:erlang][:emulator]" do
- @plugin.run
- expect(@plugin.languages[:erlang][:emulator]).to eql("BEAM")
+ it "sets languages[:erlang][:erts_version]" do
+ plugin.run
+ expect(plugin.languages[:erlang][:erts_version]).to eql("7.3")
end
- it "should not set the languages[:erlang] tree up if erlang command fails" do
- @status = 1
- @stdin = ""
- @stderr = "Erlang (ASYNC_THREADS,SMP,HIPE) (BEAM) emulator version 5.6.2\n"
- allow(@plugin).to receive(:shell_out).with("erl +V").and_return(mock_shell_out(1, "", @stderr))
- @plugin.run
- expect(@plugin.languages).not_to have_key(:erlang)
+ it "sets languages[:erlang][:nif_version]" do
+ plugin.run
+ expect(plugin.languages[:erlang][:nif_version]).to eql("2.10")
+ end
+
+ it "does not set languages[:erlang] if the erl commands fails" do
+ allow(plugin).to receive(:shell_out).and_raise(Ohai::Exceptions::Exec)
+ plugin.run
+ expect(plugin.languages).not_to have_key(:erlang)
end
end