chef-provisioning-fog 0.21.0 → 0.22.0

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: db6ee7ec27d271fb3880b648dcaab0aa3dc6c3e3
4
- data.tar.gz: 3562d4b915fae443ef15cbe7f48e9a1bf5d0af40
3
+ metadata.gz: 538fa22ee7ffaaad27677cbd067e99179a59cc37
4
+ data.tar.gz: da1a648fc1a069032f7fa60f8028a2e8bfbbe021
5
5
  SHA512:
6
- metadata.gz: 510f83a7ecc7ef0ab683e767fc0490039b2f812fe6827fbbf46cf85034d05663d974676ec6f8e4891413decb4409d12fc5d08649ba45c6dd8e659fe0c979cbea
7
- data.tar.gz: 318681b378186a7219bae547ad29b96eaac2b2053a97f93a0a15fd38150388790eee279bfb91549c8542e4b455b024db5222346dd339cf096c3243ca9f373ed9
6
+ metadata.gz: 6b4f738999c7633d975d6f60dadedb2efe3a350c290a312aa6a44aea95074520d41abfbda8783dee07024ef471a3943b79d210d39f129683e8e9d97eb4c84d37
7
+ data.tar.gz: 49d849f17d4187c47f397908b763c2fa41374c26953ab3abd2c4943bce670a5f533521e7843280074f90cc20ae1084d0f531877aa27204775c0e6ab3609b4c95
data/Gemfile CHANGED
@@ -8,4 +8,5 @@ group :development do
8
8
  gem 'guard-rspec'
9
9
  gem 'rb-readline'
10
10
  gem 'simplecov'
11
+ gem 'winrm-elevated'
11
12
  end
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.homepage = 'https://github.com/opscode/chef-provisioning-fog'
14
14
 
15
15
  s.add_dependency 'chef-provisioning', '>= 1.0', '< 3.0'
16
+ s.add_dependency 'cheffish', '~> 4.0.0'
16
17
  s.add_dependency 'fog', '>= 1.37.0'
17
18
  s.add_dependency 'google-api-client', "~> 0.8.0"
18
19
  s.add_dependency 'fog-softlayer' , '~> 1.1.0'
@@ -267,6 +267,8 @@ module FogDriver
267
267
 
268
268
  # Not meant to be part of public interface
269
269
  def transport_for(machine_spec, machine_options, server, action_handler = nil)
270
+ Chef::Log.debug("Creating transport for #{server}")
271
+ Chef::Log.debug("Machine Spec: #{machine_spec}")
270
272
  if machine_spec.reference['is_windows']
271
273
  action_handler.report_progress "Waiting for admin password on #{machine_spec.name} to be ready (may take up to 15 minutes)..." if action_handler
272
274
  transport = create_winrm_transport(machine_spec, machine_options, server)
@@ -296,7 +298,7 @@ module FogDriver
296
298
  end
297
299
 
298
300
  def create_servers(action_handler, specs_and_options, parallelizer, &block)
299
- specs_and_servers = servers_for(specs_and_options.keys)
301
+ specs_and_servers = servers_for(specs_and_options)
300
302
 
301
303
  # Get the list of servers which exist, segmented by their bootstrap options
302
304
  # (we will try to create a set of servers for each set of bootstrap options
@@ -324,7 +326,7 @@ module FogDriver
324
326
  'allocated_at' => Time.now.to_i
325
327
  )
326
328
 
327
- bootstrap_options = bootstrap_options_for(action_handler, machine_spec, machine_options)
329
+ bootstrap_options = bootstrap_options_for(machine_spec, machine_options)
328
330
  machine_spec.reference['key_name'] = bootstrap_options[:key_name] if bootstrap_options[:key_name]
329
331
  by_bootstrap_options[bootstrap_options] ||= []
330
332
  by_bootstrap_options[bootstrap_options] << machine_spec
@@ -551,9 +553,9 @@ module FogDriver
551
553
  end
552
554
  end
553
555
 
554
- def servers_for(machine_specs)
556
+ def servers_for(specs_and_options)
555
557
  result = {}
556
- machine_specs.each do |machine_spec|
558
+ machine_specs.each do |machine_spec, machine_options|
557
559
  if machine_spec.reference
558
560
  if machine_spec.reference['driver_url'] != driver_url
559
561
  raise "Switching a machine's driver from #{machine_spec.reference['driver_url']} to #{driver_url} for is not currently supported! Use machine :destroy and then re-create the machine on the new driver."
@@ -590,7 +592,7 @@ module FogDriver
590
592
  'chef_default'
591
593
  end
592
594
 
593
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
595
+ def bootstrap_options_for(machine_spec, machine_options)
594
596
  bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
595
597
 
596
598
  bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
@@ -669,6 +671,8 @@ module FogDriver
669
671
  IO.read(bootstrap_options[:key_path])
670
672
  elsif bootstrap_options[:key_name]
671
673
  get_private_key(bootstrap_options[:key_name])
674
+ elsif machine_options.has_key?(:ssh_options) && machine_options[:ssh_options].has_key?(:keys)
675
+ IO.read(machine_options[:ssh_options][:keys].first)
672
676
  else
673
677
  # TODO make a way to suggest other keys to try ...
674
678
  raise "No key found to connect to #{machine_spec.name} (#{machine_spec.reference.inspect})" \
@@ -13,7 +13,7 @@ module FogDriver
13
13
  compute_options[:joyent_username]
14
14
  end
15
15
 
16
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
16
+ def bootstrap_options_for(machine_spec, machine_options)
17
17
  bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
18
18
 
19
19
  bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
@@ -39,7 +39,7 @@ class Chef
39
39
  [result, id]
40
40
  end
41
41
 
42
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
42
+ def bootstrap_options_for(machine_spec, machine_options)
43
43
  # probably best to only ADD options here since super class looks
44
44
  # for some values; for example, :key_name doesn't get saved to
45
45
  # chef_provisioning.reference if you remove it here.
@@ -104,9 +104,9 @@ class Chef
104
104
  end
105
105
  end
106
106
 
107
- def servers_for(machine_specs)
107
+ def servers_for(specs_and_options)
108
108
  result = {}
109
- machine_specs.each do |machine_spec|
109
+ specs_and_options.each do |machine_spec, _machine_options|
110
110
  result[machine_spec] = server_for(machine_spec)
111
111
  end
112
112
 
@@ -1,38 +1,28 @@
1
- # fog:Vcair:<client id>
1
+ # fog:vcair:<vcair host>
2
2
  class Chef
3
3
  module Provisioning
4
4
  module FogDriver
5
5
  module Providers
6
6
  class Vcair < FogDriver::Driver
7
- Driver.register_provider_class('Vcair', FogDriver::Providers::Vcair)
7
+ Driver.register_provider_class('vcair', FogDriver::Providers::Vcair)
8
8
 
9
9
  def creator
10
- Chef::Config[:knife][:vcair_username]
10
+ driver_options[:username]
11
+ end
12
+
13
+ def initialize(driver_url, config)
14
+ super(driver_url, config)
15
+
16
+ @auth_params = {provider: 'vclouddirector'}
17
+ _fog, _vcair, @auth_params[:vcloud_director_host] = driver_url.split(':', 3)
18
+ @auth_params[:vcloud_director_username] = "#{driver_options[:username]}@#{driver_options[:org]}"
19
+ @auth_params[:vcloud_director_password] = driver_options[:password]
20
+ @auth_params[:vcloud_director_show_progress] = driver_options[:show_progress] || false
21
+ Chef::Log.debug('Initialized driver for vcair')
11
22
  end
12
23
 
13
24
  def compute
14
25
  @compute ||= begin
15
- Chef::Log.debug("vcair_username #{Chef::Config[:knife][:vcair_username]}")
16
- Chef::Log.debug("vcair_org #{Chef::Config[:knife][:vcair_org]}")
17
- Chef::Log.debug("vcair_api_host #{Chef::Config[:knife][:vcair_api_host]}")
18
- #Chef::Log.debug("vcair_api_version #{Chef::Config[:knife][:vcair_api_version]}")
19
- Chef::Log.debug("vcair_show_progress #{Chef::Config[:knife][:vcair_show_progress]}")
20
-
21
- username = [
22
- Chef::Config[:knife][:vcair_username],
23
- Chef::Config[:knife][:vcair_org]
24
- ].join('@')
25
-
26
- @auth_params = {
27
- :provider => 'vclouddirector', #TODO: see compute_options_for, and grab else where
28
- :vcloud_director_username => username,
29
- :vcloud_director_password => Chef::Config[:knife][:vcair_password],
30
- :vcloud_director_host => Chef::Config[:knife][:vcair_api_host],
31
- #:vcair_api_host => Chef::Config[:knife][:vcair_api_host],
32
- :vcloud_director_api_version => Chef::Config[:knife][:vcair_api_version],
33
- :vcloud_director_show_progress => false
34
- }
35
-
36
26
  Fog::Compute.new(@auth_params)
37
27
  rescue Excon::Errors::Unauthorized => e
38
28
  error_message = "Connection failure, please check your username and password."
@@ -45,6 +35,23 @@ class Chef
45
35
  end
46
36
  end
47
37
 
38
+ # Overrides the parent method and adds some additional vCloud specific metadata
39
+ def create_servers(action_handler, specs_and_options, parallelizer, &block)
40
+
41
+ specs_and_options.each do |machine_spec, machine_options|
42
+ machine_spec.reference ||= {}
43
+ # Add some vCloud info to the machine_spec
44
+ bootstrap_options = bootstrap_options_for(machine_spec, machine_options)
45
+ machine_spec.reference['vdc'] = vdc(bootstrap_options).name
46
+ machine_spec.reference['net'] = net(bootstrap_options).name
47
+
48
+ # Save the key and whether we're using sudo
49
+ machine_spec.reference['key_name'] = bootstrap_options[:key_name] if bootstrap_options.has_key?(:key_name)
50
+ machine_spec.reference['sudo'] = bootstrap_options[:sudo] if bootstrap_options.has_key?(:sudo)
51
+ end
52
+
53
+ super
54
+ end
48
55
 
49
56
  def create_many_servers(num_servers, bootstrap_options, parallelizer)
50
57
  parallelizer.parallelize(1.upto(num_servers)) do |i|
@@ -52,25 +59,36 @@ class Chef
52
59
  vm=nil
53
60
  begin
54
61
  begin
62
+ Chef::Log.debug('Creating vApp...')
55
63
  instantiate(clean_bootstrap_options)
64
+ Chef::Log.debug('Created vApp')
56
65
  rescue Fog::Errors::Error => e
57
66
  unless e.minor_error_code == "DUPLICATE_NAME"
58
67
  # if it's already there, just use the current one
59
68
  raise e
60
69
  end
70
+ Chef::Log.warn('Found existing vApp with the same name!')
61
71
  end
62
-
63
- vapp = vdc.vapps.get_by_name(bootstrap_options[:name])
64
- vm = vapp.vms.find {|v| v.vapp_name == bootstrap_options[:name]}
72
+ vdc = vdc(clean_bootstrap_options)
73
+
74
+ Chef::Log.debug("Searching for #{bootstrap_options[:name]}...")
75
+ vapp = vdc.vapps.get_by_name(clean_bootstrap_options[:name])
76
+ raise "Couldn't find vApp #{bootstrap_options[:name]} that was just created!" if vapp.nil?
77
+ vm = vapp.vms.find {|v| v.vapp_name == clean_bootstrap_options[:name]}
78
+ raise "No VMs found in vApp!" if vm.nil?
79
+ Chef::Log.debug("Found #{vm.name}")
65
80
  update_customization(clean_bootstrap_options, vm)
66
81
 
67
82
  if bootstrap_options[:cpus]
68
- vm.cpu = bootstrap_options[:cpus]
83
+ vm.cpu = clean_bootstrap_options[:cpus]
69
84
  end
70
85
  if bootstrap_options[:memory]
71
- vm.memory = bootstrap_options[:memory]
86
+ vm.memory = clean_bootstrap_options[:memory]
72
87
  end
73
- update_network(bootstrap_options, vapp, vm)
88
+
89
+ Chef::Log.debug("Updating network for #{vm.name}...")
90
+ update_network(clean_bootstrap_options, vapp, vm)
91
+ Chef::Log.debug("Updated network for #{vm.name}")
74
92
 
75
93
  rescue Excon::Errors::BadRequest => e
76
94
  response = Chef::JSONCompat.from_json(e.response.body)
@@ -107,10 +125,10 @@ class Chef
107
125
  # NOTE: vCloud Air Fog does not get server.status via http every time
108
126
  server.reload
109
127
 
110
- if server.status == 'off' or server.status != 'on'
128
+ if server.status == 'off' || server.status != 'on'
111
129
  action_handler.perform_action "start machine #{machine_spec.name} (#{server.id} on #{driver_url})" do
112
130
  server.power_on
113
- machine_spec.location['started_at'] = Time.now.to_i
131
+ machine_spec.reference['started_at'] = Time.now.to_i
114
132
  end
115
133
  machine_spec.save(action_handler)
116
134
  end
@@ -118,12 +136,13 @@ class Chef
118
136
 
119
137
 
120
138
  def server_for(machine_spec)
121
- if machine_spec.location
122
- vapp = vdc.vapps.get_by_name(machine_spec.name)
139
+ if machine_spec.reference
140
+ Chef::Log.debug("Checking for VDC #{machine_spec.reference['vdc']}...")
141
+ vapp = org.vdcs.get_by_name(machine_spec.reference['vdc']).vapps.get_by_name(machine_spec.name)
123
142
 
124
143
  server = unless vapp.nil?
125
144
  unless vapp.vms.first.nil?
126
- vapp.vms.find{|vm| vm.id == machine_spec.location['server_id'] }
145
+ vapp.vms.find{|vm| vm.id == machine_spec.reference['server_id'] }
127
146
  end
128
147
  end
129
148
  else
@@ -131,26 +150,27 @@ class Chef
131
150
  end
132
151
  end
133
152
 
134
- def servers_for(machine_specs)
153
+ def servers_for(specs_and_options)
135
154
  result = {}
136
- machine_specs.each do |machine_spec|
137
- server_for(machine_spec)
155
+ specs_and_options.each do |machine_spec, _machine_options|
156
+ result[machine_spec] = server_for(machine_spec)
138
157
  end
139
158
  result
140
159
  end
141
160
 
142
- def ssh_options_for(machine_spec, machine_options, server)
143
- { auth_methods: [ 'password' ],
144
- timeout: (machine_options[:ssh_timeout] || 600),
145
- password: machine_options[:ssh_password]
146
- }.merge(machine_options[:ssh_options] || {})
147
- end
161
+ # def ssh_options_for(machine_spec, machine_options, server)
162
+ # ssh_options = {
163
+ # auth_methods: ['password'],
164
+ # timeout: (machine_options[:ssh_timeout] || 600),
165
+ # password: machine_options[:ssh_password]
166
+ # }.merge(machine_options[:ssh_options] || {})
167
+ # end
148
168
 
149
169
  def create_ssh_transport(machine_spec, machine_options, server)
150
170
  ssh_options = ssh_options_for(machine_spec, machine_options, server)
151
- username = machine_spec.location['ssh_username'] || default_ssh_username
171
+ username = machine_spec.reference['ssh_username'] || default_ssh_username
152
172
  options = {}
153
- if machine_spec.location[:sudo] || (!machine_spec.location.has_key?(:sudo) && username != 'root')
173
+ if machine_spec.reference[:sudo] || (!machine_spec.reference.has_key?(:sudo) && username != 'root')
154
174
  options[:prefix] = 'sudo '
155
175
  end
156
176
 
@@ -165,7 +185,7 @@ class Chef
165
185
 
166
186
  #Enable pty by default
167
187
  options[:ssh_pty_enable] = true
168
- options[:ssh_gateway] = machine_spec.location['ssh_gateway'] if machine_spec.location.has_key?('ssh_gateway')
188
+ options[:ssh_gateway] = machine_spec.reference['ssh_gateway'] if machine_spec.reference.has_key?('ssh_gateway')
169
189
 
170
190
  Transport::SSH.new(remote_host, username, ssh_options, options, config)
171
191
  end
@@ -190,7 +210,7 @@ class Chef
190
210
  wait_for_transport(action_handler, machine_spec, machine_options, server)
191
211
  rescue Fog::Errors::TimeoutError
192
212
  # Only ever reboot once, and only if it's been less than 10 minutes since we stopped waiting
193
- if machine_spec.location['started_at'] || remaining_wait_time(machine_spec, machine_options) < -(10*60)
213
+ if machine_spec.reference['started_at'] || remaining_wait_time(machine_spec, machine_options) < -(10*60)
194
214
  raise
195
215
  else
196
216
  # Sometimes (on EC2) the machine comes up but gets stuck or has
@@ -207,50 +227,64 @@ class Chef
207
227
  end
208
228
 
209
229
  def org
210
- @org ||= compute.organizations.get_by_name(Chef::Config[:knife][:vcair_org])
230
+ @org ||= compute.organizations.get_by_name(driver_options[:org])
211
231
  end
212
232
 
213
- def vdc
214
- if Chef::Config[:knife][:vcair_vdc]
215
- @vdc ||= org.vdcs.get_by_name(Chef::Config[:knife][:vcair_vdc])
233
+ def vdc(bootstrap_options)
234
+ if bootstrap_options[:vdc]
235
+ @vdc ||= org.vdcs.get_by_name(bootstrap_options[:vdc])
236
+ raise "VDC #{bootstrap_options[:vdc]} not found" unless @vdc
216
237
  else
217
238
  @vdc ||= org.vdcs.first
239
+ raise 'No VDC found' unless @vdc
218
240
  end
241
+
242
+ Chef::Log.debug("VDC set to #{@vdc.name}")
243
+ @vdc
219
244
  end
220
245
 
221
- def net
222
- if Chef::Config[:knife][:vcair_net]
223
- @net ||= org.networks.get_by_name(Chef::Config[:knife][:vcair_net])
246
+ def net(bootstrap_options)
247
+ if bootstrap_options[:net]
248
+ @net ||= org.networks.get_by_name(bootstrap_options[:net])
249
+ raise "Network #{bootstrap_options[:net]} not found" unless @net
224
250
  else
225
251
  # Grab first non-isolated (bridged, natRouted) network
226
252
  @net ||= org.networks.find { |n| n if !n.fence_mode.match("isolated") }
253
+ raise 'No non-isolated network found' unless @net
227
254
  end
255
+
256
+ Chef::Log.debug("Network set to #{@net.name}")
257
+ @net
228
258
  end
229
259
 
230
260
  def template(bootstrap_options)
231
- # TODO: find by catalog item ID and/or NAME
232
- # TODO: add option to search just public and/or private catalogs
233
-
234
- #TODO: maybe make a hash for caching
235
- org.catalogs.map do |cat|
236
- #cat.catalog_items.get_by_name(config_value(:image))
237
- cat.catalog_items.get_by_name(bootstrap_options[:image_name])
238
- end.compact.first
261
+ # If we specify a catalog name, search for the image in it,
262
+ # otherwise return the first image we find in any catalog.
263
+ if bootstrap_options[:catalog_name].nil?
264
+ #TODO: maybe make a hash for caching
265
+ org.catalogs.map do |cat|
266
+ #cat.catalog_items.get_by_name(config_value(:image))
267
+ cat.catalog_items.get_by_name(bootstrap_options[:image_name])
268
+ end.compact.first
269
+ else
270
+ catalog = org.catalogs.get_by_name(bootstrap_options[:catalog_name])
271
+ raise "No catalog named #{bootstrap_options[:catalog_name]} could be found!" if catalog.nil?
272
+ catalog.catalog_items.get_by_name(bootstrap_options[:image_name])
273
+ end
239
274
  end
240
275
 
241
276
  def instantiate(bootstrap_options)
242
- begin
243
- #node_name = config_value(:chef_node_name)
244
- node_name = bootstrap_options[:name]
245
- template(bootstrap_options).instantiate(
246
- node_name,
247
- vdc_id: vdc.id,
248
- network_id: net.id,
249
- description: "id:#{node_name}")
250
- #rescue CloudExceptions::ServerCreateError => e
251
- rescue => e
252
- raise e
253
- end
277
+ #node_name = config_value(:chef_node_name)
278
+ node_name = bootstrap_options[:name]
279
+ vdc = vdc(bootstrap_options)
280
+ net = net(bootstrap_options)
281
+
282
+ template(bootstrap_options).instantiate(
283
+ node_name,
284
+ vdc_id: vdc.id,
285
+ network_id: net.id,
286
+ description: "id:#{node_name}")
287
+ #rescue CloudExceptions::ServerCreateError => e
254
288
  end
255
289
 
256
290
  # Create a WinRM transport for a vCloud Air Vapp VM instance
@@ -259,7 +293,7 @@ class Chef
259
293
  # @param [Fog::Compute::Server] server A Fog mapping to the AWS instance
260
294
  # @return [ChefMetal::Transport::WinRM] A WinRM Transport object to talk to the server
261
295
  def create_winrm_transport(machine_spec, machine_options, server)
262
- port = machine_spec.location['winrm_port'] || 5985
296
+ port = machine_spec.reference['winrm_port'] || 5985
263
297
  endpoint = "http://#{server.ip_address}:#{port}/wsman"
264
298
  type = :plaintext
265
299
 
@@ -276,6 +310,7 @@ class Chef
276
310
  end
277
311
 
278
312
  def update_customization(bootstrap_options, server)
313
+ Chef::Log.debug("Customizing vApp: #{server.name}")
279
314
  ## Initialization before first power on.
280
315
  custom=server.customization
281
316
 
@@ -291,9 +326,9 @@ class Chef
291
326
  end
292
327
  password = case bootstrap_options[:protocol]
293
328
  when 'ssh'
294
- bootstrap_options[:ssh_options][:password]
329
+ bootstrap_options[:ssh_options][:password] unless bootstrap_options[:ssh_options].nil?
295
330
  when 'winrm'
296
- bootstrap_options[:winrm_options][:password]
331
+ bootstrap_options[:winrm_options][:password] unless bootstrap_options[:winrm_options].nil?
297
332
  end
298
333
 
299
334
  if password
@@ -313,11 +348,16 @@ class Chef
313
348
 
314
349
  # DNS and Windows want AlphaNumeric and dashes for hostnames
315
350
  # Windows can only handle 15 character hostnames
316
- # TODO: only change name for Windows!
317
- #c.computer_name = config_value(:chef_node_name).gsub(/\W/,"-").slice(0..14)
318
- custom.computer_name = bootstrap_options[:name].gsub(/\W/,"-").slice(0..14)
351
+ custom.computer_name = case server.operating_system
352
+ when /Windows/
353
+ bootstrap_options[:name].gsub(/\W/,"-").slice(0..14)
354
+ else
355
+ bootstrap_options[:name]
356
+ end
357
+
319
358
  custom.enabled = true
320
359
  custom.save
360
+ Chef::Log.debug("vApp customized: #{server.name}")
321
361
  end
322
362
 
323
363
  ## vCloud Air
@@ -331,7 +371,11 @@ class Chef
331
371
  #vapp = vdc.vapps.get_by_name(bootstrap_options[:name])
332
372
  #vm = vapp.vms.find {|v| v.vapp_name == bootstrap_options[:name]}
333
373
  return if vm.ip_address != "" # return if ip address is set, as this isn't a new VM
374
+ Chef::Log.debug('No IP address found. Must be a new VM.')
375
+ net = net(bootstrap_options)
376
+ Chef::Log.debug("Searching for network: #{net.name}")
334
377
  nc = vapp.network_config.find { |netc| netc if netc[:networkName].match(net.name) }
378
+ Chef::Log.debug("Found network configuration: #{nc}")
335
379
  networks_config = [nc]
336
380
  section = {PrimaryNetworkConnectionIndex: 0}
337
381
  section[:NetworkConnection] = networks_config.compact.each_with_index.map do |network, i|
@@ -360,23 +404,24 @@ class Chef
360
404
  compute.process_task(nc_task)
361
405
  end
362
406
 
363
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
364
- bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
365
-
366
- bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
367
- bootstrap_options[:name] ||= machine_spec.name
407
+ def self.bootstrap_options_for(machine_spec, machine_options)
408
+ bootstrap_options = machine_options.key?(:bootstrap_options) ? machine_options[:bootstrap_options] : {}
409
+ bootstrap_options[:name] = machine_spec.name unless machine_spec.nil?
368
410
 
369
- bootstrap_options = bootstrap_options.merge(machine_options.configs[1])
370
411
  bootstrap_options
371
412
  end
372
413
 
373
414
  def destroy_machine(action_handler, machine_spec, machine_options)
374
415
  server = server_for(machine_spec)
416
+ Chef::Log.info("Destroying machine #{machine_spec.name}...")
417
+ bootstrap_options = bootstrap_options_for(machine_spec, machine_options)
418
+ vdc = vdc(bootstrap_options)
375
419
  if server && server.status != 'archive' # TODO: does vCloud Air do archive?
376
- action_handler.perform_action "destroy machine #{machine_spec.name} (#{machine_spec.location['server_id']} at #{driver_url})" do
420
+ action_handler.perform_action "destroy machine #{machine_spec.name} (#{machine_spec.reference['server_id']} at #{driver_url})" do
377
421
  #NOTE: currently doing 1 vm for 1 vapp
378
422
  vapp = vdc.vapps.get_by_name(machine_spec.name)
379
423
  if vapp
424
+ Chef::Log.debug("Found vApp #{machine_spec.name}")
380
425
  vapp.power_off
381
426
  vapp.undeploy
382
427
  vapp.destroy
@@ -385,7 +430,7 @@ class Chef
385
430
  end
386
431
  end
387
432
  end
388
- machine_spec.location = nil
433
+ machine_spec.reference = nil
389
434
  strategy = convergence_strategy_for(machine_spec, machine_options)
390
435
  strategy.cleanup_convergence(action_handler, machine_spec)
391
436
  end
@@ -11,7 +11,7 @@ class Chef
11
11
  compute_options[:xenserver_username]
12
12
  end
13
13
 
14
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
14
+ def bootstrap_options_for(machine_spec, machine_options)
15
15
  bootstrap_options = super
16
16
  bootstrap_options[:tags] = bootstrap_options[:tags].map {|k,v| "#{k}: #{v}" }
17
17
  bootstrap_options
@@ -56,9 +56,9 @@ class Chef
56
56
  end
57
57
  end
58
58
 
59
- def servers_for(machine_specs)
59
+ def servers_for(specs_and_options)
60
60
  result = {}
61
- machine_specs.each do |machine_spec|
61
+ specs_and_options.each do |machine_spec, _machine_options|
62
62
  if machine_spec.reference
63
63
  if machine_spec.reference['driver_url'] != driver_url
64
64
  raise "Switching a machine's driver from #{machine_spec.reference['driver_url']} to #{driver_url} for is not currently supported! Use machine :destroy and then re-create the machine on the new driver."
@@ -209,7 +209,7 @@ end
209
209
  # Otherwise machine_batch will fail since parallel calls will clash.
210
210
  #
211
211
  # See http://ruby-doc.org//stdlib-2.1.1//libdoc/xmlrpc/rdoc/XMLRPC/Client.html
212
- #
212
+ #
213
213
  module Fog
214
214
  module XenServer
215
215
  class Connection
@@ -26,7 +26,7 @@ class Chef
26
26
  end
27
27
 
28
28
  def with_fog_vcair_driver(driver_options = nil, &block)
29
- with_fog_driver('Vcair', driver_options, &block)
29
+ with_fog_driver('vcair', driver_options, &block)
30
30
  end
31
31
 
32
32
  def with_fog_scaleway_driver(driver_options = nil, &block)
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  module Provisioning
3
3
  module FogDriver
4
- VERSION = '0.21.0'
4
+ VERSION = '0.22.0'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-provisioning-fog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
@@ -34,6 +34,20 @@ dependencies:
34
34
  - - "<"
35
35
  - !ruby/object:Gem::Version
36
36
  version: '3.0'
37
+ - !ruby/object:Gem::Dependency
38
+ name: cheffish
39
+ requirement: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: 4.0.0
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: 4.0.0
37
51
  - !ruby/object:Gem::Dependency
38
52
  name: fog
39
53
  requirement: !ruby/object:Gem::Requirement