chef-metal-vsphere 0.1.3 → 0.1.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.
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