diff options
author | Thom May <thom@clearairturbulence.org> | 2015-04-09 19:44:51 +0100 |
---|---|---|
committer | Thom May <thom@clearairturbulence.org> | 2015-04-09 19:44:51 +0100 |
commit | ad10282d962aa2c09130b29b4ebcf10e4ae321e5 (patch) | |
tree | 590e827408f7a3466e4cc7f5cde17f9dcfc907f2 /lib | |
parent | 648c9f91d4a0ccbcf661a5ee4d3ec67d8538a5f3 (diff) | |
parent | 604a1e63722832bed6f0109218652a3f384f90cb (diff) | |
download | chef-ad10282d962aa2c09130b29b4ebcf10e4ae321e5.tar.gz |
Merge pull request #3067 from chef/tm/knife_status_environment
Allow knife status to filter by environment
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/knife/core/status_presenter.rb | 23 | ||||
-rw-r--r-- | lib/chef/knife/status.rb | 38 |
2 files changed, 43 insertions, 18 deletions
diff --git a/lib/chef/knife/core/status_presenter.rb b/lib/chef/knife/core/status_presenter.rb index 3298d5e4ac..9cf839d3a6 100644 --- a/lib/chef/knife/core/status_presenter.rb +++ b/lib/chef/knife/core/status_presenter.rb @@ -66,16 +66,16 @@ class Chef list.each do |node| result = {} - result["name"] = node.name - result["chef_environment"] = node.chef_environment - ip = (node[:ec2] && node[:ec2][:public_ipv4]) || node[:ipaddress] - fqdn = (node[:ec2] && node[:ec2][:public_hostname]) || node[:fqdn] + result["name"] = node["name"] || node.name + result["chef_environment"] = node["chef_environment"] + ip = (node["ec2"] && node["ec2"]["public_ipv4"]) || node["ipaddress"] + fqdn = (node["ec2"] && node["ec2"]["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] + 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 @@ -99,11 +99,12 @@ class Chef # special case ec2 with their split horizon whatsis. ip = (node[:ec2] && node[:ec2][:public_ipv4]) || node[:ipaddress] fqdn = (node[:ec2] && node[:ec2][:public_hostname]) || node[:fqdn] + name = node['name'] || node.name - hours, minutes, seconds = time_difference_in_hms(node["ohai_time"]) + hours, minutes, _ = time_difference_in_hms(node["ohai_time"]) hours_text = "#{hours} hour#{hours == 1 ? ' ' : 's'}" minutes_text = "#{minutes} minute#{minutes == 1 ? ' ' : 's'}" - run_list = "#{node.run_list}" if config[:run_list] + run_list = "#{node['run_list']}" if config[:run_list] if hours > 24 color = :red text = hours_text @@ -116,7 +117,7 @@ class Chef end line_parts = Array.new - line_parts << @ui.color(text, color) + ' ago' << node.name + line_parts << @ui.color(text, color) + ' ago' << name line_parts << fqdn if fqdn line_parts << ip if ip line_parts << run_list if run_list diff --git a/lib/chef/knife/status.rb b/lib/chef/knife/status.rb index 93e81f8f03..35868b376f 100644 --- a/lib/chef/knife/status.rb +++ b/lib/chef/knife/status.rb @@ -22,6 +22,7 @@ require 'chef/knife/core/status_presenter' class Chef class Knife class Status < Knife + include Knife::Core::NodeFormattingOptions deps do require 'chef/search/query' @@ -44,20 +45,43 @@ class Chef :long => "--hide-healthy", :description => "Hide nodes that have run chef in the last hour" + def append_to_query(term) + @query << " AND " unless @query.empty? + @query << term + end + def run ui.use_presenter Knife::Core::StatusPresenter - all_nodes = [] - q = Chef::Search::Query.new - query = @name_args[0] ? @name_args[0].dup : '*:*' + + if config[:long_output] + opts = {} + else + opts = {filter_result: + { name: ["name"], ipaddress: ["ipaddress"], ohai_time: ["ohai_time"], + ec2: ["ec2"], run_list: ["run_list"], platform: ["platform"], + platform_version: ["platform_version"], chef_environment: ["chef_environment"]}} + end + + @query ||= "" + append_to_query(@name_args[0]) if @name_args[0] + append_to_query("chef_environment:#{config[:environment]}") if config[:environment] + if config[:hide_healthy] time = Time.now.to_i - query_unhealthy = "NOT ohai_time:[" << (time - 60*60).to_s << " TO " << time.to_s << "]" - query << ' AND ' << query_unhealthy << @name_args[0] if @name_args[0] - query = query_unhealthy unless @name_args[0] + # AND NOT is not valid lucene syntax, so don't use append_to_query + @query << " " unless @query.empty? + @query << "NOT ohai_time:[#{(time - 60*60).to_s} TO #{time.to_s}]" end - q.search(:node, query) do |node| + + @query = @query.empty? ? "*:*" : @query + + all_nodes = [] + q = Chef::Search::Query.new + Chef::Log.info("Sending query: #{@query}") + q.search(:node, @query, opts) do |node| all_nodes << node end + output(all_nodes.sort { |n1, n2| if (config[:sort_reverse] || Chef::Config[:knife][:sort_status_reverse]) (n2["ohai_time"] or 0) <=> (n1["ohai_time"] or 0) |