chef-metal-fog 0.7.1 → 0.8
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2278f6624a0634e205da58bcc1e966b22eab39cf
|
4
|
+
data.tar.gz: a1f4213a340ec309ef22d4fa141262f367e379d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd9e876567aaf22364a1e12efd5747464ecea0722e9758a5866feb4bb0877d3fd4a9bdc7799aa31b18c67c79c4c5b1fdc517e550812b9ea8fda7315feaaef050
|
7
|
+
data.tar.gz: 9a4b72747673099393f9571bc81492b951c901e6b5773a6cb2d6918fa0dfc17f14b7ca03e078d673660dbc72ea7bec6b3a4f84da0833563f3c3b88640ea70db5
|
@@ -19,6 +19,8 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
19
19
|
case new_driver.compute_options[:provider]
|
20
20
|
when 'DigitalOcean'
|
21
21
|
compute.destroy_key_pair(@current_id)
|
22
|
+
when 'Joyent'
|
23
|
+
compute.delete_key(@current_id)
|
22
24
|
when 'OpenStack', 'Rackspace'
|
23
25
|
compute.key_pairs.destroy(@current_id)
|
24
26
|
else
|
@@ -56,6 +58,8 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
56
58
|
case new_driver.compute_options[:provider]
|
57
59
|
when 'DigitalOcean'
|
58
60
|
new_fingerprints = [Cheffish::KeyFormatter.encode(desired_key, :format => :openssh)]
|
61
|
+
when 'Joyent'
|
62
|
+
new_fingerprints = [Cheffish::KeyFormatter.encode(desired_key, :format => :rfc4716md5fingerprint)]
|
59
63
|
when 'OpenStack', 'Rackspace'
|
60
64
|
new_fingerprints = [Cheffish::KeyFormatter.encode(desired_key, :format => :openssh)]
|
61
65
|
else
|
@@ -94,6 +98,8 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
94
98
|
case new_driver.compute_options[:provider]
|
95
99
|
when 'DigitalOcean'
|
96
100
|
compute.create_ssh_key(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
101
|
+
when 'Joyent'
|
102
|
+
compute.create_key(name: new_resource.name, key: Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
97
103
|
when 'OpenStack'
|
98
104
|
compute.create_key_pair(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
99
105
|
when 'Rackspace'
|
@@ -116,6 +122,8 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
116
122
|
case new_driver.compute_options[:provider]
|
117
123
|
when 'DigitalOcean'
|
118
124
|
compute.create_ssh_key(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
125
|
+
when 'Joyent'
|
126
|
+
compute.create_key(name: new_resource.name, key: Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
119
127
|
when 'OpenStack'
|
120
128
|
compute.create_key_pair(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
121
129
|
when 'Rackspace'
|
@@ -212,6 +220,25 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
212
220
|
else
|
213
221
|
current_resource.action :delete
|
214
222
|
end
|
223
|
+
when 'Joyent'
|
224
|
+
current_key_pair = begin
|
225
|
+
compute.keys.get(new_resource.name)
|
226
|
+
rescue Fog::Compute::Joyent::Errors::NotFound
|
227
|
+
nil
|
228
|
+
end
|
229
|
+
if current_key_pair
|
230
|
+
@current_id = current_key_pair.name
|
231
|
+
@current_fingerprint = if current_key_pair.respond_to?(:fingerprint)
|
232
|
+
current_key_pair.fingerprint
|
233
|
+
elsif current_key_pair.respond_to?(:key)
|
234
|
+
public_key, format = Cheffish::KeyFormatter.decode(current_key_pair.key)
|
235
|
+
public_key.fingerprint
|
236
|
+
else
|
237
|
+
nil
|
238
|
+
end
|
239
|
+
else
|
240
|
+
current_resource.action :delete
|
241
|
+
end
|
215
242
|
when 'OpenStack', 'Rackspace'
|
216
243
|
current_key_pair = compute.key_pairs.get(new_resource.name)
|
217
244
|
if current_key_pair
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'chef/log'
|
2
2
|
require 'fog/aws'
|
3
|
+
require 'uri'
|
3
4
|
|
4
5
|
# fog:AWS:<account_id>:<region>
|
5
6
|
# fog:AWS:<profile_name>
|
@@ -20,6 +21,64 @@ module ChefMetalFog
|
|
20
21
|
'ubuntu'
|
21
22
|
end
|
22
23
|
|
24
|
+
def allocate_image(action_handler, image_spec, image_options, machine_spec)
|
25
|
+
if image_spec.location
|
26
|
+
image = compute.images.get(image_spec.location['image_id'])
|
27
|
+
if image
|
28
|
+
raise "The image already exists, why are you asking me to create it? I can't do that, Dave."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
action_handler.perform_action "Create image #{image_spec.name} from machine #{machine_spec.name} with options #{image_options.inspect}" do
|
32
|
+
opt = image_options.dup
|
33
|
+
response = compute.create_image(machine_spec.location['server_id'],
|
34
|
+
image_spec.name,
|
35
|
+
opt.delete(:description) || "The image formerly and currently named '#{image_spec.name}'",
|
36
|
+
opt.delete(:no_reboot) || false,
|
37
|
+
opt)
|
38
|
+
image_spec.location = {
|
39
|
+
'driver_url' => driver_url,
|
40
|
+
'driver_version' => ChefMetalFog::VERSION,
|
41
|
+
'image_id' => response.body['imageId'],
|
42
|
+
'creator' => creator,
|
43
|
+
'allocated_at' => Time.now.to_i
|
44
|
+
}
|
45
|
+
|
46
|
+
image_spec.machine_options ||= {}
|
47
|
+
image_spec.machine_options.merge!({
|
48
|
+
:bootstrap_options => {
|
49
|
+
:image_id => image_spec.location['image_id']
|
50
|
+
}
|
51
|
+
})
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def ready_image(action_handler, image_spec, image_options)
|
57
|
+
if !image_spec.location
|
58
|
+
raise "Cannot ready an image that does not exist"
|
59
|
+
end
|
60
|
+
image = compute.images.get(image_spec.location['image_id'])
|
61
|
+
if !image.ready?
|
62
|
+
action_handler.report_progress "Waiting for image to be ready ..."
|
63
|
+
# TODO timeout
|
64
|
+
image.wait_for { ready? }
|
65
|
+
action_handler.report_progress "Image is ready!"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def destroy_image(action_handler, image_spec, image_options)
|
70
|
+
if !image_spec.location
|
71
|
+
return
|
72
|
+
end
|
73
|
+
image = compute.images.get(image_spec.location['image_id'])
|
74
|
+
if !image
|
75
|
+
return
|
76
|
+
end
|
77
|
+
delete_snapshots = image_options[:delete_snapshots]
|
78
|
+
delete_snapshots = true if delete_snapshots.nil?
|
79
|
+
image.deregister(delete_snapshots)
|
80
|
+
end
|
81
|
+
|
23
82
|
def bootstrap_options_for(action_handler, machine_spec, machine_options)
|
24
83
|
bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
|
25
84
|
|
@@ -45,7 +104,7 @@ module ChefMetalFog
|
|
45
104
|
if extra_tags.size > 0 || different_tags.size > 0
|
46
105
|
tags_description = [ "Update tags for #{machine_spec.name} on #{driver_url}" ]
|
47
106
|
tags_description += extra_tags.map { |tag| " Add #{tag} = #{tags[tag].inspect}" }
|
48
|
-
tags_description += different_tags.map { |
|
107
|
+
tags_description += different_tags.map { |tag_name, tag_value| " Update #{tag_name} from #{tag_value.inspect} to #{tags[tag_name].inspect}"}
|
49
108
|
action_handler.perform_action tags_description do
|
50
109
|
# TODO should we narrow this down to just extra/different tags or
|
51
110
|
# is it OK to just pass 'em all? Certainly easier to do the
|
@@ -56,6 +115,11 @@ module ChefMetalFog
|
|
56
115
|
end
|
57
116
|
end
|
58
117
|
|
118
|
+
def convergence_strategy_for(machine_spec, machine_options)
|
119
|
+
machine_options[:convergence_options][:ohai_hints] = { 'ec2' => ''}
|
120
|
+
super(machine_spec, machine_options)
|
121
|
+
end
|
122
|
+
|
59
123
|
def self.get_aws_profile(driver_options, aws_account_id)
|
60
124
|
aws_credentials = get_aws_credentials(driver_options)
|
61
125
|
compute_options = driver_options[:compute_options] || {}
|
@@ -78,11 +142,11 @@ module ChefMetalFog
|
|
78
142
|
elsif driver_options[:aws_profile]
|
79
143
|
Chef::Log.debug("Using AWS profile #{driver_options[:aws_profile]}")
|
80
144
|
aws_credentials[driver_options[:aws_profile]]
|
81
|
-
elsif ENV['AWS_ACCESS_KEY_ID']
|
145
|
+
elsif ENV['AWS_ACCESS_KEY_ID'] || ENV['AWS_ACCESS_KEY']
|
82
146
|
Chef::Log.debug("Using AWS environment variable access keys")
|
83
147
|
{
|
84
|
-
:aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'],
|
85
|
-
:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
|
148
|
+
:aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'] || ENV['AWS_ACCESS_KEY'],
|
149
|
+
:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_KEY'],
|
86
150
|
:aws_security_token => ENV['AWS_SECURITY_TOKEN'],
|
87
151
|
:region => ENV['AWS_REGION']
|
88
152
|
}
|
@@ -93,6 +157,19 @@ module ChefMetalFog
|
|
93
157
|
Chef::Log.debug("Using AWS default profile")
|
94
158
|
aws_credentials.default
|
95
159
|
end
|
160
|
+
# Endpoint configuration
|
161
|
+
if compute_options[:ec2_endpoint]
|
162
|
+
aws_profile[:ec2_endpoint] = compute_options[:ec2_endpoint]
|
163
|
+
elsif ENV['EC2_URL']
|
164
|
+
aws_profile[:ec2_endpoint] = ENV['EC2_URL']
|
165
|
+
end
|
166
|
+
if compute_options[:iam_endpoint]
|
167
|
+
aws_profile[:iam_endpoint] = compute_options[:iam_endpoint]
|
168
|
+
elsif ENV['AWS_IAM_URL']
|
169
|
+
aws_profile[:iam_endpoint] = ENV['AWS_IAM_URL']
|
170
|
+
else
|
171
|
+
aws_profile[:iam_endpoint] = "https://iam.amazonaws.com/"
|
172
|
+
end
|
96
173
|
|
97
174
|
# Merge in account info for profile
|
98
175
|
if aws_profile
|
@@ -144,7 +221,11 @@ module ChefMetalFog
|
|
144
221
|
options = {
|
145
222
|
:aws_access_key_id => aws_profile[:aws_access_key_id],
|
146
223
|
:aws_secret_access_key => aws_profile[:aws_secret_access_key],
|
147
|
-
:aws_session_token => aws_profile[:aws_security_token]
|
224
|
+
:aws_session_token => aws_profile[:aws_security_token],
|
225
|
+
:host => URI(aws_profile[:iam_endpoint]).host,
|
226
|
+
:scheme => URI(aws_profile[:iam_endpoint]).scheme,
|
227
|
+
:port => URI(aws_profile[:iam_endpoint]).port,
|
228
|
+
:path => URI(aws_profile[:iam_endpoint]).path
|
148
229
|
}
|
149
230
|
options.delete_if { |key, value| value.nil? }
|
150
231
|
|
@@ -224,6 +305,7 @@ module ChefMetalFog
|
|
224
305
|
new_compute_options[:aws_secret_access_key] = aws_profile[:aws_secret_access_key]
|
225
306
|
new_compute_options[:aws_session_token] = aws_profile[:aws_security_token]
|
226
307
|
new_defaults[:driver_options][:compute_options][:region] = aws_profile[:region]
|
308
|
+
new_defaults[:driver_options][:compute_options][:endpoint] = aws_profile[:ec2_endpoint]
|
227
309
|
|
228
310
|
account_info = aws_account_info_for(result[:driver_options][:compute_options])
|
229
311
|
new_config[:driver_options][:aws_account_info] = account_info
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'fog/joyent'
|
2
|
+
|
3
|
+
# fog:Joyent:<joyent_url>
|
4
|
+
module ChefMetalFog
|
5
|
+
module Providers
|
6
|
+
class Joyent < ChefMetalFog::FogDriver
|
7
|
+
|
8
|
+
ChefMetalFog::FogDriver.register_provider_class('Joyent', ChefMetalFog::Providers::Joyent)
|
9
|
+
|
10
|
+
def creator
|
11
|
+
compute_options[:joyent_username]
|
12
|
+
end
|
13
|
+
|
14
|
+
def bootstrap_options_for(action_handler, machine_spec, machine_options)
|
15
|
+
bootstrap_options = symbolize_keys(machine_options[:bootstrap_options] || {})
|
16
|
+
|
17
|
+
bootstrap_options[:tags] = default_tags(machine_spec, bootstrap_options[:tags] || {})
|
18
|
+
|
19
|
+
bootstrap_options[:tags].each do |key, val|
|
20
|
+
bootstrap_options["tag.#{key}"] = val
|
21
|
+
end
|
22
|
+
|
23
|
+
bootstrap_options[:name] ||= machine_spec.name
|
24
|
+
|
25
|
+
bootstrap_options
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.compute_options_for(provider, id, config)
|
29
|
+
new_compute_options = {}
|
30
|
+
new_compute_options[:provider] = provider
|
31
|
+
new_config = { :driver_options => { :compute_options => new_compute_options }}
|
32
|
+
new_defaults = {
|
33
|
+
:driver_options => { :compute_options => {} },
|
34
|
+
:machine_options => { :bootstrap_options => {} }
|
35
|
+
}
|
36
|
+
result = Cheffish::MergedConfig.new(new_config, config, new_defaults)
|
37
|
+
|
38
|
+
new_compute_options[:joyent_url] = id if (id && id != '')
|
39
|
+
credential = Fog.credentials
|
40
|
+
|
41
|
+
new_compute_options[:joyent_username] ||= credential[:joyent_username]
|
42
|
+
new_compute_options[:joyent_password] ||= credential[:joyent_password]
|
43
|
+
new_compute_options[:joyent_keyname] ||= credential[:joyent_keyname]
|
44
|
+
new_compute_options[:joyent_keyfile] ||= credential[:joyent_keyfile]
|
45
|
+
new_compute_options[:joyent_url] ||= credential[:joyent_url]
|
46
|
+
new_compute_options[:joyent_version] ||= credential[:joyent_version]
|
47
|
+
|
48
|
+
id = result[:driver_options][:compute_options][:joyent_url]
|
49
|
+
|
50
|
+
[result, id]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-metal-fog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Keiser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- lib/chef_metal_fog/providers/aws/credentials.rb
|
115
115
|
- lib/chef_metal_fog/providers/cloudstack.rb
|
116
116
|
- lib/chef_metal_fog/providers/digitalocean.rb
|
117
|
+
- lib/chef_metal_fog/providers/joyent.rb
|
117
118
|
- lib/chef_metal_fog/providers/openstack.rb
|
118
119
|
- lib/chef_metal_fog/providers/rackspace.rb
|
119
120
|
- lib/chef_metal_fog/recipe_dsl.rb
|