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 +4 -4
- data/CHANGELOG.md +19 -0
- data/lib/chef/provider/machine_batch.rb +62 -18
- data/lib/chef/resource/machine.rb +2 -4
- data/lib/chef/resource/machine_batch.rb +27 -3
- data/lib/chef_metal/chef_machine_spec.rb +16 -2
- data/lib/chef_metal/chef_run_data.rb +13 -4
- data/lib/chef_metal/recipe_dsl.rb +66 -17
- data/lib/chef_metal/transport/ssh.rb +1 -1
- data/lib/chef_metal/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57e203c5e2a58d054e8d303906e5b40d2478ed37
|
4
|
+
data.tar.gz: 0b8b3b991467d7d834f546f5f43deea6d2082698
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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[:
|
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[:
|
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[:
|
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[:
|
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 :
|
56
|
-
parallel_do(
|
57
|
-
|
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[:
|
97
|
-
driver = run_context.chef_metal.driver_for(m[:
|
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 |
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
50
|
-
|
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
|
-
|
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($!)
|
data/lib/chef_metal/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2014-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|