Skip to content

Commit

Permalink
Merge pull request #305 from pallan/aws-creds
Browse files Browse the repository at this point in the history
Updates to support standard .aws/credentials file
  • Loading branch information
juliandunn committed Aug 25, 2015
2 parents 96aaed9 + 63b56ef commit 5f7e5b3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 8 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ this file in your <tt>knife.rb</tt> file, like so:
knife[:aws_credential_file] = "/path/to/credentials/file/in/above/format"
```

If you have multiple profiles in your credentials file you can define which
profile to use. The `default` profile will be used if not supplied,

```ruby
knife[:aws_profile] = "personal"
```

Additionally the following options may be set in your `knife.rb`:

- flavor
Expand Down
35 changes: 30 additions & 5 deletions lib/chef/knife/ec2_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ def self.included(includer)
:description => "File containing AWS credentials as used by aws cmdline tools",
:proc => Proc.new { |key| Chef::Config[:knife][:aws_credential_file] = key }

option :aws_profile,
:long => "--aws-profile PROFILE",
:description => "AWS profile, from credential file, to use",
:default => 'default',
:proc => Proc.new { |key| Chef::Config[:knife][:aws_profile] = key }

option :aws_access_key_id,
:short => "-A ID",
:long => "--aws-access-key-id KEY",
Expand Down Expand Up @@ -115,14 +121,14 @@ def validate!(keys=[:aws_access_key_id, :aws_secret_access_key])
# AWSAccessKeyId=somethingsomethingdarkside
# AWSSecretKey=somethingsomethingcomplete
# OR
# [default]
# aws_access_key_id = somethingsomethingdarkside
# aws_secret_access_key = somethingsomethingdarkside

aws_creds = []
File.read(Chef::Config[:knife][:aws_credential_file]).each_line do | line |
aws_creds << line.split("=").map(&:strip) if line.include?("=")
end
entries = Hash[*aws_creds.flatten]
aws_creds = ini_parse(File.read(Chef::Config[:knife][:aws_credential_file]))
profile = Chef::Config[:knife][:aws_profile] || 'default'
entries = aws_creds.values.first.has_key?("AWSAccessKeyId") ? aws_creds.values.first : aws_creds[profile]

Chef::Config[:knife][:aws_access_key_id] = entries['AWSAccessKeyId'] || entries['aws_access_key_id']
Chef::Config[:knife][:aws_secret_access_key] = entries['AWSSecretKey'] || entries['aws_secret_access_key']
end
Expand All @@ -149,5 +155,24 @@ def iam_name_from_profile(profile)
end
name ||= ''
end

def ini_parse(file)
current_section = {}
map = {}
file.each_line do |line|
line = line.split(/^|\s;/).first # remove comments
section = line.match(/^\s*\[([^\[\]]+)\]\s*$/) unless line.nil?
if section
current_section = section[1]
elsif current_section
item = line.match(/^\s*(.+?)\s*=\s*(.+?)\s*$/) unless line.nil?
if item
map[current_section] ||= {}
map[current_section][item[1]] = item[2]
end
end
end
map
end
end
end
15 changes: 12 additions & 3 deletions spec/unit/ec2_server_create_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -704,19 +704,28 @@
end
it "reads UNIX Line endings for new format" do
allow(File).to receive(:read).
and_return("aws_access_key_id=#{@access_key_id}\naws_secret_access_key=#{@secret_key}")
and_return("[default]\naws_access_key_id=#{@access_key_id}\naws_secret_access_key=#{@secret_key}")
@knife_ec2_create.validate!
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
end

it "reads DOS Line endings for new format" do
allow(File).to receive(:read).
and_return("aws_access_key_id=#{@access_key_id}\r\naws_secret_access_key=#{@secret_key}")
and_return("[default]\naws_access_key_id=#{@access_key_id}\r\naws_secret_access_key=#{@secret_key}")
@knife_ec2_create.validate!
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
end
end

it "loads the correct profile" do
Chef::Config[:knife][:aws_profile] = 'other'
allow(File).to receive(:read).
and_return("[default]\naws_access_key_id=TESTKEY\r\naws_secret_access_key=TESTSECRET\n\n[other]\naws_access_key_id=#{@access_key_id}\r\naws_secret_access_key=#{@secret_key}")
@knife_ec2_create.validate!
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
end
end

it 'understands that file:// validation key URIs are just paths' do
Expand Down

0 comments on commit 5f7e5b3

Please sign in to comment.