diff --git a/lib/fog/rackspace/load_balancer.rb b/lib/fog/rackspace/load_balancer.rb index 6e2a71b0d..bd5843e81 100644 --- a/lib/fog/rackspace/load_balancer.rb +++ b/lib/fog/rackspace/load_balancer.rb @@ -74,6 +74,9 @@ module Fog request :list_access_rules request :delete_access_rule request :delete_all_access_rules + request :get_session_persistence + request :set_session_persistence + request :remove_session_persistence class Real def initialize(options={}) diff --git a/lib/fog/rackspace/requests/get_session_persistence.rb b/lib/fog/rackspace/requests/get_session_persistence.rb new file mode 100644 index 000000000..18d0494d6 --- /dev/null +++ b/lib/fog/rackspace/requests/get_session_persistence.rb @@ -0,0 +1,15 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def get_session_persistence(load_balancer_id) + request( + :expects => 200, + :path => "loadbalancers/#{load_balancer_id}/sessionpersistence", + :method => 'GET' + ) + end + end + end + end +end diff --git a/lib/fog/rackspace/requests/remove_session_persistence.rb b/lib/fog/rackspace/requests/remove_session_persistence.rb new file mode 100644 index 000000000..f93576e64 --- /dev/null +++ b/lib/fog/rackspace/requests/remove_session_persistence.rb @@ -0,0 +1,15 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def remove_session_persistence(load_balancer_id) + request( + :expects => [200, 202], + :path => "loadbalancers/#{load_balancer_id}/sessionpersistence", + :method => 'DELETE' + ) + end + end + end + end +end diff --git a/lib/fog/rackspace/requests/set_session_persistence.rb b/lib/fog/rackspace/requests/set_session_persistence.rb new file mode 100644 index 000000000..0ca1672df --- /dev/null +++ b/lib/fog/rackspace/requests/set_session_persistence.rb @@ -0,0 +1,21 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def set_session_persistence(load_balancer_id, persistence_type) + data = { + 'sessionPersistence' => { + 'persistenceType' => persistence_type + } + } + request( + :body => data.to_json, + :expects => [200, 202], + :path => "loadbalancers/#{load_balancer_id}/sessionpersistence", + :method => 'PUT' + ) + end + end + end + end +end diff --git a/tests/rackspace/requests/helper.rb b/tests/rackspace/requests/helper.rb index 3af5c8e8b..37e8ad053 100644 --- a/tests/rackspace/requests/helper.rb +++ b/tests/rackspace/requests/helper.rb @@ -8,6 +8,11 @@ CONNECTION_LOGGING_FORMAT = { 'enabled' => Fog::Boolean } } +SESSION_PERSISTENCE_FORMAT = { + 'sessionPersistence' => { + 'persistenceType' => Fog::Nullable::String + } +} ACCESS_LIST_FORMAT = { 'accessList' => [ diff --git a/tests/rackspace/requests/session_persistence_tests.rb b/tests/rackspace/requests/session_persistence_tests.rb new file mode 100644 index 000000000..ac310d513 --- /dev/null +++ b/tests/rackspace/requests/session_persistence_tests.rb @@ -0,0 +1,39 @@ +Shindo.tests('Fog::Rackspace::LoadBalancer | session_persistence', ['rackspace']) do + + @service = Fog::Rackspace::LoadBalancer.new + @lb = @service.load_balancers.create({ + :name => ('fog' + Time.now.to_i.to_s), + :protocol => 'HTTP', + :port => 80, + :virtual_ips => [{ :type => 'PUBLIC'}], + :nodes => [{ :address => '10.0.0.1', :port => 80, :condition => 'ENABLED'}] + }) + + tests('success') do + @lb.wait_for { ready? } + tests("#set_session_persistence(#{@lb.id}, 'HTTP_COOKIE')").succeeds do + @service.set_session_persistence(@lb.id, 'HTTP_COOKIE') + end + + @lb.wait_for { ready? } + tests("#get_session_persistence{@lb.id})").formats(SESSION_PERSISTENCE_FORMAT) do + data = @service.get_session_persistence(@lb.id).body + returns('HTTP_COOKIE') { data['sessionPersistence']['persistenceType'] } + data + end + + @lb.wait_for { ready? } + tests("#remove_session_persistence()").succeeds do + @service.remove_session_persistence(@lb.id) + end + end + + tests('failure') do + tests("#set_session_persistence(#{@lb.id}, 'aaa')").raises(Fog::Rackspace::LoadBalancer::BadRequest) do + @service.set_session_persistence(@lb.id, 'aaa') + end + end + + @lb.wait_for { ready? } + @lb.destroy +end