Skip to content

Commit 69d4f41

Browse files
author
James Awesome
committed
Add explicit option for using iam profile for authentication
* Add 'use_iam_profile' config option, default to false * Have #iam_creds return an empty hash unless use_iam_profile is true * Call iam_creds as driver.iam_creds in `default_config` blocks * Rescue fron NoMethodError in iam_creds `Fog::AWS::CredentialFetcher::ServiceMethods::fetch_credentials` will call super when it fails. Because there is no superclass method this will throw a NoMethodError * Write unit tests for #iam_creds
1 parent 8325c9d commit 69d4f41

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

lib/kitchen/driver/ec2.rb

+8-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ module Driver
2929
#
3030
# @author Fletcher Nichol <[email protected]>
3131
class Ec2 < Kitchen::Driver::SSHBase
32-
3332
extend Fog::AWS::CredentialFetcher::ServiceMethods
3433
default_config :region, 'us-east-1'
3534
default_config :availability_zone, 'us-east-1b'
@@ -41,14 +40,16 @@ class Ec2 < Kitchen::Driver::SSHBase
4140
default_config :private_ip_address, nil
4241
default_config :iam_profile_name, nil
4342
default_config :price, nil
43+
default_config :use_iam_profile, false
4444
default_config :aws_access_key_id do |driver|
45-
ENV['AWS_ACCESS_KEY'] || ENV['AWS_ACCESS_KEY_ID'] || iam_creds[:aws_access_key_id]
45+
ENV['AWS_ACCESS_KEY'] || ENV['AWS_ACCESS_KEY_ID'] || driver.iam_creds[:aws_access_key_id]
4646
end
4747
default_config :aws_secret_access_key do |driver|
48-
ENV['AWS_SECRET_KEY'] || ENV['AWS_SECRET_ACCESS_KEY'] || iam_creds[:aws_secret_access_key]
48+
ENV['AWS_SECRET_KEY'] || ENV['AWS_SECRET_ACCESS_KEY'] \
49+
|| driver.iam_creds[:aws_secret_access_key]
4950
end
5051
default_config :aws_session_token do |driver|
51-
ENV['AWS_SESSION_TOKEN'] || ENV['AWS_TOKEN'] || iam_creds[:aws_session_token]
52+
ENV['AWS_SESSION_TOKEN'] || ENV['AWS_TOKEN'] || driver.iam_creds[:aws_session_token]
5253
end
5354
default_config :aws_ssh_key_id do |driver|
5455
ENV['AWS_SSH_KEY_ID']
@@ -98,10 +99,10 @@ class Ec2 < Kitchen::Driver::SSHBase
9899
end
99100
end
100101

101-
def self.iam_creds
102+
def iam_creds
102103
@iam_creds ||= begin
103-
fetch_credentials(use_iam_profile:true)
104-
rescue RuntimeError => e
104+
config[:use_iam_profile] ? fetch_credentials(use_iam_profile: true) : {}
105+
rescue RuntimeError, NoMethodError => e
105106
debug("fetch_credentials failed with exception #{e.message}:#{e.backtrace.join("\n")}")
106107
{}
107108
end

spec/create_spec.rb

+31
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,37 @@
128128

129129
end
130130

131+
describe '#iam_creds' do
132+
context 'when use_iam_profile is not set' do
133+
it 'returns an empty hash' do
134+
expect(driver.iam_creds).to eq({})
135+
end
136+
end
137+
138+
context 'when use_iam_profile is set to true' do
139+
let(:credentials) do
140+
{
141+
aws_access_key_id: 'secret',
142+
aws_secret_access_key: 'moarsecret',
143+
aws_session_token: 'randomsecret'
144+
}
145+
end
146+
147+
it 'calls fetch_credentials' do
148+
config[:use_iam_profile] = true
149+
150+
allow(driver)
151+
.to receive(:fetch_credentials).and_return(credentials)
152+
153+
expect(driver)
154+
.to receive(:fetch_credentials)
155+
.with(use_iam_profile: true)
156+
157+
expect(driver.iam_creds).to eq(credentials)
158+
end
159+
end
160+
end
161+
131162
describe '#block_device_mappings' do
132163
let(:connection) { double(Fog::Compute) }
133164
let(:image) { double('Image', :root_device_name => 'name') }

0 commit comments

Comments
 (0)