diff --git a/lib/chef/knife/ec2_server_create.rb b/lib/chef/knife/ec2_server_create.rb index 23eb5957..a431b4ab 100644 --- a/lib/chef/knife/ec2_server_create.rb +++ b/lib/chef/knife/ec2_server_create.rb @@ -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", @@ -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 @@ -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) diff --git a/spec/unit/ec2_server_create_spec.rb b/spec/unit/ec2_server_create_spec.rb index 94c11416..e33e1800 100644 --- a/spec/unit/ec2_server_create_spec.rb +++ b/spec/unit/ec2_server_create_spec.rb @@ -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, @@ -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']) @@ -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