chef-metal 0.11.beta.5 → 0.11.beta.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64ea86f29c6071ee79f33641c14a1f789cfcd332
4
- data.tar.gz: 26b76360f2199924897ce4e86e68be5fd21dff0e
3
+ metadata.gz: 57e203c5e2a58d054e8d303906e5b40d2478ed37
4
+ data.tar.gz: 0b8b3b991467d7d834f546f5f43deea6d2082698
5
5
  SHA512:
6
- metadata.gz: 6fc3b908d5393e2729fee78d50a9edf1f561748c93a4336b871fafa22f17898b50b3248dee66a7350399631c95de2c9431562352d67fc8267d47a68271196501
7
- data.tar.gz: b6e096f975a6807a2ecb313ba8de45c4611aea368ebf84004ed3ba14257025f75f5ce4b302317a98ac2c7275aa032295d74983e5786cb563bbab8eb502c64b56
6
+ metadata.gz: 6e53205b1f8a91b810aac8f45f830194d2a9b6012351d64f7cb51d2da219f71d5aa1cb5a534d710bbaf7a7a2a98041d38dd843149eebd3927e97366a61e70440
7
+ data.tar.gz: bfc2fbef95fc8c9692d48621fe4aefb353422742350c79e49a5386af627dfc7aba41140d589f250916abf7c6fd6a290b3fc92b9da56fdce620ab5bf8c0301234
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Chef Metal Changelog
2
2
 
3
+ ## 0.11.beta.6 (5/28/2014)
4
+
5
+ - Fix machine_batch defaults to be significantly less stupid
6
+ - Remove with_machine_batch
7
+ - Allow this:
8
+ ```ruby
9
+ machine_batch do
10
+ machine 'a'
11
+ machine 'b'
12
+ end
13
+ ```
14
+ - Allow this:
15
+ ```ruby
16
+ machine_batch do
17
+ machines 'a', 'b', 'c'
18
+ action :destroy
19
+ end
20
+ - fix SSH gateway code to honor any options given (@marcusn)
21
+
3
22
  ## 0.11.beta.5 (5/28/2014)
4
23
 
5
24
  - fix issue setting Hosted Chef ACLs on nodes
@@ -3,6 +3,8 @@ require 'chef/provider/lwrp_base'
3
3
  require 'chef/provider/machine'
4
4
  require 'chef_metal/chef_provider_action_handler'
5
5
  require 'chef_metal/add_prefix_action_handler'
6
+ require 'chef_metal/machine_spec'
7
+ require 'chef_metal/chef_machine_spec'
6
8
 
7
9
  class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
8
10
 
@@ -34,27 +36,28 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
34
36
 
35
37
  action :setup do
36
38
  with_ready_machines do |m|
37
- prefixed_handler = ChefMetal::AddPrefixActionHandler.new(action_handler, "[#{m[:resource].name}] ")
39
+ prefixed_handler = ChefMetal::AddPrefixActionHandler.new(action_handler, "[#{m[:spec].name}] ")
38
40
  machine[:machine].setup_convergence(prefixed_handler)
39
41
  m[:spec].save(action_handler)
40
- Chef::Provider::Machine.upload_files(prefixed_handler, m[:machine], m[:resource].files)
42
+ Chef::Provider::Machine.upload_files(prefixed_handler, m[:machine], m[:files])
41
43
  end
42
44
  end
43
45
 
44
46
  action :converge do
45
47
  with_ready_machines do |m|
46
- prefixed_handler = ChefMetal::AddPrefixActionHandler.new(action_handler, "[#{m[:resource].name}] ")
48
+ prefixed_handler = ChefMetal::AddPrefixActionHandler.new(action_handler, "[#{m[:spec].name}] ")
47
49
  m[:machine].setup_convergence(prefixed_handler)
48
50
  m[:spec].save(action_handler)
49
- Chef::Provider::Machine.upload_files(prefixed_handler, m[:machine], m[:resource].files)
51
+ Chef::Provider::Machine.upload_files(prefixed_handler, m[:machine], m[:files])
50
52
  m[:machine].converge(prefixed_handler)
51
53
  m[:spec].save(action_handler)
52
54
  end
53
55
  end
54
56
 
55
- action :stop do
56
- parallel_do(by_current_driver) do |driver, specs_and_options|
57
- driver.stop_machines(action_handler, specs_and_options, parallelizer)
57
+ action :converge_only do
58
+ parallel_do(@machines) do |m|
59
+ machine = run_context.chef_metal.connect_to_machine(m[:spec])
60
+ machine.converge(action_handler)
58
61
  end
59
62
  end
60
63
 
@@ -64,6 +67,12 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
64
67
  end
65
68
  end
66
69
 
70
+ action :stop do
71
+ parallel_do(by_current_driver) do |driver, specs_and_options|
72
+ driver.stop_machines(action_handler, specs_and_options, parallelizer)
73
+ end
74
+ end
75
+
67
76
  def with_ready_machines
68
77
  action_allocate
69
78
  by_id = @machines.inject({}) { |hash,m| hash[m[:spec].id] = m; hash }
@@ -93,8 +102,8 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
93
102
  def by_new_driver
94
103
  result = {}
95
104
  @machines.each do |m|
96
- if m[:resource].driver
97
- driver = run_context.chef_metal.driver_for(m[:resource].driver)
105
+ if m[:desired_driver]
106
+ driver = run_context.chef_metal.driver_for(m[:desired_driver])
98
107
  result[driver] ||= {}
99
108
  result[driver][m[:spec]] = m[:options]
100
109
  end
@@ -116,15 +125,50 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
116
125
 
117
126
  def load_current_resource
118
127
  # Load nodes in parallel
119
- @machines = parallel_do(new_resource.machines) do |machine_resource|
120
- provider = Chef::Provider::Machine.new(machine_resource, machine_resource.run_context)
121
- provider.load_current_resource
122
- {
123
- :resource => machine_resource,
124
- :spec => provider.machine_spec,
125
- :options => provider.machine_options
126
- }
127
- end.to_a
128
+ @machines = parallel_do(new_resource.machines) do |machine|
129
+ if machine.is_a?(Chef::Resource::Machine)
130
+ machine_resource = machine
131
+ provider = Chef::Provider::Machine.new(machine_resource, machine_resource.run_context)
132
+ provider.load_current_resource
133
+ {
134
+ :spec => provider.machine_spec,
135
+ :desired_driver => machine_resource.driver,
136
+ :files => machine_resource.files,
137
+ :options => provider.machine_options
138
+ }
139
+ elsif machine.is_a?(ChefMetal::MachineSpec)
140
+ machine_spec = machine
141
+ {
142
+ :spec => machine_spec,
143
+ :desired_driver => new_resource.driver,
144
+ :files => new_resource.files,
145
+ :options => new_machine_options
146
+ }
147
+ else
148
+ name = machine
149
+ machine_spec = ChefMetal::ChefMachineSpec.get(name, new_resource.chef_server) ||
150
+ ChefMetal::ChefMachineSpec.empty(name, new_resource.chef_server)
151
+ {
152
+ :spec => machine_spec,
153
+ :desired_driver => new_resource.driver,
154
+ :files => new_resource.files,
155
+ :options => new_machine_options
156
+ }
157
+ end
158
+ end.select { |m| !m.nil? }.to_a
159
+ end
160
+
161
+ def new_machine_options
162
+ @new_machine_options ||= begin
163
+ result = { :convergence_options => { :chef_server => new_resource.chef_server } }
164
+ result = Chef::Mixin::DeepMerge.hash_only_merge(result, new_config[:machine_options]) if new_config[:machine_options]
165
+ result = Chef::Mixin::DeepMerge.hash_only_merge(result, new_resource.machine_options)
166
+ result
167
+ end
168
+ end
169
+
170
+ def new_config
171
+ @new_config ||= run_context.chef_metal.driver_config_for(new_resource.driver)
128
172
  end
129
173
 
130
174
  end
@@ -1,6 +1,7 @@
1
1
  require 'chef/resource/lwrp_base'
2
2
  require 'cheffish'
3
3
  require 'chef_metal'
4
+ require 'cheffish/merged_config'
4
5
 
5
6
  class Chef::Resource::Machine < Chef::Resource::LWRPBase
6
7
  self.resource_name = 'machine'
@@ -11,9 +12,6 @@ class Chef::Resource::Machine < Chef::Resource::LWRPBase
11
12
  @chef_server = run_context.cheffish.current_chef_server
12
13
  @driver = run_context.chef_metal.current_driver
13
14
  @machine_options = run_context.chef_metal.current_machine_options
14
- if run_context.chef_metal.current_machine_batch
15
- run_context.chef_metal.current_machine_batch.machines << self
16
- end
17
15
  end
18
16
 
19
17
  actions :allocate, :ready, :setup, :converge, :converge_only, :destroy, :stop
@@ -85,7 +83,7 @@ class Chef::Resource::Machine < Chef::Resource::LWRPBase
85
83
  end
86
84
 
87
85
  def add_machine_options(options)
88
- @machine_options = Chef::Mixin::DeepMerge.hash_only_merge(@machine_options, options)
86
+ @machine_options = Cheffish::MergedConfig.new(options, @machine_options)
89
87
  end
90
88
 
91
89
  # chef client version and omnibus
@@ -1,4 +1,5 @@
1
1
  require 'chef/resource/lwrp_base'
2
+ require 'chef/mixin/deep_merge'
2
3
 
3
4
  class Chef::Resource::MachineBatch < Chef::Resource::LWRPBase
4
5
  self.resource_name = 'machine_batch'
@@ -6,15 +7,38 @@ class Chef::Resource::MachineBatch < Chef::Resource::LWRPBase
6
7
  def initialize(*args)
7
8
  super
8
9
  @machines = []
10
+ @driver = run_context.chef_metal.current_driver
9
11
  @chef_server = run_context.cheffish.current_chef_server
12
+ @machine_options = run_context.chef_metal.current_machine_options
10
13
  end
11
14
 
12
- # TODO there is a useful action sequence where one does an ohai on all machines,
13
- # waits for that to complete, save the nodes, and THEN converges.
14
- actions :acquire, :setup, :converge, :stop, :destroy
15
+ actions :allocate, :ready, :setup, :converge, :converge_only, :destroy, :stop
15
16
  default_action :converge
16
17
 
17
18
  attribute :machines, :kind_of => [ Array ]
18
19
  attribute :max_simultaneous, :kind_of => [ Integer ]
20
+ attribute :from_recipe
21
+
22
+ # These four attributes are for when you pass names or MachineSpecs to
23
+ # "machines". Not used for auto-batch or explicit inline machine declarations.
24
+ attribute :driver
19
25
  attribute :chef_server
26
+ attribute :machine_options
27
+ attribute :files, :kind_of => [ Array ]
28
+
29
+ def machines(*values)
30
+ if values.size == 0
31
+ @machines
32
+ else
33
+ @machines += values.flatten
34
+ end
35
+ end
36
+
37
+ def machine(name, &block)
38
+ machines << from_recipe.build_resource(:machine, name, caller[0], &block)
39
+ end
40
+
41
+ def add_machine_options(options)
42
+ @machine_options = Chef::Mixin::DeepMerge.hash_only_merge(@machine_options, options)
43
+ end
20
44
  end
@@ -14,11 +14,25 @@ module ChefMetal
14
14
  end
15
15
 
16
16
  #
17
- # Get a MachineSpec from the chef server.
17
+ # Get a MachineSpec from the chef server. If the node does not exist on the
18
+ # server, it returns nil.
18
19
  #
19
20
  def self.get(name, chef_server = Cheffish.default_chef_server)
20
21
  chef_api = Cheffish.chef_server_api(chef_server)
21
- ChefMachineSpec.new(chef_api.get("/nodes/#{name}"), chef_server)
22
+ begin
23
+ ChefMachineSpec.new(chef_api.get("/nodes/#{name}"), chef_server)
24
+ rescue Net::HTTPServerException => e
25
+ if e.response.code == '404'
26
+ nil
27
+ else
28
+ raise
29
+ end
30
+ end
31
+ end
32
+
33
+ # Creates a new empty MachineSpec with the given name.
34
+ def self.empty(name, chef_server = Cheffish.default_chef_server)
35
+ ChefMachineSpec.new({ 'name' => name, 'normal' => {} }, chef_server)
22
36
  end
23
37
 
24
38
  #
@@ -16,7 +16,18 @@ module ChefMetal
16
16
 
17
17
  with :driver
18
18
  with :machine_options
19
- with :machine_batch
19
+
20
+ def auto_batch_machines
21
+ if !@auto_batch_machines.nil?
22
+ @auto_batch_machines
23
+ else
24
+ config[:auto_batch_machines]
25
+ end
26
+ end
27
+
28
+ def auto_batch_machines=(value)
29
+ @auto_batch_machines = value
30
+ end
20
31
 
21
32
  def current_driver
22
33
  @current_driver || config[:driver]
@@ -25,10 +36,8 @@ module ChefMetal
25
36
  def current_machine_options
26
37
  if @current_machine_options
27
38
  @current_machine_options
28
- elsif config[:drivers] && driver_for(current_driver) && config[:drivers][driver_for(current_driver).driver_url]
29
- Cheffish::MergedConfig.new(config[:drivers][driver_for(current_driver).driver_url], config)[:machine_options] || {}
30
39
  else
31
- config[:machine_options] || {}
40
+ driver_config_for(current_driver)[:machine_options] || {}
32
41
  end
33
42
  end
34
43
 
@@ -21,20 +21,6 @@ class Chef
21
21
  run_context.chef_metal.with_machine_options(machine_options, &block)
22
22
  end
23
23
 
24
- def with_machine_batch(the_machine_batch, options = {}, &block)
25
- if the_machine_batch.is_a?(String)
26
- the_machine_batch = machine_batch the_machine_batch do
27
- if options[:action]
28
- action options[:action]
29
- end
30
- if options[:max_simultaneous]
31
- max_simultaneous options[:max_simultaneous]
32
- end
33
- end
34
- end
35
- run_context.chef_metal.with_machine_batch(the_machine_batch, &block)
36
- end
37
-
38
24
  def current_machine_options
39
25
  run_context.chef_metal.current_machine_options
40
26
  end
@@ -43,19 +29,76 @@ class Chef
43
29
  run_context.chef_metal.add_machine_options(options, &block)
44
30
  end
45
31
 
32
+ NOT_PASSED = Object.new
33
+
34
+ def auto_batch_machines(value = NOT_PASSED)
35
+ if value == NOT_PASSED
36
+ run_context.chef_metal.auto_batch_machines
37
+ else
38
+ run_context.chef_metal.auto_batch_machines = value
39
+ end
40
+ end
41
+
42
+ def machine_batch_default_name
43
+ if @machine_batch_index
44
+ @machine_batch_index += 1
45
+ "default#{@machine_batch_index}"
46
+ else
47
+ @machine_batch_index = 0
48
+ "default"
49
+ end
50
+ end
51
+
52
+ def machine_batch(name = nil, &block)
53
+ name ||= machine_batch_default_name
54
+ recipe = self
55
+ declare_resource(:machine_batch, name, caller[0]) do
56
+ from_recipe recipe
57
+ instance_eval(&block)
58
+ end
59
+ end
60
+
46
61
  # When the machine resource is first declared, create a machine_batch (if there
47
62
  # isn't one already)
48
63
  def machine(name, &block)
49
- if !run_context.chef_metal.current_machine_batch
50
- run_context.chef_metal.with_machine_batch declare_resource(:machine_batch, 'default', caller[0])
64
+ resource = build_resource(:machine, name, caller[0], &block)
65
+
66
+ # Grab the previous resource so we can decide whether to batch this or make it its own resource.
67
+ previous_index = run_context.resource_collection.previous_index
68
+ previous = previous_index >= 0 ? run_context.resource_collection[previous_index] : nil
69
+ if run_context.chef_metal.auto_batch_machines &&
70
+ previous &&
71
+ Array(resource.action).size == 1 &&
72
+ Array(previous.action) == Array(resource.action)
73
+
74
+ # Handle batching similar machines (with similar actions)
75
+ if previous.is_a?(Chef::Resource::MachineBatch)
76
+ # If we see a machine declared after a previous machine_batch with the same action, add it to the batch.
77
+ previous.machines << resource
78
+ elsif previous.is_a?(Chef::Resource::Machine)
79
+ # If we see two machines in a row with the same action, batch them.
80
+ _self = self
81
+ batch = build_resource(:machine_batch, machine_batch_default_name) do
82
+ action resource.action
83
+ machines [ previous, resource ]
84
+ end
85
+ batch.from_recipe self
86
+ run_context.resource_collection[previous_index] = batch
87
+ else
88
+ run_context.resource_collection.insert(resource)
89
+ end
90
+
91
+ else
92
+ run_context.resource_collection.insert(resource)
51
93
  end
52
- declare_resource(:machine, name, caller[0], &block)
94
+ resource
53
95
  end
54
96
  end
55
97
  end
56
98
 
57
99
  class Config
58
100
  default(:driver) { ENV['CHEF_DRIVER'] }
101
+ default(:auto_batch_machines) { true }
59
102
  # config_context :drivers do
60
103
  # # each key is a driver_url, and each value can have driver, driver_options and machine_options
61
104
  # config_strict_mode false
@@ -75,4 +118,10 @@ class Chef
75
118
  @chef_metal ||= ChefMetal::ChefRunData.new(config)
76
119
  end
77
120
  end
121
+
122
+ class ResourceCollection
123
+ def previous_index
124
+ @insert_after_idx ? @insert_after_idx : @resources.length - 1
125
+ end
126
+ end
78
127
  end
@@ -159,7 +159,7 @@ module ChefMetal
159
159
 
160
160
  Chef::Log.debug("Opening SSH gateway to #{gw_user}@#{gw_host} with options #{ssh_start_opts.inspect}")
161
161
  begin
162
- Net::SSH::Gateway.new(gw_host, gw_user)
162
+ Net::SSH::Gateway.new(gw_host, gw_user, ssh_start_opts)
163
163
  rescue Errno::ETIMEDOUT
164
164
  Chef::Log.debug("Timed out connecting to gateway: #{$!}")
165
165
  raise InitialConnectTimeout.new($!)
@@ -1,3 +1,3 @@
1
1
  module ChefMetal
2
- VERSION = '0.11.beta.5'
2
+ VERSION = '0.11.beta.6'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-metal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.beta.5
4
+ version: 0.11.beta.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-28 00:00:00.000000000 Z
11
+ date: 2014-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef