Given an API info hash (see +parse_api_info(response)+), return the name of the "server-ctl" command for the kind of server we're interacting with (based on the flavor field)
# File lib/chef/knife/index_rebuild.rb, line 120 def ctl_command(api_info) case api_info["flavor"] when "osc" "chef-server-ctl" when "opc" "private-chef-ctl" else # Generic fallback "chef-server-ctl" end end
# File lib/chef/knife/index_rebuild.rb, line 71 def deprecated_server_message ui.warn("'knife index rebuild' has been removed for Chef 11+ servers. It will continue to work for prior versions, however.") end
# File lib/chef/knife/index_rebuild.rb, line 46 def grab_api_info # Since we don't yet have any endpoints that implement an # OPTIONS handler, we need to get our version header # information in a more roundabout way. We'll try to query # for a node we know won't exist; the 404 response that comes # back will give us what we want dummy_node = "knife_index_rebuild_test_#{rand(1000000)}" rest.get_rest("/nodes/#{dummy_node}") rescue Net::HTTPServerException => exception r = exception.response parse_api_info(r) end
# File lib/chef/knife/index_rebuild.rb, line 75 def nag ui.info("This operation is destructive. Rebuilding the index may take some time.") ui.confirm("Continue") end
Chef 11 (and above) servers return various pieces of information about the server in an x-ops-api-info header. This is a +;+ delimited string of key / value pairs, separated by +=+.
Given a Net::HTTPResponse object, this method extracts this information (if present), and returns it as a hash. If no such header is found, an empty hash is returned.
# File lib/chef/knife/index_rebuild.rb, line 88 def parse_api_info(response) value = response["x-ops-api-info"] if value kv = value.split(";") kv.inject({}) do |acc, pair| k, v = pair.split("=") acc[k] = v acc end else {} end end
# File lib/chef/knife/index_rebuild.rb, line 32 def run api_info = grab_api_info if unsupported_version?(api_info) unsupported_server_message(api_info) exit 1 else deprecated_server_message nag output rest.post_rest("/search/reindex", {}) end end
Given an API info hash (see +parse_api_info(response)+), return a string describing the kind of server we're interacting with (based on the flavor field)
# File lib/chef/knife/index_rebuild.rb, line 105 def server_type(api_info) case api_info["flavor"] when "osc" "Open Source Chef Server" when "opc" "Private Chef Server" else # Generic fallback "Chef Server" end end
# File lib/chef/knife/index_rebuild.rb, line 66 def unsupported_server_message(api_info) ui.error("Rebuilding the index is not available via knife for #{server_type(api_info)}s version 11.0.0 and above.") ui.info("Instead, run the '#{ctl_command(api_info)} reindex' command on the server itself.") end
Only Chef 11+ servers will have version information in their headers, and only those servers will lack an API endpoint for index rebuilding.
# File lib/chef/knife/index_rebuild.rb, line 62 def unsupported_version?(api_info) !!api_info["version"] end
Generated with the Darkfish Rdoc Generator 2.