chef 12.15.19 → 12.16.42

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/VERSION +1 -1
  4. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +3 -1
  5. data/acceptance/Gemfile.lock +14 -14
  6. data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +3 -11
  7. data/distro/common/html/knife_bootstrap.html +1 -1
  8. data/distro/common/man/man1/README.md +2 -2
  9. data/distro/common/man/man1/knife-client.1 +1 -1
  10. data/lib/chef/application.rb +7 -15
  11. data/lib/chef/application/client.rb +2 -2
  12. data/lib/chef/application/solo.rb +1 -1
  13. data/lib/chef/chef_class.rb +1 -0
  14. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +3 -7
  15. data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbook_dir.rb +1 -1
  16. data/lib/chef/data_collector.rb +83 -9
  17. data/lib/chef/data_collector/messages.rb +2 -1
  18. data/lib/chef/dsl/core.rb +1 -1
  19. data/lib/chef/dsl/declare_resource.rb +10 -4
  20. data/lib/chef/dsl/method_missing.rb +1 -1
  21. data/lib/chef/dsl/recipe.rb +1 -1
  22. data/lib/chef/dsl/universal.rb +1 -1
  23. data/lib/chef/event_dispatch/base.rb +3 -0
  24. data/lib/chef/http.rb +3 -4
  25. data/lib/chef/knife.rb +20 -2
  26. data/lib/chef/knife/core/generic_presenter.rb +18 -4
  27. data/lib/chef/knife/node_show.rb +0 -5
  28. data/lib/chef/knife/osc_user_show.rb +0 -1
  29. data/lib/chef/knife/ssl_fetch.rb +9 -5
  30. data/lib/chef/mixin/powershell_out.rb +1 -1
  31. data/lib/chef/mixin/shell_out.rb +1 -1
  32. data/lib/chef/node.rb +1 -5
  33. data/lib/chef/node/attribute.rb +70 -98
  34. data/lib/chef/node/attribute_collections.rb +28 -19
  35. data/lib/chef/node/common_api.rb +0 -6
  36. data/lib/chef/node/immutable_collections.rb +16 -79
  37. data/lib/chef/node/mixin/deep_merge_cache.rb +61 -0
  38. data/lib/chef/node/mixin/immutablize_array.rb +67 -0
  39. data/lib/chef/node/mixin/immutablize_hash.rb +54 -0
  40. data/lib/chef/node/mixin/state_tracking.rb +93 -0
  41. data/lib/chef/property.rb +4 -4
  42. data/lib/chef/provider/cron.rb +1 -1
  43. data/lib/chef/provider/group/suse.rb +23 -4
  44. data/lib/chef/provider/package.rb +43 -5
  45. data/lib/chef/provider/package/apt.rb +20 -0
  46. data/lib/chef/provider/package/windows/exe.rb +4 -3
  47. data/lib/chef/provider/package/windows/msi.rb +4 -3
  48. data/lib/chef/provider/package/yum.rb +20 -0
  49. data/lib/chef/provider/package/zypper.rb +20 -0
  50. data/lib/chef/provider/ruby_block.rb +1 -1
  51. data/lib/chef/provider/service/upstart.rb +25 -9
  52. data/lib/chef/provider/user.rb +4 -6
  53. data/lib/chef/provider/user/dscl.rb +8 -3
  54. data/lib/chef/provider/user/solaris.rb +5 -12
  55. data/lib/chef/resource.rb +19 -0
  56. data/lib/chef/resource/file.rb +1 -1
  57. data/lib/chef/resource/package.rb +1 -1
  58. data/lib/chef/resource/scm.rb +1 -7
  59. data/lib/chef/resource/yum_repository.rb +1 -1
  60. data/lib/chef/rest.rb +1 -0
  61. data/lib/chef/run_context.rb +12 -0
  62. data/lib/chef/version.rb +1 -1
  63. data/spec/data/trusted_certs/example_no_cn.crt +36 -0
  64. data/spec/functional/resource/group_spec.rb +1 -0
  65. data/spec/functional/resource/user/useradd_spec.rb +4 -2
  66. data/spec/integration/knife/data_bag_create_spec.rb +0 -3
  67. data/spec/integration/knife/environment_show_spec.rb +24 -4
  68. data/spec/integration/knife/node_environment_set_spec.rb +4 -1
  69. data/spec/integration/recipes/accumulator_spec.rb +232 -0
  70. data/spec/integration/recipes/resource_action_spec.rb +1 -1
  71. data/spec/spec_helper.rb +2 -2
  72. data/spec/support/shared/context/client.rb +12 -3
  73. data/spec/support/shared/integration/app_server_support.rb +1 -1
  74. data/spec/support/shared/integration/knife_support.rb +4 -1
  75. data/spec/unit/data_collector/messages_spec.rb +2 -0
  76. data/spec/unit/data_collector_spec.rb +158 -21
  77. data/spec/unit/http_spec.rb +1 -1
  78. data/spec/unit/knife/core/gem_glob_loader_spec.rb +1 -1
  79. data/spec/unit/knife/core/ui_spec.rb +10 -0
  80. data/spec/unit/knife/ssl_fetch_spec.rb +38 -0
  81. data/spec/unit/knife_spec.rb +31 -0
  82. data/spec/unit/mixin/powershell_out_spec.rb +25 -1
  83. data/spec/unit/node/attribute_spec.rb +46 -1
  84. data/spec/unit/node/vivid_mash_spec.rb +27 -89
  85. data/spec/unit/node_spec.rb +134 -3
  86. data/spec/unit/provider/deploy_spec.rb +1 -1
  87. data/spec/unit/provider/group/suse_spec.rb +90 -0
  88. data/spec/unit/provider/package/apt_spec.rb +22 -0
  89. data/spec/unit/provider/package/windows/msi_spec.rb +13 -4
  90. data/spec/unit/provider/package/windows_spec.rb +3 -3
  91. data/spec/unit/provider/package/yum_spec.rb +18 -0
  92. data/spec/unit/provider/package/zypper_spec.rb +64 -0
  93. data/spec/unit/provider/package_spec.rb +58 -0
  94. data/spec/unit/provider/remote_file/content_spec.rb +1 -1
  95. data/spec/unit/provider/service/upstart_service_spec.rb +13 -6
  96. data/spec/unit/provider/user/solaris_spec.rb +36 -9
  97. data/spec/unit/provider/user_spec.rb +6 -0
  98. data/spec/unit/resource/apt_repository_spec.rb +1 -1
  99. metadata +12 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4f24dbbdd459acf96dabb227da7326a4dff4a49
4
- data.tar.gz: d98ceac12bf8f48a05ae367f20cb9d0de810dbe2
3
+ metadata.gz: 340c1cbda2004926c5f046f561e56586829a141c
4
+ data.tar.gz: efed35187da59fd2a49ea092312be922d11f90db
5
5
  SHA512:
6
- metadata.gz: 16eca9e1f4ae67fbf7119be0c84ae229a495837aaa6ffd0fbb97a379a6de0a2f452746f57f6ab16300704e1f0b63abd3958957e283849a05899a50c10199fee5
7
- data.tar.gz: 7223d4a4fb15d892ffbd99466345eb1754fab218fb885098e49602af675b7a01300be5d9aac128930269838f6b732b7884636ce9a0474ba882bcfd90357a44af
6
+ metadata.gz: 0f0e9083844b5a3553acf79a476daab28277cbd3ef1f4d7da0354d88bf28afbe98e967e3470e5967ccaf5139864d11a9fffd58f3a3d733c07b81e8dbc6c7d11d
7
+ data.tar.gz: c97b133f8aa935250e57a66ef73af2288563547dcfec3cc9031531c0f2205ee52fbc8d8091e3b2d57dc9825f852cb7f7ff4e8332b1c733aae8b4ae3d0ecc7a68
data/Gemfile CHANGED
@@ -33,7 +33,6 @@ end
33
33
  group(:integration) do
34
34
  gem "chef-provisioning"
35
35
  gem "chef-provisioning-aws"
36
- gem "chef-rewind"
37
36
  gem "chef-sugar"
38
37
  gem "chefspec"
39
38
  gem "halite"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 12.15.19
1
+ 12.16.42
@@ -10,7 +10,9 @@ end
10
10
  driver:
11
11
  name: ec2
12
12
  tags:
13
- X-Project: chef-ci-acceptance
13
+ X-Dept: Eng
14
+ X-Contact: product-team
15
+ X-Application: chef-ci-acceptance
14
16
  aws_ssh_key_id: <%= ENV['AWS_SSH_KEY_ID'] || ENV['USER'] || ENV['USERNAME'] %>
15
17
  # test-specific stuff
16
18
  region: us-west-2
@@ -11,12 +11,12 @@ GEM
11
11
  specs:
12
12
  addressable (2.4.0)
13
13
  artifactory (2.5.0)
14
- aws-sdk (2.6.5)
15
- aws-sdk-resources (= 2.6.5)
16
- aws-sdk-core (2.6.5)
14
+ aws-sdk (2.6.14)
15
+ aws-sdk-resources (= 2.6.14)
16
+ aws-sdk-core (2.6.14)
17
17
  jmespath (~> 1.0)
18
- aws-sdk-resources (2.6.5)
19
- aws-sdk-core (= 2.6.5)
18
+ aws-sdk-resources (2.6.14)
19
+ aws-sdk-core (= 2.6.14)
20
20
  berkshelf (4.3.5)
21
21
  addressable (~> 2.3, >= 2.3.4)
22
22
  berkshelf-api-client (~> 2.0, >= 2.0.2)
@@ -53,7 +53,7 @@ GEM
53
53
  celluloid-io (0.16.2)
54
54
  celluloid (>= 0.16.0)
55
55
  nio4r (>= 1.1.0)
56
- chef-config (12.14.89)
56
+ chef-config (12.15.19)
57
57
  addressable
58
58
  fuzzyurl
59
59
  mixlib-config (~> 2.0)
@@ -61,11 +61,11 @@ GEM
61
61
  cleanroom (1.0.0)
62
62
  coderay (1.1.1)
63
63
  diff-lcs (1.2.5)
64
- docker-api (1.32.0)
64
+ docker-api (1.32.1)
65
65
  excon (>= 0.38.0)
66
66
  json
67
67
  erubis (2.7.0)
68
- excon (0.53.0)
68
+ excon (0.54.0)
69
69
  faraday (0.9.2)
70
70
  multipart-post (>= 1.2, < 3)
71
71
  ffi (1.9.14)
@@ -77,7 +77,7 @@ GEM
77
77
  hashie (3.4.6)
78
78
  hitimes (1.2.4)
79
79
  httpclient (2.7.2)
80
- inspec (1.0.0)
80
+ inspec (1.3.0)
81
81
  hashie (~> 3.4)
82
82
  json (>= 1.8, < 3.0)
83
83
  method_source (~> 0.8)
@@ -90,7 +90,7 @@ GEM
90
90
  rubyzip (~> 1.1)
91
91
  sslshake (~> 1)
92
92
  thor (~> 0.19)
93
- train (>= 0.19.1, < 1.0)
93
+ train (>= 0.20.1, < 1.0)
94
94
  jmespath (1.3.1)
95
95
  json (2.0.2)
96
96
  kitchen-ec2 (1.2.0)
@@ -132,7 +132,7 @@ GEM
132
132
  net-ssh (>= 2.6.5)
133
133
  nio4r (1.2.1)
134
134
  nori (2.6.0)
135
- octokit (4.3.0)
135
+ octokit (4.4.1)
136
136
  sawyer (~> 0.7.0, >= 0.5.3)
137
137
  parallel (1.9.0)
138
138
  pry (0.10.4)
@@ -186,7 +186,7 @@ GEM
186
186
  solve (2.0.3)
187
187
  molinillo (~> 0.4.2)
188
188
  semverse (~> 1.1)
189
- sslshake (1.0.12)
189
+ sslshake (1.0.13)
190
190
  test-kitchen (1.13.2)
191
191
  mixlib-install (>= 1.2, < 3.0)
192
192
  mixlib-shellout (>= 1.2, < 3.0)
@@ -198,7 +198,7 @@ GEM
198
198
  thor (0.19.1)
199
199
  timers (4.0.4)
200
200
  hitimes
201
- train (0.20.0)
201
+ train (0.20.1)
202
202
  docker-api (~> 1.26)
203
203
  json (>= 1.8, < 3.0)
204
204
  mixlib-shellout (~> 2.0)
@@ -211,7 +211,7 @@ GEM
211
211
  hashie (>= 2.0.2, < 4.0.0)
212
212
  windows_chef_zero (2.0.0)
213
213
  test-kitchen (>= 1.2.1)
214
- winrm (2.0.3)
214
+ winrm (2.1.0)
215
215
  builder (>= 2.1.2)
216
216
  erubis (~> 2.7)
217
217
  gssapi (~> 1.2)
@@ -60,7 +60,7 @@ end
60
60
 
61
61
  shared_examples_for "counter checks" do |counters_to_check|
62
62
  counters_to_check.each do |counter, value|
63
- it "counter #{counter} should equal #{value}" do
63
+ it "counter #{counter} should equal #{value.inspect}" do
64
64
  counter_values = JSON.load(command("curl http://localhost:9292/counters").stdout)
65
65
  expect(counter_values[counter]).to eq(value)
66
66
  end
@@ -91,11 +91,6 @@ shared_examples_for "run_start payload check" do
91
91
  expect(missing_fields).to eq([])
92
92
  end
93
93
 
94
- it "does not have any extra fields" do
95
- payload = JSON.load(command("curl http://localhost:9292/cache/run_start").stdout)
96
- extra_fields = payload.keys.select { |key| !required_fields.include?(key) && !optional_fields.include?(key) }
97
- expect(extra_fields).to eq([])
98
- end
99
94
  end
100
95
  end
101
96
 
@@ -121,6 +116,7 @@ shared_examples_for "run_converge.success payload check" do
121
116
  status
122
117
  total_resource_count
123
118
  updated_resource_count
119
+ deprecations
124
120
  }
125
121
  end
126
122
  let(:optional_fields) { [] }
@@ -131,11 +127,6 @@ shared_examples_for "run_converge.success payload check" do
131
127
  expect(missing_fields).to eq([])
132
128
  end
133
129
 
134
- it "does not have any extra fields" do
135
- payload = JSON.load(command("curl http://localhost:9292/cache/run_converge.success").stdout)
136
- extra_fields = payload.keys.select { |key| !required_fields.include?(key) && !optional_fields.include?(key) }
137
- expect(extra_fields).to eq([])
138
- end
139
130
  end
140
131
  end
141
132
 
@@ -162,6 +153,7 @@ shared_examples_for "run_converge.failure payload check" do
162
153
  status
163
154
  total_resource_count
164
155
  updated_resource_count
156
+ deprecations
165
157
  }
166
158
  end
167
159
  let(:optional_fields) { [] }
@@ -173,7 +173,7 @@
173
173
  <div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife bootstrap 192.168.1.100 -r <span class="s1">&#39;role[webserver]&#39;</span> -d ubuntu12.04-gems-mine
174
174
  </pre></div>
175
175
  </div>
176
- <p>Alternatively, an example bootstrap template can be found in the git source for the chef-repo: <a class="reference external" href="https://github.com/opscode/chef/tree/master/lib/chef/knife/bootstrap">https://github.com/opscode/chef/tree/master/lib/chef/knife/bootstrap</a>. Copy the template to <tt class="docutils literal"><span class="pre">~/.chef-repo/.chef/bootstrap/ubuntu12.04-apt.erb</span></tt> and modify the template appropriately.</p>
176
+ <p>Alternatively, an example bootstrap template can be found in the git source for the chef-repo: <a class="reference external" href="https://github.com/chef/chef/tree/master/lib/chef/knife/bootstrap">https://github.com/chef/chef/tree/master/lib/chef/knife/bootstrap</a>. Copy the template to <tt class="docutils literal"><span class="pre">~/.chef-repo/.chef/bootstrap/ubuntu12.04-apt.erb</span></tt> and modify the template appropriately.</p>
177
177
  </div>
178
178
  <div class="section" id="debian-and-apt">
179
179
  <h3>Debian and Apt<a class="headerlink" href="#debian-and-apt" title="Permalink to this headline">¶</a></h3>
@@ -9,7 +9,7 @@ that are built into the chef-client are managed.
9
9
  ## Source Files
10
10
 
11
11
  The source files are located in the chef-docs repository:
12
- https://github.com/opscode/chef-docs
12
+ https://github.com/chef/chef-docs
13
13
 
14
14
  Each Knife subcommand has its own source folder. The folder naming
15
15
  pattern begins with man_.
@@ -55,4 +55,4 @@ at docs.opscode.com/knife_foo.html.
55
55
 
56
56
  ## Questions?
57
57
 
58
- Open an [Issue](https://github.com/opscode/chef-docs/issues) and ask.
58
+ Open an [Issue](https://github.com/chef/chef-docs/issues) and ask.
@@ -37,7 +37,7 @@ However, during the first chef\-client run, this private key does not exist. Ins
37
37
  .sp
38
38
  During the initial chef\-client run, the chef\-client will register with the Chef server using the private key assigned to the chef\-validator, after which the chef\-client will obtain a \fBclient.pem\fP private key for all future authentication requests to the Chef server\&.
39
39
  .sp
40
- After the initial chef\-client run has completed successfully, the chef\-validator is no longer required and may be deleted from the node. Use the \fBdelete_validation\fP recipe found in the \fBchef\-client\fP cookbook (\fI\%https://github.com/opscode\-cookbooks/chef\-client\fP) to remove the chef\-validator\&.
40
+ After the initial chef\-client run has completed successfully, the chef\-validator is no longer required and may be deleted from the node. Use the \fBdelete_validation\fP recipe found in the \fBchef\-client\fP cookbook (\fI\%https://github.com/chef\-cookbooks/chef\-client\fP) to remove the chef\-validator\&.
41
41
  .sp
42
42
  The \fBknife client\fP subcommand is used to manage an API client list and their associated RSA public key\-pairs. This allows authentication requests to be made to the Chef server by any entity that uses the Chef server API, such as the chef\-client and knife\&.
43
43
  .SH COMMON OPTIONS
@@ -28,7 +28,6 @@ require "mixlib/cli"
28
28
  require "tmpdir"
29
29
  require "rbconfig"
30
30
  require "chef/application/exit_code"
31
- require "yaml"
32
31
 
33
32
  class Chef
34
33
  class Application
@@ -111,20 +110,13 @@ class Chef
111
110
  end
112
111
  extra_config_options = config.delete(:config_option)
113
112
  Chef::Config.merge!(config)
114
- if extra_config_options
115
- extra_parsed_options = extra_config_options.inject({}) do |memo, option|
116
- # Sanity check value.
117
- Chef::Application.fatal!("Unparsable config option #{option.inspect}") if option.empty? || !option.include?("=")
118
- # Split including whitespace if someone does truly odd like
119
- # --config-option "foo = bar"
120
- key, value = option.split(/\s*=\s*/, 2)
121
- # Call to_sym because Chef::Config expects only symbol keys. Also
122
- # runs a simple parse on the string for some common types.
123
- memo[key.to_sym] = YAML.safe_load(value)
124
- memo
125
- end
126
- Chef::Config.merge!(extra_parsed_options)
127
- end
113
+ apply_extra_config_options(extra_config_options)
114
+ end
115
+
116
+ def apply_extra_config_options(extra_config_options)
117
+ Chef::Config.apply_extra_config_options(extra_config_options)
118
+ rescue ChefConfig::UnparsableConfigOption => e
119
+ Chef::Application.fatal!(e.message)
128
120
  end
129
121
 
130
122
  def set_specific_recipes
@@ -202,7 +202,7 @@ class Chef::Application::Client < Chef::Application
202
202
  :short => "-o RunlistItem,RunlistItem...",
203
203
  :long => "--override-runlist RunlistItem,RunlistItem...",
204
204
  :description => "Replace current run list with specified items for a single run",
205
- :proc => lambda {|items|
205
+ :proc => lambda { |items|
206
206
  items = items.split(",")
207
207
  items.compact.map do |item|
208
208
  Chef::RunList::RunListItem.new(item)
@@ -213,7 +213,7 @@ class Chef::Application::Client < Chef::Application
213
213
  :short => "-r RunlistItem,RunlistItem...",
214
214
  :long => "--runlist RunlistItem,RunlistItem...",
215
215
  :description => "Permanently replace current run list with specified items",
216
- :proc => lambda {|items|
216
+ :proc => lambda { |items|
217
217
  items = items.split(",")
218
218
  items.compact.map do |item|
219
219
  Chef::RunList::RunListItem.new(item)
@@ -166,7 +166,7 @@ class Chef::Application::Solo < Chef::Application
166
166
  :short => "-o RunlistItem,RunlistItem...",
167
167
  :long => "--override-runlist RunlistItem,RunlistItem...",
168
168
  :description => "Replace current run list with specified items",
169
- :proc => lambda {|items|
169
+ :proc => lambda { |items|
170
170
  items = items.split(",")
171
171
  items.compact.map do |item|
172
172
  Chef::RunList::RunListItem.new(item)
@@ -30,6 +30,7 @@ require "chef/platform/provider_priority_map"
30
30
  require "chef/platform/resource_priority_map"
31
31
  require "chef/platform/provider_handler_map"
32
32
  require "chef/platform/resource_handler_map"
33
+ require "chef/event_dispatch/dsl"
33
34
 
34
35
  class Chef
35
36
  class << self
@@ -39,17 +39,13 @@ class Chef
39
39
  def read
40
40
  begin
41
41
  tmpfile = rest.streaming_request(file[:url])
42
+ File.open(tmpfile, "rb") { |f| f.read }
42
43
  rescue Timeout::Error => e
43
44
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:read, self, e, "Timeout reading #{file[:url]}: #{e}")
44
45
  rescue Net::HTTPServerException => e
45
46
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:read, self, e, "#{e.message} retrieving #{file[:url]}")
46
- end
47
-
48
- begin
49
- tmpfile.open
50
- tmpfile.read
51
- ensure
52
- tmpfile.close!
47
+ rescue Errno::ENOENT
48
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
53
49
  end
54
50
  end
55
51
 
@@ -24,7 +24,7 @@ class Chef
24
24
  module ChefServer
25
25
  class VersionedCookbookDir < CookbookDir
26
26
  # See Erchef code
27
- # https://github.com/opscode/chef_objects/blob/968a63344d38fd507f6ace05f73d53e9cd7fb043/src/chef_regex.erl#L94
27
+ # https://github.com/chef/chef_objects/blob/968a63344d38fd507f6ace05f73d53e9cd7fb043/src/chef_regex.erl#L94
28
28
  VALID_VERSIONED_COOKBOOK_NAME = /^([.a-zA-Z0-9_-]+)-(\d+\.\d+\.\d+)$/
29
29
 
30
30
  def initialize(name, parent, options = {})
@@ -19,20 +19,66 @@
19
19
  #
20
20
 
21
21
  require "uri"
22
+ require "chef/server_api"
23
+ require "chef/http/simple_json"
22
24
  require "chef/event_dispatch/base"
23
25
  require "chef/data_collector/messages"
24
26
  require "chef/data_collector/resource_report"
25
27
  require "ostruct"
28
+ require "set"
26
29
 
27
30
  class Chef
28
31
 
29
32
  # == Chef::DataCollector
30
33
  # Provides methods for determinine whether a reporter should be registered.
31
34
  class DataCollector
35
+
36
+ # Whether or not to enable data collection:
37
+ # * always disabled for why run mode
38
+ # * disabled when the user sets `Chef::Config[:data_collector][:mode]` to a
39
+ # value that excludes the mode (client or solo) that we are running as
40
+ # * disabled in solo mode if the user did not configure the auth token
41
+ # * disabled if `Chef::Config[:data_collector][:server_url]` is set to a
42
+ # falsey value
32
43
  def self.register_reporter?
33
- Chef::Config[:data_collector][:server_url] &&
34
- !Chef::Config[:why_run] &&
35
- self.reporter_enabled_for_current_mode?
44
+ if why_run?
45
+ Chef::Log.debug("data collector is disabled for why run mode")
46
+ return false
47
+ end
48
+ unless reporter_enabled_for_current_mode?
49
+ Chef::Log.debug("data collector is configured to only run in " \
50
+ "#{Chef::Config[:data_collector][:mode].inspect} modes, disabling it")
51
+ return false
52
+ end
53
+ unless data_collector_url_configured?
54
+ Chef::Log.debug("data collector URL is not configured, disabling data collector")
55
+ return false
56
+ end
57
+ if solo? && !token_auth_configured?
58
+ Chef::Log.debug("Data collector token must be configured to use Chef Automate data collector with Chef Solo")
59
+ end
60
+ if !solo? && token_auth_configured?
61
+ Chef::Log.warn("Data collector token authentication is not recommended for client-server mode" \
62
+ "Please upgrade Chef Server to 12.11.0 and remove the token from your config file " \
63
+ "to use key based authentication instead")
64
+ end
65
+ true
66
+ end
67
+
68
+ def self.data_collector_url_configured?
69
+ !!Chef::Config[:data_collector][:server_url]
70
+ end
71
+
72
+ def self.why_run?
73
+ !!Chef::Config[:why_run]
74
+ end
75
+
76
+ def self.token_auth_configured?
77
+ !!Chef::Config[:data_collector][:token]
78
+ end
79
+
80
+ def self.solo?
81
+ !!Chef::Config[:solo] || !!Chef::Config[:local_mode]
36
82
  end
37
83
 
38
84
  def self.reporter_enabled_for_current_mode?
@@ -54,7 +100,7 @@ class Chef
54
100
  class Reporter < EventDispatch::Base
55
101
  attr_reader :all_resource_reports, :status, :exception, :error_descriptions,
56
102
  :expanded_run_list, :run_context, :run_status, :http,
57
- :current_resource_report, :enabled
103
+ :current_resource_report, :enabled, :deprecations
58
104
 
59
105
  def initialize
60
106
  validate_data_collector_server_url!
@@ -63,8 +109,10 @@ class Chef
63
109
  @current_resource_loaded = nil
64
110
  @error_descriptions = {}
65
111
  @expanded_run_list = {}
66
- @http = Chef::HTTP.new(data_collector_server_url)
112
+ @deprecations = Set.new
67
113
  @enabled = true
114
+
115
+ @http = setup_http_client
68
116
  end
69
117
 
70
118
  # see EventDispatch::Base#run_started
@@ -79,7 +127,7 @@ class Chef
79
127
 
80
128
  disable_reporter_on_error do
81
129
  send_to_data_collector(
82
- Chef::DataCollector::Messages.run_start_message(current_run_status).to_json
130
+ Chef::DataCollector::Messages.run_start_message(current_run_status)
83
131
  )
84
132
  end
85
133
  end
@@ -223,8 +271,27 @@ class Chef
223
271
  )
224
272
  end
225
273
 
274
+ # see EventDispatch::Base#deprecation
275
+ # Append a received deprecation to the list of deprecations
276
+ def deprecation(message, location = caller(2..2)[0])
277
+ add_deprecation(message, location)
278
+ end
279
+
226
280
  private
227
281
 
282
+ # Selects the type of HTTP client to use based on whether we are using
283
+ # token-based or signed header authentication. Token authentication is
284
+ # intended to be used primarily for Chef Solo in which case no signing
285
+ # key will be available (in which case `Chef::ServerAPI.new()` would
286
+ # raise an exception.
287
+ def setup_http_client
288
+ if data_collector_token.nil?
289
+ Chef::ServerAPI.new(data_collector_server_url)
290
+ else
291
+ Chef::HTTP::SimpleJSON.new(data_collector_server_url)
292
+ end
293
+ end
294
+
228
295
  #
229
296
  # Yields to the passed-in block (which is expected to be some interaction
230
297
  # with the DataCollector endpoint). If some communication failure occurs,
@@ -255,7 +322,9 @@ class Chef
255
322
  Chef::Log.error(msg)
256
323
  raise
257
324
  else
258
- Chef::Log.warn(msg)
325
+ # Make the message non-scary for folks who don't have automate:
326
+ msg << " (This is normal if you do not have Chef Automate)"
327
+ Chef::Log.info(msg)
259
328
  end
260
329
  end
261
330
 
@@ -288,8 +357,9 @@ class Chef
288
357
  expanded_run_list: expanded_run_list,
289
358
  resources: all_resource_reports,
290
359
  status: opts[:status],
291
- error_descriptions: error_descriptions
292
- ).to_json
360
+ error_descriptions: error_descriptions,
361
+ deprecations: deprecations.to_a
362
+ )
293
363
  )
294
364
  end
295
365
 
@@ -340,6 +410,10 @@ class Chef
340
410
  @error_descriptions = discription_hash
341
411
  end
342
412
 
413
+ def add_deprecation(message, location)
414
+ @deprecations << { message: message, location: location }
415
+ end
416
+
343
417
  def create_resource_report(new_resource, action, current_resource = nil)
344
418
  Chef::DataCollector::ResourceReport.new(
345
419
  new_resource,