chef-metal 0.4 → 0.5

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.
@@ -8,7 +8,6 @@ module ChefMetal
8
8
  class VagrantProvisioner < Provisioner
9
9
 
10
10
  include Chef::Mixin::ShellOut
11
-
12
11
  # Create a new vagrant provisioner.
13
12
  #
14
13
  # ## Parameters
@@ -20,6 +19,20 @@ module ChefMetal
20
19
 
21
20
  attr_reader :cluster_path
22
21
 
22
+ # Inflate a provisioner from node information; we don't want to force the
23
+ # driver to figure out what the provisioner really needs, since it varies
24
+ # from provisioner to provisioner.
25
+ #
26
+ # ## Parameters
27
+ # node - node to inflate the provisioner for
28
+ #
29
+ # returns a VagrantProvisioner
30
+ def self.inflate(node)
31
+ node_url = node['normal']['provisioner_output']['provisioner_url']
32
+ cluster_path = node_url.split(':', 2)[1].sub(/^\/\//, "")
33
+ self.new(cluster_path)
34
+ end
35
+
23
36
  # Acquire a machine, generally by provisioning it. Returns a Machine
24
37
  # object pointing at the machine, allowing useful actions like setup,
25
38
  # converge, execute, file and directory. The Machine object will have a
@@ -27,7 +40,11 @@ module ChefMetal
27
40
  # different from the original node object).
28
41
  #
29
42
  # ## Parameters
30
- # provider - the provider object that is calling this method.
43
+ # action_handler - the action_handler object that is calling this method; this
44
+ # is generally a action_handler, but could be anything that can support the
45
+ # ChefMetal::ActionHandler interface (i.e., in the case of the test
46
+ # kitchen metal driver for acquiring and destroying VMs; see the base
47
+ # class for what needs providing).
31
48
  # node - node object (deserialized json) representing this machine. If
32
49
  # the node has a provisioner_options hash in it, these will be used
33
50
  # instead of options provided by the provisioner. TODO compare and
@@ -60,13 +77,13 @@ module ChefMetal
60
77
  # on disk
61
78
  # -- forwarded_ports: hash with key as guest_port => host_port
62
79
  #
63
- def acquire_machine(provider, node)
80
+ def acquire_machine(action_handler, node)
64
81
  # Set up the modified node data
65
82
  provisioner_options = node['normal']['provisioner_options']
66
83
  vm_name = node['name']
67
84
  old_provisioner_output = node['normal']['provisioner_output']
68
85
  node['normal']['provisioner_output'] = provisioner_output = {
69
- 'provisioner_url' => provisioner_url(provider),
86
+ 'provisioner_url' => provisioner_url(action_handler),
70
87
  'vm_name' => vm_name,
71
88
  'vm_file_path' => File.join(cluster_path, "#{vm_name}.vm")
72
89
  }
@@ -89,7 +106,7 @@ module ChefMetal
89
106
  vm_file_content << " end\nend\n"
90
107
 
91
108
  # Set up vagrant file
92
- vm_file = ChefMetal.inline_resource(provider) do
109
+ vm_file = ChefMetal.inline_resource(action_handler) do
93
110
  file provisioner_output['vm_file_path'] do
94
111
  content vm_file_content
95
112
  action :create
@@ -102,7 +119,7 @@ module ChefMetal
102
119
 
103
120
  if current_status != 'running'
104
121
  # Run vagrant up if vm is not running
105
- provider.converge_by "run vagrant up #{vm_name} (status was '#{current_status}')" do
122
+ action_handler.perform_action "run vagrant up #{vm_name} (status was '#{current_status}')" do
106
123
  result = shell_out("vagrant up #{vm_name}", :cwd => cluster_path, :timeout => up_timeout)
107
124
  if result.exitstatus != 0
108
125
  raise "vagrant up #{vm_name} failed!\nSTDOUT:#{result.stdout}\nSTDERR:#{result.stderr}"
@@ -111,7 +128,7 @@ module ChefMetal
111
128
  end
112
129
  elsif vm_file.updated_by_last_action?
113
130
  # Run vagrant reload if vm is running and vm file changed
114
- provider.converge_by "run vagrant reload #{vm_name}" do
131
+ action_handler.perform_action "run vagrant reload #{vm_name}" do
115
132
  result = shell_out("vagrant reload #{vm_name}", :cwd => cluster_path, :timeout => up_timeout)
116
133
  if result.exitstatus != 0
117
134
  raise "vagrant reload #{vm_name} failed!\nSTDOUT:#{result.stdout}\nSTDERR:#{result.stderr}"
@@ -129,7 +146,7 @@ module ChefMetal
129
146
  machine_for(node)
130
147
  end
131
148
 
132
- def delete_machine(provider, node)
149
+ def delete_machine(action_handler, node)
133
150
  if node['normal'] && node['normal']['provisioner_output']
134
151
  provisioner_output = node['normal']['provisioner_output']
135
152
  else
@@ -138,7 +155,7 @@ module ChefMetal
138
155
  vm_name = provisioner_output['vm_name'] || node['name']
139
156
  current_status = vagrant_status(vm_name)
140
157
  if current_status != 'not created'
141
- provider.converge_by "run vagrant destroy -f #{vm_name} (status was '#{current_status}')" do
158
+ action_handler.perform_action "run vagrant destroy -f #{vm_name} (status was '#{current_status}')" do
142
159
  result = shell_out("vagrant destroy -f #{vm_name}", :cwd => cluster_path)
143
160
  if result.exitstatus != 0
144
161
  raise "vagrant destroy failed!\nSTDOUT:#{result.stdout}\nSTDERR:#{result.stderr}"
@@ -146,17 +163,17 @@ module ChefMetal
146
163
  end
147
164
  end
148
165
 
149
- convergence_strategy_for(node).delete_chef_objects(provider, node)
166
+ convergence_strategy_for(node).cleanup_convergence(action_handler, node)
150
167
 
151
168
  vm_file_path = provisioner_output['vm_file_path'] || File.join(cluster_path, "#{vm_name}.vm")
152
- ChefMetal.inline_resource(provider) do
169
+ ChefMetal.inline_resource(action_handler) do
153
170
  file vm_file_path do
154
171
  action :delete
155
172
  end
156
173
  end
157
174
  end
158
175
 
159
- def stop_machine(provider, node)
176
+ def stop_machine(action_handler, node)
160
177
  if node['normal'] && node['normal']['provisioner_output']
161
178
  provisioner_output = node['normal']['provisioner_output']
162
179
  else
@@ -165,7 +182,7 @@ module ChefMetal
165
182
  vm_name = provisioner_output['vm_name'] || node['name']
166
183
  current_status = vagrant_status(vm_name)
167
184
  if current_status == 'running'
168
- provider.converge_by "run vagrant halt #{vm_name} (status was '#{current_status}')" do
185
+ action_handler.perform_action "run vagrant halt #{vm_name} (status was '#{current_status}')" do
169
186
  result = shell_out("vagrant halt #{vm_name}", :cwd => cluster_path)
170
187
  if result.exitstatus != 0
171
188
  raise "vagrant halt failed!\nSTDOUT:#{result.stdout}\nSTDERR:#{result.stderr}"
@@ -188,8 +205,8 @@ module ChefMetal
188
205
 
189
206
  protected
190
207
 
191
- def provisioner_url(provider)
192
- "vagrant_cluster://#{provider.node['name']}#{cluster_path}"
208
+ def provisioner_url(action_handler)
209
+ "vagrant_cluster://#{action_handler.node['name']}#{cluster_path}"
193
210
  end
194
211
 
195
212
  def parse_vagrant_up(output, node)
@@ -0,0 +1,4 @@
1
+ require 'chef_metal/provisioner/fog_provisioner'
2
+
3
+ ChefMetal.add_registered_provisioner_class("fog",
4
+ ChefMetal::Provisioner::FogProvisioner)
@@ -0,0 +1,4 @@
1
+ require 'chef_metal/provisioner/vagrant_provisioner'
2
+
3
+ ChefMetal.add_registered_provisioner_class("vagrant_cluster",
4
+ ChefMetal::Provisioner::VagrantProvisioner)
@@ -23,6 +23,14 @@ module ChefMetal
23
23
  stderr = ''
24
24
  exitstatus = nil
25
25
  channel = session.open_channel do |channel|
26
+ # Enable PTY unless otherwise specified, some instances require this
27
+ unless options[:ssh_pty_enable] == false
28
+ channel.request_pty do |chan, success|
29
+ raise "could not get pty" if !success && options[:ssh_pty_enable]
30
+ end
31
+ end
32
+
33
+
26
34
  channel.exec("#{options[:prefix]}#{command}") do |ch, success|
27
35
  raise "could not execute command: #{command.inspect}" unless success
28
36
 
@@ -154,4 +162,4 @@ module ChefMetal
154
162
  end
155
163
  end
156
164
  end
157
- end
165
+ end
@@ -1,3 +1,3 @@
1
1
  module ChefMetal
2
- VERSION = '0.4'
2
+ VERSION = '0.5'
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.4'
4
+ version: '0.5'
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-03-29 00:00:00.000000000 Z
11
+ date: 2014-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
@@ -129,10 +129,12 @@ files:
129
129
  - lib/chef/resource/machine_file.rb
130
130
  - lib/chef/resource/vagrant_box.rb
131
131
  - lib/chef/resource/vagrant_cluster.rb
132
+ - lib/chef_metal/action_handler.rb
132
133
  - lib/chef_metal/aws_credentials.rb
133
134
  - lib/chef_metal/convergence_strategy/install_cached.rb
134
135
  - lib/chef_metal/convergence_strategy/install_msi.rb
135
136
  - lib/chef_metal/convergence_strategy/install_sh.rb
137
+ - lib/chef_metal/convergence_strategy/no_converge.rb
136
138
  - lib/chef_metal/convergence_strategy/precreate_chef_objects.rb
137
139
  - lib/chef_metal/convergence_strategy.rb
138
140
  - lib/chef_metal/fog.rb
@@ -142,9 +144,12 @@ files:
142
144
  - lib/chef_metal/machine/windows_machine.rb
143
145
  - lib/chef_metal/machine.rb
144
146
  - lib/chef_metal/openstack_credentials.rb
147
+ - lib/chef_metal/provider_action_handler.rb
145
148
  - lib/chef_metal/provisioner/fog_provisioner.rb
146
149
  - lib/chef_metal/provisioner/vagrant_provisioner.rb
147
150
  - lib/chef_metal/provisioner.rb
151
+ - lib/chef_metal/provisioner_init/fog_init.rb
152
+ - lib/chef_metal/provisioner_init/vagrant_cluster_init.rb
148
153
  - lib/chef_metal/recipe_dsl.rb
149
154
  - lib/chef_metal/transport/ssh.rb
150
155
  - lib/chef_metal/transport/winrm.rb