chef-provisioning-fog 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +201 -201
  3. data/README.md +3 -3
  4. data/Rakefile +6 -6
  5. data/lib/chef/provider/fog_key_pair.rb +266 -266
  6. data/lib/chef/provisioning/driver_init/fog.rb +3 -3
  7. data/lib/chef/provisioning/fog_driver/driver.rb +736 -709
  8. data/lib/chef/provisioning/fog_driver/providers/aws.rb +492 -492
  9. data/lib/chef/provisioning/fog_driver/providers/aws/credentials.rb +115 -115
  10. data/lib/chef/provisioning/fog_driver/providers/cloudstack.rb +44 -44
  11. data/lib/chef/provisioning/fog_driver/providers/digitalocean.rb +136 -136
  12. data/lib/chef/provisioning/fog_driver/providers/google.rb +85 -84
  13. data/lib/chef/provisioning/fog_driver/providers/joyent.rb +63 -59
  14. data/lib/chef/provisioning/fog_driver/providers/openstack.rb +117 -41
  15. data/lib/chef/provisioning/fog_driver/providers/rackspace.rb +42 -42
  16. data/lib/chef/provisioning/fog_driver/providers/softlayer.rb +36 -36
  17. data/lib/chef/provisioning/fog_driver/providers/vcair.rb +409 -376
  18. data/lib/chef/provisioning/fog_driver/providers/xenserver.rb +210 -0
  19. data/lib/chef/provisioning/fog_driver/recipe_dsl.rb +32 -32
  20. data/lib/chef/provisioning/fog_driver/version.rb +7 -7
  21. data/lib/chef/resource/fog_key_pair.rb +34 -34
  22. data/spec/spec_helper.rb +18 -18
  23. data/spec/support/aws/config-file.csv +2 -2
  24. data/spec/support/aws/ini-file.ini +10 -10
  25. data/spec/support/chef_metal_fog/providers/testdriver.rb +16 -16
  26. data/spec/unit/chef/provisioning/fog_driver/driver_spec.rb +71 -0
  27. data/spec/unit/fog_driver_spec.rb +32 -32
  28. data/spec/unit/providers/aws/credentials_spec.rb +45 -45
  29. data/spec/unit/providers/rackspace_spec.rb +16 -16
  30. metadata +5 -3
@@ -1,84 +1,85 @@
1
- class Chef
2
- module Provisioning
3
- module FogDriver
4
- module Providers
5
- class Google < FogDriver::Driver
6
- Driver.register_provider_class('Google', FogDriver::Providers::Google)
7
-
8
- def creator
9
- ''
10
- end
11
-
12
- def converge_floating_ips(action_handler, machine_spec, machine_options, server)
13
- end
14
-
15
- def server_for(machine_spec)
16
- if machine_spec.name
17
- compute.servers.get(machine_spec.name)
18
- else
19
- nil
20
- end
21
- end
22
-
23
- def servers_for(machine_specs)
24
- result = {}
25
- machine_specs.each do |machine_spec|
26
- result[machine_spec] = server_for(machine_spec)
27
- end
28
- result
29
- end
30
-
31
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
32
- bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
33
- bootstrap_options[:image_name] = 'debian-7-wheezy-v20150325'
34
- bootstrap_options[:machine_type] = 'n1-standard-1'
35
- bootstrap_options[:zone_name] = 'europe-west1-b'
36
- bootstrap_options[:name] = machine_spec.name
37
-
38
- if bootstrap_options[:disks].nil?
39
- # create the persistent boot disk
40
- disk_defaults = {
41
- :name => machine_spec.name,
42
- :size_gb => 10,
43
- :zone_name => bootstrap_options[:zone_name],
44
- :source_image => bootstrap_options[:image_name],
45
- }
46
-
47
- disk = compute.disks.create(disk_defaults)
48
- disk.wait_for { disk.ready? }
49
- bootstrap_options[:disks] = [disk]
50
- end
51
-
52
- bootstrap_options
53
- end
54
-
55
- def destroy_machine(action_handler, machine_spec, machine_options)
56
- server = server_for(machine_spec)
57
- if server && server.state != 'archive'
58
- action_handler.perform_action "destroy machine #{machine_spec.name} (#{machine_spec.location['server_id']} at #{driver_url})" do
59
- server.destroy
60
- end
61
- end
62
- machine_spec.location = nil
63
- strategy = convergence_strategy_for(machine_spec, machine_options)
64
- strategy.cleanup_convergence(action_handler, machine_spec)
65
- end
66
-
67
- def self.compute_options_for(provider, id, config)
68
- new_compute_options = {}
69
- new_compute_options[:provider] = provider
70
- new_config = { :driver_options => { :compute_options => new_compute_options }}
71
- new_defaults = {
72
- :driver_options => { :compute_options => {} },
73
- :machine_options => { :bootstrap_options => {}, :ssh_options => {} }
74
- }
75
- result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
76
-
77
- [result, '']
78
- end
79
-
80
- end
81
- end
82
- end
83
- end
84
- end
1
+ class Chef
2
+ module Provisioning
3
+ module FogDriver
4
+ module Providers
5
+ class Google < FogDriver::Driver
6
+ Driver.register_provider_class('Google', FogDriver::Providers::Google)
7
+
8
+ def creator
9
+ ''
10
+ end
11
+
12
+ def converge_floating_ips(action_handler, machine_spec, machine_options, server)
13
+ end
14
+
15
+ def server_for(machine_spec)
16
+ if machine_spec.name
17
+ compute.servers.get(machine_spec.name)
18
+ else
19
+ nil
20
+ end
21
+ end
22
+
23
+ def servers_for(machine_specs)
24
+ result = {}
25
+ machine_specs.each do |machine_spec|
26
+ result[machine_spec] = server_for(machine_spec)
27
+ end
28
+ result
29
+ end
30
+
31
+ def bootstrap_options_for(action_handler, machine_spec, machine_options)
32
+ bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
33
+ bootstrap_options[:image_name] ||= 'debian-7-wheezy-v20150325'
34
+ bootstrap_options[:machine_type] ||= 'n1-standard-1'
35
+ bootstrap_options[:zone_name] ||= 'europe-west1-b'
36
+ bootstrap_options[:name] ||= machine_spec.name
37
+ bootstrap_options[:disk_size] ||= 10
38
+
39
+ if bootstrap_options[:disks].nil?
40
+ # create the persistent boot disk
41
+ disk_defaults = {
42
+ :name => machine_spec.name,
43
+ :size_gb => bootstrap_options[:disk_size],
44
+ :zone_name => bootstrap_options[:zone_name],
45
+ :source_image => bootstrap_options[:image_name],
46
+ }
47
+
48
+ disk = compute.disks.create(disk_defaults)
49
+ disk.wait_for { disk.ready? }
50
+ bootstrap_options[:disks] = [disk]
51
+ end
52
+
53
+ bootstrap_options
54
+ end
55
+
56
+ def destroy_machine(action_handler, machine_spec, machine_options)
57
+ server = server_for(machine_spec)
58
+ if server && server.state != 'archive'
59
+ action_handler.perform_action "destroy machine #{machine_spec.name} (#{machine_spec.location['server_id']} at #{driver_url})" do
60
+ server.destroy
61
+ end
62
+ end
63
+ machine_spec.location = nil
64
+ strategy = convergence_strategy_for(machine_spec, machine_options)
65
+ strategy.cleanup_convergence(action_handler, machine_spec)
66
+ end
67
+
68
+ def self.compute_options_for(provider, id, config)
69
+ new_compute_options = {}
70
+ new_compute_options[:provider] = provider
71
+ new_config = { :driver_options => { :compute_options => new_compute_options }}
72
+ new_defaults = {
73
+ :driver_options => { :compute_options => {} },
74
+ :machine_options => { :bootstrap_options => {}, :ssh_options => {} }
75
+ }
76
+ result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
77
+
78
+ [result, '']
79
+ end
80
+
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,59 +1,63 @@
1
- require 'fog/joyent'
2
-
3
- # fog:Joyent:<joyent_url>
4
- class Chef
5
- module Provisioning
6
- module FogDriver
7
- module Providers
8
- class Joyent < FogDriver::Driver
9
-
10
- Driver.register_provider_class('Joyent', FogDriver::Providers::Joyent)
11
-
12
- def creator
13
- compute_options[:joyent_username]
14
- end
15
-
16
- def bootstrap_options_for(action_handler, machine_spec, machine_options)
17
- bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
18
-
19
- bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
20
-
21
- bootstrap_options[:tags].each do |key, val|
22
- bootstrap_options["tag.#{key}"] = val
23
- end
24
-
25
- bootstrap_options[:name] ||= machine_spec.name
26
-
27
- bootstrap_options
28
- end
29
-
30
- def self.compute_options_for(provider, id, config)
31
- new_compute_options = {}
32
- new_compute_options[:provider] = provider
33
- new_config = { :driver_options => { :compute_options => new_compute_options }}
34
- new_defaults = {
35
- :driver_options => { :compute_options => {} },
36
- :machine_options => { :bootstrap_options => {} }
37
- }
38
- result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
39
-
40
- new_compute_options[:joyent_url] = id if (id && id != '')
41
- credential = Fog.credentials
42
-
43
- new_compute_options[:joyent_username] ||= credential[:joyent_username]
44
- new_compute_options[:joyent_password] ||= credential[:joyent_password]
45
- new_compute_options[:joyent_keyname] ||= credential[:joyent_keyname]
46
- new_compute_options[:joyent_keyfile] ||= credential[:joyent_keyfile]
47
- new_compute_options[:joyent_url] ||= credential[:joyent_url]
48
- new_compute_options[:joyent_version] ||= credential[:joyent_version]
49
-
50
- id = result[:driver_options][:compute_options][:joyent_url]
51
-
52
- [result, id]
53
- end
54
-
55
- end
56
- end
57
- end
58
- end
59
- end
1
+ require 'fog/joyent'
2
+
3
+ # fog:Joyent:<joyent_url>
4
+ class Chef
5
+ module Provisioning
6
+ module FogDriver
7
+ module Providers
8
+ class Joyent < FogDriver::Driver
9
+
10
+ Driver.register_provider_class('Joyent', FogDriver::Providers::Joyent)
11
+
12
+ def creator
13
+ compute_options[:joyent_username]
14
+ end
15
+
16
+ def bootstrap_options_for(action_handler, machine_spec, machine_options)
17
+ bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
18
+
19
+ bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
20
+
21
+ bootstrap_options[:tags].each do |key, val|
22
+ bootstrap_options["tag.#{key}"] = val
23
+ end
24
+
25
+ bootstrap_options[:name] ||= machine_spec.name
26
+
27
+ bootstrap_options
28
+ end
29
+
30
+ def find_floating_ips(server, action_handler)
31
+ []
32
+ end
33
+
34
+ def self.compute_options_for(provider, id, config)
35
+ new_compute_options = {}
36
+ new_compute_options[:provider] = provider
37
+ new_config = { :driver_options => { :compute_options => new_compute_options }}
38
+ new_defaults = {
39
+ :driver_options => { :compute_options => {} },
40
+ :machine_options => { :bootstrap_options => {} }
41
+ }
42
+ result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
43
+
44
+ new_compute_options[:joyent_url] = id if (id && id != '')
45
+ credential = Fog.credentials
46
+
47
+ new_compute_options[:joyent_username] ||= credential[:joyent_username]
48
+ new_compute_options[:joyent_password] ||= credential[:joyent_password]
49
+ new_compute_options[:joyent_keyname] ||= credential[:joyent_keyname]
50
+ new_compute_options[:joyent_keyfile] ||= credential[:joyent_keyfile]
51
+ new_compute_options[:joyent_url] ||= credential[:joyent_url]
52
+ new_compute_options[:joyent_version] ||= credential[:joyent_version]
53
+
54
+ id = result[:driver_options][:compute_options][:joyent_url]
55
+
56
+ [result, id]
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,41 +1,117 @@
1
- # fog:OpenStack:https://identifyhost:portNumber/v2.0
2
- class Chef
3
- module Provisioning
4
- module FogDriver
5
- module Providers
6
- class OpenStack < FogDriver::Driver
7
-
8
- Driver.register_provider_class('OpenStack', FogDriver::Providers::OpenStack)
9
-
10
- def creator
11
- compute_options[:openstack_username]
12
- end
13
-
14
- def self.compute_options_for(provider, id, config)
15
- new_compute_options = {}
16
- new_compute_options[:provider] = provider
17
- new_config = { :driver_options => { :compute_options => new_compute_options }}
18
- new_defaults = {
19
- :driver_options => { :compute_options => {} },
20
- :machine_options => { :bootstrap_options => {} }
21
- }
22
- result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
23
-
24
- new_compute_options[:openstack_auth_url] = id if (id && id != '')
25
- credential = Fog.credentials
26
-
27
- new_compute_options[:openstack_username] ||= credential[:openstack_username]
28
- new_compute_options[:openstack_api_key] ||= credential[:openstack_api_key]
29
- new_compute_options[:openstack_auth_url] ||= credential[:openstack_auth_url]
30
- new_compute_options[:openstack_tenant] ||= credential[:openstack_tenant]
31
-
32
- id = result[:driver_options][:compute_options][:openstack_auth_url]
33
-
34
- [result, id]
35
- end
36
-
37
- end
38
- end
39
- end
40
- end
41
- end
1
+ # fog:OpenStack:https://identifyhost:portNumber/v2.0
2
+ class Chef
3
+ module Provisioning
4
+ module FogDriver
5
+ module Providers
6
+ class OpenStack < FogDriver::Driver
7
+
8
+ Driver.register_provider_class('OpenStack', FogDriver::Providers::OpenStack)
9
+
10
+ def creator
11
+ compute_options[:openstack_username]
12
+ end
13
+
14
+ def self.compute_options_for(provider, id, config)
15
+ new_compute_options = {}
16
+ new_compute_options[:provider] = provider
17
+ new_config = { :driver_options => { :compute_options => new_compute_options }}
18
+ new_defaults = {
19
+ :driver_options => { :compute_options => {} },
20
+ :machine_options => { :bootstrap_options => {} }
21
+ }
22
+ result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
23
+
24
+ new_compute_options[:openstack_auth_url] = id if (id && id != '')
25
+ credential = Fog.credentials
26
+
27
+ new_compute_options[:openstack_username] ||= credential[:openstack_username]
28
+ new_compute_options[:openstack_api_key] ||= credential[:openstack_api_key]
29
+ new_compute_options[:openstack_auth_url] ||= credential[:openstack_auth_url]
30
+ new_compute_options[:openstack_tenant] ||= credential[:openstack_tenant]
31
+
32
+ id = result[:driver_options][:compute_options][:openstack_auth_url]
33
+
34
+ [result, id]
35
+ end
36
+
37
+ # Image methods
38
+ def allocate_image(action_handler, image_spec, image_options, machine_spec, machine_options)
39
+ image = image_for(image_spec)
40
+ if image
41
+ raise "The image already exists, why are you asking me to create it? I can't do that, Dave."
42
+ end
43
+ action_handler.perform_action "Create image #{image_spec.name} from machine #{machine_spec.name} with options #{image_options.inspect}" do
44
+ response = compute.create_image(
45
+ machine_spec.reference['server_id'], image_spec.name,
46
+ {
47
+ description: "The Image named '#{image_spec.name}"
48
+ })
49
+
50
+ image_spec.reference = {
51
+ driver_url: driver_url,
52
+ driver_version: FogDriver::VERSION,
53
+ image_id: response.body['image']['id'],
54
+ creator: creator,
55
+ allocated_it: Time.new.to_i
56
+ }
57
+ end
58
+ end
59
+
60
+ def ready_image(action_handler, image_spec, image_options)
61
+ actual_image = image_for(image_spec)
62
+ if actual_image.nil?
63
+ raise 'Cannot ready an image that does not exist'
64
+ else
65
+ if actual_image.status != 'ACTIVE'
66
+ action_handler.report_progress 'Waiting for image to be active ...'
67
+ wait_until_ready_image(action_handler, image_spec, actual_image)
68
+ else
69
+ action_handler.report_progress "Image #{image_spec.name} is active!"
70
+ end
71
+ end
72
+ end
73
+
74
+ def destroy_image(action_handler, image_spec, image_options)
75
+ image = image_for(image_spec)
76
+ unless image.status == "DELETED"
77
+ image.destroy
78
+ end
79
+ end
80
+
81
+ def wait_until_ready_image(action_handler, image_spec, image=nil)
82
+ wait_until_image(action_handler, image_spec, image) { image.status == 'ACTIVE' }
83
+ end
84
+
85
+ def wait_until_image(action_handler, image_spec, image=nil, &block)
86
+ image ||= image_for(image_spec)
87
+ time_elapsed = 0
88
+ sleep_time = 10
89
+ max_wait_time = 300
90
+ if !yield(image)
91
+ action_handler.report_progress "waiting for image #{image_spec.name} (#{image.id} on #{driver_url}) to be active ..."
92
+ while time_elapsed < max_wait_time && !yield(image)
93
+ action_handler.report_progress "been waiting #{time_elapsed}/#{max_wait_time} -- sleeping #{sleep_time} seconds for image #{image_spec.name} (#{image.id} on #{driver_url}) to be ACTIVE instead of #{image.status}..."
94
+ sleep(sleep_time)
95
+ image.reload
96
+ time_elapsed += sleep_time
97
+ end
98
+ unless yield(image)
99
+ raise "Image #{image.id} did not become ready within #{max_wait_time} seconds"
100
+ end
101
+ action_handler.report_progress "Image #{image_spec.name} is now ready"
102
+ end
103
+ end
104
+
105
+ def image_for(image_spec)
106
+ if image_spec.reference
107
+ compute.images.get(image_spec.reference[:image_id]) || compute.images.get(image_spec.reference['image_id'])
108
+ else
109
+ nil
110
+ end
111
+ end
112
+
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end