clc-fork-chef-metal 0.14.alpha.3 → 0.14.alpha.4
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 +10 -0
- data/README.md +2 -1
- data/lib/chef/provider/machine.rb +7 -1
- data/lib/chef/provider/machine_batch.rb +6 -1
- data/lib/chef/provider/machine_execute.rb +6 -1
- data/lib/chef/provider/machine_file.rb +6 -1
- data/lib/chef/provider/machine_image.rb +7 -1
- data/lib/chef/resource/machine.rb +27 -2
- data/lib/chef/resource/machine_batch.rb +7 -1
- data/lib/chef/resource/machine_execute.rb +7 -1
- data/lib/chef/resource/machine_file.rb +7 -1
- data/lib/chef/resource/machine_image.rb +7 -1
- data/lib/chef_metal/chef_run_data.rb +26 -16
- data/lib/chef_metal/convergence_strategy/install_cached.rb +2 -5
- data/lib/chef_metal/convergence_strategy/precreate_chef_objects.rb +1 -1
- data/lib/chef_metal/driver.rb +61 -70
- data/lib/chef_metal/machine.rb +1 -1
- data/lib/chef_metal/recipe_dsl.rb +1 -44
- data/lib/chef_metal/transport/ssh.rb +21 -1
- data/lib/chef_metal/transport/winrm.rb +15 -0
- data/lib/chef_metal/transport.rb +9 -4
- data/lib/chef_metal/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c08de5313597e7139143246a94138fee6fca9a84
|
4
|
+
data.tar.gz: 6de6e645deaa776b7aab8a46ef8306b16046e3fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d17679c6572756d466c8cfa14c7a07256c9e58d058b086800f4f18f23057f851e721de28af47e2e207cd46ab27f3c5d58a15bdc47fa2762b420be8921c7b12d
|
7
|
+
data.tar.gz: d86b7d85497dfe688385af9418e41438fd6a66b9ab18a4773122452dc438e45a2505b9fbde5d134798ffa0a570f886d9967ceab951b98da903c3f2d89526a4c1
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Chef Metal Changelog
|
2
2
|
|
3
|
+
## 0.14.2 (9/2/2014)
|
4
|
+
|
5
|
+
- Disable auto batching
|
6
|
+
- Fix for with_machine_options context hash
|
7
|
+
- Pass timeout from execution_options to winrm set_timeout
|
8
|
+
- Add better error message when driver does not specify driver_url
|
9
|
+
- Add info that location.driver_url is required
|
10
|
+
- Remove Chef 11.14 alpha note in readme
|
11
|
+
- Gracefully handle Host Down and Network Unreachable
|
12
|
+
|
3
13
|
## 0.14.1 (8/18/2014)
|
4
14
|
|
5
15
|
- Fix "metal execute mario ls" to work again
|
data/README.md
CHANGED
@@ -15,6 +15,7 @@ Date | Blog
|
|
15
15
|
|
16
16
|
Documentation
|
17
17
|
-------------
|
18
|
+
* [Frequently Asked Questions](https://github.com/opscode/chef-metal/blog/master/docs/faq.md)
|
18
19
|
* [Configuration](https://github.com/opscode/chef-metal/blob/master/docs/configuration.md#configuring-and-using-metal-drivers)
|
19
20
|
* [Writing Drivers](https://github.com/opscode/chef-metal/blob/master/docs/building_drivers.md#writing-drivers)
|
20
21
|
* [Embedding](https://github.com/opscode/chef-metal/blob/master/docs/embedding.md)
|
@@ -124,7 +125,7 @@ Drivers each have their own repository. Current drivers:
|
|
124
125
|
|
125
126
|
**Containers:**
|
126
127
|
- [LXC](https://github.com/opscode/chef-metal-lxc) (not yet up to date with 0.11)
|
127
|
-
- [Docker](https://github.com/opscode/chef-metal-docker)
|
128
|
+
- [Docker](https://github.com/opscode/chef-metal-docker)
|
128
129
|
|
129
130
|
**Bare Metal:**
|
130
131
|
- [SSH (no PXE)](https://github.com/double-z/chef-metal-ssh) (not yet up to date with 0.11)
|
@@ -4,7 +4,9 @@ require 'openssl'
|
|
4
4
|
require 'chef_metal/chef_provider_action_handler'
|
5
5
|
require 'chef_metal/chef_machine_spec'
|
6
6
|
|
7
|
-
class Chef
|
7
|
+
class Chef
|
8
|
+
class Provider
|
9
|
+
class Machine < Chef::Provider::LWRPBase
|
8
10
|
|
9
11
|
def action_handler
|
10
12
|
@action_handler ||= ChefMetal::ChefProviderActionHandler.new(self)
|
@@ -133,6 +135,7 @@ class Chef::Provider::Machine < Chef::Provider::LWRPBase
|
|
133
135
|
result
|
134
136
|
end
|
135
137
|
}
|
138
|
+
|
136
139
|
configs << new_resource.machine_options if new_resource.machine_options
|
137
140
|
configs << driver.config[:machine_options] if driver.config[:machine_options]
|
138
141
|
Cheffish::MergedConfig.new(*configs)
|
@@ -167,4 +170,7 @@ class Chef::Provider::Machine < Chef::Provider::LWRPBase
|
|
167
170
|
def upload_files(machine)
|
168
171
|
Machine.upload_files(action_handler, machine, new_resource.files)
|
169
172
|
end
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
170
176
|
end
|
@@ -6,7 +6,9 @@ require 'chef_metal/add_prefix_action_handler'
|
|
6
6
|
require 'chef_metal/machine_spec'
|
7
7
|
require 'chef_metal/chef_machine_spec'
|
8
8
|
|
9
|
-
class Chef
|
9
|
+
class Chef
|
10
|
+
class Provider
|
11
|
+
class MachineBatch < Chef::Provider::LWRPBase
|
10
12
|
|
11
13
|
def action_handler
|
12
14
|
@action_handler ||= ChefMetal::ChefProviderActionHandler.new(self)
|
@@ -183,4 +185,7 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
|
|
183
185
|
result = Chef::Mixin::DeepMerge.hash_only_merge(result, new_resource.machine_options)
|
184
186
|
result
|
185
187
|
end
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
186
191
|
end
|
@@ -2,7 +2,9 @@ require 'chef/provider/lwrp_base'
|
|
2
2
|
require 'chef_metal/chef_provider_action_handler'
|
3
3
|
require 'chef_metal/machine'
|
4
4
|
|
5
|
-
class Chef
|
5
|
+
class Chef
|
6
|
+
class Provider
|
7
|
+
class MachineExecute < Chef::Provider::LWRPBase
|
6
8
|
|
7
9
|
def action_handler
|
8
10
|
@action_handler ||= ChefMetal::ChefProviderActionHandler.new(self)
|
@@ -27,4 +29,7 @@ class Chef::Provider::MachineExecute < Chef::Provider::LWRPBase
|
|
27
29
|
action :run do
|
28
30
|
machine.execute(action_handler, new_resource.command)
|
29
31
|
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
30
35
|
end
|
@@ -2,7 +2,9 @@ require 'chef/provider/lwrp_base'
|
|
2
2
|
require 'chef_metal/chef_provider_action_handler'
|
3
3
|
require 'chef_metal/machine'
|
4
4
|
|
5
|
-
class Chef
|
5
|
+
class Chef
|
6
|
+
class Provider
|
7
|
+
class MachineFile < Chef::Provider::LWRPBase
|
6
8
|
|
7
9
|
def action_handler
|
8
10
|
@action_handler ||= ChefMetal::ChefProviderActionHandler.new(self)
|
@@ -46,4 +48,7 @@ class Chef::Provider::MachineFile < Chef::Provider::LWRPBase
|
|
46
48
|
action :delete do
|
47
49
|
machine.delete_file(action_handler, new_resource.path)
|
48
50
|
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
49
54
|
end
|
@@ -4,7 +4,10 @@ require 'openssl'
|
|
4
4
|
require 'chef_metal/chef_provider_action_handler'
|
5
5
|
require 'chef_metal/chef_image_spec'
|
6
6
|
|
7
|
-
class Chef
|
7
|
+
class Chef
|
8
|
+
class Provider
|
9
|
+
class MachineImage < Chef::Provider::LWRPBase
|
10
|
+
|
8
11
|
def action_handler
|
9
12
|
@action_handler ||= ChefMetal::ChefProviderActionHandler.new(self)
|
10
13
|
end
|
@@ -51,4 +54,7 @@ class Chef::Provider::MachineImage < Chef::Provider::LWRPBase
|
|
51
54
|
# 4. Wait for image to be ready
|
52
55
|
new_driver.ready_image(action_handler, image_spec, new_resource.image_options)
|
53
56
|
end
|
57
|
+
|
58
|
+
end
|
54
59
|
end
|
60
|
+
end
|
@@ -3,7 +3,10 @@ require 'cheffish'
|
|
3
3
|
require 'chef_metal'
|
4
4
|
require 'cheffish/merged_config'
|
5
5
|
|
6
|
-
class Chef
|
6
|
+
class Chef
|
7
|
+
class Resource
|
8
|
+
class Machine < Chef::Resource::LWRPBase
|
9
|
+
|
7
10
|
self.resource_name = 'machine'
|
8
11
|
|
9
12
|
def initialize(*args)
|
@@ -19,8 +22,10 @@ class Chef::Resource::Machine < Chef::Resource::LWRPBase
|
|
19
22
|
|
20
23
|
# Driver attributes
|
21
24
|
attribute :driver
|
22
|
-
attribute :machine_options
|
23
25
|
|
26
|
+
# Machine options
|
27
|
+
attribute :machine_options
|
28
|
+
|
24
29
|
# Node attributes
|
25
30
|
Cheffish.node_attributes(self)
|
26
31
|
|
@@ -92,8 +97,28 @@ class Chef::Resource::Machine < Chef::Resource::LWRPBase
|
|
92
97
|
@machine_options = Cheffish::MergedConfig.new(options, @machine_options)
|
93
98
|
end
|
94
99
|
|
100
|
+
|
101
|
+
# This is here because metal users will probably want to do things like:
|
102
|
+
# machine "foo"
|
103
|
+
# action :destroy
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# @example
|
107
|
+
# with_machine_options :bootstrap_options => { ... }
|
108
|
+
# machine "foo"
|
109
|
+
# converge true
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# Without this, the first resource's machine options will obliterate the second
|
113
|
+
# resource's machine options, and then unexpected (and undesired) things happen.
|
114
|
+
def load_prior_resource
|
115
|
+
Chef::Log.debug "Overloading #{self.resource_name} load_prior_resource with NOOP"
|
116
|
+
end
|
117
|
+
|
95
118
|
# chef client version and omnibus
|
96
119
|
# chef-zero boot method?
|
97
120
|
# chef-client -z boot method?
|
98
121
|
# pushy boot method?
|
99
122
|
end
|
123
|
+
end
|
124
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'chef/resource/lwrp_base'
|
2
2
|
require 'chef/mixin/deep_merge'
|
3
3
|
|
4
|
-
class Chef
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class MachineBatch < Chef::Resource::LWRPBase
|
7
|
+
|
5
8
|
self.resource_name = 'machine_batch'
|
6
9
|
|
7
10
|
def initialize(*args)
|
@@ -69,4 +72,7 @@ class Chef::Resource::MachineBatch < Chef::Resource::LWRPBase
|
|
69
72
|
end
|
70
73
|
text << "end\n"
|
71
74
|
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
72
78
|
end
|
@@ -3,7 +3,10 @@ require 'chef_metal'
|
|
3
3
|
require 'chef_metal/machine'
|
4
4
|
require 'chef_metal/driver'
|
5
5
|
|
6
|
-
class Chef
|
6
|
+
class Chef
|
7
|
+
class Resource
|
8
|
+
class MachineExecute < Chef::Resource::LWRPBase
|
9
|
+
|
7
10
|
self.resource_name = 'machine_execute'
|
8
11
|
|
9
12
|
def initialize(*args)
|
@@ -19,4 +22,7 @@ class Chef::Resource::MachineExecute < Chef::Resource::LWRPBase
|
|
19
22
|
|
20
23
|
attribute :chef_server, :kind_of => Hash
|
21
24
|
attribute :driver, :kind_of => ChefMetal::Driver
|
25
|
+
|
26
|
+
end
|
22
27
|
end
|
28
|
+
end
|
@@ -3,7 +3,10 @@ require 'chef_metal'
|
|
3
3
|
require 'chef_metal/machine'
|
4
4
|
require 'chef_metal/driver'
|
5
5
|
|
6
|
-
class Chef
|
6
|
+
class Chef
|
7
|
+
class Resource
|
8
|
+
class MachineFile < Chef::Resource::LWRPBase
|
9
|
+
|
7
10
|
self.resource_name = 'machine_file'
|
8
11
|
|
9
12
|
def initialize(*args)
|
@@ -25,4 +28,7 @@ class Chef::Resource::MachineFile < Chef::Resource::LWRPBase
|
|
25
28
|
|
26
29
|
attribute :chef_server, :kind_of => Hash
|
27
30
|
attribute :driver, :kind_of => ChefMetal::Driver
|
31
|
+
|
32
|
+
end
|
28
33
|
end
|
34
|
+
end
|
@@ -3,7 +3,10 @@ require 'cheffish'
|
|
3
3
|
require 'chef_metal'
|
4
4
|
require 'cheffish/merged_config'
|
5
5
|
|
6
|
-
class Chef
|
6
|
+
class Chef
|
7
|
+
class Resource
|
8
|
+
class MachineImage < Chef::Resource::Machine
|
9
|
+
|
7
10
|
self.resource_name = 'machine_image'
|
8
11
|
|
9
12
|
def initialize(*args)
|
@@ -26,4 +29,7 @@ class Chef::Resource::MachineImage < Chef::Resource::Machine
|
|
26
29
|
# - ability to rebuild new image based on the previous image
|
27
30
|
# - ability to specify whether and how to keep the image-building machine around
|
28
31
|
# - ability to specify whether to leave the chef config around or not
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
29
35
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'chef/mixin/deep_merge'
|
2
|
-
require 'cheffish/with_pattern'
|
3
2
|
require 'cheffish/merged_config'
|
4
3
|
require 'chef_metal/chef_machine_spec'
|
5
4
|
|
6
5
|
module ChefMetal
|
7
6
|
class ChefRunData
|
8
|
-
|
7
|
+
|
9
8
|
def initialize(config)
|
10
9
|
@config = config
|
11
10
|
@drivers = {}
|
@@ -14,9 +13,32 @@ module ChefMetal
|
|
14
13
|
attr_reader :config
|
15
14
|
attr_reader :drivers
|
16
15
|
attr_reader :current_driver
|
16
|
+
attr_accessor :current_machine_options
|
17
|
+
attr_accessor :current_image_options
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
def with_machine_options(value)
|
20
|
+
old_value = self.current_machine_options
|
21
|
+
self.current_machine_options = value
|
22
|
+
if block_given?
|
23
|
+
begin
|
24
|
+
yield
|
25
|
+
ensure
|
26
|
+
self.current_machine_options = old_value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def with_image_options(value)
|
32
|
+
old_value = self.current_image_options
|
33
|
+
self.current_image_options = value
|
34
|
+
if block_given?
|
35
|
+
begin
|
36
|
+
yield
|
37
|
+
ensure
|
38
|
+
self.current_image_options = old_value
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
20
42
|
|
21
43
|
def with_driver(driver, options = nil, &block)
|
22
44
|
if drivers[driver] && options
|
@@ -26,18 +48,6 @@ module ChefMetal
|
|
26
48
|
@current_driver_options = options
|
27
49
|
end
|
28
50
|
|
29
|
-
def auto_batch_machines
|
30
|
-
if !@auto_batch_machines.nil?
|
31
|
-
@auto_batch_machines
|
32
|
-
else
|
33
|
-
config[:auto_batch_machines]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def auto_batch_machines=(value)
|
38
|
-
@auto_batch_machines = value
|
39
|
-
end
|
40
|
-
|
41
51
|
def current_driver
|
42
52
|
@current_driver || config[:driver]
|
43
53
|
end
|
@@ -3,6 +3,7 @@ require 'pathname'
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'digest/md5'
|
5
5
|
require 'thread'
|
6
|
+
require 'chef/http/simple'
|
6
7
|
|
7
8
|
module ChefMetal
|
8
9
|
class ConvergenceStrategy
|
@@ -118,11 +119,7 @@ module ChefMetal
|
|
118
119
|
# Download and parse the metadata
|
119
120
|
Chef::Log.debug("Getting metadata for machine #{machine.node['name']}: #{metadata_url}")
|
120
121
|
uri = URI(metadata_url)
|
121
|
-
|
122
|
-
http.use_ssl = use_ssl
|
123
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
124
|
-
response = http.request(request)
|
125
|
-
metadata_str = response.body
|
122
|
+
metadata_str = Chef::HTTP::Simple.new(uri).get(uri)
|
126
123
|
metadata = {}
|
127
124
|
metadata_str.each_line do |line|
|
128
125
|
key, value = line.split("\t", 2)
|
@@ -173,7 +173,7 @@ module ChefMetal
|
|
173
173
|
chef_server_url #{chef_server_url.inspect}
|
174
174
|
node_name #{node_name.inspect}
|
175
175
|
client_key #{convergence_options[:client_pem_path].inspect}
|
176
|
-
ssl_verify_mode :
|
176
|
+
ssl_verify_mode :verify_peer
|
177
177
|
EOM
|
178
178
|
end
|
179
179
|
end
|
data/lib/chef_metal/driver.rb
CHANGED
@@ -6,25 +6,23 @@ module ChefMetal
|
|
6
6
|
# For AWS, a Driver instance corresponds to a single account.
|
7
7
|
# For Vagrant, it is a directory where VM files are found.
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# = How to Make a Driver
|
10
10
|
#
|
11
11
|
# To implement a Driver, you must implement the following methods:
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# - destroy_machine - delete the machine.
|
21
|
-
# - connect_to_machine - connect to the given machine.
|
13
|
+
# * initialize(driver_url) - create a new driver with the given URL
|
14
|
+
# * driver_url - a URL representing everything unique about your driver. (NOT credentials)
|
15
|
+
# * allocate_machine - ask the driver to allocate a machine to you.
|
16
|
+
# * ready_machine - get the machine "ready" - wait for it to be booted and accessible (for example, accessible via SSH transport).
|
17
|
+
# * stop_machine - stop the machine.
|
18
|
+
# * destroy_machine - delete the machine.
|
19
|
+
# * connect_to_machine - connect to the given machine.
|
22
20
|
#
|
23
21
|
# Optionally, you can also implement:
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
22
|
+
# * allocate_machines - allocate an entire group of machines.
|
23
|
+
# * ready_machines - get a group of machines warm and booted.
|
24
|
+
# * stop_machines - stop a group of machines.
|
25
|
+
# * destroy_machines - delete a group of machines.
|
28
26
|
#
|
29
27
|
# Additionally, you must create a file named `chef_metal/driver_init/<scheme>.rb`,
|
30
28
|
# where <scheme> is the name of the scheme you chose for your driver_url. This
|
@@ -39,8 +37,8 @@ module ChefMetal
|
|
39
37
|
#
|
40
38
|
# Inflate a driver from a driver URL.
|
41
39
|
#
|
42
|
-
#
|
43
|
-
#
|
40
|
+
#
|
41
|
+
# @param [String] driver_url the URL to inflate the driver
|
44
42
|
# config - a configuration hash. See "config" for a list of known keys.
|
45
43
|
#
|
46
44
|
# == Returns
|
@@ -61,7 +59,7 @@ module ChefMetal
|
|
61
59
|
#
|
62
60
|
# A URL representing the driver and the place where machines come from.
|
63
61
|
# This will be stuffed in machine_spec.location['driver_url'] so that the
|
64
|
-
# machine can be
|
62
|
+
# machine can be re-inflated. URLs must have a unique scheme identifying the
|
65
63
|
# driver class, and enough information to identify the place where created
|
66
64
|
# machines can be found. For AWS, this is the account number; for lxc and
|
67
65
|
# vagrant, it is the directory in which VMs and containers are.
|
@@ -92,8 +90,8 @@ module ChefMetal
|
|
92
90
|
config[:driver_options] || {}
|
93
91
|
end
|
94
92
|
|
95
|
-
|
96
|
-
# Allocate a machine from the
|
93
|
+
|
94
|
+
# Allocate a machine from the underlying service. This method
|
97
95
|
# does not need to wait for the machine to boot or have an IP, but it must
|
98
96
|
# store enough information in machine_spec.location to find the machine
|
99
97
|
# later in ready_machine.
|
@@ -102,103 +100,91 @@ module ChefMetal
|
|
102
100
|
# it, but does not need to wait until it is started. The idea is to get the
|
103
101
|
# gears moving, but the job doesn't need to be done :)
|
104
102
|
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# acquiring and destroying VMs).
|
110
|
-
#
|
111
|
-
# existing_machine - a MachineSpec representing the existing machine (if any).
|
112
|
-
#
|
113
|
-
# machine_options - a set of options representing the desired provisioning
|
114
|
-
# state of the machine (image name, bootstrap ssh credentials,
|
115
|
-
# etc.). This will NOT be stored in the machine_spec, and is
|
116
|
-
# ephemeral.
|
103
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
104
|
+
# @param [ChefMetal::MachineSpec] machine_spec A machine specification representing this machine.
|
105
|
+
# @param [Hash] machine_options A set of options representing the desired options when
|
106
|
+
# constructing the machine
|
117
107
|
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
# Modifies the passed-in machine_spec. Anything in here will be saved
|
108
|
+
# @return [ChefMetal::MachineSpec] Modifies the passed-in machine_spec. Anything in here will be saved
|
121
109
|
# back after allocate_machine completes.
|
122
110
|
#
|
123
111
|
def allocate_machine(action_handler, machine_spec, machine_options)
|
124
112
|
raise "#{self.class} does not implement allocate_machine"
|
125
113
|
end
|
126
114
|
|
127
|
-
#
|
128
115
|
# Ready a machine, to the point where it is running and accessible via a
|
129
116
|
# transport. This will NOT allocate a machine, but may kick it if it is down.
|
130
117
|
# This method waits for the machine to be usable, returning a Machine object
|
131
118
|
# pointing at the machine, allowing useful actions like setup, converge,
|
132
119
|
# execute, file and directory.
|
133
120
|
#
|
134
|
-
# ## Parameters
|
135
|
-
# action_handler - the action_handler object that is calling this method; this
|
136
|
-
# is generally a driver, but could be anything that can support the
|
137
|
-
# interface (i.e., in the case of the test kitchen metal driver for
|
138
|
-
# acquiring and destroying VMs).
|
139
|
-
# machine_spec - MachineSpec representing this machine.
|
140
|
-
# machine_options - a set of options representing the desired provisioning
|
141
|
-
# state of the machine (image name, bootstrap ssh credentials,
|
142
|
-
# etc.). This will NOT be stored in the machine_spec, and is
|
143
|
-
# ephemeral.
|
144
121
|
#
|
145
|
-
#
|
122
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
123
|
+
# @param [ChefMetal::MachineSpec] machine_spec A machine specification representing this machine.
|
124
|
+
# @param [Hash] machine_options A set of options representing the desired state of the machine
|
146
125
|
#
|
147
|
-
# Machine object pointing at the machine, allowing useful actions like setup,
|
126
|
+
# @return [Machine] A machine object pointing at the machine, allowing useful actions like setup,
|
148
127
|
# converge, execute, file and directory.
|
149
128
|
#
|
150
129
|
def ready_machine(action_handler, machine_spec, machine_options)
|
151
130
|
raise "#{self.class} does not implement ready_machine"
|
152
131
|
end
|
153
132
|
|
154
|
-
#
|
155
133
|
# Connect to a machine without allocating or readying it. This method will
|
156
134
|
# NOT make any changes to anything, or attempt to wait.
|
157
135
|
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
#
|
161
|
-
# ## Returns
|
162
|
-
#
|
163
|
-
# Machine object pointing at the machine, allowing useful actions like setup,
|
136
|
+
# @param [ChefMetal::MachineSpec] machine_spec MachineSpec representing this machine.
|
137
|
+
# @param [Hash] machine_options
|
138
|
+
# @return [Machine] A machine object pointing at the machine, allowing useful actions like setup,
|
164
139
|
# converge, execute, file and directory.
|
165
140
|
#
|
166
141
|
def connect_to_machine(machine_spec, machine_options)
|
167
142
|
raise "#{self.class} does not implement connect_to_machine"
|
168
143
|
end
|
169
144
|
|
170
|
-
|
171
|
-
# Delete the given machine
|
145
|
+
|
146
|
+
# Delete the given machine -- destroy the machine,
|
172
147
|
# returning things to the state before allocate_machine was called.
|
173
148
|
#
|
149
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
150
|
+
# @param [ChefMetal::MachineSpec] machine_spec A machine specification representing this machine.
|
151
|
+
# @param [Hash] machine_options A set of options representing the desired state of the machine
|
174
152
|
def destroy_machine(action_handler, machine_spec, machine_options)
|
175
153
|
raise "#{self.class} does not implement destroy_machine"
|
176
154
|
end
|
177
155
|
|
178
|
-
#
|
179
156
|
# Stop the given machine.
|
180
157
|
#
|
158
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
159
|
+
# @param [ChefMetal::MachineSpec] machine_spec A machine specification representing this machine.
|
160
|
+
# @param [Hash] machine_options A set of options representing the desired state of the machine
|
181
161
|
def stop_machine(action_handler, machine_spec, machine_options)
|
182
162
|
raise "#{self.class} does not implement stop_machine"
|
183
163
|
end
|
184
164
|
|
185
|
-
#
|
186
165
|
# Allocate an image. Returns quickly with an ID that tracks the image.
|
187
166
|
#
|
167
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
168
|
+
# @param [ChefMetal::ImageSpec] image_spec A machine specification representing this machine.
|
169
|
+
# @param [Hash] image_options A set of options representing the desired state of the machine
|
188
170
|
def allocate_image(action_handler, image_spec, image_options, machine_spec)
|
189
171
|
raise "#{self.class} does not implement create_image"
|
190
172
|
end
|
191
173
|
|
192
|
-
#
|
193
174
|
# Ready an image, waiting till the point where it is ready to be used.
|
194
175
|
#
|
176
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
177
|
+
# @param [ChefMetal::ImageSpec] image_spec A machine specification representing this machine.
|
178
|
+
# @param [Hash] image_options A set of options representing the desired state of the machine
|
195
179
|
def ready_image(action_handler, image_spec, image_options)
|
196
180
|
raise "#{self.class} does not implement ready_image"
|
197
181
|
end
|
198
182
|
|
183
|
+
# Destroy an image using this service.
|
199
184
|
#
|
200
|
-
#
|
201
|
-
#
|
185
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method
|
186
|
+
# @param [ChefMetal::ImageSpec] image_spec A machine specification representing this machine.
|
187
|
+
# @param [Hash] image_options A set of options representing the desired state of the machine
|
202
188
|
def destroy_image(action_handler, image_spec, image_options)
|
203
189
|
raise "#{self.class} does not implement destroy_image"
|
204
190
|
end
|
@@ -214,15 +200,10 @@ module ChefMetal
|
|
214
200
|
# Drivers do not need to implement this; the default implementation
|
215
201
|
# calls acquire_machine in parallel.
|
216
202
|
#
|
217
|
-
#
|
218
|
-
# action_handler - the action_handler object that is calling this method; this
|
219
|
-
# is generally a driver, but could be anything that can support the
|
220
|
-
# interface (i.e., in the case of the test kitchen metal driver for
|
221
|
-
# acquiring and destroying VMs).
|
222
|
-
# specs_and_options - a hash of machine_spec -> machine_options representing the
|
223
|
-
# machines to allocate.
|
224
|
-
# parallelizer - an object with a parallelize() method that works like this:
|
203
|
+
# == Parallelizing
|
225
204
|
#
|
205
|
+
# The parallelizer must implement #parallelize
|
206
|
+
# @example Example parallelizer
|
226
207
|
# parallelizer.parallelize(specs_and_options) do |machine_spec|
|
227
208
|
# allocate_machine(action_handler, machine_spec)
|
228
209
|
# end.to_a
|
@@ -232,16 +213,25 @@ module ChefMetal
|
|
232
213
|
# not go over parallelization limits set by the user. Use of the parallelizer
|
233
214
|
# to parallelizer machines is not required.
|
234
215
|
#
|
235
|
-
#
|
216
|
+
# == Passing a block
|
236
217
|
#
|
237
218
|
# If you pass a block to this function, each machine will be yielded to you
|
238
219
|
# as it completes, and then the function will return when all machines are
|
239
220
|
# yielded.
|
240
221
|
#
|
222
|
+
# @example Passing a block
|
241
223
|
# allocate_machines(action_handler, specs_and_options, parallelizer) do |machine_spec|
|
242
224
|
# ...
|
243
225
|
# end
|
244
226
|
#
|
227
|
+
# @param [ChefMetal::ActionHandler] action_handler The action_handler object that is calling this method; this
|
228
|
+
# is generally a driver, but could be anything that can support the
|
229
|
+
# interface (i.e., in the case of the test kitchen metal driver for
|
230
|
+
# acquiring and destroying VMs).
|
231
|
+
# @param [Hash] specs_and_options A hash of machine_spec -> machine_options representing the
|
232
|
+
# machines to allocate.
|
233
|
+
# @param [Parallelizer] parallelizer an object with a parallelize() method that works like this:
|
234
|
+
# @return [Array<Machine>] An array of machine objects created
|
245
235
|
def allocate_machines(action_handler, specs_and_options, parallelizer)
|
246
236
|
parallelizer.parallelize(specs_and_options) do |machine_spec, machine_options|
|
247
237
|
allocate_machine(add_prefix(machine_spec, action_handler), machine_spec, machine_options)
|
@@ -275,6 +265,7 @@ module ChefMetal
|
|
275
265
|
end.to_a
|
276
266
|
end
|
277
267
|
|
268
|
+
|
278
269
|
protected
|
279
270
|
|
280
271
|
def add_prefix(machine_spec, action_handler)
|
data/lib/chef_metal/machine.rb
CHANGED
@@ -102,7 +102,7 @@ module ChefMetal
|
|
102
102
|
# Returns a triplet:
|
103
103
|
# platform, platform_version, machine_architecture = machine.detect_os(action_handler)
|
104
104
|
# This triplet is suitable for passing to the Chef metadata API:
|
105
|
-
# https://www.opscode.com/chef/metadata?p
|
105
|
+
# https://www.opscode.com/chef/metadata?p=PLATFORM&pv=PLATFORM_VERSION&m=MACHINE_ARCHITECTURE
|
106
106
|
def detect_os(action_handler)
|
107
107
|
raise "detect_os not overridden on #{self.class}"
|
108
108
|
end
|
@@ -15,6 +15,7 @@ require 'chef/provider/machine_image'
|
|
15
15
|
class Chef
|
16
16
|
module DSL
|
17
17
|
module Recipe
|
18
|
+
|
18
19
|
def with_driver(driver, options = nil, &block)
|
19
20
|
run_context.chef_metal.with_driver(driver, options, &block)
|
20
21
|
end
|
@@ -41,14 +42,6 @@ class Chef
|
|
41
42
|
|
42
43
|
NOT_PASSED = Object.new
|
43
44
|
|
44
|
-
def auto_batch_machines(value = NOT_PASSED)
|
45
|
-
if value == NOT_PASSED
|
46
|
-
run_context.chef_metal.auto_batch_machines
|
47
|
-
else
|
48
|
-
run_context.chef_metal.auto_batch_machines = value
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
45
|
@@next_machine_batch_index = 0
|
53
46
|
|
54
47
|
def machine_batch_default_name
|
@@ -69,47 +62,11 @@ class Chef
|
|
69
62
|
end
|
70
63
|
end
|
71
64
|
|
72
|
-
# When the machine resource is first declared, create a machine_batch (if there
|
73
|
-
# isn't one already)
|
74
|
-
def machine(name, &block)
|
75
|
-
resource = build_resource(:machine, name, caller[0], &block)
|
76
|
-
|
77
|
-
# Grab the previous resource so we can decide whether to batch this or make it its own resource.
|
78
|
-
previous_index = run_context.resource_collection.previous_index
|
79
|
-
previous = previous_index >= 0 ? run_context.resource_collection[previous_index] : nil
|
80
|
-
if run_context.chef_metal.auto_batch_machines &&
|
81
|
-
previous &&
|
82
|
-
Array(resource.action).size == 1 &&
|
83
|
-
Array(previous.action) == Array(resource.action)
|
84
|
-
|
85
|
-
# Handle batching similar machines (with similar actions)
|
86
|
-
if previous.is_a?(Chef::Resource::MachineBatch)
|
87
|
-
# If we see a machine declared after a previous machine_batch with the same action, add it to the batch.
|
88
|
-
previous.machines << resource
|
89
|
-
elsif previous.is_a?(Chef::Resource::Machine)
|
90
|
-
# If we see two machines in a row with the same action, batch them.
|
91
|
-
_self = self
|
92
|
-
batch = build_resource(:machine_batch, machine_batch_default_name) do
|
93
|
-
action resource.action
|
94
|
-
machines [ previous, resource ]
|
95
|
-
end
|
96
|
-
batch.from_recipe self
|
97
|
-
run_context.resource_collection[previous_index] = batch
|
98
|
-
else
|
99
|
-
run_context.resource_collection.insert(resource)
|
100
|
-
end
|
101
|
-
|
102
|
-
else
|
103
|
-
run_context.resource_collection.insert(resource)
|
104
|
-
end
|
105
|
-
resource
|
106
|
-
end
|
107
65
|
end
|
108
66
|
end
|
109
67
|
|
110
68
|
class Config
|
111
69
|
default(:driver) { ENV['CHEF_DRIVER'] }
|
112
|
-
default(:auto_batch_machines) { true }
|
113
70
|
# config_context :drivers do
|
114
71
|
# # each key is a driver_url, and each value can have driver, driver_options and machine_options
|
115
72
|
# config_strict_mode false
|
@@ -10,6 +10,26 @@ require 'net/ssh/gateway'
|
|
10
10
|
module ChefMetal
|
11
11
|
class Transport
|
12
12
|
class SSH < ChefMetal::Transport
|
13
|
+
#
|
14
|
+
# Create a new SSH transport.
|
15
|
+
#
|
16
|
+
# == Arguments
|
17
|
+
#
|
18
|
+
# - host: the host to connect to, e.g. '145.14.51.45'
|
19
|
+
# - username: the username to connect with
|
20
|
+
# - ssh_options: a list of options to Net::SSH.start
|
21
|
+
# - options: a hash of options for the transport itself, including:
|
22
|
+
# - :prefix: a prefix to send before each command (e.g. "sudo ")
|
23
|
+
# - :ssh_pty_enable: set to false to disable pty (some instances don't
|
24
|
+
# support this, most do)
|
25
|
+
# - :ssh_gateway: the gateway to use, e.g. "jkeiser@145.14.51.45:222".
|
26
|
+
# nil (the default) means no gateway.
|
27
|
+
# - global_config: an options hash that looks suspiciously similar to
|
28
|
+
# Chef::Config, containing at least the key :log_level.
|
29
|
+
#
|
30
|
+
# The options are used in
|
31
|
+
# Net::SSH.start(host, username, ssh_options)
|
32
|
+
|
13
33
|
def initialize(host, username, ssh_options, options, global_config)
|
14
34
|
@host = host
|
15
35
|
@username = username
|
@@ -224,7 +244,7 @@ module ChefMetal
|
|
224
244
|
end
|
225
245
|
|
226
246
|
def gateway
|
227
|
-
|
247
|
+
gw_user, gw_host = options[:ssh_gateway].split('@')
|
228
248
|
gw_host, gw_port = gw_host.split(':')
|
229
249
|
gw_user = ssh_options[:ssh_username] unless gw_user
|
230
250
|
|
@@ -4,7 +4,22 @@ require 'timeout'
|
|
4
4
|
|
5
5
|
module ChefMetal
|
6
6
|
class Transport
|
7
|
+
# Transport to handle the WinRM connection protocol.
|
7
8
|
class WinRM < ChefMetal::Transport
|
9
|
+
#
|
10
|
+
# Create a new WinRM transport.
|
11
|
+
#
|
12
|
+
# == Arguments
|
13
|
+
# - endpoint: the WinRM endpoint, e.g. http://145.14.51.45:5985/wsman.
|
14
|
+
# - type: the connection type, e.g. :plaintext.
|
15
|
+
# - options: options hash, including both WinRM options and transport options.
|
16
|
+
# For transport options, see the Transport.options definition. WinRM
|
17
|
+
# options include :user, :pass, :disable_sspi => true, among others.
|
18
|
+
# - global_config: an options hash that looks suspiciously similar to
|
19
|
+
# Chef::Config, containing at least the key :log_level.
|
20
|
+
#
|
21
|
+
# The actual connection is made as ::WinRM::WinRMWebService.new(endpoint, type, options)
|
22
|
+
#
|
8
23
|
def initialize(endpoint, type, options, global_config)
|
9
24
|
@endpoint = endpoint
|
10
25
|
@type = type
|
data/lib/chef_metal/transport.rb
CHANGED
@@ -7,14 +7,19 @@ module ChefMetal
|
|
7
7
|
# Execute a program on the remote host.
|
8
8
|
#
|
9
9
|
# == Arguments
|
10
|
-
# command: command to run. May be a shell-escaped string or a pre-split
|
10
|
+
# command: command to run. May be a shell-escaped string or a pre-split
|
11
|
+
# array containing [PROGRAM, ARG1, ARG2, ...].
|
11
12
|
# options: hash of options, including but not limited to:
|
12
|
-
# :timeout => NUM_SECONDS - time to wait before program finishes
|
13
|
+
# :timeout => NUM_SECONDS - time to wait before program finishes
|
14
|
+
# (throws an exception otherwise). Set to nil or 0 to
|
15
|
+
# run with no timeout. Defaults to 15 minutes.
|
13
16
|
# :stream => BOOLEAN - true to stream stdout and stderr to the console.
|
14
|
-
# :stream => BLOCK - block to stream stdout and stderr to
|
17
|
+
# :stream => BLOCK - block to stream stdout and stderr to
|
18
|
+
# (block.call(stdout_chunk, stderr_chunk))
|
15
19
|
# :stream_stdout => FD - FD to stream stdout to (defaults to IO.stdout)
|
16
20
|
# :stream_stderr => FD - FD to stream stderr to (defaults to IO.stderr)
|
17
|
-
# :read_only => BOOLEAN - true if command is guaranteed not to
|
21
|
+
# :read_only => BOOLEAN - true if command is guaranteed not to
|
22
|
+
# change system state (useful for Docker)
|
18
23
|
def execute(command, options = {})
|
19
24
|
raise "execute not overridden on #{self.class}"
|
20
25
|
end
|
data/lib/chef_metal/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clc-fork-chef-metal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.14.alpha.
|
4
|
+
version: 0.14.alpha.4
|
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-
|
11
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
@@ -81,33 +81,33 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: cheffish
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.8
|
89
|
+
version: '0.8'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.8
|
96
|
+
version: '0.8'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: winrm
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
103
|
+
version: 1.2.0
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.
|
110
|
+
version: 1.2.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|