Module: Chef::DataCollector::ConfigValidation Private

Defined in:
lib/chef/data_collector/config_validation.rb

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Class Method Summary collapse

Class Method Details

.should_be_enabled?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Main logic controlling the data collector being enabled or disabled:

  • disabled in why-run mode

  • disabled when `Chef::Config[:mode]` excludes the solo-vs-client mode

  • disabled if there is no server_url or no output_locations to log to

  • enabled if there is a configured output_location even without a token

  • disabled in solo mode if the user did not configure the auth token

Returns:

  • (Boolean)

    true if the data collector should be enabled


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/chef/data_collector/config_validation.rb', line 74

def should_be_enabled?
  running_mode = ( Chef::Config[:solo_legacy_mode] || Chef::Config[:local_mode] ) ? :solo : :client
  want_mode = Chef::Config[:data_collector][:mode]

  case
  when Chef::Config[:why_run]
    Chef::Log.trace("data collector is disabled for why run mode")
    false
  when (want_mode != :both) && running_mode != want_mode
    Chef::Log.trace("data collector is configured to only run in #{Chef::Config[:data_collector][:mode]} modes, disabling it")
    false
  when !(Chef::Config[:data_collector][:server_url] || Chef::Config[:data_collector][:output_locations])
    Chef::Log.trace("Neither data collector URL or output locations have been configured, disabling data collector")
    false
  when running_mode == :client && Chef::Config[:data_collector][:token]
    Chef::Log.warn("Data collector token authentication is not recommended for client-server mode. " \
                   "Please upgrade #{ChefUtils::Dist::Server::PRODUCT} to 12.11 or later and remove the token from your config file " \
                   "to use key based authentication instead")
    true
  when Chef::Config[:data_collector][:output_locations] && !valid_hash_with_keys?(Chef::Config[:data_collector][:output_locations], :urls)
    # we can run fine to a file without a token, even in solo mode.
    unless valid_hash_with_keys?(Chef::Config[:data_collector][:output_locations], :files)
      raise Chef::Exceptions::ConfigurationError,
        "Chef::Config[:data_collector][:output_locations] is empty. Please supply an hash of valid URLs and / or local file paths."
    end

    true
  when running_mode == :solo && !Chef::Config[:data_collector][:token]
    # we are in solo mode and are not logging to a file, so must have a token
    Chef::Log.trace("Data collector token must be configured to use #{ChefUtils::Dist::Automate::PRODUCT} data collector with #{ChefUtils::Dist::Solo::PRODUCT}")
    false
  else
    true
  end
end

.validate_output_locations!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/chef/data_collector/config_validation.rb', line 44

def validate_output_locations!
  # not having an output_location set at all is fine, we just skip it then
  output_locations = Chef::Config[:data_collector][:output_locations]
  return unless output_locations

  # but deliberately setting an empty output_location we consider to be an error (XXX: but should we?)
  unless valid_hash_with_keys?(output_locations, :urls, :files)
    raise Chef::Exceptions::ConfigurationError,
      "Chef::Config[:data_collector][:output_locations] is empty. Please supply an hash of valid URLs and / or local file paths."
  end

  # loop through all the types and locations and validate each one-by-one
  output_locations.each do |type, locations|
    Array(locations).each do |location|
      validate_url!(location) if type == :urls
      validate_file!(location) if type == :files
    end
  end
end

.validate_server_url!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/chef/data_collector/config_validation.rb', line 27

def validate_server_url!
  # if we have a server_url set we ALWAYS validate it, and we MUST have an output_location set to skip server_url validation
  # (having output_locations set and no server_url is valid, but both of them unset blows up in here)
  return if !Chef::Config[:data_collector][:server_url] && Chef::Config[:data_collector][:output_locations]

  begin
    uri = URI(Chef::Config[:data_collector][:server_url])
  rescue
    raise Chef::Exceptions::ConfigurationError, "Chef::Config[:data_collector][:server_url] (#{Chef::Config[:data_collector][:server_url]}) is not a valid URI."
  end

  if uri.host.nil?
    raise Chef::Exceptions::ConfigurationError,
      "Chef::Config[:data_collector][:server_url] (#{Chef::Config[:data_collector][:server_url]}) is a URI with no host. Please supply a valid URL."
  end
end