From c19cd4003f1bf420ab1c7f114cbc4b9a6b1fc282 Mon Sep 17 00:00:00 2001 From: Brian Hartsock Date: Thu, 14 Jul 2011 21:07:29 -0700 Subject: [PATCH] Rackspace Load Balancers: requests for virtual ips --- lib/fog/rackspace/load_balancer.rb | 3 ++ .../rackspace/requests/create_virtual_ip.rb | 25 ++++++++++ .../rackspace/requests/delete_virtual_ip.rb | 20 ++++++++ .../rackspace/requests/list_virtual_ips.rb | 20 ++++++++ tests/rackspace/requests/helper.rb | 1 + tests/rackspace/requests/virtual_ip_tests.rb | 46 +++++++++++++++++++ 6 files changed, 115 insertions(+) create mode 100644 lib/fog/rackspace/requests/create_virtual_ip.rb create mode 100644 lib/fog/rackspace/requests/delete_virtual_ip.rb create mode 100644 lib/fog/rackspace/requests/list_virtual_ips.rb create mode 100644 tests/rackspace/requests/virtual_ip_tests.rb diff --git a/lib/fog/rackspace/load_balancer.rb b/lib/fog/rackspace/load_balancer.rb index fdb867610..1a2db4ee6 100644 --- a/lib/fog/rackspace/load_balancer.rb +++ b/lib/fog/rackspace/load_balancer.rb @@ -60,6 +60,9 @@ module Fog request :update_node request :delete_node request :delete_nodes + request :create_virtual_ip + request :list_virtual_ips + request :delete_virtual_ip class Real def initialize(options={}) diff --git a/lib/fog/rackspace/requests/create_virtual_ip.rb b/lib/fog/rackspace/requests/create_virtual_ip.rb new file mode 100644 index 000000000..8ab79d134 --- /dev/null +++ b/lib/fog/rackspace/requests/create_virtual_ip.rb @@ -0,0 +1,25 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def create_virtual_ip(load_balancer_id, type) + data = { + 'type' => type, + 'ipVersion' => 'IPV6' + } + request( + :body => data.to_json, + :expects => [200, 202], + :method => 'POST', + :path => "loadbalancers/#{load_balancer_id}/virtualips.json" + ) + end + end + class Mock + def create_virtual_ip(load_balancer_id, type) + Fog::Mock.not_implemented + end + end + end + end +end diff --git a/lib/fog/rackspace/requests/delete_virtual_ip.rb b/lib/fog/rackspace/requests/delete_virtual_ip.rb new file mode 100644 index 000000000..81172a482 --- /dev/null +++ b/lib/fog/rackspace/requests/delete_virtual_ip.rb @@ -0,0 +1,20 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def delete_virtual_ip(load_balancer_id, virtual_ip_id) + request( + :expects => [200, 202], + :path => "loadbalancers/#{load_balancer_id}/virtualips/#{virtual_ip_id}", + :method => 'DELETE' + ) + end + end + class Mock + def delete_virtual_ip(load_balancer_id, virtual_ip_id) + Fog::Mock.not_implemented + end + end + end + end +end diff --git a/lib/fog/rackspace/requests/list_virtual_ips.rb b/lib/fog/rackspace/requests/list_virtual_ips.rb new file mode 100644 index 000000000..f888b014e --- /dev/null +++ b/lib/fog/rackspace/requests/list_virtual_ips.rb @@ -0,0 +1,20 @@ +module Fog + module Rackspace + class LoadBalancer + class Real + def list_virtual_ips(load_balancer_id) + request( + :expects => 200, + :method => 'GET', + :path => "loadbalancers/#{load_balancer_id}/virtualips.json" + ) + end + end + class Mock + def list_virtual_ips(load_balancer_id) + Fog::Mock.not_implemented + end + end + end + end +end diff --git a/tests/rackspace/requests/helper.rb b/tests/rackspace/requests/helper.rb index 71d0cf4b9..455eb1a4a 100644 --- a/tests/rackspace/requests/helper.rb +++ b/tests/rackspace/requests/helper.rb @@ -2,6 +2,7 @@ SINGLE_NODE_FORMAT = {'address' => String, 'id' => Integer, 'status' => String, NODE_FORMAT = {'node' => SINGLE_NODE_FORMAT} NODES_FORMAT = {'nodes' => [SINGLE_NODE_FORMAT]} VIRTUAL_IP_FORMAT = {'type' => String, 'id' => Integer, 'type' => String, 'ipVersion' => String, 'address' => String} +VIRTUAL_IPS_FORMAT = { 'virtualIps' => [VIRTUAL_IP_FORMAT] } STATUS_ACTIVE = 'ACTIVE' diff --git a/tests/rackspace/requests/virtual_ip_tests.rb b/tests/rackspace/requests/virtual_ip_tests.rb new file mode 100644 index 000000000..cd331d33a --- /dev/null +++ b/tests/rackspace/requests/virtual_ip_tests.rb @@ -0,0 +1,46 @@ +Shindo.tests('Fog::Rackspace::LoadBalancer | virtual_ip_tests', ['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('#create_virtual_ip').formats(VIRTUAL_IP_FORMAT) do + data = @service.create_virtual_ip(@lb.id, 'PUBLIC').body + @virtual_ip_id = data['id'] + data + end + + @lb.wait_for { ready? } + tests("list_virtual_ips").formats(VIRTUAL_IPS_FORMAT) do + @service.list_virtual_ips(@lb.id).body + end + end + + tests('failure') do + #TODO - I feel like this should really be a BadRequest, need to dig in + tests('create_virtual_ip(invalid type)').raises(Fog::Rackspace::LoadBalancer::ServiceError) do + @service.create_virtual_ip(@lb.id, 'badtype') + end + tests('delete_virtual_ip(0)').raises(Fog::Rackspace::LoadBalancer::NotFound) do + @service.delete_virtual_ip(@lb.id, 0) + end + end + + tests('success') do + @lb.wait_for { ready? } + tests("#delete_virtual_ip(#{@lb.id}, #{@virtual_ip_id})").succeeds do + @service.delete_virtual_ip(@lb.id, @virtual_ip_id) + end + end + + @lb.wait_for { ready? } + @lb.destroy +end