diff --git a/lib/fog/aws/models/elb/listener.rb b/lib/fog/aws/models/elb/listener.rb index bd8a5c484..23fe82e56 100644 --- a/lib/fog/aws/models/elb/listener.rb +++ b/lib/fog/aws/models/elb/listener.rb @@ -4,20 +4,21 @@ module Fog class ELB class Listener < Fog::Model - attribute :policy_names, :aliases => 'PolicyNames' - attribute :instance_port, :aliases => 'InstancePort' - attribute :lb_port, :aliases => 'LoadBalancerPort' - attribute :protocol, :aliases => 'Protocol' - attribute :ssl_id, :aliases => 'SSLCertificateId' + attribute :policy_names, :aliases => 'PolicyNames' + attribute :instance_port, :aliases => 'InstancePort' + attribute :instance_protocol, :aliases => 'InstanceProtocol' + attribute :lb_port, :aliases => 'LoadBalancerPort' + attribute :protocol, :aliases => 'Protocol' + attribute :ssl_id, :aliases => 'SSLCertificateId' def initialize(attributes={}) # set defaults, which may be overridden in super - merge_attributes(:policy_names => [], :instance_port => 80, :lb_port => 80, :protocol => 'HTTP') + merge_attributes(:policy_names => [], :instance_port => 80, :instance_protocol => 'HTTP', :lb_port => 80, :protocol => 'HTTP') super end def save - requires :load_balancer, :instance_port, :lb_port, :protocol + requires :load_balancer, :instance_port, :lb_port, :protocol, :instance_protocol connection.create_load_balancer_listeners(load_balancer.id, [to_params]) reload end @@ -44,6 +45,7 @@ module Fog def to_params { 'InstancePort' => instance_port, + 'InstanceProtocol' => instance_protocol, 'LoadBalancerPort' => lb_port, 'Protocol' => protocol, 'SSLCertificateId' => ssl_id diff --git a/lib/fog/aws/requests/elb/create_load_balancer.rb b/lib/fog/aws/requests/elb/create_load_balancer.rb index 87a0e9c3a..8d76e9572 100644 --- a/lib/fog/aws/requests/elb/create_load_balancer.rb +++ b/lib/fog/aws/requests/elb/create_load_balancer.rb @@ -11,9 +11,10 @@ module Fog # * availability_zones<~Array> - List of availability zones for the ELB # * lb_name<~String> - Name for the new ELB -- must be unique # * listeners<~Array> - Array of Hashes describing ELB listeners to assign to the ELB - # * 'Protocol'<~String> - Protocol to use. Either HTTP or TCP. + # * 'Protocol'<~String> - Protocol to use. Either HTTP, HTTPS, TCP or SSL. # * 'LoadBalancerPort'<~Integer> - The port that the ELB will listen to for outside traffic # * 'InstancePort'<~Integer> - The port on the instance that the ELB will forward traffic to + # * 'InstanceProtocol'<~String> - Protocol for sending traffic to an instance. Either HTTP, HTTPS, TCP or SSL. # * 'SSLCertificateId'<~String> - ARN of the server certificate # ==== Returns # * response<~Excon::Response>: @@ -28,17 +29,20 @@ module Fog listener_protocol = [] listener_lb_port = [] listener_instance_port = [] + listener_instance_protocol = [] listener_ssl_certificate_id = [] listeners.each do |listener| listener_protocol.push(listener['Protocol']) listener_lb_port.push(listener['LoadBalancerPort']) listener_instance_port.push(listener['InstancePort']) + listener_instance_protocol.push(listener['InstanceProtocol']) listener_ssl_certificate_id.push(listener['SSLCertificateId']) end params.merge!(Fog::AWS.indexed_param('Listeners.member.%d.Protocol', listener_protocol)) params.merge!(Fog::AWS.indexed_param('Listeners.member.%d.LoadBalancerPort', listener_lb_port)) params.merge!(Fog::AWS.indexed_param('Listeners.member.%d.InstancePort', listener_instance_port)) + params.merge!(Fog::AWS.indexed_param('Listeners.member.%d.InstanceProtocol', listener_instance_protocol)) params.merge!(Fog::AWS.indexed_param('Listeners.member.%d.SSLCertificateId', listener_ssl_certificate_id)) request({ diff --git a/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb b/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb index 15a74fa08..27e5a28e1 100644 --- a/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb +++ b/lib/fog/aws/requests/elb/create_load_balancer_listeners.rb @@ -10,9 +10,10 @@ module Fog # ==== Parameters # * lb_name<~String> - Name for the new ELB -- must be unique # * listeners<~Array> - Array of Hashes describing ELB listeners to add to the ELB - # * 'Protocol'<~String> - Protocol to use. Either HTTP or TCP. + # * 'Protocol'<~String> - Protocol to use. Either HTTP, HTTPS, TCP or SSL. # * 'LoadBalancerPort'<~Integer> - The port that the ELB will listen to for outside traffic # * 'InstancePort'<~Integer> - The port on the instance that the ELB will forward traffic to + # * 'InstanceProtocol'<~String> - Protocol for sending traffic to an instance. Either HTTP, HTTPS, TCP or SSL. # * 'SSLCertificateId'<~String> - ARN of the server certificate # ==== Returns # * response<~Excon::Response>: diff --git a/tests/aws/models/elb/model_tests.rb b/tests/aws/models/elb/model_tests.rb index 9ce617c22..2d1963f6d 100644 --- a/tests/aws/models/elb/model_tests.rb +++ b/tests/aws/models/elb/model_tests.rb @@ -1,4 +1,5 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do + require 'fog' @availability_zones = Fog::Compute[:aws].describe_availability_zones('state' => 'available').body['availabilityZoneInfo'].collect{ |az| az['zoneName'] } @key_name = 'fog-test-model' @@ -13,15 +14,17 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do tests("default attributes") do listener = Fog::AWS[:elb].listeners.new tests('instance_port is 80').returns(80) { listener.instance_port } + tests('instance_protocol is HTTP').returns('HTTP') { listener.instance_protocol } tests('lb_port is 80').returns(80) { listener.lb_port } tests('protocol is HTTP').returns('HTTP') { listener.protocol } tests('policy_names is empty').returns([]) { listener.policy_names } end tests("specifying attributes") do - attributes = {:instance_port => 2000, :lb_port => 2001, :protocol => 'SSL', :policy_names => ['fake'] } + attributes = {:instance_port => 2000, :instance_protocol => 'SSL', :lb_port => 2001, :protocol => 'SSL', :policy_names => ['fake'] } listener = Fog::AWS[:elb].listeners.new(attributes) tests('instance_port is 2000').returns(2000) { listener.instance_port } + tests('instance_protocol is SSL').returns('SSL') { listener.instance_protocol } tests('lb_port is 2001').returns(2001) { listener.lb_port } tests('protocol is SSL').returns('SSL') { listener.protocol } tests('policy_names is [ fake ]').returns(['fake']) { listener.policy_names } @@ -62,7 +65,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do 'PolicyNames' => [] }, { 'Listener' => { - 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'Protocol' => 'HTTPS', + 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'Protocol' => 'HTTPS', 'InstanceProtocol' => 'HTTPS', 'SSLCertificateId' => @certificate['Arn'] }, 'PolicyNames' => [] @@ -73,13 +76,14 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do tests('lb_port is 2030').returns(2030) { elb3.listeners.first.lb_port } tests('protocol is HTTP').returns('HTTP') { elb3.listeners.first.protocol } tests('protocol is HTTPS').returns('HTTPS') { elb3.listeners.last.protocol } + tests('instance_protocol is HTTPS').returns('HTTPS') { elb3.listeners.last.instance_protocol } elb3.destroy end tests('with invalid Server Cert ARN').raises(Fog::AWS::IAM::NotFound) do listeners = [{ 'Listener' => { - 'LoadBalancerPort' => 443, 'InstancePort' => 80, 'Protocol' => 'HTTPS', "SSLCertificateId" => "fakecert"} + 'LoadBalancerPort' => 443, 'InstancePort' => 80, 'Protocol' => 'HTTPS', 'InstanceProtocol' => 'HTTPS', "SSLCertificateId" => "fakecert"} }] Fog::AWS[:elb].load_balancers.create(:id => "#{elb_id}-4", "ListenerDescriptions" => listeners, :availability_zones => @availability_zones) end @@ -178,7 +182,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do returns(1) { elb.listeners.size } listener = elb.listeners.first - returns([80,80,'HTTP', []]) { [listener.instance_port, listener.lb_port, listener.protocol, listener.policy_names] } + returns([80,80,'HTTP','HTTP', []]) { [listener.instance_port, listener.lb_port, listener.protocol, listener.instance_protocol, listener.policy_names] } end tests('#get') do @@ -186,8 +190,8 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do end tests('create') do - new_listener = { 'InstancePort' => 443, 'LoadBalancerPort' => 443, 'Protocol' => 'TCP'} - elb.listeners.create(:instance_port => 443, :lb_port => 443, :protocol => 'TCP') + new_listener = { 'InstancePort' => 443, 'LoadBalancerPort' => 443, 'Protocol' => 'TCP', 'InstanceProtocol' => 'TCP'} + elb.listeners.create(:instance_port => 443, :lb_port => 443, :protocol => 'TCP', :instance_protocol => 'TCP') returns(2) { elb.listeners.size } returns(443) { elb.listeners.get(443).lb_port } end @@ -245,7 +249,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do end tests('setting a new ssl certificate id') do - elb.listeners.create(:instance_port => 443, :lb_port => 443, :protocol => 'HTTPS', :ssl_id => @certificate['Arn']) + elb.listeners.create(:instance_port => 443, :lb_port => 443, :protocol => 'HTTPS', :instance_protocol => 'HTTPS', :ssl_id => @certificate['Arn']) elb.set_listener_ssl_certificate(443, @certificate['Arn']) end diff --git a/tests/aws/requests/elb/listener_tests.rb b/tests/aws/requests/elb/listener_tests.rb index 5aaecd50c..32a982e63 100644 --- a/tests/aws/requests/elb/listener_tests.rb +++ b/tests/aws/requests/elb/listener_tests.rb @@ -8,7 +8,7 @@ Shindo.tests('AWS::ELB | listener_tests', ['aws', 'elb']) do tests("#create_load_balancer_listeners").formats(AWS::ELB::Formats::BASIC) do listeners = [ - {'Protocol' => 'TCP', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => @certificate['Arn']}, + {'Protocol' => 'TCP','InstanceProtocol' => 'TCP', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => @certificate['Arn']}, {'Protocol' => 'HTTP', 'LoadBalancerPort' => 80, 'InstancePort' => 80} ] response = Fog::AWS[:elb].create_load_balancer_listeners(@load_balancer_id, listeners).body @@ -22,7 +22,7 @@ Shindo.tests('AWS::ELB | listener_tests', ['aws', 'elb']) do tests("#create_load_balancer_listeners with non-existant SSL certificate") do listeners = [ - {'Protocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => 'non-existant'}, + {'Protocol' => 'HTTPS', 'InstanceProtocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => 'non-existant'}, ] raises(Fog::AWS::IAM::NotFound) { Fog::AWS[:elb].create_load_balancer_listeners(@load_balancer_id, listeners) } end @@ -30,7 +30,7 @@ Shindo.tests('AWS::ELB | listener_tests', ['aws', 'elb']) do tests("#create_load_balancer_listeners with invalid SSL certificate").raises(Fog::AWS::IAM::NotFound) do sleep 8 unless Fog.mocking? listeners = [ - {'Protocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => "#{@certificate['Arn']}fake"}, + {'Protocol' => 'HTTPS', 'InstanceProtocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => "#{@certificate['Arn']}fake"}, ] Fog::AWS[:elb].create_load_balancer_listeners(@load_balancer_id, listeners).body end @@ -39,7 +39,7 @@ Shindo.tests('AWS::ELB | listener_tests', ['aws', 'elb']) do tests("#create_load_balancer_listeners with SSL certificate").formats(AWS::ELB::Formats::BASIC) do sleep 8 unless Fog.mocking? listeners = [ - {'Protocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => @certificate['Arn']}, + {'Protocol' => 'HTTPS', 'InstanceProtocol' => 'HTTPS', 'LoadBalancerPort' => 443, 'InstancePort' => 443, 'SSLCertificateId' => @certificate['Arn']}, ] Fog::AWS[:elb].create_load_balancer_listeners(@load_balancer_id, listeners).body end