chef-provisioning 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +899 -885
  3. data/Gemfile +17 -17
  4. data/LICENSE +201 -201
  5. data/README.md +312 -312
  6. data/Rakefile +55 -55
  7. data/chef-provisioning.gemspec +38 -38
  8. data/lib/chef/provider/load_balancer.rb +75 -75
  9. data/lib/chef/provider/machine.rb +219 -219
  10. data/lib/chef/provider/machine_batch.rb +224 -224
  11. data/lib/chef/provider/machine_execute.rb +36 -35
  12. data/lib/chef/provider/machine_file.rb +55 -55
  13. data/lib/chef/provider/machine_image.rb +105 -105
  14. data/lib/chef/provisioning.rb +110 -110
  15. data/lib/chef/provisioning/action_handler.rb +68 -68
  16. data/lib/chef/provisioning/add_prefix_action_handler.rb +35 -35
  17. data/lib/chef/provisioning/chef_managed_entry_store.rb +128 -128
  18. data/lib/chef/provisioning/chef_provider_action_handler.rb +74 -74
  19. data/lib/chef/provisioning/chef_run_data.rb +132 -132
  20. data/lib/chef/provisioning/convergence_strategy.rb +28 -28
  21. data/lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb +54 -54
  22. data/lib/chef/provisioning/convergence_strategy/install_cached.rb +188 -188
  23. data/lib/chef/provisioning/convergence_strategy/install_msi.rb +71 -71
  24. data/lib/chef/provisioning/convergence_strategy/install_sh.rb +71 -71
  25. data/lib/chef/provisioning/convergence_strategy/no_converge.rb +35 -35
  26. data/lib/chef/provisioning/convergence_strategy/precreate_chef_objects.rb +255 -255
  27. data/lib/chef/provisioning/driver.rb +323 -323
  28. data/lib/chef/provisioning/load_balancer_spec.rb +14 -14
  29. data/lib/chef/provisioning/machine.rb +112 -112
  30. data/lib/chef/provisioning/machine/basic_machine.rb +84 -84
  31. data/lib/chef/provisioning/machine/unix_machine.rb +288 -288
  32. data/lib/chef/provisioning/machine/windows_machine.rb +108 -108
  33. data/lib/chef/provisioning/machine_image_spec.rb +34 -34
  34. data/lib/chef/provisioning/machine_spec.rb +58 -58
  35. data/lib/chef/provisioning/managed_entry.rb +121 -121
  36. data/lib/chef/provisioning/managed_entry_store.rb +136 -136
  37. data/lib/chef/provisioning/recipe_dsl.rb +99 -99
  38. data/lib/chef/provisioning/rspec.rb +27 -27
  39. data/lib/chef/provisioning/transport.rb +100 -100
  40. data/lib/chef/provisioning/transport/ssh.rb +403 -403
  41. data/lib/chef/provisioning/transport/winrm.rb +144 -156
  42. data/lib/chef/provisioning/version.rb +5 -5
  43. data/lib/chef/resource/chef_data_bag_resource.rb +146 -146
  44. data/lib/chef/resource/load_balancer.rb +57 -57
  45. data/lib/chef/resource/machine.rb +128 -128
  46. data/lib/chef/resource/machine_batch.rb +78 -78
  47. data/lib/chef/resource/machine_execute.rb +30 -29
  48. data/lib/chef/resource/machine_file.rb +34 -34
  49. data/lib/chef/resource/machine_image.rb +35 -35
  50. data/lib/chef_metal.rb +1 -1
  51. data/spec/chef/provisioning/convergence_strategy/ignore_convergence_failure_spec.rb +86 -86
  52. data/spec/spec_helper.rb +27 -27
  53. metadata +5 -5
@@ -1,224 +1,224 @@
1
- require 'chef/chef_fs/parallelizer'
2
- require 'chef/provider/lwrp_base'
3
- require 'chef/provider/machine'
4
- require 'chef/provisioning/chef_provider_action_handler'
5
- require 'chef/provisioning/add_prefix_action_handler'
6
- require 'chef/provisioning/machine_spec'
7
-
8
- class Chef
9
- class Provider
10
- class MachineBatch < Chef::Provider::LWRPBase
11
- provides :machine_batch
12
-
13
- def action_handler
14
- @action_handler ||= Provisioning::ChefProviderActionHandler.new(self)
15
- end
16
-
17
- use_inline_resources
18
-
19
- def whyrun_supported?
20
- true
21
- end
22
-
23
- def parallelizer
24
- @parallelizer ||= Chef::ChefFS::Parallelizer.new(new_resource.max_simultaneous || 100)
25
- end
26
-
27
- action :allocate do
28
- by_new_driver.each do |driver, specs_and_options|
29
- driver.allocate_machines(action_handler, specs_and_options, parallelizer) do |machine_spec|
30
- m = by_id[machine_spec.id]
31
- machine_spec.from_image ||= m[:resource].from_image if m[:resource] && m[:resource].from_image
32
- machine_spec.driver_url ||= driver.driver_url
33
- machine_spec.save(m[:action_handler])
34
- end
35
- end
36
- end
37
-
38
- action :ready do
39
- with_ready_machines
40
- end
41
-
42
- action :setup do
43
- with_ready_machines do |m|
44
- m[:machine].setup_convergence(m[:action_handler])
45
- m[:spec].save(m[:action_handler])
46
- Chef::Provider::Machine.upload_files(m[:action_handler], m[:machine], m[:files])
47
- end
48
- end
49
-
50
- action :converge do
51
- with_ready_machines do |m|
52
- m[:machine].setup_convergence(m[:action_handler])
53
- m[:spec].save(m[:action_handler])
54
- Chef::Provider::Machine.upload_files(m[:action_handler], m[:machine], m[:files])
55
-
56
- if m[:resource] && m[:resource].converge
57
- Chef::Log.info("Converging #{m[:spec].name} because 'converge true' is set ...")
58
- m[:machine].converge(m[:action_handler])
59
- elsif (!m[:resource] || m[:resource].converge.nil?) && m[:action_handler].locally_updated
60
- Chef::Log.info("Converging #{m[:spec].name} because the resource was updated ...")
61
- m[:machine].converge(m[:action_handler])
62
- elsif !m[:spec].node['automatic'] || m[:spec].node['automatic'].size == 0
63
- Chef::Log.info("Converging #{m[:spec].name} because it has never been converged (automatic attributes are empty) ...")
64
- m[:machine].converge(m[:action_handler])
65
- elsif m[:resource] && m[:resource].converge == false
66
- Chef::Log.debug("Not converging #{m[:spec].name} because 'converge false' is set.")
67
- end
68
- end
69
- end
70
-
71
- action :converge_only do
72
- parallel_do(@machines) do |m|
73
- machine = run_context.chef_provisioning.connect_to_machine(m[:spec])
74
- machine.converge(m[:action_handler])
75
- end
76
- end
77
-
78
- action :destroy do
79
- parallel_do(by_current_driver) do |driver, specs_and_options|
80
- driver.destroy_machines(action_handler, specs_and_options, parallelizer)
81
- specs_and_options.keys.each do |machine_spec|
82
- machine_spec.delete(action_handler)
83
- end
84
- end
85
- end
86
-
87
- action :stop do
88
- parallel_do(by_current_driver) do |driver, specs_and_options|
89
- driver.stop_machines(action_handler, specs_and_options, parallelizer)
90
- end
91
- end
92
-
93
- class MachineBatchError < StandardError
94
- attr_reader :machine
95
- def initialize(machine, msg)
96
- @machine = machine
97
- super(msg)
98
- end
99
- end
100
-
101
- def with_ready_machines
102
- action_allocate
103
- parallel_do(by_new_driver) do |driver, specs_and_options|
104
- driver.ready_machines(action_handler, specs_and_options, parallelizer) do |machine|
105
- machine.machine_spec.save(action_handler)
106
-
107
- m = by_id[machine.machine_spec.id]
108
-
109
- m[:machine] = machine
110
- begin
111
- yield m if block_given?
112
- rescue StandardError => error
113
- Chef::Log.debug("Chef provisioning failed on machine #{machine.name}")
114
- raise MachineBatchError.new(machine, error.message)
115
- ensure
116
- machine.disconnect
117
- end
118
- end
119
- end
120
- end
121
-
122
- def by_id
123
- @by_id ||= @machines.inject({}) { |hash,m| hash[m[:spec].id] = m; hash }
124
- end
125
-
126
- # TODO in many of these cases, the order of the results only matters because you
127
- # want to match it up with the input. Make a parallelize method that doesn't
128
- # care about order and spits back results as quickly as possible.
129
- def parallel_do(enum, options = {}, &block)
130
- parallelizer.parallelize(enum, options, &block).to_a
131
- end
132
-
133
- def by_new_driver
134
- result = {}
135
- drivers = {}
136
- @machines.each do |m|
137
- if m[:desired_driver]
138
- drivers[m[:desired_driver]] ||= run_context.chef_provisioning.driver_for(m[:desired_driver])
139
- driver = drivers[m[:desired_driver]]
140
- # Check whether the current driver is same or different; we disallow
141
- # moving a machine from one place to another.
142
- if m[:spec].driver_url
143
- drivers[m[:spec].driver_url] ||= run_context.chef_provisioning.driver_for(m[:spec].driver_url)
144
- current_driver = drivers[m[:spec].driver_url]
145
- if driver.driver_url != current_driver.driver_url
146
- raise "Cannot move '#{m[:spec].name}' from #{current_driver.driver_url} to #{driver.driver_url}: machine moving is not supported. Destroy and recreate."
147
- end
148
- end
149
- result[driver] ||= {}
150
- result[driver][m[:spec]] = m[:machine_options].call(driver)
151
- else
152
- raise "No driver specified for #{m[:spec].name}"
153
- end
154
- end
155
- result
156
- end
157
-
158
- def by_current_driver
159
- result = {}
160
- drivers = {}
161
- @machines.each do |m|
162
- if m[:spec].driver_url
163
- drivers[m[:spec].driver_url] ||= run_context.chef_provisioning.driver_for(m[:spec].driver_url)
164
- driver = drivers[m[:spec].driver_url]
165
- result[driver] ||= {}
166
- result[driver][m[:spec]] = m[:machine_options].call(driver)
167
- end
168
- end
169
- result
170
- end
171
-
172
- def load_current_resource
173
- # Load nodes in parallel
174
- @machines = parallel_do(new_resource.machines) do |machine|
175
- if machine.is_a?(Chef::Resource::Machine)
176
- machine_resource = machine
177
- provider = Chef::Provider::Machine.new(machine_resource, machine_resource.run_context)
178
- provider.load_current_resource
179
- {
180
- :resource => machine_resource,
181
- :spec => provider.machine_spec,
182
- :desired_driver => machine_resource.driver,
183
- :files => machine_resource.files,
184
- :machine_options => proc { |driver| provider.machine_options(driver) },
185
- :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{machine_resource.name}] ")
186
- }
187
- elsif machine.is_a?(Provisioning::ManagedEntry)
188
- machine_spec = machine
189
- {
190
- :spec => machine_spec,
191
- :desired_driver => new_resource.driver,
192
- :files => new_resource.files,
193
- :machine_options => proc { |driver| machine_options(driver) },
194
- :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{machine_spec.name}] ")
195
- }
196
- else
197
- name = machine
198
- machine_spec = chef_managed_entry_store.get_or_new(:machine, name)
199
- {
200
- :spec => machine_spec,
201
- :desired_driver => new_resource.driver,
202
- :files => new_resource.files,
203
- :machine_options => proc { |driver| machine_options(driver) },
204
- :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{name}] ")
205
- }
206
- end
207
- end.to_a
208
- end
209
-
210
- def chef_managed_entry_store
211
- @chef_managed_entry_store ||= Provisioning.chef_managed_entry_store(new_resource.chef_server)
212
- end
213
-
214
- def machine_options(driver)
215
- result = { :convergence_options => { :chef_server => new_resource.chef_server } }
216
- result = Chef::Mixin::DeepMerge.hash_only_merge(result, run_context.chef_provisioning.config[:machine_options]) if run_context.chef_provisioning.config[:machine_options]
217
- result = Chef::Mixin::DeepMerge.hash_only_merge(result, driver.config[:machine_options]) if driver.config && driver.config[:machine_options]
218
- result = Chef::Mixin::DeepMerge.hash_only_merge(result, new_resource.machine_options)
219
- result
220
- end
221
-
222
- end
223
- end
224
- end
1
+ require 'chef/chef_fs/parallelizer'
2
+ require 'chef/provider/lwrp_base'
3
+ require 'chef/provider/machine'
4
+ require 'chef/provisioning/chef_provider_action_handler'
5
+ require 'chef/provisioning/add_prefix_action_handler'
6
+ require 'chef/provisioning/machine_spec'
7
+
8
+ class Chef
9
+ class Provider
10
+ class MachineBatch < Chef::Provider::LWRPBase
11
+ provides :machine_batch
12
+
13
+ def action_handler
14
+ @action_handler ||= Provisioning::ChefProviderActionHandler.new(self)
15
+ end
16
+
17
+ use_inline_resources
18
+
19
+ def whyrun_supported?
20
+ true
21
+ end
22
+
23
+ def parallelizer
24
+ @parallelizer ||= Chef::ChefFS::Parallelizer.new(new_resource.max_simultaneous || 100)
25
+ end
26
+
27
+ action :allocate do
28
+ by_new_driver.each do |driver, specs_and_options|
29
+ driver.allocate_machines(action_handler, specs_and_options, parallelizer) do |machine_spec|
30
+ m = by_id[machine_spec.id]
31
+ machine_spec.from_image ||= m[:resource].from_image if m[:resource] && m[:resource].from_image
32
+ machine_spec.driver_url ||= driver.driver_url
33
+ machine_spec.save(m[:action_handler])
34
+ end
35
+ end
36
+ end
37
+
38
+ action :ready do
39
+ with_ready_machines
40
+ end
41
+
42
+ action :setup do
43
+ with_ready_machines do |m|
44
+ m[:machine].setup_convergence(m[:action_handler])
45
+ m[:spec].save(m[:action_handler])
46
+ Chef::Provider::Machine.upload_files(m[:action_handler], m[:machine], m[:files])
47
+ end
48
+ end
49
+
50
+ action :converge do
51
+ with_ready_machines do |m|
52
+ m[:machine].setup_convergence(m[:action_handler])
53
+ m[:spec].save(m[:action_handler])
54
+ Chef::Provider::Machine.upload_files(m[:action_handler], m[:machine], m[:files])
55
+
56
+ if m[:resource] && m[:resource].converge
57
+ Chef::Log.info("Converging #{m[:spec].name} because 'converge true' is set ...")
58
+ m[:machine].converge(m[:action_handler])
59
+ elsif (!m[:resource] || m[:resource].converge.nil?) && m[:action_handler].locally_updated
60
+ Chef::Log.info("Converging #{m[:spec].name} because the resource was updated ...")
61
+ m[:machine].converge(m[:action_handler])
62
+ elsif !m[:spec].node['automatic'] || m[:spec].node['automatic'].size == 0
63
+ Chef::Log.info("Converging #{m[:spec].name} because it has never been converged (automatic attributes are empty) ...")
64
+ m[:machine].converge(m[:action_handler])
65
+ elsif m[:resource] && m[:resource].converge == false
66
+ Chef::Log.debug("Not converging #{m[:spec].name} because 'converge false' is set.")
67
+ end
68
+ end
69
+ end
70
+
71
+ action :converge_only do
72
+ parallel_do(@machines) do |m|
73
+ machine = run_context.chef_provisioning.connect_to_machine(m[:spec])
74
+ machine.converge(m[:action_handler])
75
+ end
76
+ end
77
+
78
+ action :destroy do
79
+ parallel_do(by_current_driver) do |driver, specs_and_options|
80
+ driver.destroy_machines(action_handler, specs_and_options, parallelizer)
81
+ specs_and_options.keys.each do |machine_spec|
82
+ machine_spec.delete(action_handler)
83
+ end
84
+ end
85
+ end
86
+
87
+ action :stop do
88
+ parallel_do(by_current_driver) do |driver, specs_and_options|
89
+ driver.stop_machines(action_handler, specs_and_options, parallelizer)
90
+ end
91
+ end
92
+
93
+ class MachineBatchError < StandardError
94
+ attr_reader :machine
95
+ def initialize(machine, msg)
96
+ @machine = machine
97
+ super(msg)
98
+ end
99
+ end
100
+
101
+ def with_ready_machines
102
+ action_allocate
103
+ parallel_do(by_new_driver) do |driver, specs_and_options|
104
+ driver.ready_machines(action_handler, specs_and_options, parallelizer) do |machine|
105
+ machine.machine_spec.save(action_handler)
106
+
107
+ m = by_id[machine.machine_spec.id]
108
+
109
+ m[:machine] = machine
110
+ begin
111
+ yield m if block_given?
112
+ rescue StandardError => error
113
+ Chef::Log.debug("Chef provisioning failed on machine #{machine.name}")
114
+ raise MachineBatchError.new(machine, error.message)
115
+ ensure
116
+ machine.disconnect
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ def by_id
123
+ @by_id ||= @machines.inject({}) { |hash,m| hash[m[:spec].id] = m; hash }
124
+ end
125
+
126
+ # TODO in many of these cases, the order of the results only matters because you
127
+ # want to match it up with the input. Make a parallelize method that doesn't
128
+ # care about order and spits back results as quickly as possible.
129
+ def parallel_do(enum, options = {}, &block)
130
+ parallelizer.parallelize(enum, options, &block).to_a
131
+ end
132
+
133
+ def by_new_driver
134
+ result = {}
135
+ drivers = {}
136
+ @machines.each do |m|
137
+ if m[:desired_driver]
138
+ drivers[m[:desired_driver]] ||= run_context.chef_provisioning.driver_for(m[:desired_driver])
139
+ driver = drivers[m[:desired_driver]]
140
+ # Check whether the current driver is same or different; we disallow
141
+ # moving a machine from one place to another.
142
+ if m[:spec].driver_url
143
+ drivers[m[:spec].driver_url] ||= run_context.chef_provisioning.driver_for(m[:spec].driver_url)
144
+ current_driver = drivers[m[:spec].driver_url]
145
+ if driver.driver_url != current_driver.driver_url
146
+ raise "Cannot move '#{m[:spec].name}' from #{current_driver.driver_url} to #{driver.driver_url}: machine moving is not supported. Destroy and recreate."
147
+ end
148
+ end
149
+ result[driver] ||= {}
150
+ result[driver][m[:spec]] = m[:machine_options].call(driver)
151
+ else
152
+ raise "No driver specified for #{m[:spec].name}"
153
+ end
154
+ end
155
+ result
156
+ end
157
+
158
+ def by_current_driver
159
+ result = {}
160
+ drivers = {}
161
+ @machines.each do |m|
162
+ if m[:spec].driver_url
163
+ drivers[m[:spec].driver_url] ||= run_context.chef_provisioning.driver_for(m[:spec].driver_url)
164
+ driver = drivers[m[:spec].driver_url]
165
+ result[driver] ||= {}
166
+ result[driver][m[:spec]] = m[:machine_options].call(driver)
167
+ end
168
+ end
169
+ result
170
+ end
171
+
172
+ def load_current_resource
173
+ # Load nodes in parallel
174
+ @machines = parallel_do(new_resource.machines) do |machine|
175
+ if machine.is_a?(Chef::Resource::Machine)
176
+ machine_resource = machine
177
+ provider = Chef::Provider::Machine.new(machine_resource, machine_resource.run_context)
178
+ provider.load_current_resource
179
+ {
180
+ :resource => machine_resource,
181
+ :spec => provider.machine_spec,
182
+ :desired_driver => machine_resource.driver,
183
+ :files => machine_resource.files,
184
+ :machine_options => proc { |driver| provider.machine_options(driver) },
185
+ :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{machine_resource.name}] ")
186
+ }
187
+ elsif machine.is_a?(Provisioning::ManagedEntry)
188
+ machine_spec = machine
189
+ {
190
+ :spec => machine_spec,
191
+ :desired_driver => new_resource.driver,
192
+ :files => new_resource.files,
193
+ :machine_options => proc { |driver| machine_options(driver) },
194
+ :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{machine_spec.name}] ")
195
+ }
196
+ else
197
+ name = machine
198
+ machine_spec = chef_managed_entry_store.get_or_new(:machine, name)
199
+ {
200
+ :spec => machine_spec,
201
+ :desired_driver => new_resource.driver,
202
+ :files => new_resource.files,
203
+ :machine_options => proc { |driver| machine_options(driver) },
204
+ :action_handler => Provisioning::AddPrefixActionHandler.new(action_handler, "[#{name}] ")
205
+ }
206
+ end
207
+ end.to_a
208
+ end
209
+
210
+ def chef_managed_entry_store
211
+ @chef_managed_entry_store ||= Provisioning.chef_managed_entry_store(new_resource.chef_server)
212
+ end
213
+
214
+ def machine_options(driver)
215
+ result = { :convergence_options => { :chef_server => new_resource.chef_server } }
216
+ result = Chef::Mixin::DeepMerge.hash_only_merge(result, run_context.chef_provisioning.config[:machine_options]) if run_context.chef_provisioning.config[:machine_options]
217
+ result = Chef::Mixin::DeepMerge.hash_only_merge(result, driver.config[:machine_options]) if driver.config && driver.config[:machine_options]
218
+ result = Chef::Mixin::DeepMerge.hash_only_merge(result, new_resource.machine_options)
219
+ result
220
+ end
221
+
222
+ end
223
+ end
224
+ end
@@ -1,35 +1,36 @@
1
- require 'chef/provider/lwrp_base'
2
- require 'chef/provisioning/chef_provider_action_handler'
3
- require 'chef/provisioning/machine'
4
-
5
- class Chef
6
- class Provider
7
- class MachineExecute < Chef::Provider::LWRPBase
8
-
9
- def action_handler
10
- @action_handler ||= Chef::Provisioning::ChefProviderActionHandler.new(self)
11
- end
12
-
13
- use_inline_resources
14
-
15
- def whyrun_supported?
16
- true
17
- end
18
-
19
- def machine
20
- @machine ||= begin
21
- if new_resource.machine.kind_of?(Chef::Provisioning::Machine)
22
- new_resource.machine
23
- else
24
- run_context.chef_provisioning.connect_to_machine(new_resource.machine, new_resource.chef_server)
25
- end
26
- end
27
- end
28
-
29
- action :run do
30
- machine.execute(action_handler, new_resource.command, :stream => new_resource.live_stream)
31
- end
32
-
33
- end
34
- end
35
- end
1
+ require 'chef/provider/lwrp_base'
2
+ require 'chef/provisioning/chef_provider_action_handler'
3
+ require 'chef/provisioning/machine'
4
+
5
+ class Chef
6
+ class Provider
7
+ class MachineExecute < Chef::Provider::LWRPBase
8
+
9
+ def action_handler
10
+ @action_handler ||= Chef::Provisioning::ChefProviderActionHandler.new(self)
11
+ end
12
+
13
+ use_inline_resources
14
+
15
+ def whyrun_supported?
16
+ true
17
+ end
18
+
19
+ def machine
20
+ @machine ||= begin
21
+ if new_resource.machine.kind_of?(Chef::Provisioning::Machine)
22
+ new_resource.machine
23
+ else
24
+ run_context.chef_provisioning.connect_to_machine(new_resource.machine, new_resource.chef_server)
25
+ end
26
+ end
27
+ end
28
+
29
+ action :run do
30
+ machine.execute(action_handler, new_resource.command, :stream => new_resource.live_stream,
31
+ :timeout => new_resource.timeout)
32
+ end
33
+
34
+ end
35
+ end
36
+ end