Skip to content

Commit

Permalink
Updated --security-group-ids option to accept multiple values and add…
Browse files Browse the repository at this point in the history
…ed validation to accept array from knife.rb
  • Loading branch information
Vasu1105 committed Aug 12, 2016
1 parent 604b0fb commit 31b1bcf
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 30 deletions.
30 changes: 17 additions & 13 deletions lib/chef/knife/ec2_server_create.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,20 @@ class Ec2ServerCreate < Knife
:proc => Proc.new { |groups| groups.split(',') }

option :security_group_ids,
:short => "-g 'X,Y,Z'",
:long => "--security-group-ids 'X,Y,Z'",
:description => "The security group ids for this server; required when using VPC,Please provide values in format --security-group-ids 'X,Y,Z'"
:short => "-g SECURITY_GROUP_IDS",
:long => "--security-group-ids",
:description => "The security group ids for this server; required when using VPC. Mulitple values can be provide as -g sg-e985168d -g sg-e858768d",
:proc => Proc.new { |security_group_ids|
require 'pry'
binding.pry
if security_group_ids.split(',').size > 1
Chef::Log.error("[DEPRECATED] Comma separated values for --security-group-ids is deprecated. Provide --security-group-ids option multiple times if mulitple values has to be provided. for e.g. --security-group-ids sg-e985168d --security-group-ids sg-e7f06383 --security-group-ids sg-ec1b7e88 .")
exit 1
end
Chef::Config[:knife][:security_group_ids] ||= []
Chef::Config[:knife][:security_group_ids].push(security_group_ids)
Chef::Config[:knife][:security_group_ids]
}

option :associate_eip,
:long => "--associate-eip IP_ADDRESS",
Expand Down Expand Up @@ -857,16 +868,9 @@ def validate!
exit 1
end

# Validation for security_group_ids. It will raise error if security_group_ids provided by user are not
# comma seprated values, if it includes any special character other than '-', and if the values are provided
# in other than string format.
# Validation for security_group_ids passed through knife.rb. It will raise error if values are not provided in Array.
if locate_config_value(:security_group_ids) && locate_config_value(:security_group_ids).class == String
if !locate_config_value(:security_group_ids).index(/[~$;@#'*&!.=^%\[\]\{\}\(\)\|\/\\]/).nil?
ui.error("Invalid input for --security-group-ids. --security-group-ids must be comma separated values. e.g 'x,y,z'")
exit 1
end
elsif locate_config_value(:security_group_ids) && locate_config_value(:security_group_ids).class != String
ui.error("Invalid input for --security-group-ids. --security-group-ids must be comma separated values. e.g 'x,y,z'")
ui.error("Invalid value type for knife[:security_group_ids] in knife configuration file (i.e knife.rb). Type should be array. e.g - knife[:security_group_ids] = ['sgroup1']")
exit 1
end

Expand Down Expand Up @@ -1005,7 +1009,7 @@ def create_server_def
:request_type => locate_config_value(:spot_request_type)
}

server_def[:security_group_ids] = locate_config_value(:security_group_ids).gsub(' ', '').split(',') unless locate_config_value(:security_group_ids).nil?
server_def[:security_group_ids] = locate_config_value(:security_group_ids)
server_def[:subnet_id] = locate_config_value(:subnet_id) if vpc_mode?
server_def[:private_ip_address] = locate_config_value(:private_ip_address) if vpc_mode?
server_def[:placement_group] = locate_config_value(:placement_group)
Expand Down
36 changes: 19 additions & 17 deletions spec/unit/ec2_server_create_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
:flavor_id => nil,
:key_name => "ssh_key_name",
:availability_zone => nil,
:security_group_ids => nil,
:price => 0.001,
:request_type => 'persistent',
:placement_group => nil,
Expand Down Expand Up @@ -1159,7 +1160,7 @@
end

it "sets the specified security group ids" do
@knife_ec2_create.config[:security_group_ids] = 'sg-aabbccdd, sg-3764sdss, sg-aab343ytre'
@knife_ec2_create.config[:security_group_ids] = ['sg-aabbccdd', 'sg-3764sdss', 'sg-aab343ytre']
server_def = @knife_ec2_create.create_server_def

expect(server_def[:security_group_ids]).to eq(['sg-aabbccdd', 'sg-3764sdss', 'sg-aab343ytre'])
Expand Down Expand Up @@ -2191,35 +2192,36 @@
describe "--security-group-ids option" do
before do
allow(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
Chef::Config.reset
end

context "when invalid input is given for --security-group-ids from cli" do
let(:ec2_server_create) { Chef::Knife::Ec2ServerCreate.new(['-g', 'sg-aabbccdd,sg-3764sdss,sg-00aa11bb'])}
it "raises error" do
@knife_ec2_create.config[:security_group_ids] = 'sg-aabbccdd; sg-3764sdss ; sg-00aa11bb'
expect { @knife_ec2_create.validate! }.to raise_error(SystemExit)
expect { ec2_server_create }.to raise_error(SystemExit)
end
end

context "when valid input is given --security-group-ids from cli" do
it "does not raise error" do
@knife_ec2_create.config[:security_group_ids] = 'sg-aabbccdd, sg-3764sdss, sg-00aa11bb'
expect { @knife_ec2_create.validate! }.to_not raise_error
let(:ec2_server_create) { Chef::Knife::Ec2ServerCreate.new(['-g', sg-aabbccdd, '-g', sg-aabbccdd])}
expect { ec2_server_create }.to_not raise_error
end
end

context "when invalid input is given for --security-group-ids from knife.rb" do
it "raises error" do
Chef::Config[:knife][:security_group_ids] = ['sg-aabbccdd', 'sg-3764sdss', 'sg-00aa11bb']
expect { @knife_ec2_create.validate! }.to raise_error(SystemExit)
end
end
# context "when invalid input is given for --security-group-ids from knife.rb" do
# it "raises error" do
# Chef::Config[:knife][:security_group_ids] = 'sg-aabbccdd, sg-3764sdss, sg-00aa11bb'
# expect { @knife_ec2_create.validate! }.to raise_error(SystemExit)
# end
# end

context "when valid input is given for --security-group-ids from knife.rb" do
it "does not raise error" do
Chef::Config[:knife][:security_group_ids] = 'sg-aabbccdd, sg-3764sdss, sg-00aa11bb'
expect { @knife_ec2_create.validate! }.to_not raise_error
end
end
# context "when valid input is given for --security-group-ids from knife.rb" do
# it "does not raise error" do
# Chef::Config[:knife][:security_group_ids] = 'sg-aabbccdd, sg-3764sdss, sg-00aa11bb'
# expect { @knife_ec2_create.validate! }.to_not raise_error
# end
# end
end
end
end

0 comments on commit 31b1bcf

Please sign in to comment.