chef-metal-fog 0.4 → 0.5.beta
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/README.md +1 -1
- data/lib/chef/provider/fog_key_pair.rb +45 -21
- data/lib/chef/resource/fog_key_pair.rb +2 -7
- data/lib/chef_metal/driver_init/fog.rb +3 -0
- data/lib/chef_metal_fog/aws_credentials.rb +65 -0
- data/lib/chef_metal_fog/fog_driver.rb +622 -0
- data/lib/chef_metal_fog/fog_driver_aws.rb +133 -0
- data/lib/chef_metal_fog/recipe_dsl.rb +23 -0
- data/lib/chef_metal_fog/version.rb +1 -1
- data/lib/chef_metal_fog.rb +2 -19
- metadata +11 -8
- data/lib/chef_metal/provisioner_init/fog_init.rb +0 -4
- data/lib/chef_metal_fog/fog_provisioner.rb +0 -558
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dd0fd9efc928a98ed0742916d1bbbed1a2c13b3
|
4
|
+
data.tar.gz: a4cb6fb64e7848db44f96ef6e4385bcd1fe1247d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 872bbb650218e9374713b63575849a25eb5dc296b0633ace402c5c19b791a5e8f68115df0546eb5297e87d586f5d3f24c22fc1c1b592784a95221358a70bf100
|
7
|
+
data.tar.gz: 9455469c78c3d131ef9562cea69bb6a529dafa4f98f2f3bd8541012b66bddc2db08cbbbcf83a5266f1e72925c10ddaafde8f43f3a0dab5ada29c39301fb43ee6
|
data/README.md
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
require 'chef/provider/lwrp_base'
|
2
|
-
require '
|
3
|
-
require 'chef_metal_fog/fog_provisioner'
|
2
|
+
require 'chef_metal_fog/fog_driver'
|
4
3
|
|
5
4
|
class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
6
5
|
|
7
|
-
include ChefMetal::ProviderActionHandler
|
8
|
-
|
9
6
|
use_inline_resources
|
10
7
|
|
11
8
|
def whyrun_supported?
|
@@ -19,7 +16,7 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
19
16
|
action :delete do
|
20
17
|
if current_resource_exists?
|
21
18
|
converge_by "delete #{key_description}" do
|
22
|
-
case
|
19
|
+
case new_driver.compute_options[:provider]
|
23
20
|
when 'DigitalOcean'
|
24
21
|
compute.destroy_key_pair(@current_id)
|
25
22
|
when 'OpenStack'
|
@@ -32,23 +29,29 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
32
29
|
end
|
33
30
|
|
34
31
|
def key_description
|
35
|
-
"#{new_resource.name} on #{
|
32
|
+
"#{new_resource.name} on #{new_driver.driver_url}"
|
36
33
|
end
|
37
34
|
|
38
35
|
def create_key(action)
|
36
|
+
if @should_create_directory
|
37
|
+
Cheffish.inline_resource(self, action) do
|
38
|
+
directory run_context.config[:private_key_write_path]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
39
42
|
if current_resource_exists?
|
40
43
|
# If the public keys are different, update the server public key
|
41
44
|
if !current_resource.private_key_path
|
42
45
|
if new_resource.allow_overwrite
|
43
46
|
ensure_keys(action)
|
44
47
|
else
|
45
|
-
raise "#{key_description} already exists on the server, but the private key #{
|
48
|
+
raise "#{key_description} already exists on the server, but the private key #{new_private_key_path} does not exist!"
|
46
49
|
end
|
47
50
|
else
|
48
51
|
ensure_keys(action)
|
49
52
|
end
|
50
53
|
|
51
|
-
new_fingerprints = case
|
54
|
+
new_fingerprints = case new_driver.compute_options[:provider]
|
52
55
|
when 'DigitalOcean'
|
53
56
|
[Cheffish::KeyFormatter.encode(desired_key, :format => :openssh)]
|
54
57
|
when 'OpenStack'
|
@@ -73,7 +76,7 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
73
76
|
if !new_fingerprints.any? { |f| (f.is_a?(Proc) ? f.call : f) == @current_fingerprint }
|
74
77
|
if new_resource.allow_overwrite
|
75
78
|
converge_by "update #{key_description} to match local key at #{new_resource.private_key_path}" do
|
76
|
-
case
|
79
|
+
case new_driver.compute_options[:provider]
|
77
80
|
when 'DigitalOcean'
|
78
81
|
compute.create_ssh_key(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
79
82
|
when 'OpenStack'
|
@@ -92,7 +95,7 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
92
95
|
|
93
96
|
# Create key
|
94
97
|
converge_by "create #{key_description} from local key at #{new_resource.private_key_path}" do
|
95
|
-
case
|
98
|
+
case new_driver.compute_options[:provider]
|
96
99
|
when 'DigitalOcean'
|
97
100
|
compute.create_ssh_key(new_resource.name, Cheffish::KeyFormatter.encode(desired_key, :format => :openssh))
|
98
101
|
when 'OpenStack'
|
@@ -104,10 +107,15 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
110
|
+
def new_driver
|
111
|
+
run_context.chef_metal.driver_for(new_resource.driver)
|
112
|
+
end
|
113
|
+
|
107
114
|
def ensure_keys(action)
|
108
115
|
resource = new_resource
|
116
|
+
private_key_path = new_private_key_path
|
109
117
|
Cheffish.inline_resource(self, action) do
|
110
|
-
private_key
|
118
|
+
private_key private_key_path do
|
111
119
|
public_key_path resource.public_key_path
|
112
120
|
if resource.private_key_options
|
113
121
|
resource.private_key_options.each_pair do |key,value|
|
@@ -131,8 +139,8 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
131
139
|
|
132
140
|
def desired_private_key
|
133
141
|
@desired_private_key ||= begin
|
134
|
-
|
135
|
-
|
142
|
+
private_key, format = Cheffish::KeyFormatter.decode(IO.read(new_private_key_path))
|
143
|
+
private_key
|
136
144
|
end
|
137
145
|
end
|
138
146
|
|
@@ -141,19 +149,35 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
141
149
|
end
|
142
150
|
|
143
151
|
def compute
|
144
|
-
|
152
|
+
new_driver.compute
|
145
153
|
end
|
146
154
|
|
147
155
|
def current_public_key
|
148
156
|
current_resource.source_key
|
149
157
|
end
|
150
158
|
|
159
|
+
def new_private_key_path
|
160
|
+
private_key_path = new_resource.private_key_path || new_resource.name
|
161
|
+
if private_key_path.is_a?(Symbol)
|
162
|
+
private_key_path
|
163
|
+
elsif Pathname.new(private_key_path).relative? && new_driver.config[:private_key_write_path]
|
164
|
+
@should_create_directory = true
|
165
|
+
::File.join(new_driver.config[:private_key_write_path], private_key_path)
|
166
|
+
else
|
167
|
+
private_key_path
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def new_public_key_path
|
172
|
+
new_resource.public_key_path
|
173
|
+
end
|
174
|
+
|
151
175
|
def load_current_resource
|
152
|
-
if !
|
153
|
-
raise '
|
176
|
+
if !new_driver.kind_of?(ChefMetalFog::FogDriver)
|
177
|
+
raise 'fog_key_pair only works with fog_driver'
|
154
178
|
end
|
155
179
|
@current_resource = Chef::Resource::FogKeyPair.new(new_resource.name, run_context)
|
156
|
-
case
|
180
|
+
case new_driver.provider
|
157
181
|
when 'DigitalOcean'
|
158
182
|
current_key_pair = compute.ssh_keys.select { |key| key.name == new_resource.name }.first
|
159
183
|
if current_key_pair
|
@@ -179,11 +203,11 @@ class Chef::Provider::FogKeyPair < Chef::Provider::LWRPBase
|
|
179
203
|
end
|
180
204
|
end
|
181
205
|
|
182
|
-
if
|
183
|
-
current_resource.private_key_path
|
206
|
+
if new_private_key_path && ::File.exist?(new_private_key_path)
|
207
|
+
current_resource.private_key_path new_private_key_path
|
184
208
|
end
|
185
|
-
if
|
186
|
-
current_resource.public_key_path
|
209
|
+
if new_public_key_path && ::File.exist?(new_public_key_path)
|
210
|
+
current_resource.public_key_path new_public_key_path
|
187
211
|
end
|
188
212
|
end
|
189
213
|
end
|
@@ -5,18 +5,13 @@ class Chef::Resource::FogKeyPair < Chef::Resource::LWRPBase
|
|
5
5
|
|
6
6
|
def initialize(*args)
|
7
7
|
super
|
8
|
-
@
|
9
|
-
end
|
10
|
-
|
11
|
-
def after_created
|
12
|
-
# Make the credentials usable
|
13
|
-
provisioner.key_pairs[name] = self
|
8
|
+
@driver = run_context.chef_metal.current_driver
|
14
9
|
end
|
15
10
|
|
16
11
|
actions :create, :delete, :nothing
|
17
12
|
default_action :create
|
18
13
|
|
19
|
-
attribute :
|
14
|
+
attribute :driver
|
20
15
|
# Private key to use as input (will be generated if it does not exist)
|
21
16
|
attribute :private_key_path, :kind_of => String
|
22
17
|
# Public key to use as input (will be generated if it does not exist)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'inifile'
|
2
|
+
require 'csv'
|
3
|
+
|
4
|
+
module ChefMetalFog
|
5
|
+
# Reads in a credentials file in Amazon's download format and presents the credentials to you
|
6
|
+
class AWSCredentials
|
7
|
+
def initialize
|
8
|
+
@credentials = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def default
|
12
|
+
@credentials[ENV['AWS_DEFAULT_PROFILE'] || 'default'] || @credentials.first[1]
|
13
|
+
end
|
14
|
+
|
15
|
+
def keys
|
16
|
+
@credentials.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](name)
|
20
|
+
@credentials[name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def each(&block)
|
24
|
+
@credentials.each(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_ini(credentials_ini_file)
|
28
|
+
inifile = IniFile.load(File.expand_path(credentials_ini_file))
|
29
|
+
inifile.each_section do |section|
|
30
|
+
if section =~ /^\s*profile\s+(.+)$/ || section =~ /^\s*(default)\s*/
|
31
|
+
profile_name = $1.strip
|
32
|
+
profile = inifile[section].inject({}) do |result, pair|
|
33
|
+
result[pair[0].to_sym] = pair[1]
|
34
|
+
result
|
35
|
+
end
|
36
|
+
profile[:name] = profile_name
|
37
|
+
@credentials[profile_name] = profile
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def load_csv(credentials_csv_file)
|
43
|
+
CSV.new(File.open(credentials_csv_file), :headers => :first_row).each do |row|
|
44
|
+
@credentials[row['User Name']] = {
|
45
|
+
:name => row['User Name'],
|
46
|
+
:user_name => row['User Name'],
|
47
|
+
:aws_access_key_id => row['Access Key Id'],
|
48
|
+
:aws_secret_access_key => row['Secret Access Key']
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_default
|
54
|
+
load_ini('~/.aws/config')
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.method_missing(name, *args, &block)
|
58
|
+
singleton.send(name, *args, &block)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.singleton
|
62
|
+
@aws_credentials ||= AWSCredentials.new
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|