clc-fork-chef-metal 0.12.1.alpha.4 → 0.13.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
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