Class: Chef::Knife::IndexRebuild
- Inherits:
-
Chef::Knife
- Object
- Chef::Knife
- Chef::Knife::IndexRebuild
- Defined in:
- lib/chef/knife/index_rebuild.rb
Instance Attribute Summary
Attributes inherited from Chef::Knife
Instance Method Summary collapse
-
#ctl_command(api_info) ⇒ Object
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). - #deprecated_server_message ⇒ Object
- #grab_api_info ⇒ Object
- #nag ⇒ Object
-
#parse_api_info(response) ⇒ Object
Chef 11 (and above) servers return various pieces of information about the server in an
x-ops-api-info
header. - #run ⇒ Object
-
#server_type(api_info) ⇒ Object
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). - #unsupported_server_message(api_info) ⇒ Object
-
#unsupported_version?(api_info) ⇒ Boolean
Only Chef 11+ servers will have version information in their headers, and only those servers will lack an API endpoint for index rebuilding.
Methods inherited from Chef::Knife
#api_key, #apply_computed_config, category, common_name, #config_file_settings, #configure_chef, #create_object, #delete_object, deps, #format_rest_error, guess_category, #highlight_config_error, #humanize_exception, #humanize_http_exception, inherited, #initialize, list_commands, load_commands, load_deps, #locate_config_file, #merge_configs, msg, #noauth_rest, #parse_options, #read_config_file, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_loader, subcommands, subcommands_by_category, ui, unnamed?, use_separate_defaults?, #username
Methods included from Mixin::ConvertToClassName
#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename
Methods included from Mixin::PathSanity
Constructor Details
This class inherits a constructor from Chef::Knife
Instance Method Details
#ctl_command(api_info) ⇒ Object
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)
120 121 122 123 124 125 126 127 128 129 130 |
# 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 |
#deprecated_server_message ⇒ Object
71 72 73 |
# File 'lib/chef/knife/index_rebuild.rb', line 71 def ui.warn("'knife index rebuild' has been removed for Chef 11+ servers. It will continue to work for prior versions, however.") end |
#grab_api_info ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 |
# 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 |
#nag ⇒ Object
75 76 77 78 |
# 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 |
#parse_api_info(response) ⇒ Object
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.
88 89 90 91 92 93 94 95 96 97 98 99 100 |
# 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 |
#run ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/chef/knife/index_rebuild.rb', line 32 def run api_info = grab_api_info if unsupported_version?(api_info) (api_info) exit 1 else nag output rest.post_rest("/search/reindex", {}) end end |
#server_type(api_info) ⇒ Object
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)
105 106 107 108 109 110 111 112 113 114 115 |
# 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 |
#unsupported_server_message(api_info) ⇒ Object
66 67 68 69 |
# File 'lib/chef/knife/index_rebuild.rb', line 66 def (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 |
#unsupported_version?(api_info) ⇒ Boolean
Only Chef 11+ servers will have version information in their headers, and only those servers will lack an API endpoint for index rebuilding.
62 63 64 |
# File 'lib/chef/knife/index_rebuild.rb', line 62 def unsupported_version?(api_info) !!api_info["version"] end |