clc-fork-chef-metal 0.12.1.alpha.4 → 0.13.alpha.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 063dc6912cd4c2b675e871152f4021d5c06a2aa9
4
- data.tar.gz: 79786e362cbbf63faef0448d5af5302b889fb205
3
+ metadata.gz: 92fd9ce1269e598cb791750506afc09fe1ebd514
4
+ data.tar.gz: 51fbc3e51bb706e79995554ee1f9f433077f2b16
5
5
  SHA512:
6
- metadata.gz: 1e6ec4090657451ed8cc898ab673c8c810a81bd969a577f3b0bfc06dc8aef0e733c9ec9d6a068ebd6962015f2b86033715e8649d9ab71a3daf4c48d1a01dac0e
7
- data.tar.gz: 47b27089194d5f676aaade9d7790569c3617e899fd5b24041995f2ee080e1caa4f5f7ff8babc6bbb49d8c80580aa7b1bfb61e3b228b8caeda7db0b63421b5941
6
+ metadata.gz: 84fc7691daf6f62d12d8f8bed0e621a3c62b2f195efbb6afb9c9efa29d6615290c51894c588bc0005f1ac62e78ebb7aa5d5b10decd2013896401712450e191e1
7
+ data.tar.gz: f7dfa7d4df6eaecd8635118c9a2afc2e60ae25c5b98b94f1d53a4704d239ea323ff02e3dab61a44b8225fb7eabf99d772548b1d1a24fdc2e439c614cddd44fcc
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Chef Metal Changelog
2
2
 
3
+ ## 0.13 (6/17/2014)
4
+
5
+ - make winrm work again (@mwrock)
6
+ - add bootstrap_proxy as a convergence_option for when target machines require a proxy (@MrMMorris)
7
+
3
8
  ## 0.12.1 (6/18/2014)
4
9
 
5
10
  - fix machine_batch action :setup
data/README.md CHANGED
@@ -13,6 +13,13 @@ Date | Blog
13
13
  3/4/2014 | [Chef Metal 0.2: Overview](http://www.getchef.com/blog/2014/03/04/chef-metal-0-2-release/) - this is a pretty good overview (though dated).
14
14
  12/20/2013 | [Chef Metal Alpha](http://www.getchef.com/blog/2013/12/20/chef-metal-alpha/)
15
15
 
16
+ Documentation
17
+ -------------
18
+ * [Configuration](https://github.com/opscode/chef-metal/blob/master/docs/configuration.md#configuring-and-using-metal-drivers)
19
+ * [Writing Drivers](https://github.com/opscode/chef-metal/blob/master/docs/building_drivers.md#writing-drivers)
20
+ * [Embedding](https://github.com/opscode/chef-metal/blob/master/docs/embedding.md)
21
+ * [Providers](https://github.com/opscode/chef-metal/blob/master/docs/providers)
22
+
16
23
  Try It Out
17
24
  ----------
18
25
 
@@ -218,17 +225,33 @@ with_chef_server "https://chef-server.example.org",
218
225
  :signing_key_filename => Chef::Config[:client_key]
219
226
  ```
220
227
 
228
+ **Note for Hosted/Enterprise Chef Servers**
229
+
230
+ Currently, you will need to add the 'clients' group to the 'admin' group in order for machine provisioning to work:
231
+
232
+ ```
233
+ knife edit /groups/admin.json -e <editor>
234
+ ```
235
+ Then add:
236
+ ```
237
+ {
238
+ "users": [
239
+ "pivotal" # This is an internal superuser for Hosted/Enterprise Chef
240
+ ],
241
+ "groups": [
242
+ "clients" # This is what you need to add
243
+ ]
244
+ }
245
+ ```
246
+
247
+ This can also be done through the Chef Server web UI (Administration tab > Groups > select admins Group > Add 'clients'
248
+
249
+
221
250
  Kitchen
222
251
  -------
223
252
 
224
253
  Chef Metal also works with Test Kitchen, allowing you to test entire clusters, not just machines! The repository for the kitchen-metal gem is https://github.com/doubt72/kitchen-metal.
225
254
 
226
- Documentation
227
- -------------
228
- * [Configuration](https://github.com/opscode/chef-metal/blob/master/docs/configuration.md#configuring-and-using-metal-drivers)
229
- * [Writing Drivers](https://github.com/opscode/chef-metal/blob/master/docs/building_drivers.md#writing-drivers)
230
- * [Embedding](https://github.com/opscode/chef-metal/blob/master/docs/embedding.md)
231
-
232
255
  Bugs and The Plan
233
256
  -----------------
234
257
 
@@ -20,6 +20,9 @@ class Chef::Provider::Machine < Chef::Provider::LWRPBase
20
20
  if current_driver && current_driver.driver_url != new_driver.driver_url
21
21
  raise "Cannot move '#{machine_spec.name}' from #{current_driver.driver_url} to #{new_driver.driver_url}: machine moving is not supported. Destroy and recreate."
22
22
  end
23
+ if !new_driver
24
+ raise "Driver not specified for machine #{machine_spec.name}"
25
+ end
23
26
  new_driver.allocate_machine(action_handler, machine_spec, new_machine_options)
24
27
  machine_spec.save(action_handler)
25
28
  end
@@ -120,6 +120,8 @@ class Chef::Provider::MachineBatch < Chef::Provider::LWRPBase
120
120
  end
121
121
  result[driver] ||= {}
122
122
  result[driver][m[:spec]] = m[:machine_options].call(driver)
123
+ else
124
+ raise "No driver specified for #{m[:spec].name}"
123
125
  end
124
126
  end
125
127
  result
data/lib/chef_metal.rb CHANGED
@@ -71,9 +71,13 @@ module ChefMetal
71
71
  end
72
72
 
73
73
  def self.connect_to_machine(machine_spec, config = Cheffish.profiled_config)
74
+ chef_server = Cheffish.default_chef_server(config)
75
+ if machine_spec.is_a?(String)
76
+ machine_spec = ChefMachineSpec.get(machine_spec, chef_server)
77
+ end
74
78
  driver = driver_for_url(machine_spec.driver_url, config)
75
79
  if driver
76
- machine_options = { :convergence_options => { :chef_server => Cheffish.default_chef_server(config) } }
80
+ machine_options = { :convergence_options => { :chef_server => chef_server } }
77
81
  machine_options = Cheffish::MergedConfig.new(config[:machine_options], machine_options) if config[:machine_options]
78
82
  driver.connect_to_machine(machine_spec, machine_options)
79
83
  else
@@ -14,11 +14,13 @@ module ChefMetal
14
14
  super(convergence_options, config)
15
15
  @install_sh_url = convergence_options[:install_sh_url] || 'http://www.opscode.com/chef/install.sh'
16
16
  @install_sh_path = convergence_options[:install_sh_path] || '/tmp/chef-install.sh'
17
+ @bootstrap_env = convergence_options[:bootstrap_proxy] ? "http_proxy=#{convergence_options[:bootstrap_proxy]}" : ""
17
18
  @chef_client_timeout = convergence_options.has_key?(:chef_client_timeout) ? convergence_options[:chef_client_timeout] : 120*60 # Default: 2 hours
18
19
  end
19
20
 
20
21
  attr_reader :install_sh_url
21
22
  attr_reader :install_sh_path
23
+ attr_reader :bootstrap_env
22
24
 
23
25
  def setup_convergence(action_handler, machine)
24
26
  super
@@ -28,7 +30,7 @@ module ChefMetal
28
30
  # TODO ssh verification of install.sh before running arbtrary code would be nice?
29
31
  @@install_sh_cache[install_sh_url] ||= Net::HTTP.get(URI(install_sh_url))
30
32
  machine.write_file(action_handler, install_sh_path, @@install_sh_cache[install_sh_url], :ensure_dir => true)
31
- machine.execute(action_handler, "bash #{install_sh_path}")
33
+ machine.execute(action_handler, "bash -c '#{bootstrap_env} bash #{install_sh_path}'")
32
34
  end
33
35
  end
34
36
 
@@ -1,4 +1,5 @@
1
1
  require 'chef_metal/transport'
2
+ require 'chef/log'
2
3
  require 'uri'
3
4
  require 'socket'
4
5
  require 'timeout'
@@ -108,14 +109,20 @@ module ChefMetal
108
109
 
109
110
  def make_url_available_to_remote(local_url)
110
111
  uri = URI(local_url)
111
- host = Socket.getaddrinfo(uri.host, uri.scheme, nil, :STREAM)[0][3]
112
- if host == '127.0.0.1' || host == '::1'
113
- unless session.forward.active_remotes.any? { |port, bind| port == uri.port && bind == uri.host }
114
- Chef::Log.debug("Forwarding local server #{uri.host}:#{uri.port} to port #{uri.port} on #{username}@#{self.host}")
115
- session.forward.remote(uri.port, uri.host, uri.port)
112
+ if is_local_machine(uri.host)
113
+ port, host = forward_port(uri.port, uri.host, uri.port, 'localhost')
114
+ if !port
115
+ # Try harder if the port is already taken
116
+ port, host = forward_port(uri.port, uri.host, 0, 'localhost')
117
+ if !port
118
+ raise "Error forwarding port: could not forward #{uri.port} or 0"
119
+ end
116
120
  end
121
+ uri.host = host
122
+ uri.port = port
117
123
  end
118
- local_url
124
+ Chef::Log.info("Port forwarded: local URL #{local_url} is available to #{self.host} as #{uri.to_s} for the duration of this SSH connection.")
125
+ uri.to_s
119
126
  end
120
127
 
121
128
  def disconnect
@@ -232,6 +239,50 @@ module ChefMetal
232
239
  raise InitialConnectTimeout.new($!)
233
240
  end
234
241
  end
242
+
243
+ def is_local_machine(host)
244
+ local_addrs = Socket.ip_address_list
245
+ host_addrs = Addrinfo.getaddrinfo(host, nil)
246
+ local_addrs.any? do |local_addr|
247
+ host_addrs.any? do |host_addr|
248
+ local_addr.ip_address == host_addr.ip_address
249
+ end
250
+ end
251
+ end
252
+
253
+ # Forwards a port over the connection, and returns the
254
+ def forward_port(local_port, local_host, remote_port, remote_host)
255
+ # This bit is from the documentation.
256
+ if session.forward.respond_to?(:active_remote_destinations)
257
+ got_remote_port, remote_host = session.forward.active_remote_destinations[[local_port, local_host]]
258
+ if !got_remote_port
259
+ Chef::Log.debug("Forwarding local server #{local_host}:#{local_port} to #{username}@#{self.host}")
260
+
261
+ session.forward.remote(local_port, local_host, remote_port, remote_host) do |actual_remote_port|
262
+ got_remote_port = actual_remote_port || :error
263
+ :no_exception # I'll take care of it myself, thanks
264
+ end
265
+ # Kick SSH until we get a response
266
+ session.loop { !got_remote_port }
267
+ if got_remote_port == :error
268
+ return nil
269
+ end
270
+ end
271
+ [ got_remote_port, remote_host ]
272
+ else
273
+ @forwarded_ports ||= {}
274
+ remote_port, remote_host = @forwarded_ports[[local_port, local_host]]
275
+ if !remote_port
276
+ Chef::Log.debug("Forwarding local server #{local_host}:#{local_port} to #{username}@#{self.host}")
277
+ old_active_remotes = session.forward.active_remotes
278
+ session.forward.remote(local_port, local_host, local_port)
279
+ session.loop { !(session.forward.active_remotes.length > old_active_remotes.length) }
280
+ remote_port, remote_host = (session.forward.active_remotes - old_active_remotes).first
281
+ @forwarded_ports[[local_port, local_host]] = [ remote_port, remote_host ]
282
+ end
283
+ [ remote_port, remote_host ]
284
+ end
285
+ end
235
286
  end
236
287
  end
237
288
  end
@@ -80,14 +80,11 @@ $file.Close
80
80
  end
81
81
 
82
82
  def make_url_available_to_remote(local_url)
83
- # uri = URI(local_url)
84
- # host = Socket.getaddrinfo(uri.host, uri.scheme, nil, :STREAM)[0][3]
85
- # if host == '127.0.0.1' || host == '::1'
86
- # unless session.forward.active_remotes.any? { |port, bind| port == uri.port && bind == uri.host }
87
- # Chef::Log.debug("Forwarding local server #{uri.host}:#{uri.port} to port #{uri.port} on #{username}@#{self.host}")
88
- # session.forward.remote(uri.port, uri.host, uri.port)
89
- # end
90
- # end
83
+ uri = URI(local_url)
84
+ host = Socket.getaddrinfo(uri.host, uri.scheme, nil, :STREAM)[0][3]
85
+ if host == '127.0.0.1' || host == '::1'
86
+ raise 'Unable to converge locally via winrm. Local converge is currently only supported with SSH. You may only converge with winrm against a chef-server.'
87
+ end
91
88
  local_url
92
89
  end
93
90
 
@@ -1,3 +1,3 @@
1
1
  module ChefMetal
2
- VERSION = '0.12.1.alpha.4'
2
+ VERSION = '0.13.alpha.1'
3
3
  end
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.12.1.alpha.4
4
+ version: 0.13.alpha.1
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-07-04 00:00:00.000000000 Z
11
+ date: 2014-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef