From 4554335e9e43c8d7cf52def67ce12a29c5be8f5f Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 11:51:09 -0400 Subject: [PATCH 1/6] [AWS | AutoScaling] Do not send Instances for update_auto_scaling_group (Avoids 413 Request Entity Too Large for ASGs with lots of instances) --- lib/fog/aws/models/auto_scaling/group.rb | 2 +- .../auto_scaling/update_auto_scaling_group.rb | 3 +++ tests/aws/models/auto_scaling/groups_test.rb | 22 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/aws/models/auto_scaling/groups_test.rb diff --git a/lib/fog/aws/models/auto_scaling/group.rb b/lib/fog/aws/models/auto_scaling/group.rb index 97843dcc7..57fc6a604 100644 --- a/lib/fog/aws/models/auto_scaling/group.rb +++ b/lib/fog/aws/models/auto_scaling/group.rb @@ -132,7 +132,7 @@ module Fog def update requires :id - service.update_auto_scaling_group(id, options) + service.update_auto_scaling_group(id, options.reject{|k,v| k == "Instances" }) reload end diff --git a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb index d3beb75ab..716f43235 100644 --- a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb @@ -71,6 +71,9 @@ module Fog class Mock def update_auto_scaling_group(auto_scaling_group_name, options = {}) + if options.has_key?("Instances") + raise Fog::AWS::AutoScaling::ValidationError.new('Instances should not be included in request') + end unless self.data[:auto_scaling_groups].has_key?(auto_scaling_group_name) raise Fog::AWS::AutoScaling::ValidationError.new('AutoScalingGroup name not found - null') end diff --git a/tests/aws/models/auto_scaling/groups_test.rb b/tests/aws/models/auto_scaling/groups_test.rb new file mode 100644 index 000000000..43874727f --- /dev/null +++ b/tests/aws/models/auto_scaling/groups_test.rb @@ -0,0 +1,22 @@ +Shindo.tests('AWS::AutoScaling | group', ['aws', 'auto_scaling_m']) do + + params = { + :id => uniq_id, + :auto_scaling_group_name => "name", + :availability_zones => [], + :launch_configuration_name => "lc" + } + + lc_params = { + :id => params[:launch_configuration_name], + :image_id => "image-id", + :instance_type => "instance-type", + } + + Fog::AWS[:auto_scaling].configurations.new(lc_params).save + + model_tests(Fog::AWS[:auto_scaling].groups, params, true) do + @instance.update + end + +end From b7948a15dcdc6c8648a765b6501c183b860d5d47 Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 12:23:16 -0400 Subject: [PATCH 2/6] [AWS | Autoscaling] whitelist the options for update_auto_scaling_group --- lib/fog/aws/models/auto_scaling/group.rb | 4 +++- .../aws/requests/auto_scaling/update_auto_scaling_group.rb | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/fog/aws/models/auto_scaling/group.rb b/lib/fog/aws/models/auto_scaling/group.rb index 57fc6a604..bda480f4f 100644 --- a/lib/fog/aws/models/auto_scaling/group.rb +++ b/lib/fog/aws/models/auto_scaling/group.rb @@ -132,7 +132,9 @@ module Fog def update requires :id - service.update_auto_scaling_group(id, options.reject{|k,v| k == "Instances" }) + expected_options = %w[AvailabilityZones DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LaunchConfigurationName MaxSize MinSize PlacementGroup TerminationPolicies VPCZoneIdentifier] + + service.update_auto_scaling_group(id, options.select{|k,_| expected_options.include?(k)}) reload end diff --git a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb index 716f43235..40f4cc9ae 100644 --- a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb @@ -71,9 +71,12 @@ module Fog class Mock def update_auto_scaling_group(auto_scaling_group_name, options = {}) - if options.has_key?("Instances") - raise Fog::AWS::AutoScaling::ValidationError.new('Instances should not be included in request') + expected_options = %w[AvailabilityZones DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LaunchConfigurationName MaxSize MinSize PlacementGroup TerminationPolicies VPCZoneIdentifier] + unexpected_options = options.keys - expected_options + unless unexpected_options.empty? + raise Fog::AWS::AutoScaling::ValidationError.new("Options #{unexpected_options.join(',')} should not be included in request") end + unless self.data[:auto_scaling_groups].has_key?(auto_scaling_group_name) raise Fog::AWS::AutoScaling::ValidationError.new('AutoScalingGroup name not found - null') end From 7bc1180bb545965b2080380cfceaf35d77cb1e6f Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 12:30:39 -0400 Subject: [PATCH 3/6] [AWS | Autoscaling] whitelist the options for create_auto_scaling_group --- lib/fog/aws/models/auto_scaling/group.rb | 3 ++- .../aws/requests/auto_scaling/create_auto_scaling_group.rb | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/fog/aws/models/auto_scaling/group.rb b/lib/fog/aws/models/auto_scaling/group.rb index bda480f4f..70ed787d6 100644 --- a/lib/fog/aws/models/auto_scaling/group.rb +++ b/lib/fog/aws/models/auto_scaling/group.rb @@ -111,8 +111,9 @@ module Fog requires :launch_configuration_name requires :max_size requires :min_size + expected_options = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] - service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, options) + service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, options.select{|k,_| expected_options.include?(k)}) reload end diff --git a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb index f655a04f3..7ab0e2051 100644 --- a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb @@ -94,6 +94,12 @@ module Fog class Mock def create_auto_scaling_group(auto_scaling_group_name, availability_zones, launch_configuration_name, max_size, min_size, options = {}) + expected_options = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] + unexpected_options = options.keys - expected_options + unless unexpected_options.empty? + raise Fog::AWS::AutoScaling::ValidationError.new("Options #{unexpected_options.join(',')} should not be included in request") + end + if self.data[:auto_scaling_groups].has_key?(auto_scaling_group_name) raise Fog::AWS::AutoScaling::IdentifierTaken.new("AutoScalingGroup by this name already exists - A group with the name #{auto_scaling_group_name} already exists") end From cc12069f5cfaf316e784844b77535f5817147442 Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 12:44:45 -0400 Subject: [PATCH 4/6] [AWS | Autoscaling] dry up expected options --- lib/fog/aws/auto_scaling.rb | 2 ++ lib/fog/aws/models/auto_scaling/group.rb | 8 ++------ .../requests/auto_scaling/create_auto_scaling_group.rb | 6 ++++-- .../requests/auto_scaling/update_auto_scaling_group.rb | 7 ++++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/fog/aws/auto_scaling.rb b/lib/fog/aws/auto_scaling.rb index dc42afbc1..4fcd6b2b1 100644 --- a/lib/fog/aws/auto_scaling.rb +++ b/lib/fog/aws/auto_scaling.rb @@ -60,6 +60,8 @@ module Fog model :policy collection :policies + ExpectedOptions = {} + class Real include Fog::AWS::CredentialFetcher::ConnectionMethods diff --git a/lib/fog/aws/models/auto_scaling/group.rb b/lib/fog/aws/models/auto_scaling/group.rb index 70ed787d6..75a08d65b 100644 --- a/lib/fog/aws/models/auto_scaling/group.rb +++ b/lib/fog/aws/models/auto_scaling/group.rb @@ -111,9 +111,7 @@ module Fog requires :launch_configuration_name requires :max_size requires :min_size - expected_options = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] - - service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, options.select{|k,_| expected_options.include?(k)}) + service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, options.select{|k,_| ExpectedOptions[:create_auto_scaling_group].include?(k)}) reload end @@ -133,9 +131,7 @@ module Fog def update requires :id - expected_options = %w[AvailabilityZones DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LaunchConfigurationName MaxSize MinSize PlacementGroup TerminationPolicies VPCZoneIdentifier] - - service.update_auto_scaling_group(id, options.select{|k,_| expected_options.include?(k)}) + service.update_auto_scaling_group(id, options.select{|k,_| ExpectedOptions[:update_auto_scaling_group].include?(k)}) reload end diff --git a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb index 7ab0e2051..a751b7846 100644 --- a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb @@ -63,6 +63,9 @@ module Fog # ==== See Also # http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_CreateAutoScalingGroup.html # + + ExpectedOptions[:create_auto_scaling_group] = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] + def create_auto_scaling_group(auto_scaling_group_name, availability_zones, launch_configuration_name, max_size, min_size, options = {}) options.merge!(AWS.indexed_param('AvailabilityZones.member.%d', [*availability_zones])) options.delete('AvailabilityZones') @@ -94,8 +97,7 @@ module Fog class Mock def create_auto_scaling_group(auto_scaling_group_name, availability_zones, launch_configuration_name, max_size, min_size, options = {}) - expected_options = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] - unexpected_options = options.keys - expected_options + unexpected_options = options.keys - ExpectedOptions[:create_auto_scaling_group] unless unexpected_options.empty? raise Fog::AWS::AutoScaling::ValidationError.new("Options #{unexpected_options.join(',')} should not be included in request") end diff --git a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb index 40f4cc9ae..f65fde0ea 100644 --- a/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/update_auto_scaling_group.rb @@ -1,7 +1,6 @@ module Fog module AWS class AutoScaling - class Real require 'fog/aws/parsers/auto_scaling/basic' @@ -52,6 +51,9 @@ module Fog # ==== See Also # http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_UpdateAutoScalingGroup.html # + + ExpectedOptions[:update_auto_scaling_group] = %w[AvailabilityZones DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LaunchConfigurationName MaxSize MinSize PlacementGroup TerminationPolicies VPCZoneIdentifier] + def update_auto_scaling_group(auto_scaling_group_name, options = {}) if availability_zones = options.delete('AvailabilityZones') options.merge!(AWS.indexed_param('AvailabilityZones.member.%d', [*availability_zones])) @@ -71,8 +73,7 @@ module Fog class Mock def update_auto_scaling_group(auto_scaling_group_name, options = {}) - expected_options = %w[AvailabilityZones DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LaunchConfigurationName MaxSize MinSize PlacementGroup TerminationPolicies VPCZoneIdentifier] - unexpected_options = options.keys - expected_options + unexpected_options = options.keys - ExpectedOptions[:update_auto_scaling_group] unless unexpected_options.empty? raise Fog::AWS::AutoScaling::ValidationError.new("Options #{unexpected_options.join(',')} should not be included in request") end From 923b73366c2fa3bac913f27323493e3fcdfa0980 Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 12:49:29 -0400 Subject: [PATCH 5/6] [AWS | Autoscaling] correct whitelist for create_auto_scaling_group --- lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb index a751b7846..d63ed2de7 100644 --- a/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +++ b/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb @@ -64,7 +64,7 @@ module Fog # http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_CreateAutoScalingGroup.html # - ExpectedOptions[:create_auto_scaling_group] = %w[BlockDeviceMappings EbsOptimized IamInstanceProfile InstanceMonitoring KernelId KeyName RamdiskId SecurityGroups SpotPrice UserData] + ExpectedOptions[:create_auto_scaling_group] = %w[DefaultCooldown DesiredCapacity HealthCheckGracePeriod HealthCheckType LoadBalancerNames PlacementGroup Tags TerminationPolicies VPCZoneIdentifier] def create_auto_scaling_group(auto_scaling_group_name, availability_zones, launch_configuration_name, max_size, min_size, options = {}) options.merge!(AWS.indexed_param('AvailabilityZones.member.%d', [*availability_zones])) From e520e4581b031f53f2528f140af58b09aff34217 Mon Sep 17 00:00:00 2001 From: Michael Hale Date: Mon, 10 Jun 2013 13:03:09 -0400 Subject: [PATCH 6/6] [AWS | Autoscaling] ensure tests work in 1.8.7 --- lib/fog/aws/models/auto_scaling/group.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/fog/aws/models/auto_scaling/group.rb b/lib/fog/aws/models/auto_scaling/group.rb index 75a08d65b..9cde50d8c 100644 --- a/lib/fog/aws/models/auto_scaling/group.rb +++ b/lib/fog/aws/models/auto_scaling/group.rb @@ -111,7 +111,7 @@ module Fog requires :launch_configuration_name requires :max_size requires :min_size - service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, options.select{|k,_| ExpectedOptions[:create_auto_scaling_group].include?(k)}) + service.create_auto_scaling_group(id, availability_zones, launch_configuration_name, max_size, min_size, filtered_options(:create_auto_scaling_group)) reload end @@ -131,10 +131,14 @@ module Fog def update requires :id - service.update_auto_scaling_group(id, options.select{|k,_| ExpectedOptions[:update_auto_scaling_group].include?(k)}) + service.update_auto_scaling_group(id, filtered_options(:update_auto_scaling_group) ) reload end + def filtered_options(method) + Hash[options.select{|k,_| ExpectedOptions[method].include?(k)}] + end + def options ret = Hash[self.class.aliases.map { |key, value| [key, send(value)] }] ret.delete_if { |key, value| value.nil? }