Skip to content

Commit

Permalink
Merge pull request #430 from MsysTechnologiesllc/nim/aws-config-file-…
Browse files Browse the repository at this point in the history
…fixes

Fixing --aws-config-file issues
  • Loading branch information
Nimisha Sharad authored Jul 27, 2016
2 parents 6114101 + f9c1c37 commit 4747159
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 13 deletions.
33 changes: 20 additions & 13 deletions lib/chef/knife/ec2_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def self.included(includer)
option :aws_config_file,
:long => "--aws-config-ile FILE",
:description => "File containing AWS configurations as used by aws cmdline tools",
:proc => Proc.new {|key| Chef::Config[:knife][:aws_config_file] = key}
:proc => Proc.new {|key| Chef::Config[:knife][:aws_config_file] = key}

option :aws_profile,
:long => "--aws-profile PROFILE",
Expand Down Expand Up @@ -86,7 +86,7 @@ def connection
:provider => 'AWS',
:region => locate_config_value(:region)
}

if locate_config_value(:use_iam_profile)
connection_settings[:use_iam_profile] = true
else
Expand Down Expand Up @@ -118,18 +118,25 @@ def is_image_windows?
def validate!(keys=[:aws_access_key_id, :aws_secret_access_key])
errors = []

unless Chef::Config[:knife][:aws_config_file].nil?
aws_config = ini_parse(File.read(Chef::Config[:knife][:aws_config_file]))
profile = if !Chef::Config[:knife][:aws_profile].nil? then 'profile '+Chef::Config[:knife][:aws_profile] else 'default' end

unless aws_config.values.empty?
entries = aws_config[profile]
Chef::Config[:knife][:region] = entries['region']
if locate_config_value(:aws_config_file)
aws_config = ini_parse(File.read(locate_config_value(:aws_config_file)))
profile = if locate_config_value(:aws_profile) == 'default'
'default'
else
"profile #{locate_config_value(:aws_profile)}"
end

unless aws_config.values.empty?
if aws_config[profile]
Chef::Config[:knife][:region] = aws_config[profile]['region']
else
raise "The provided --aws-profile '#{profile}' is invalid."
end
end
end

unless locate_config_value(:use_iam_profile)
unless Chef::Config[:knife][:aws_credential_file].nil?
if locate_config_value(:aws_credential_file)
unless (Chef::Config[:knife].keys & [:aws_access_key_id, :aws_secret_access_key]).empty?
errors << "Either provide a credentials file or the access key and secret keys but not both."
end
Expand All @@ -141,11 +148,11 @@ def validate!(keys=[:aws_access_key_id, :aws_secret_access_key])
# aws_access_key_id = somethingsomethingdarkside
# aws_secret_access_key = somethingsomethingdarkside

aws_creds = ini_parse(File.read(Chef::Config[:knife][:aws_credential_file]))
profile = Chef::Config[:knife][:aws_profile] || 'default'
aws_creds = ini_parse(File.read(locate_config_value(:aws_credential_file)))
profile = locate_config_value(: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']
Chef::Config[:knife][:aws_session_token] = entries['AWSSessionToken'] || entries['aws_session_token']
Expand Down
16 changes: 16 additions & 0 deletions spec/unit/ec2_server_create_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,22 @@
expect(Chef::Config[:knife][:region]).to eq(@region)
end

context "when invalid --aws-profile is given" do
it "raises exception" do
Chef::Config[:knife][:aws_profile] = 'xyz'
allow(File).to receive(:read).and_return("[default]\nregion=TESTREGION")
expect{ @knife_ec2_create.validate! }.to raise_error("The provided --aws-profile 'profile xyz' is invalid.")
end
end

context "when aws_profile is passed a 'default' from CLI or knife.rb file" do
it 'loads the default profile successfully' do
Chef::Config[:knife][:aws_profile] = 'default'
allow(File).to receive(:read).and_return("[default]\nregion=#{@region}\n\n[profile other]\nregion=TESTREGION")
@knife_ec2_create.validate!
expect(Chef::Config[:knife][:region]).to eq(@region)
end
end
end

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

0 comments on commit 4747159

Please sign in to comment.