chef-metal-vsphere 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -69,9 +69,14 @@ Create or obtain a unix/linux VM template. The VM template must:
69
69
 
70
70
  This will clone your VM template to create two VMware Virtual Machines, "metal_1" and "metal_2", in the vSphere Folder specified by vm_folder, bootstrapped to an empty runlist. It will then stop (guest shutdown) and delete the vms.
71
71
 
72
+ Roadmap
73
+ -------
74
+
75
+ Check out [TODO.md](TODO.md)
76
+
72
77
  Bugs and Contact
73
78
  ----------------
74
79
 
75
- Please submit bugs at [https://github.com/RallySoftware-cookbooks/chef-metal-vsphere], contact Brian Dupras on Twitter at @briandupras, email at rallysoftware-cookbooks@rallydev.com.
80
+ Please submit bugs at [chef-metal-vpshere](https://github.com/RallySoftware-cookbooks/chef-metal-vsphere), contact Brian Dupras on Twitter at @briandupras, email at rallysoftware-cookbooks@rallydev.com.
76
81
 
77
82
  *Warning* if you get an rbvmomi error regarding VMODL::AnyType, add `gem 'nokogiri', '1.5.5'` to your dependencies.
@@ -1,3 +1,3 @@
1
1
  module ChefMetalVsphere
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
@@ -24,6 +24,21 @@ module ChefMetalVsphere
24
24
  vm = folder.find(vm_name, RbVmomi::VIM::VirtualMachine)
25
25
  end
26
26
 
27
+ def vm_started?(vm, wait_on_port = 22)
28
+ return false if vm.nil?
29
+ state = vm.runtime.powerState
30
+ return false unless state == 'poweredOn'
31
+ return false unless port_ready?(vm, wait_on_port)
32
+ return true
33
+ end
34
+
35
+ def vm_stopped?(vm)
36
+ return true if vm.nil?
37
+ state = vm.runtime.powerState
38
+ return false unless state == 'poweredOff'
39
+ return false
40
+ end
41
+
27
42
  def start_vm(vm, wait_on_port = 22)
28
43
  state = vm.runtime.powerState
29
44
  unless state == 'poweredOn'
@@ -137,8 +137,10 @@ module ChefMetalVsphere
137
137
 
138
138
  vm = vm_instance(action_handler, node)
139
139
 
140
- action_handler.perform_action "Start VM and wait for ssh [#{vm_folder}/#{vm_name}]" do
141
- start_vm(vm, wait_on_port)
140
+ unless vm_started?(vm, wait_on_port)
141
+ action_handler.perform_action "Start VM and wait for port #{wait_on_port}" do
142
+ start_vm(vm, wait_on_port)
143
+ end
142
144
  end
143
145
 
144
146
  machine = machine_for(node)
@@ -177,8 +179,12 @@ module ChefMetalVsphere
177
179
  end
178
180
  vm_name = provisioner_output['vm_name'] || node['name']
179
181
  vm_folder = provisioner_output['bootstrap_options']['vm_folder']
180
- action_handler.perform_action "Guest shutdown and power off VM [#{vm_folder}/#{vm_name}]" do
181
- stop_vm(vm_for(node))
182
+ vm = vm_for(node)
183
+
184
+ unless vm_stopped?(vm)
185
+ action_handler.perform_action "Shutdown guest OS and power off VM [#{vm_folder}/#{vm_name}]" do
186
+ stop_vm(vm)
187
+ end
182
188
  end
183
189
  end
184
190
 
@@ -198,7 +204,7 @@ module ChefMetalVsphere
198
204
  vm = find_vm(datacenter, vm_folder, vm_name)
199
205
  return vm unless vm.nil?
200
206
 
201
- action_handler.perform_action "Clone a new VM instance for [#{vm_folder}/#{vm_name}]" do
207
+ action_handler.perform_action "Clone a new VM instance from [#{bootstrap_options['template_folder']}/#{bootstrap_options['template_name']}]" do
202
208
  vm = clone_vm(vm_name, bootstrap_options)
203
209
  end
204
210
 
@@ -215,7 +221,9 @@ module ChefMetalVsphere
215
221
  end
216
222
 
217
223
  def machine_for(node)
218
- if is_windows?(vm_for(node))
224
+ vm = vm_for(node) or raise "VM for node #{node['name']} has not been created!"
225
+
226
+ if is_windows?(vm)
219
227
  ChefMetal::Machine::WindowsMachine.new(node, transport_for(node), convergence_strategy_for(node))
220
228
  else
221
229
  ChefMetal::Machine::UnixMachine.new(node, transport_for(node), convergence_strategy_for(node))
@@ -229,9 +237,11 @@ module ChefMetalVsphere
229
237
  vm_folder = bootstrap_options['vm_folder']
230
238
  vm_name = node['normal']['provisioner_output']['vm_name']
231
239
  vm = find_vm(datacenter, vm_folder, vm_name)
240
+ vm
232
241
  end
233
242
 
234
243
  def is_windows?(vm)
244
+ return false if vm.nil?
235
245
  vm.guest.guestFamily == 'windowsGuest'
236
246
  end
237
247
 
@@ -267,8 +277,9 @@ module ChefMetalVsphere
267
277
 
268
278
  def create_ssh_transport(node)
269
279
  bootstrap_options = node['normal']['provisioner_output']['bootstrap_options']
280
+ vm = vm_for(node) or raise "VM for node #{node['name']} has not been created!"
270
281
 
271
- hostname = vm_for(node).guest.ipAddress
282
+ hostname = vm.guest.ipAddress
272
283
  ssh_user = bootstrap_options['ssh']['user']
273
284
  ssh_options = symbolize_keys(bootstrap_options['ssh'])
274
285
  transport_options = {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-metal-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-09 00:00:00.000000000 Z
12
+ date: 2014-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -106,7 +106,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
106
  version: '0'
107
107
  segments:
108
108
  - 0
109
- hash: -2191173413187633211
109
+ hash: -1936715573261494371
110
110
  required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements:
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  version: '0'
116
116
  segments:
117
117
  - 0
118
- hash: -2191173413187633211
118
+ hash: -1936715573261494371
119
119
  requirements: []
120
120
  rubyforge_project:
121
121
  rubygems_version: 1.8.28