summaryrefslogtreecommitdiff
path: root/lib/chef/knife/search.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/knife/search.rb')
-rw-r--r--lib/chef/knife/search.rb141
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/chef/knife/search.rb b/lib/chef/knife/search.rb
new file mode 100644
index 0000000000..da739c4e62
--- /dev/null
+++ b/lib/chef/knife/search.rb
@@ -0,0 +1,141 @@
+#
+# Author:: Adam Jacob (<adam@opscode.com>)
+# Copyright:: Copyright (c) 2009 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'chef/knife'
+require 'chef/knife/core/node_presenter'
+
+class Chef
+ class Knife
+ class Search < Knife
+
+ deps do
+ require 'chef/node'
+ require 'chef/environment'
+ require 'chef/api_client'
+ require 'chef/search/query'
+ end
+
+ include Knife::Core::NodeFormattingOptions
+
+ banner "knife search INDEX QUERY (options)"
+
+ option :sort,
+ :short => "-o SORT",
+ :long => "--sort SORT",
+ :description => "The order to sort the results in",
+ :default => nil
+
+ option :start,
+ :short => "-b ROW",
+ :long => "--start ROW",
+ :description => "The row to start returning results at",
+ :default => 0,
+ :proc => lambda { |i| i.to_i }
+
+ option :rows,
+ :short => "-R INT",
+ :long => "--rows INT",
+ :description => "The number of rows to return",
+ :default => 1000,
+ :proc => lambda { |i| i.to_i }
+
+ option :attribute,
+ :short => "-a ATTR",
+ :long => "--attribute ATTR",
+ :description => "Show only one attribute"
+
+ option :run_list,
+ :short => "-r",
+ :long => "--run-list",
+ :description => "Show only the run list"
+
+ option :id_only,
+ :short => "-i",
+ :long => "--id-only",
+ :description => "Show only the ID of matching objects"
+
+ option :query,
+ :short => "-q QUERY",
+ :long => "--query QUERY",
+ :description => "The search query; useful to protect queries starting with -"
+
+ def run
+ if config[:query] && @name_args[1]
+ ui.error "please specify query as an argument or an option via -q, not both"
+ ui.msg opt_parser
+ exit 1
+ end
+ raw_query = config[:query] || @name_args[1]
+ if !raw_query || raw_query.empty?
+ ui.error "no query specified"
+ ui.msg opt_parser
+ exit 1
+ end
+
+ if name_args[0].nil?
+ ui.error "you must specify an item type to search for"
+ exit 1
+ end
+
+ if name_args[0] == 'node'
+ ui.use_presenter Knife::Core::NodePresenter
+ end
+
+
+ q = Chef::Search::Query.new
+ query = URI.escape(raw_query,
+ Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
+
+ result_items = []
+ result_count = 0
+
+ rows = config[:rows]
+ start = config[:start]
+ begin
+ q.search(@name_args[0], query, config[:sort], start, rows) do |item|
+ formatted_item = format_for_display(item)
+ # if formatted_item.respond_to?(:has_key?) && !formatted_item.has_key?('id')
+ # formatted_item['id'] = item.has_key?('id') ? item['id'] : item.name
+ # end
+ result_items << formatted_item
+ result_count += 1
+ end
+ rescue Net::HTTPServerException => e
+ msg = Chef::JSONCompat.from_json(e.response.body)["error"].first
+ ui.error("knife search failed: #{msg}")
+ exit 1
+ end
+
+ if ui.interchange?
+ output({:results => result_count, :rows => result_items})
+ else
+ ui.msg "#{result_count} items found"
+ ui.msg("\n")
+ result_items.each do |item|
+ output(item)
+ ui.msg("\n")
+ end
+ end
+ end
+ end
+ end
+end
+
+
+
+