class Chef::Knife::Core::StatusPresenter
A customized presenter for Chef::Node objects. Supports variable-length output formats for displaying node data
Public Instance Methods
format(data)
click to toggle source
Calls superclass method
Chef::Knife::Core::GenericPresenter#format
# File lib/chef/knife/core/status_presenter.rb, line 30 def format(data) if parse_format_option == :json summarize_json(data) else super end end
key(key_text)
click to toggle source
# File lib/chef/knife/core/status_presenter.rb, line 128 def key(key_text) ui.color(key_text, :cyan) end
summarize(list)
click to toggle source
Converts a Chef::Node object to a string suitable for output to a terminal. If config or config are set the volume of output is adjusted accordingly. Uses colors if enabled in the ui object.
# File lib/chef/knife/core/status_presenter.rb, line 69 def summarize(list) summarized = "" list.each do |data| node = data # special case clouds with their split horizon thing. ip = (node[:cloud] && node[:cloud][:public_ipv4_addrs] && node[:cloud][:public_ipv4_addrs].first) || node[:ipaddress] fqdn = (node[:cloud] && node[:cloud][:public_hostname]) || node[:fqdn] name = node["name"] || node.name if config[:run_list] if config[:long_output] run_list = node.run_list.map { |rl| "#{rl.type}[#{rl.name}]" } else run_list = node["run_list"] end end line_parts = [] if node["ohai_time"] hours, minutes, seconds = time_difference_in_hms(node["ohai_time"]) hours_text = "#{hours} hour#{hours == 1 ? " " : "s"}" minutes_text = "#{minutes} minute#{minutes == 1 ? " " : "s"}" seconds_text = "#{seconds} second#{seconds == 1 ? " " : "s"}" if hours > 24 color = :red text = hours_text elsif hours >= 1 color = :yellow text = hours_text elsif minutes >= 1 color = :green text = minutes_text else color = :green text = seconds_text end line_parts << @ui.color(text, color) + " ago" << name else line_parts << "Node #{name} has not yet converged" end line_parts << fqdn if fqdn line_parts << ip if ip line_parts << run_list.to_s if run_list if node["platform"] platform = node["platform"].dup if node["platform_version"] platform << " #{node["platform_version"]}" end line_parts << platform end summarized = summarized + line_parts.join(", ") + ".\n" end summarized end
summarize_json(list)
click to toggle source
# File lib/chef/knife/core/status_presenter.rb, line 38 def summarize_json(list) result_list = [] list.each do |node| result = {} result["name"] = node["name"] || node.name result["chef_environment"] = node["chef_environment"] ip = (node["cloud"] && node["cloud"]["public_ipv4_addrs"]&.first) || node["ipaddress"] fqdn = (node["cloud"] && node["cloud"]["public_hostname"]) || node["fqdn"] result["ip"] = ip if ip result["fqdn"] = fqdn if fqdn result["run_list"] = node.run_list if config["run_list"] result["ohai_time"] = node["ohai_time"] result["platform"] = node["platform"] if node["platform"] result["platform_version"] = node["platform_version"] if node["platform_version"] if config[:long_output] result["default"] = node.default_attrs result["override"] = node.override_attrs result["automatic"] = node.automatic_attrs end result_list << result end Chef::JSONCompat.to_json_pretty(result_list) end
time_difference_in_hms(unix_time)
click to toggle source
@private @todo this is duplicated from StatusHelper in the Webui. dedup.
# File lib/chef/knife/core/status_presenter.rb, line 134 def time_difference_in_hms(unix_time) now = Time.now.to_i difference = now - unix_time.to_i hours = (difference / 3600).to_i difference = difference % 3600 minutes = (difference / 60).to_i seconds = (difference % 60) [hours, minutes, seconds] end