chef-metal-fog 0.5.1 → 0.5.2
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.
- checksums.yaml +4 -4
- data/lib/chef_metal_fog/fog_driver.rb +52 -11
- data/lib/chef_metal_fog/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f700b696e9287fbc6a14e028b27879efb1841828
|
4
|
+
data.tar.gz: eded4c9ec79313327158939eeeff70d09ef73e1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 043b903bcc06d9337d2fc0910007e43a480d6ab7b70f2eb03f98a08f8825cc57235d937b8ecde0a0d48cc4cced0157b94d8f4858eb976b6286ee1e642baca204
|
7
|
+
data.tar.gz: d0f843d5bcdeeec31bc9beeb7ff033ac3befca843ba395a6a82423af7013f0dc7c01b0ecf0e4822542d0772dff294065259541b11f5526fc756dd4dedb1e9369
|
@@ -418,7 +418,7 @@ module ChefMetalFog
|
|
418
418
|
|
419
419
|
def bootstrap_options_for(action_handler, machine_spec, machine_options)
|
420
420
|
bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
|
421
|
-
if !bootstrap_options[:key_name]
|
421
|
+
if (provider == 'DigitalOcean' || provider == 'AWS') && !bootstrap_options[:key_name]
|
422
422
|
bootstrap_options[:key_name] = overwrite_default_key_willy_nilly(action_handler)
|
423
423
|
end
|
424
424
|
tags = {
|
@@ -445,7 +445,11 @@ module ChefMetalFog
|
|
445
445
|
bootstrap_options[:region_name] ||= 'San Francisco 1'
|
446
446
|
bootstrap_options[:region_id] = compute.regions.select { |region| region.name == bootstrap_options[:region_name] }.first.id
|
447
447
|
end
|
448
|
-
|
448
|
+
found_key = compute.ssh_keys.select { |k| k.name == bootstrap_options[:key_name] }.first
|
449
|
+
if !found_key
|
450
|
+
raise "Could not find key named '#{bootstrap_options[:key_name]}' on #{driver_url}"
|
451
|
+
end
|
452
|
+
bootstrap_options[:ssh_key_ids] ||= [ found_key.id ]
|
449
453
|
|
450
454
|
# You don't get to specify name yourself
|
451
455
|
bootstrap_options[:name] = machine_spec.name
|
@@ -484,7 +488,7 @@ module ChefMetalFog
|
|
484
488
|
end
|
485
489
|
end
|
486
490
|
|
487
|
-
def ssh_options_for(machine_spec, server)
|
491
|
+
def ssh_options_for(machine_spec, machine_options, server)
|
488
492
|
result = {
|
489
493
|
# TODO create a user known hosts file
|
490
494
|
# :user_known_hosts_file => vagrant_ssh_config['UserKnownHostsFile'],
|
@@ -492,13 +496,15 @@ module ChefMetalFog
|
|
492
496
|
:auth_methods => [ 'publickey' ],
|
493
497
|
:keys_only => true,
|
494
498
|
:host_key_alias => "#{server.id}.#{provider}"
|
495
|
-
}
|
499
|
+
}.merge(machine_options[:ssh_options] || {})
|
496
500
|
if server.respond_to?(:private_key) && server.private_key
|
497
501
|
result[:key_data] = [ server.private_key ]
|
498
502
|
elsif server.respond_to?(:key_name)
|
499
503
|
result[:key_data] = [ get_private_key(server.key_name) ]
|
500
504
|
elsif machine_spec.location['key_name']
|
501
505
|
result[:key_data] = [ get_private_key(machine_spec.location['key_name']) ]
|
506
|
+
elsif machine_options[:bootstrap_options][:key_name]
|
507
|
+
result[:key_data] = [ get_private_key(machine_options[:bootstrap_options][:key_name]) ]
|
502
508
|
else
|
503
509
|
# TODO make a way to suggest other keys to try ...
|
504
510
|
raise "No key found to connect to #{machine_spec.name}!"
|
@@ -507,7 +513,7 @@ module ChefMetalFog
|
|
507
513
|
end
|
508
514
|
|
509
515
|
def create_ssh_transport(machine_spec, machine_options, server)
|
510
|
-
ssh_options = ssh_options_for(machine_spec, server)
|
516
|
+
ssh_options = ssh_options_for(machine_spec, machine_options, server)
|
511
517
|
# If we're on AWS, the default is to use ubuntu, not root
|
512
518
|
if provider == 'AWS'
|
513
519
|
username = machine_spec.location['ssh_username'] || 'ubuntu'
|
@@ -547,7 +553,11 @@ module ChefMetalFog
|
|
547
553
|
new_compute_options = {}
|
548
554
|
new_compute_options[:provider] = provider
|
549
555
|
new_config = { :driver_options => { :compute_options => new_compute_options }}
|
550
|
-
|
556
|
+
new_defaults = {
|
557
|
+
:driver_options => { :compute_options => {} },
|
558
|
+
:machine_options => { :bootstrap_options => {} }
|
559
|
+
}
|
560
|
+
result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
|
551
561
|
|
552
562
|
# Get data from the identifier in the URL
|
553
563
|
if id && id != ''
|
@@ -593,8 +603,7 @@ module ChefMetalFog
|
|
593
603
|
new_compute_options[:aws_access_key_id] = aws_profile[:aws_access_key_id]
|
594
604
|
new_compute_options[:aws_secret_access_key] = aws_profile[:aws_secret_access_key]
|
595
605
|
new_compute_options[:aws_session_token] = aws_profile[:aws_security_token]
|
596
|
-
|
597
|
-
new_compute_options[:region] ||= aws_profile[:region] if aws_profile.has_key?(:region) && !compute_options.has_key?(:region)
|
606
|
+
new_defaults[:driver_options][:compute_options][:region] = aws_profile[:region]
|
598
607
|
when 'OpenStack'
|
599
608
|
# TODO it is supposed to be unnecessary to load credentials from fog this way;
|
600
609
|
# why are we doing it?
|
@@ -614,6 +623,38 @@ module ChefMetalFog
|
|
614
623
|
new_compute_options[:rackspace_region] ||= credential[:rackspace_region]
|
615
624
|
new_compute_options[:rackspace_endpoint] ||= credential[:rackspace_endpoint]
|
616
625
|
new_compute_options[:rackspace_compute_url] ||= credential[:rackspace_compute_url]
|
626
|
+
when 'DigitalOcean'
|
627
|
+
# This uses ~/.tugboat, generated by "tugboat authorize" - see https://github.com/pearkes/tugboat
|
628
|
+
tugboat_file = File.expand_path('~/.tugboat')
|
629
|
+
if File.exist?(tugboat_file)
|
630
|
+
tugboat_data = YAML.load(IO.read(tugboat_file))
|
631
|
+
new_compute_options.merge!(
|
632
|
+
:digitalocean_client_id => tugboat_data['authentication']['client_key'],
|
633
|
+
:digitalocean_api_key => tugboat_data['authentication']['api_key']
|
634
|
+
)
|
635
|
+
new_defaults[:machine_options].merge!(
|
636
|
+
#:ssh_username => tugboat_data['ssh']['ssh_user'],
|
637
|
+
:ssh_options => {
|
638
|
+
:port => tugboat_data['ssh']['ssh_port'],
|
639
|
+
# TODO we ignore ssh_key_path in favor of ssh_key / key_name stuff
|
640
|
+
#:key_data => [ IO.read(tugboat_data['ssh']['ssh_key_path']) ] # TODO use paths, not data?
|
641
|
+
}
|
642
|
+
)
|
643
|
+
|
644
|
+
# TODO verify that the key_name exists and matches the ssh key path
|
645
|
+
|
646
|
+
new_defaults[:machine_options][:bootstrap_options].merge!(
|
647
|
+
:region_id => tugboat_data['defaults']['region'].to_i,
|
648
|
+
:image_id => tugboat_data['defaults']['image'].to_i,
|
649
|
+
:size_id => tugboat_data['defaults']['region'].to_i,
|
650
|
+
:private_networking => tugboat_data['defaults']['private_networking'] == 'true',
|
651
|
+
:backups_enabled => tugboat_data['defaults']['backups_enabled'] == 'true',
|
652
|
+
)
|
653
|
+
ssh_key = tugboat_data['defaults']['ssh_key']
|
654
|
+
if ssh_key && ssh_key.size > 0
|
655
|
+
new_defaults[:machine_options][:bootstrap_options][:key_name] = ssh_key
|
656
|
+
end
|
657
|
+
end
|
617
658
|
end
|
618
659
|
|
619
660
|
id = case provider
|
@@ -622,11 +663,11 @@ module ChefMetalFog
|
|
622
663
|
new_config[:driver_options][:aws_account_info] = account_info
|
623
664
|
"#{account_info[:aws_account_id]}:#{result[:driver_options][:compute_options][:region]}"
|
624
665
|
when 'DigitalOcean'
|
625
|
-
|
666
|
+
result[:driver_options][:compute_options][:digitalocean_client_id]
|
626
667
|
when 'OpenStack'
|
627
|
-
|
668
|
+
result[:driver_options][:compute_options][:openstack_auth_url]
|
628
669
|
when 'Rackspace'
|
629
|
-
|
670
|
+
result[:driver_options][:compute_options][:rackspace_auth_url]
|
630
671
|
when 'CloudStack'
|
631
672
|
host = result[:driver_options][:compute_options][:cloudstack_host]
|
632
673
|
path = result[:driver_options][:compute_options][:cloudstack_path] || '/client/api'
|