From fbc6e384875f87cb490614e6f7299720a88fd966 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 11:26:16 +0100 Subject: [PATCH 01/57] Add Serverlove directory. --- lib/fog/providers.rb | 1 + lib/fog/serverlove.rb | 10 ++++++++++ lib/fog/serverlove/compute.rb | 7 +++++++ 3 files changed, 18 insertions(+) create mode 100644 lib/fog/serverlove.rb create mode 100644 lib/fog/serverlove/compute.rb diff --git a/lib/fog/providers.rb b/lib/fog/providers.rb index 7767792b9..daceca03f 100644 --- a/lib/fog/providers.rb +++ b/lib/fog/providers.rb @@ -21,6 +21,7 @@ require 'fog/ninefold' require 'fog/rackspace' require 'fog/openstack' require 'fog/ovirt' +require 'fog/serverlove' require 'fog/slicehost' require 'fog/storm_on_demand' require 'fog/vcloud' diff --git a/lib/fog/serverlove.rb b/lib/fog/serverlove.rb new file mode 100644 index 000000000..2bfb327d5 --- /dev/null +++ b/lib/fog/serverlove.rb @@ -0,0 +1,10 @@ +require(File.expand_path(File.join(File.dirname(__FILE__), 'core'))) + +module Fog + module Serverlove + extend Fog::Provider + + service(:compute, 'serverlove/compute', 'Compute') + + end +end diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb new file mode 100644 index 000000000..44e796a55 --- /dev/null +++ b/lib/fog/serverlove/compute.rb @@ -0,0 +1,7 @@ +module Fog + module Compute + class Serverlove < Fog::Service + + end + end +end \ No newline at end of file From a627445d6309973fc7edd8a0a25a29d1aee7b00b Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 12:11:33 +0100 Subject: [PATCH 02/57] Basic Serverlove implementation. --- lib/fog/compute.rb | 3 ++ lib/fog/serverlove/compute.rb | 58 +++++++++++++++++++++++ lib/fog/serverlove/requests/get_drives.rb | 13 +++++ 3 files changed, 74 insertions(+) create mode 100644 lib/fog/serverlove/requests/get_drives.rb diff --git a/lib/fog/compute.rb b/lib/fog/compute.rb index c7a168135..bfcfeaf06 100644 --- a/lib/fog/compute.rb +++ b/lib/fog/compute.rb @@ -66,6 +66,9 @@ module Fog when :rackspace require 'fog/rackspace/compute' Fog::Compute::Rackspace.new(attributes) + when :serverlove + require 'fog/serverlove/compute' + Fog::Compute::Serverlove.new(attributes) when :slicehost warn "[DEPRECATION] `slicehost` is deprecated. Please use `rackspace` instead." require 'fog/slicehost/compute' diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 44e796a55..c22152105 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -2,6 +2,64 @@ module Fog module Compute class Serverlove < Fog::Service + APR_URL = "https://api.z1-man.serverlove.com/" + + requires :serverlove_uuid, :serverlove_api_key + + recognizes :serverlove_api_url + + request_path 'fog/serverlove/requests/compute' + request :get_drives + + class Mock + + def initialize(options) + @serverlove_uuid = options[:serverlove_uuid] || Fog.credentials[:serverlove_uuid] + @serverlove_api_key = options[:serverlove_api_key] || Fog.credentials[:serverlove_api_key] + end + + def request(options) + raise "Not implemented" + end + + end + + class Real + + def initialize(options) + @api_uuid = options[:serverlove_uuid] || Fog.credentials[:serverlove_uuid] + @api_key = options[:serverlove_api_key] || Fog.credentials[:serverlove_api_key] + @api_url = options[:serverlove_api_url] || Fog.credentials[:serverlove_api_url] + + @connection = Fog::Connection.new(@api_url) + end + + def request(params) + params = params.merge!(header_for_basic_auth) + response = @connection.request(params) + + raise_if_error!(response) + + response.body = Fog::JSON.decode(response.body) + + response + end + + def header_for_basic_auth + { + "Authorization" => "Basic #{Base64.encode64("#{@uuid}:#{@api_key}").delete("\r\n")}" + } + end + + def raise_if_error!(response) + case response.status + when 400 then + raise 'omg' + end + end + + end + end end end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/get_drives.rb b/lib/fog/serverlove/requests/get_drives.rb new file mode 100644 index 000000000..0cf863888 --- /dev/null +++ b/lib/fog/serverlove/requests/get_drives.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def get_drives + request("get", "/drives/list", [200]) + end + + end + end + end +end \ No newline at end of file From c57647a41055e2d4a243076e55ba9b1d094ae3eb Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 12:15:01 +0100 Subject: [PATCH 03/57] Wrong directory. --- lib/fog/serverlove/requests/{ => compute}/get_drives.rb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/fog/serverlove/requests/{ => compute}/get_drives.rb (100%) diff --git a/lib/fog/serverlove/requests/get_drives.rb b/lib/fog/serverlove/requests/compute/get_drives.rb similarity index 100% rename from lib/fog/serverlove/requests/get_drives.rb rename to lib/fog/serverlove/requests/compute/get_drives.rb From 08cf679268ada65aaad5c73fd93a7948eaf0b5f0 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 12:17:05 +0100 Subject: [PATCH 04/57] Typo --- lib/fog/serverlove/compute.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index c22152105..62a937cf0 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -2,7 +2,7 @@ module Fog module Compute class Serverlove < Fog::Service - APR_URL = "https://api.z1-man.serverlove.com/" + API_URL = "https://api.z1-man.serverlove.com/" requires :serverlove_uuid, :serverlove_api_key @@ -29,13 +29,13 @@ module Fog def initialize(options) @api_uuid = options[:serverlove_uuid] || Fog.credentials[:serverlove_uuid] @api_key = options[:serverlove_api_key] || Fog.credentials[:serverlove_api_key] - @api_url = options[:serverlove_api_url] || Fog.credentials[:serverlove_api_url] + @api_url = options[:serverlove_api_url] || Fog.credentials[:serverlove_api_url] || API_URL @connection = Fog::Connection.new(@api_url) end def request(params) - params = params.merge!(header_for_basic_auth) + params = params.merge!({:host => @api_url}).merge!(header_for_basic_auth) response = @connection.request(params) raise_if_error!(response) From e2087a7a57889b0a3a065277724f09177a765ff5 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 12:21:39 +0100 Subject: [PATCH 05/57] Proper request arguments. --- lib/fog/serverlove/requests/compute/get_drives.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/requests/compute/get_drives.rb b/lib/fog/serverlove/requests/compute/get_drives.rb index 0cf863888..4864945d3 100644 --- a/lib/fog/serverlove/requests/compute/get_drives.rb +++ b/lib/fog/serverlove/requests/compute/get_drives.rb @@ -4,7 +4,7 @@ module Fog class Real def get_drives - request("get", "/drives/list", [200]) + request(:method => "get", :path => "/drives/list", :expects => 200) end end From fa4aa9859dbcda2d6fc5d0db2ebf87f4d762b4d6 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 12:26:13 +0100 Subject: [PATCH 06/57] Typo. --- lib/fog/serverlove/compute.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 62a937cf0..101b20145 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -47,7 +47,7 @@ module Fog def header_for_basic_auth { - "Authorization" => "Basic #{Base64.encode64("#{@uuid}:#{@api_key}").delete("\r\n")}" + "Authorization" => "Basic #{Base64.encode64("#{@api_uuid}:#{@api_key}").delete("\r\n")}", } end From 68dc5a941e94063fe33662558e2daf43efb98f61 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 13:25:40 +0100 Subject: [PATCH 07/57] Adding server love disk model. Not all attributes included/named properly yet. --- lib/fog/serverlove/models/compute/disk.rb | 34 ++++++++++++++++++++++ lib/fog/serverlove/models/compute/disks.rb | 25 ++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 lib/fog/serverlove/models/compute/disk.rb create mode 100644 lib/fog/serverlove/models/compute/disks.rb diff --git a/lib/fog/serverlove/models/compute/disk.rb b/lib/fog/serverlove/models/compute/disk.rb new file mode 100644 index 000000000..d8881f22c --- /dev/null +++ b/lib/fog/serverlove/models/compute/disk.rb @@ -0,0 +1,34 @@ +require 'fog/core/model' + +module Fog + module Compute + class Serverlove + + class Disk < Fog::Model + + identity :id + + attribute :name + attribute :user + attribute :status + attribute :tags + attribute :size + attribute :claimed? + attribute :claim_type + attribute :imaging? + attribute :readers + attribute :encryption_cipher + + def save + # TODO + end + + def destroy + requires :identity + connection.destroy_disk(identity) + true + end + end + end + end +end diff --git a/lib/fog/serverlove/models/compute/disks.rb b/lib/fog/serverlove/models/compute/disks.rb new file mode 100644 index 000000000..0095fb0ec --- /dev/null +++ b/lib/fog/serverlove/models/compute/disks.rb @@ -0,0 +1,25 @@ +require 'fog/core/collection' +require 'fog/serverlove/models/compute/disk' + +module Fog + module Compute + class Serverlove + + class Disks < Fog::Collection + + model Fog::Compute::Serverlove::Disk + + def all + data = connection.get_disks.body['disks'] + load(data) + end + + def get(disk_id) + connection.get_disk(image_id) + end + + end + + end + end +end From ab8f8f6b0a902a02b2a79bc20648e9d6f3374ec7 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 14:01:42 +0100 Subject: [PATCH 08/57] Changed disk model based on responses from real API requests. --- lib/fog/serverlove/models/compute/disk.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/fog/serverlove/models/compute/disk.rb b/lib/fog/serverlove/models/compute/disk.rb index d8881f22c..74144c67e 100644 --- a/lib/fog/serverlove/models/compute/disk.rb +++ b/lib/fog/serverlove/models/compute/disk.rb @@ -6,18 +6,14 @@ module Fog class Disk < Fog::Model - identity :id + identity :drive attribute :name attribute :user - attribute :status - attribute :tags attribute :size - attribute :claimed? - attribute :claim_type - attribute :imaging? - attribute :readers - attribute :encryption_cipher + attribute :claimed + attribute :status + attribute :encryption:cipher def save # TODO From 39d5e6729ba0838ff28d09b0afa85c8fd1c2edee Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 14:08:24 +0100 Subject: [PATCH 09/57] Still wrong. --- lib/fog/serverlove/compute.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 101b20145..8b7f2ffc9 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -35,7 +35,12 @@ module Fog end def request(params) - params = params.merge!({:host => @api_url}).merge!(header_for_basic_auth) + params = params.merge!( + :headers => { + "Authorization" => "Basic #{Base64.encode64("#{@api_uuid}:#{@api_key}").chomp!}", + }, + :host => @api_url + ) response = @connection.request(params) raise_if_error!(response) @@ -45,11 +50,6 @@ module Fog response end - def header_for_basic_auth - { - "Authorization" => "Basic #{Base64.encode64("#{@api_uuid}:#{@api_key}").delete("\r\n")}", - } - end def raise_if_error!(response) case response.status From 1a5e39606cd461743008a75d1494666638cf4458 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 14:31:12 +0100 Subject: [PATCH 10/57] Works. --- lib/fog/serverlove/compute.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 8b7f2ffc9..aa4f03e24 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -1,9 +1,7 @@ module Fog module Compute class Serverlove < Fog::Service - - API_URL = "https://api.z1-man.serverlove.com/" - + requires :serverlove_uuid, :serverlove_api_key recognizes :serverlove_api_url @@ -29,17 +27,15 @@ module Fog def initialize(options) @api_uuid = options[:serverlove_uuid] || Fog.credentials[:serverlove_uuid] @api_key = options[:serverlove_api_key] || Fog.credentials[:serverlove_api_key] - @api_url = options[:serverlove_api_url] || Fog.credentials[:serverlove_api_url] || API_URL - @connection = Fog::Connection.new(@api_url) + @connection = Fog::Connection.new("https://#{@api_uuid}:#{@api_key}@api.z1-man.serverlove.com/") end def request(params) params = params.merge!( :headers => { - "Authorization" => "Basic #{Base64.encode64("#{@api_uuid}:#{@api_key}").chomp!}", - }, - :host => @api_url + "Content-Type" => "application/json" + } ) response = @connection.request(params) From 86ac91ac22b01d388dc1c547933643aad42a99a3 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 27 Apr 2012 14:35:08 +0100 Subject: [PATCH 11/57] We want JSON. --- lib/fog/serverlove/compute.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index aa4f03e24..5ce3bf0da 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -1,7 +1,9 @@ module Fog module Compute class Serverlove < Fog::Service - + + API_HOST = "api.z1-man.serverlove.com" + requires :serverlove_uuid, :serverlove_api_key recognizes :serverlove_api_url @@ -27,14 +29,15 @@ module Fog def initialize(options) @api_uuid = options[:serverlove_uuid] || Fog.credentials[:serverlove_uuid] @api_key = options[:serverlove_api_key] || Fog.credentials[:serverlove_api_key] + @api_host = options[:serverlove_api_url] || Fog.credentials[:serverlove_api_url] || API_HOST - @connection = Fog::Connection.new("https://#{@api_uuid}:#{@api_key}@api.z1-man.serverlove.com/") + @connection = Fog::Connection.new("https://#{@api_uuid}:#{@api_key}@#{@api_host}") end def request(params) params = params.merge!( :headers => { - "Content-Type" => "application/json" + "Accept" => "application/json" } ) response = @connection.request(params) From 5cc1b4699eb1acc3ffe067ba7dc7d3ad25bcf0a1 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 14:43:52 +0100 Subject: [PATCH 12/57] Set up drive objects (not disks). --- lib/fog/serverlove/compute.rb | 4 +++ lib/fog/serverlove/models/compute/disks.rb | 25 ------------------- .../models/compute/{disk.rb => drive.rb} | 6 ++--- lib/fog/serverlove/models/compute/drives.rb | 25 +++++++++++++++++++ 4 files changed, 32 insertions(+), 28 deletions(-) delete mode 100644 lib/fog/serverlove/models/compute/disks.rb rename lib/fog/serverlove/models/compute/{disk.rb => drive.rb} (77%) create mode 100644 lib/fog/serverlove/models/compute/drives.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 5ce3bf0da..d905b1e76 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -11,6 +11,10 @@ module Fog request_path 'fog/serverlove/requests/compute' request :get_drives + model_path 'fog/serverlove/models/compute' + model :drive + collection :drives + class Mock def initialize(options) diff --git a/lib/fog/serverlove/models/compute/disks.rb b/lib/fog/serverlove/models/compute/disks.rb deleted file mode 100644 index 0095fb0ec..000000000 --- a/lib/fog/serverlove/models/compute/disks.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'fog/core/collection' -require 'fog/serverlove/models/compute/disk' - -module Fog - module Compute - class Serverlove - - class Disks < Fog::Collection - - model Fog::Compute::Serverlove::Disk - - def all - data = connection.get_disks.body['disks'] - load(data) - end - - def get(disk_id) - connection.get_disk(image_id) - end - - end - - end - end -end diff --git a/lib/fog/serverlove/models/compute/disk.rb b/lib/fog/serverlove/models/compute/drive.rb similarity index 77% rename from lib/fog/serverlove/models/compute/disk.rb rename to lib/fog/serverlove/models/compute/drive.rb index 74144c67e..858dc1e5b 100644 --- a/lib/fog/serverlove/models/compute/disk.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -4,7 +4,7 @@ module Fog module Compute class Serverlove - class Disk < Fog::Model + class Drive < Fog::Model identity :drive @@ -13,7 +13,7 @@ module Fog attribute :size attribute :claimed attribute :status - attribute :encryption:cipher + attribute :encryption_cipher def save # TODO @@ -21,7 +21,7 @@ module Fog def destroy requires :identity - connection.destroy_disk(identity) + connection.destroy_drive(identity) true end end diff --git a/lib/fog/serverlove/models/compute/drives.rb b/lib/fog/serverlove/models/compute/drives.rb new file mode 100644 index 000000000..ca3f41556 --- /dev/null +++ b/lib/fog/serverlove/models/compute/drives.rb @@ -0,0 +1,25 @@ +require 'fog/core/collection' +require 'fog/serverlove/models/compute/drive' + +module Fog + module Compute + class Serverlove + + class Drives < Fog::Collection + + model Fog::Compute::Serverlove::Drive + + def all + data = connection.get_drives.body + load(data) + end + + def get(drive_id) + connection.get_drive(drive_id) + end + + end + + end + end +end From da08c6b0fc5a12096d3914b2c22d1e406d6ef1cf Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 14:48:15 +0100 Subject: [PATCH 13/57] If you use info, you get all the info. --- lib/fog/serverlove/requests/compute/get_drives.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/requests/compute/get_drives.rb b/lib/fog/serverlove/requests/compute/get_drives.rb index 4864945d3..54ce1692e 100644 --- a/lib/fog/serverlove/requests/compute/get_drives.rb +++ b/lib/fog/serverlove/requests/compute/get_drives.rb @@ -4,7 +4,7 @@ module Fog class Real def get_drives - request(:method => "get", :path => "/drives/list", :expects => 200) + request(:method => "get", :path => "/drives/info", :expects => 200) end end From 4add747ab3d49d5d92de3aac353518bfeb4db7e4 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 14:55:06 +0100 Subject: [PATCH 14/57] Alias the encryption cipher. --- lib/fog/serverlove/models/compute/drive.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb index 858dc1e5b..944e6c700 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -13,7 +13,7 @@ module Fog attribute :size attribute :claimed attribute :status - attribute :encryption_cipher + attribute :encryption_cipher, :aliases => 'encryption:cipher' def save # TODO From 02db2873404e02738a91588ce700c5771ffe366c Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 15:17:56 +0100 Subject: [PATCH 15/57] Sometimes the response body is empty. --- lib/fog/serverlove/compute.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index d905b1e76..a47a06572 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -10,6 +10,7 @@ module Fog request_path 'fog/serverlove/requests/compute' request :get_drives + request :destroy_drive model_path 'fog/serverlove/models/compute' model :drive @@ -48,7 +49,7 @@ module Fog raise_if_error!(response) - response.body = Fog::JSON.decode(response.body) + response.body = Fog::JSON.decode(response.body) if response.body && response.body.length > 0 response end From d4863eb29d96e2bd34aa468098d9b5686319eba7 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 27 Apr 2012 15:18:21 +0100 Subject: [PATCH 16/57] Destroying drives is easy. --- .../serverlove/requests/compute/destroy_drive.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 lib/fog/serverlove/requests/compute/destroy_drive.rb diff --git a/lib/fog/serverlove/requests/compute/destroy_drive.rb b/lib/fog/serverlove/requests/compute/destroy_drive.rb new file mode 100644 index 000000000..34077d2ad --- /dev/null +++ b/lib/fog/serverlove/requests/compute/destroy_drive.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def destroy_drive(drive_id) + request(:method => "post", :path => "/drives/#{drive_id}/destroy", :expects => 204) + end + + end + end + end +end \ No newline at end of file From 4331d171eedfcd59ad89f317b9b94ab91c4afffb Mon Sep 17 00:00:00 2001 From: seanhandley Date: Fri, 27 Apr 2012 21:53:39 +0100 Subject: [PATCH 17/57] Made steps to get update/create working. Work in progress. --- lib/fog/serverlove/compute.rb | 4 +++- lib/fog/serverlove/models/compute/drive.rb | 10 +++++++++- .../serverlove/requests/compute/create_drive.rb | 14 ++++++++++++++ .../serverlove/requests/compute/update_drive.rb | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 lib/fog/serverlove/requests/compute/create_drive.rb create mode 100644 lib/fog/serverlove/requests/compute/update_drive.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index a47a06572..237278809 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -11,6 +11,8 @@ module Fog request_path 'fog/serverlove/requests/compute' request :get_drives request :destroy_drive + request :create_drive + request :update_drive model_path 'fog/serverlove/models/compute' model :drive @@ -66,4 +68,4 @@ module Fog end end -end \ No newline at end of file +end diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb index 944e6c700..28f8893ed 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -16,7 +16,15 @@ module Fog attribute :encryption_cipher, :aliases => 'encryption:cipher' def save - # TODO + requires :identity + connection.update_drive(identity, attributes) + true + end + + def create(attributes) + requires :name + connection.create_drive(attributes) + true end def destroy diff --git a/lib/fog/serverlove/requests/compute/create_drive.rb b/lib/fog/serverlove/requests/compute/create_drive.rb new file mode 100644 index 000000000..f4fdea990 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/create_drive.rb @@ -0,0 +1,14 @@ +module Fog + module Compute + class Serverlove + class Real + + def create_drive(options) + return nil if options.empty? || options.nil? + request(:method => "post", :path => "/drives/create", :expects => 200, :options => options) + end + + end + end + end +end diff --git a/lib/fog/serverlove/requests/compute/update_drive.rb b/lib/fog/serverlove/requests/compute/update_drive.rb new file mode 100644 index 000000000..395cda706 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/update_drive.rb @@ -0,0 +1,15 @@ +module Fog + module Compute + class Serverlove + class Real + + def update_drive(identifier, options) + return nil if identifier.nil? || identifier == "" + return nil if options.empty? || options.nil? + request(:method => "post", :path => "/drives/#{identifier}/set", :expects => 200, :options => options) + end + + end + end + end +end From 847712e0aef30a37e4650a94c7a28379b66d9a4d Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 14:03:46 +0100 Subject: [PATCH 18/57] Allowed setting of params as k/v pairs. This is needed for setting the request body for create/update calls. --- lib/fog/serverlove/compute.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 237278809..573d11b1c 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -47,6 +47,7 @@ module Fog "Accept" => "application/json" } ) + params[:body] = encode_pairs(params[:options]) unless params[:options].nil? response = @connection.request(params) raise_if_error!(response) @@ -56,7 +57,12 @@ module Fog response end - + def encode_pairs(params) + params.keys.collect do |key| + "#{key} #{params[key]}" + end.join("\n") + end + def raise_if_error!(response) case response.status when 400 then From a648f9d4eb1c5f9ca2cdd3e5a0452317e21180fc Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 14:14:17 +0100 Subject: [PATCH 19/57] Added create/update functionality. --- lib/fog/serverlove/models/compute/drive.rb | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb index 28f8893ed..3a1fcc1d8 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -16,22 +16,28 @@ module Fog attribute :encryption_cipher, :aliases => 'encryption:cipher' def save - requires :identity - connection.update_drive(identity, attributes) + connection.update_drive(identity, allowed_attributes) true end def create(attributes) requires :name - connection.create_drive(attributes) - true + requires :size + attributes = Fog::Compute::Serverlove::Drive.new(attributes).allowed_attributes + Fog::Compute::Serverlove::Drive.new(connection.create_drive(attributes).body) end def destroy requires :identity connection.destroy_drive(identity) true - end + end + + def allowed_attributes + allowed = [:name, :size] + attributes.select {|k,v| allowed.include? k} + end + end end end From f23abc0955d0d3d1d89a5b78ba41ae22719b74bd Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 17:00:13 +0100 Subject: [PATCH 20/57] Made create/save conform to the Fog API. i.e. drive = Fog::Compute[:serverlove].drives.create(name: 'FooFoo', size: 12345) drive.name = "BarBar" drive.save --- lib/fog/serverlove/models/compute/drive.rb | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb index 3a1fcc1d8..e127d4279 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -16,17 +16,20 @@ module Fog attribute :encryption_cipher, :aliases => 'encryption:cipher' def save - connection.update_drive(identity, allowed_attributes) + attributes = {} + + if(identity) + attributes = connection.update_drive(identity, allowed_attributes).body + else + requires :name + requires :size + attributes = connection.create_drive(allowed_attributes).body + end + + merge_attributes(attributes) true end - def create(attributes) - requires :name - requires :size - attributes = Fog::Compute::Serverlove::Drive.new(attributes).allowed_attributes - Fog::Compute::Serverlove::Drive.new(connection.create_drive(attributes).body) - end - def destroy requires :identity connection.destroy_drive(identity) From 87c2a09a73bfd111bcc2ea1f29f2681b72fc8869 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 17:11:19 +0100 Subject: [PATCH 21/57] Returning self is totes better than bools. --- lib/fog/serverlove/models/compute/drive.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb index e127d4279..640d27e9b 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/drive.rb @@ -27,13 +27,13 @@ module Fog end merge_attributes(attributes) - true + self end def destroy requires :identity connection.destroy_drive(identity) - true + self end def allowed_attributes From a809a0717840b834eb107dbe3d926ba497b7ee6b Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 17:36:16 +0100 Subject: [PATCH 22/57] Fog calls drives "images", rename for consistency. --- lib/fog/serverlove/compute.rb | 12 ++-- lib/fog/serverlove/models/compute/drives.rb | 25 ------- .../models/compute/{drive.rb => image.rb} | 14 ++-- lib/fog/serverlove/models/compute/images.rb | 25 +++++++ .../{create_drive.rb => create_image.rb} | 2 +- .../{destroy_drive.rb => destroy_image.rb} | 2 +- .../compute/{get_drives.rb => get_images.rb} | 2 +- .../{update_drive.rb => update_image.rb} | 2 +- .../requests/compute/drive_tests.rb | 68 +++++++++++++++++++ 9 files changed, 112 insertions(+), 40 deletions(-) delete mode 100644 lib/fog/serverlove/models/compute/drives.rb rename lib/fog/serverlove/models/compute/{drive.rb => image.rb} (71%) create mode 100644 lib/fog/serverlove/models/compute/images.rb rename lib/fog/serverlove/requests/compute/{create_drive.rb => create_image.rb} (88%) rename lib/fog/serverlove/requests/compute/{destroy_drive.rb => destroy_image.rb} (83%) rename lib/fog/serverlove/requests/compute/{get_drives.rb => get_images.rb} (87%) rename lib/fog/serverlove/requests/compute/{update_drive.rb => update_image.rb} (87%) create mode 100644 tests/serverlove/requests/compute/drive_tests.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 573d11b1c..7e8e8e995 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -9,14 +9,14 @@ module Fog recognizes :serverlove_api_url request_path 'fog/serverlove/requests/compute' - request :get_drives - request :destroy_drive - request :create_drive - request :update_drive + request :get_images + request :destroy_image + request :create_image + request :update_image model_path 'fog/serverlove/models/compute' - model :drive - collection :drives + model :image + collection :images class Mock diff --git a/lib/fog/serverlove/models/compute/drives.rb b/lib/fog/serverlove/models/compute/drives.rb deleted file mode 100644 index ca3f41556..000000000 --- a/lib/fog/serverlove/models/compute/drives.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'fog/core/collection' -require 'fog/serverlove/models/compute/drive' - -module Fog - module Compute - class Serverlove - - class Drives < Fog::Collection - - model Fog::Compute::Serverlove::Drive - - def all - data = connection.get_drives.body - load(data) - end - - def get(drive_id) - connection.get_drive(drive_id) - end - - end - - end - end -end diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/image.rb similarity index 71% rename from lib/fog/serverlove/models/compute/drive.rb rename to lib/fog/serverlove/models/compute/image.rb index 640d27e9b..8ad2be231 100644 --- a/lib/fog/serverlove/models/compute/drive.rb +++ b/lib/fog/serverlove/models/compute/image.rb @@ -4,9 +4,9 @@ module Fog module Compute class Serverlove - class Drive < Fog::Model + class Image < Fog::Model - identity :drive + identity :id, :aliases => 'drive' attribute :name attribute :user @@ -19,20 +19,24 @@ module Fog attributes = {} if(identity) - attributes = connection.update_drive(identity, allowed_attributes).body + attributes = connection.update_image(identity, allowed_attributes).body else requires :name requires :size - attributes = connection.create_drive(allowed_attributes).body + attributes = connection.create_image(allowed_attributes).body end merge_attributes(attributes) self end + + def ready? + status.upcase == 'ACTIVE' + end def destroy requires :identity - connection.destroy_drive(identity) + connection.destroy_image(identity) self end diff --git a/lib/fog/serverlove/models/compute/images.rb b/lib/fog/serverlove/models/compute/images.rb new file mode 100644 index 000000000..77524ab19 --- /dev/null +++ b/lib/fog/serverlove/models/compute/images.rb @@ -0,0 +1,25 @@ +require 'fog/core/collection' +require 'fog/serverlove/models/compute/image' + +module Fog + module Compute + class Serverlove + + class Images < Fog::Collection + + model Fog::Compute::Serverlove::Image + + def all + data = connection.get_images.body + load(data) + end + + def get(image_id) + connection.get_image(image_id) + end + + end + + end + end +end diff --git a/lib/fog/serverlove/requests/compute/create_drive.rb b/lib/fog/serverlove/requests/compute/create_image.rb similarity index 88% rename from lib/fog/serverlove/requests/compute/create_drive.rb rename to lib/fog/serverlove/requests/compute/create_image.rb index f4fdea990..1cfa976c2 100644 --- a/lib/fog/serverlove/requests/compute/create_drive.rb +++ b/lib/fog/serverlove/requests/compute/create_image.rb @@ -3,7 +3,7 @@ module Fog class Serverlove class Real - def create_drive(options) + def create_image(options) return nil if options.empty? || options.nil? request(:method => "post", :path => "/drives/create", :expects => 200, :options => options) end diff --git a/lib/fog/serverlove/requests/compute/destroy_drive.rb b/lib/fog/serverlove/requests/compute/destroy_image.rb similarity index 83% rename from lib/fog/serverlove/requests/compute/destroy_drive.rb rename to lib/fog/serverlove/requests/compute/destroy_image.rb index 34077d2ad..745015084 100644 --- a/lib/fog/serverlove/requests/compute/destroy_drive.rb +++ b/lib/fog/serverlove/requests/compute/destroy_image.rb @@ -3,7 +3,7 @@ module Fog class Serverlove class Real - def destroy_drive(drive_id) + def destroy_image(drive_id) request(:method => "post", :path => "/drives/#{drive_id}/destroy", :expects => 204) end diff --git a/lib/fog/serverlove/requests/compute/get_drives.rb b/lib/fog/serverlove/requests/compute/get_images.rb similarity index 87% rename from lib/fog/serverlove/requests/compute/get_drives.rb rename to lib/fog/serverlove/requests/compute/get_images.rb index 54ce1692e..c8e7c6282 100644 --- a/lib/fog/serverlove/requests/compute/get_drives.rb +++ b/lib/fog/serverlove/requests/compute/get_images.rb @@ -3,7 +3,7 @@ module Fog class Serverlove class Real - def get_drives + def get_images request(:method => "get", :path => "/drives/info", :expects => 200) end diff --git a/lib/fog/serverlove/requests/compute/update_drive.rb b/lib/fog/serverlove/requests/compute/update_image.rb similarity index 87% rename from lib/fog/serverlove/requests/compute/update_drive.rb rename to lib/fog/serverlove/requests/compute/update_image.rb index 395cda706..f7e532833 100644 --- a/lib/fog/serverlove/requests/compute/update_drive.rb +++ b/lib/fog/serverlove/requests/compute/update_image.rb @@ -3,7 +3,7 @@ module Fog class Serverlove class Real - def update_drive(identifier, options) + def update_image(identifier, options) return nil if identifier.nil? || identifier == "" return nil if options.empty? || options.nil? request(:method => "post", :path => "/drives/#{identifier}/set", :expects => 200, :options => options) diff --git a/tests/serverlove/requests/compute/drive_tests.rb b/tests/serverlove/requests/compute/drive_tests.rb new file mode 100644 index 000000000..94768d1e5 --- /dev/null +++ b/tests/serverlove/requests/compute/drive_tests.rb @@ -0,0 +1,68 @@ +Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do + + @image_format = { + 'created' => Fog::Nullable::String, + 'id' => Integer, + 'name' => String, + 'progress' => Fog::Nullable::Integer, + 'serverId' => Fog::Nullable::Integer, + 'status' => String, + 'updated' => String + } + + tests('success') do + + @server = Fog::Compute[:serverlove].servers.create(:flavor_id => 1, :image_id => 19) + @server.wait_for { ready? } + @image_id = nil + + tests("#create_image(#{@server.id})").formats(@image_format) do + data = Fog::Compute[:serverlove].create_image(@server.id).body['image'] + @image_id = data['id'] + data + end + + unless Fog.mocking? + Fog::Compute[:serverlove].images.get(@image_id).wait_for { ready? } + end + + tests("#get_image_details(#{@image_id})").formats(@image_format) do + pending if Fog.mocking? + Fog::Compute[:serverlove].get_image_details(@image_id).body['image'] + end + + tests('#list_images').formats({'images' => [serverlove::Compute::Formats::SUMMARY]}) do + Fog::Compute[:serverlove].list_images.body + end + + tests('#list_images_detail').formats({'images' => [@image_format]}) do + Fog::Compute[:serverlove].list_images_detail.body + end + + unless Fog.mocking? + Fog::Compute[:serverlove].images.get(@image_id).wait_for { ready? } + end + + tests("#delete_image(#{@image_id})").succeeds do + pending if Fog.mocking? # because it will fail without the wait just above here, which won't work + Fog::Compute[:serverlove].delete_image(@image_id) + end + + @server.destroy + + end + + tests('failure') do + + tests('#delete_image(0)').raises(Excon::Errors::BadRequest) do + Fog::Compute[:serverlove].delete_image(0) + end + + tests('#get_image_details(0)').raises(Fog::Compute::serverlove::NotFound) do + pending if Fog.mocking? + Fog::Compute[:serverlove].get_image_details(0) + end + + end + +end From 30520ae493945f2d7e42f7ed23b33e68aa8cb19d Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 17:59:24 +0100 Subject: [PATCH 23/57] Beginnings of shin do request tests. --- tests/helper.rb | 2 +- .../requests/compute/drive_tests.rb | 68 ------------------- .../requests/compute/image_tests.rb | 30 ++++++++ 3 files changed, 31 insertions(+), 69 deletions(-) delete mode 100644 tests/serverlove/requests/compute/drive_tests.rb create mode 100644 tests/serverlove/requests/compute/image_tests.rb diff --git a/tests/helper.rb b/tests/helper.rb index f77be689f..cb546bd78 100644 --- a/tests/helper.rb +++ b/tests/helper.rb @@ -12,7 +12,7 @@ def array_differences(array_a, array_b) end # check to see which credentials are available and add others to the skipped tags list -all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'glesys', 'gogrid', 'google', 'hp', 'linode', 'local', 'ninefold', 'newservers', 'openstack', 'rackspace', 'slicehost', 'stormondemand', 'voxel', 'zerigo'] +all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'glesys', 'gogrid', 'google', 'hp', 'linode', 'local', 'ninefold', 'newservers', 'openstack', 'rackspace', 'serverlove' 'slicehost', 'stormondemand', 'voxel', 'zerigo'] available_providers = Fog.available_providers.map {|provider| provider.downcase} for provider in (all_providers - available_providers) Formatador.display_line("[yellow]Skipping tests for [bold]#{provider}[/] [yellow]due to lacking credentials (add some to '~/.fog' to run them)[/]") diff --git a/tests/serverlove/requests/compute/drive_tests.rb b/tests/serverlove/requests/compute/drive_tests.rb deleted file mode 100644 index 94768d1e5..000000000 --- a/tests/serverlove/requests/compute/drive_tests.rb +++ /dev/null @@ -1,68 +0,0 @@ -Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do - - @image_format = { - 'created' => Fog::Nullable::String, - 'id' => Integer, - 'name' => String, - 'progress' => Fog::Nullable::Integer, - 'serverId' => Fog::Nullable::Integer, - 'status' => String, - 'updated' => String - } - - tests('success') do - - @server = Fog::Compute[:serverlove].servers.create(:flavor_id => 1, :image_id => 19) - @server.wait_for { ready? } - @image_id = nil - - tests("#create_image(#{@server.id})").formats(@image_format) do - data = Fog::Compute[:serverlove].create_image(@server.id).body['image'] - @image_id = data['id'] - data - end - - unless Fog.mocking? - Fog::Compute[:serverlove].images.get(@image_id).wait_for { ready? } - end - - tests("#get_image_details(#{@image_id})").formats(@image_format) do - pending if Fog.mocking? - Fog::Compute[:serverlove].get_image_details(@image_id).body['image'] - end - - tests('#list_images').formats({'images' => [serverlove::Compute::Formats::SUMMARY]}) do - Fog::Compute[:serverlove].list_images.body - end - - tests('#list_images_detail').formats({'images' => [@image_format]}) do - Fog::Compute[:serverlove].list_images_detail.body - end - - unless Fog.mocking? - Fog::Compute[:serverlove].images.get(@image_id).wait_for { ready? } - end - - tests("#delete_image(#{@image_id})").succeeds do - pending if Fog.mocking? # because it will fail without the wait just above here, which won't work - Fog::Compute[:serverlove].delete_image(@image_id) - end - - @server.destroy - - end - - tests('failure') do - - tests('#delete_image(0)').raises(Excon::Errors::BadRequest) do - Fog::Compute[:serverlove].delete_image(0) - end - - tests('#get_image_details(0)').raises(Fog::Compute::serverlove::NotFound) do - pending if Fog.mocking? - Fog::Compute[:serverlove].get_image_details(0) - end - - end - -end diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb new file mode 100644 index 000000000..2ef569c73 --- /dev/null +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -0,0 +1,30 @@ +Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do + + @image_format = { + 'id' => String, + 'name' => String, + 'user' => String, + 'size' => Integer, + 'claimed' => Fog::Nullable::String + 'status' => String, + 'encryption_cipher' => String + } + + tests('success') do + + attributes = { name: 'Test', size: 12345 } + + tests("#create_image").formats(@image_format) do + @image = Fog::Compute[:serverlove].create(attributes) + @image + end + + tests('#list_images_detail').formats({'images' => [@image_format]}) do + Fog::Compute[:serverlove].images + end + + @image.destroy + + end + +end From de4574200ed0e321a8785ecf77fd6352e69a708c Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 20:50:06 +0100 Subject: [PATCH 24/57] Need these to run the server love tests. --- lib/fog/bin.rb | 1 + lib/fog/bin/serverlove.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/fog/bin/serverlove.rb diff --git a/lib/fog/bin.rb b/lib/fog/bin.rb index af4852a21..f42e076b6 100644 --- a/lib/fog/bin.rb +++ b/lib/fog/bin.rb @@ -75,6 +75,7 @@ require 'fog/bin/ninefold' require 'fog/bin/rackspace' require 'fog/bin/openstack' require 'fog/bin/ovirt' +require 'fog/bin/serverlove' require 'fog/bin/slicehost' require 'fog/bin/stormondemand' require 'fog/bin/terremark' diff --git a/lib/fog/bin/serverlove.rb b/lib/fog/bin/serverlove.rb new file mode 100644 index 000000000..62b722d3c --- /dev/null +++ b/lib/fog/bin/serverlove.rb @@ -0,0 +1,31 @@ +class Serverlove < Fog::Bin + class << self + + def class_for(key) + case key + when :compute + Fog::Compute::Serverlove + else + raise ArgumentError, "Unrecognized service: #{key}" + end + end + + def [](service) + @@connections ||= Hash.new do |hash, key| + hash[key] = case key + when :compute + Fog::Logger.warning("Serverlove[:compute] is not recommended, use Compute[:serverlove] for portability") + Fog::Compute.new(:provider => 'Serverlove') + else + raise ArgumentError, "Unrecognized service: #{key.inspect}" + end + end + @@connections[service] + end + + def services + Fog::Serverlove.services + end + + end +end From 6ac581118921f394ec8facb7f6dac71dbbda13d8 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 20:50:17 +0100 Subject: [PATCH 25/57] Beginnings of tests for image operations. --- .../requests/compute/image_tests.rb | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index 2ef569c73..50929eb6f 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -1,29 +1,34 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do @image_format = { - 'id' => String, + 'drive' => String, 'name' => String, 'user' => String, 'size' => Integer, - 'claimed' => Fog::Nullable::String + 'claimed' => Fog::Nullable::String, 'status' => String, - 'encryption_cipher' => String + 'encryption:cipher' => String, + 'read:bytes' => String, + 'write:bytes' => String, + 'read:requests' => String, + 'write:requests' => String } - + tests('success') do attributes = { name: 'Test', size: 12345 } tests("#create_image").formats(@image_format) do - @image = Fog::Compute[:serverlove].create(attributes) - @image + @image = Fog::Compute[:serverlove].create_image(attributes).body end - tests('#list_images_detail').formats({'images' => [@image_format]}) do + tests("#list_images").succeeds do Fog::Compute[:serverlove].images end - - @image.destroy + + tests("#destroy_image").succeeds do + Fog::Compute[:serverlove].destroy_image(@image['drive']) + end end From c66d55284c5c26befed12ca5cd573f14479dfd90 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 21:18:54 +0100 Subject: [PATCH 26/57] Adding mock for easier testing. --- .../requests/compute/create_image.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/fog/serverlove/requests/compute/create_image.rb b/lib/fog/serverlove/requests/compute/create_image.rb index 1cfa976c2..8c29665e3 100644 --- a/lib/fog/serverlove/requests/compute/create_image.rb +++ b/lib/fog/serverlove/requests/compute/create_image.rb @@ -9,6 +9,24 @@ module Fog end end + + class Mock + + def create_image(options = {}) + response = Excon::Response.new + response.status = 200 + + data = { + 'drive' => Fog::Mock.random_numbers(1000000).to_s, + 'name' => options['name'] || 'Test', + 'size' => options['size'] || 12345 + } + + response.body = data + response + end + + end end end end From 24b7ba1eab24de678a0a7a71d4fc5ed060249922 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 21:38:29 +0100 Subject: [PATCH 27/57] Added get_image function. --- lib/fog/serverlove/compute.rb | 1 + lib/fog/serverlove/models/compute/images.rb | 3 ++- lib/fog/serverlove/requests/compute/get_image.rb | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 lib/fog/serverlove/requests/compute/get_image.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 7e8e8e995..c9fa8df0a 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -9,6 +9,7 @@ module Fog recognizes :serverlove_api_url request_path 'fog/serverlove/requests/compute' + request :get_image request :get_images request :destroy_image request :create_image diff --git a/lib/fog/serverlove/models/compute/images.rb b/lib/fog/serverlove/models/compute/images.rb index 77524ab19..d6706603d 100644 --- a/lib/fog/serverlove/models/compute/images.rb +++ b/lib/fog/serverlove/models/compute/images.rb @@ -15,7 +15,8 @@ module Fog end def get(image_id) - connection.get_image(image_id) + data = connection.get_image(image_id).body + new(data) end end diff --git a/lib/fog/serverlove/requests/compute/get_image.rb b/lib/fog/serverlove/requests/compute/get_image.rb new file mode 100644 index 000000000..a13e9d1cc --- /dev/null +++ b/lib/fog/serverlove/requests/compute/get_image.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def get_image(image_id) + request(:method => "get", :path => "/drives/#{image_id}/info", :expects => 200) + end + + end + end + end +end \ No newline at end of file From d03bc6607ecb30acd23fd614b6326b9f602c7ab6 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 29 Apr 2012 21:38:46 +0100 Subject: [PATCH 28/57] Added meaningful test for updating images. --- tests/serverlove/requests/compute/image_tests.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index 50929eb6f..4ea87e77f 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -26,6 +26,12 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do Fog::Compute[:serverlove].images end + tests("#update_image").returns(true) do + @image['name'] = "Diff" + Fog::Compute[:serverlove].update_image(@image['drive'], { name: @image['name'], size: @image['size']}) + Fog::Compute[:serverlove].images.get(@image['drive']).name == "Diff" + end + tests("#destroy_image").succeeds do Fog::Compute[:serverlove].destroy_image(@image['drive']) end From bfe1fdbe7d28931dcaeddc7b3205fa45eb9a2676 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 4 May 2012 18:57:35 +0100 Subject: [PATCH 29/57] Typo! --- tests/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helper.rb b/tests/helper.rb index cb546bd78..e629ffb16 100644 --- a/tests/helper.rb +++ b/tests/helper.rb @@ -12,7 +12,7 @@ def array_differences(array_a, array_b) end # check to see which credentials are available and add others to the skipped tags list -all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'glesys', 'gogrid', 'google', 'hp', 'linode', 'local', 'ninefold', 'newservers', 'openstack', 'rackspace', 'serverlove' 'slicehost', 'stormondemand', 'voxel', 'zerigo'] +all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'glesys', 'gogrid', 'google', 'hp', 'linode', 'local', 'ninefold', 'newservers', 'openstack', 'rackspace', 'serverlove', 'slicehost', 'stormondemand', 'voxel', 'zerigo'] available_providers = Fog.available_providers.map {|provider| provider.downcase} for provider in (all_providers - available_providers) Formatador.display_line("[yellow]Skipping tests for [bold]#{provider}[/] [yellow]due to lacking credentials (add some to '~/.fog' to run them)[/]") From 364a00d3cd7319bbc75c17716c5f24e238d9bf5e Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 22 Jun 2012 10:08:04 +0100 Subject: [PATCH 30/57] Fix conflict. --- lib/fog/providers.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/fog/providers.rb b/lib/fog/providers.rb index f7c4d8467..880b95900 100644 --- a/lib/fog/providers.rb +++ b/lib/fog/providers.rb @@ -21,11 +21,7 @@ require 'fog/ninefold' require 'fog/rackspace' require 'fog/openstack' require 'fog/ovirt' -<<<<<<< HEAD require 'fog/serverlove' -require 'fog/slicehost' -======= ->>>>>>> c2ed3c886d730764dd1c7168ae78ddafeba7d504 require 'fog/storm_on_demand' require 'fog/vcloud' require 'fog/virtual_box' From 73b74ba96442d16bd18219b1868810f356edd1cc Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 22 Jun 2012 10:33:16 +0100 Subject: [PATCH 31/57] This shouldn't be here. --- lib/fog/serverlove/models/compute/drive.rb | 34 ---------------------- 1 file changed, 34 deletions(-) delete mode 100644 lib/fog/serverlove/models/compute/drive.rb diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb deleted file mode 100644 index b9fab6574..000000000 --- a/lib/fog/serverlove/models/compute/drive.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'fog/core/model' - -module Fog - module Compute - class Serverlove - - class Drive < Fog::Model - - identity :drive - - attribute :name - attribute :user - attribute :size - attribute :claimed - attribute :status - attribute :encryption_cipher, :aliases => 'encryption:cipher' - - def save - - end - - def destroy - requires :identity - connection.destroy_drive(identity) - self - end - - def self.create(args) - - end - end - end - end -end From 873d969d9c1d57c3ac650f659b2468c29e00f8f4 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 22 Jun 2012 11:03:29 +0100 Subject: [PATCH 32/57] Merge changes. Begin server definitions. --- lib/fog/serverlove/compute.rb | 7 +++- lib/fog/serverlove/models/compute/drive.rb | 34 ------------------- lib/fog/serverlove/models/compute/server.rb | 28 +++++++++++++++ lib/fog/serverlove/models/compute/servers.rb | 25 ++++++++++++++ .../serverlove/requests/compute/get_server.rb | 13 +++++++ .../requests/compute/get_servers.rb | 13 +++++++ 6 files changed, 85 insertions(+), 35 deletions(-) delete mode 100644 lib/fog/serverlove/models/compute/drive.rb create mode 100644 lib/fog/serverlove/models/compute/server.rb create mode 100644 lib/fog/serverlove/models/compute/servers.rb create mode 100644 lib/fog/serverlove/requests/compute/get_server.rb create mode 100644 lib/fog/serverlove/requests/compute/get_servers.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index c9fa8df0a..cb4069564 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -15,10 +15,14 @@ module Fog request :create_image request :update_image - model_path 'fog/serverlove/models/compute' model :image collection :images + + request :get_servers + model :server + collection :servers + class Mock def initialize(options) @@ -64,6 +68,7 @@ module Fog end.join("\n") end + # TODO def raise_if_error!(response) case response.status when 400 then diff --git a/lib/fog/serverlove/models/compute/drive.rb b/lib/fog/serverlove/models/compute/drive.rb deleted file mode 100644 index b9fab6574..000000000 --- a/lib/fog/serverlove/models/compute/drive.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'fog/core/model' - -module Fog - module Compute - class Serverlove - - class Drive < Fog::Model - - identity :drive - - attribute :name - attribute :user - attribute :size - attribute :claimed - attribute :status - attribute :encryption_cipher, :aliases => 'encryption:cipher' - - def save - - end - - def destroy - requires :identity - connection.destroy_drive(identity) - self - end - - def self.create(args) - - end - end - end - end -end diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb new file mode 100644 index 000000000..cabb28875 --- /dev/null +++ b/lib/fog/serverlove/models/compute/server.rb @@ -0,0 +1,28 @@ +require 'fog/core/model' + +module Fog + module Compute + class Serverlove + + class Server < Fog::Model + + identity :server + + attribute :server + attribute :status + attribute :user + attribute :started + + def save + # TODO + end + + def destroy + requires :identity + connection.destroy_server(identity) + true + end + end + end + end +end diff --git a/lib/fog/serverlove/models/compute/servers.rb b/lib/fog/serverlove/models/compute/servers.rb new file mode 100644 index 000000000..096526fc0 --- /dev/null +++ b/lib/fog/serverlove/models/compute/servers.rb @@ -0,0 +1,25 @@ +require 'fog/core/collection' +require 'fog/serverlove/models/compute/drive' + +module Fog + module Compute + class Serverlove + + class Servers < Fog::Collection + + model Fog::Compute::Serverlove::Server + + def all + data = connection.get_servers.body + load(data) + end + + def get(server_id) + load(connection.get_drive(server_id).body) + end + + end + + end + end +end diff --git a/lib/fog/serverlove/requests/compute/get_server.rb b/lib/fog/serverlove/requests/compute/get_server.rb new file mode 100644 index 000000000..219ff8bb8 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/get_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def get_server(server_id) + request(:method => "get", :path => "/servers/#{server_id}/info", :expects => 200) + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/compute/get_servers.rb b/lib/fog/serverlove/requests/compute/get_servers.rb new file mode 100644 index 000000000..19d9bf387 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/get_servers.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def get_servers + request(:method => "get", :path => "/servers/info", :expects => 200) + end + + end + end + end +end \ No newline at end of file From 36b19d5ff15ff1bfc514c4ce1bb61e7bd5177966 Mon Sep 17 00:00:00 2001 From: James Rose Date: Fri, 22 Jun 2012 11:06:36 +0100 Subject: [PATCH 33/57] Typo. --- lib/fog/serverlove/compute.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index cb4069564..17567b8c6 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -9,16 +9,21 @@ module Fog recognizes :serverlove_api_url request_path 'fog/serverlove/requests/compute' + + # Image request :get_image request :get_images request :destroy_image request :create_image request :update_image + + # Server + request :get_servers + + model_path 'fog/serverlove/models/compute' model :image collection :images - - request :get_servers model :server collection :servers From 3831f81de7c1bd95287e4e6f684c13d28690b992 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 22 Jun 2012 14:47:42 +0100 Subject: [PATCH 34/57] Can't run shindo tests with old references. --- lib/fog/serverlove/models/compute/servers.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/fog/serverlove/models/compute/servers.rb b/lib/fog/serverlove/models/compute/servers.rb index 096526fc0..2a071a1db 100644 --- a/lib/fog/serverlove/models/compute/servers.rb +++ b/lib/fog/serverlove/models/compute/servers.rb @@ -1,5 +1,6 @@ require 'fog/core/collection' -require 'fog/serverlove/models/compute/drive' +require 'fog/serverlove/models/compute/server' +require 'fog/serverlove/models/compute/image' module Fog module Compute @@ -15,7 +16,7 @@ module Fog end def get(server_id) - load(connection.get_drive(server_id).body) + load(connection.get_image(server_id).body) end end From 14efc2f14cde68fc287dea25d78fdd6818e89142 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 22 Jun 2012 16:09:17 +0100 Subject: [PATCH 35/57] Added loading of standard image. Currently not working: Expected(204) <=> Actual(404 Not Found) request => {:connect_timeout=>60, :headers=>{"Authorization"=>"Basic YWE4ZWIxYzktYzc4OC00MDlmLWJmZjQtYjAyMjVjMDE0MDQ1OkFkZ1hYSGVUTmY3TTJHR1l2NEI3WkpnWE1ISkJMY1E2dlJBejRZUUg=", "Accept"=>"application/json", "Host"=>"api.z1-man.serverlove.com:443", "Content-Length"=>0}, :instrumentor_name=>"excon", :mock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/Users/seanhandley/.rvm/gems/ruby-1.9.3-p125@fog_gem/gems/excon-0.14.1/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"api.z1-man.serverlove.com", :path=>"/drives/aea15650-5001-4cb8-8146-8c9835f5b880/image/679f5f44-0be7-4745-a658-cccd4334c1aa", :port=>"443", :query=>nil, :scheme=>"https", :method=>"post", :expects=>204} response => #"BaseHTTP/0.3 Python/2.6.6", "Date"=>"Fri, 22 Jun 2012 15:03:50 GMT", "X-Elastic-Error"=>"missing drive", "Connection"=>"close", "Content-Type"=>"text/plain"}, @status=404> (Excon::Errors::NotFound) --- lib/fog/serverlove/compute.rb | 1 + lib/fog/serverlove/models/compute/image.rb | 5 +++++ .../requests/compute/load_standard_image.rb | 13 +++++++++++++ tests/serverlove/requests/compute/image_tests.rb | 7 ++++++- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 lib/fog/serverlove/requests/compute/load_standard_image.rb diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index 17567b8c6..e2a1e4c59 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -16,6 +16,7 @@ module Fog request :destroy_image request :create_image request :update_image + request :load_standard_image # Server request :get_servers diff --git a/lib/fog/serverlove/models/compute/image.rb b/lib/fog/serverlove/models/compute/image.rb index 8ad2be231..fcc3532f2 100644 --- a/lib/fog/serverlove/models/compute/image.rb +++ b/lib/fog/serverlove/models/compute/image.rb @@ -30,6 +30,11 @@ module Fog self end + def load_standard_image(standard_image_uuid) + requires :identity + connection.load_standard_image(identity, standard_image_uuid) + end + def ready? status.upcase == 'ACTIVE' end diff --git a/lib/fog/serverlove/requests/compute/load_standard_image.rb b/lib/fog/serverlove/requests/compute/load_standard_image.rb new file mode 100644 index 000000000..341b5c5c1 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/load_standard_image.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def load_standard_image(destination_image, source_image) + request(:method => "post", :path => "/drives/#{destination_image}/image/#{source_image}", :expects => 204) + end + + end + end + end +end diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index 4ea87e77f..97fc3da74 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -16,7 +16,7 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do tests('success') do - attributes = { name: 'Test', size: 12345 } + attributes = { 'name' => 'Test', 'size' => '1234567890' } tests("#create_image").formats(@image_format) do @image = Fog::Compute[:serverlove].create_image(attributes).body @@ -32,6 +32,11 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do Fog::Compute[:serverlove].images.get(@image['drive']).name == "Diff" end + tests("#load_standard_image").succeeds do + # Load centos + Fog::Compute[:serverlove].load_standard_image(@image['drive'], '679f5f44-0be7-4745-a658-cccd4334c1aa') + end + tests("#destroy_image").succeeds do Fog::Compute[:serverlove].destroy_image(@image['drive']) end From aaabc1d6a9b70fbf471810d32049e49705c95812 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 22 Jun 2012 16:26:11 +0100 Subject: [PATCH 36/57] Shindo tests pass. Turns out our UUIDs for pre-built drives are way out of date. --- lib/fog/serverlove/models/compute/image.rb | 1 + tests/serverlove/requests/compute/image_tests.rb | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/models/compute/image.rb b/lib/fog/serverlove/models/compute/image.rb index fcc3532f2..557cbeaa8 100644 --- a/lib/fog/serverlove/models/compute/image.rb +++ b/lib/fog/serverlove/models/compute/image.rb @@ -13,6 +13,7 @@ module Fog attribute :size attribute :claimed attribute :status + attribute :imaging attribute :encryption_cipher, :aliases => 'encryption:cipher' def save diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index 97fc3da74..9a58a1cec 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -16,7 +16,7 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do tests('success') do - attributes = { 'name' => 'Test', 'size' => '1234567890' } + attributes = { 'name' => 'Test', 'size' => '4234567890' } tests("#create_image").formats(@image_format) do @image = Fog::Compute[:serverlove].create_image(attributes).body @@ -30,11 +30,13 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do @image['name'] = "Diff" Fog::Compute[:serverlove].update_image(@image['drive'], { name: @image['name'], size: @image['size']}) Fog::Compute[:serverlove].images.get(@image['drive']).name == "Diff" + end - tests("#load_standard_image").succeeds do + tests("#load_standard_image").returns(true) do # Load centos - Fog::Compute[:serverlove].load_standard_image(@image['drive'], '679f5f44-0be7-4745-a658-cccd4334c1aa') + Fog::Compute[:serverlove].load_standard_image(@image['drive'], '88ed067f-d2b8-42ce-a25f-5297818a3b6f') + Fog::Compute[:serverlove].images.get(@image['drive']).imaging != "" # This will be "x%" when imaging end tests("#destroy_image").succeeds do From 743b95a827bfcfacec42e90734e3848f38ad751b Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 6 Jul 2012 13:56:46 +0100 Subject: [PATCH 37/57] Test that we can view servers. --- tests/serverlove/requests/compute/server_tests.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/serverlove/requests/compute/server_tests.rb diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb new file mode 100644 index 000000000..57f4dea17 --- /dev/null +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -0,0 +1,11 @@ +Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do + + tests('success') do + + tests("#list_servers").succeeds do + Fog::Compute[:serverlove].servers + end + + end + +end From 4fa4c6d79f6daf562cd9c7ca4927fc1b2179f830 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 12:23:49 +0200 Subject: [PATCH 38/57] Whitespace adjustments. --- lib/fog/serverlove/requests/compute/create_image.rb | 2 +- tests/serverlove/requests/compute/image_tests.rb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/requests/compute/create_image.rb b/lib/fog/serverlove/requests/compute/create_image.rb index 8c29665e3..ab77e9a98 100644 --- a/lib/fog/serverlove/requests/compute/create_image.rb +++ b/lib/fog/serverlove/requests/compute/create_image.rb @@ -17,7 +17,7 @@ module Fog response.status = 200 data = { - 'drive' => Fog::Mock.random_numbers(1000000).to_s, + 'drive' => Fog::Mock.random_numbers(1000000).to_s, 'name' => options['name'] || 'Test', 'size' => options['size'] || 12345 } diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index 9a58a1cec..aa20669f1 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -1,7 +1,7 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do @image_format = { - 'drive' => String, + 'drive' => String, 'name' => String, 'user' => String, 'size' => Integer, @@ -30,7 +30,6 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do @image['name'] = "Diff" Fog::Compute[:serverlove].update_image(@image['drive'], { name: @image['name'], size: @image['size']}) Fog::Compute[:serverlove].images.get(@image['drive']).name == "Diff" - end tests("#load_standard_image").returns(true) do From 2f4ac6433ee80c6f6123a0b339b8a1a05f26fb4d Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 12:24:36 +0200 Subject: [PATCH 39/57] CRUDs + tests for servers. --- .../requests/compute/create_server.rb | 33 +++++++++++++++++++ .../requests/compute/destroy_server.rb | 13 ++++++++ .../requests/compute/update_server.rb | 15 +++++++++ .../requests/compute/server_tests.rb | 28 ++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 lib/fog/serverlove/requests/compute/create_server.rb create mode 100644 lib/fog/serverlove/requests/compute/destroy_server.rb create mode 100644 lib/fog/serverlove/requests/compute/update_server.rb diff --git a/lib/fog/serverlove/requests/compute/create_server.rb b/lib/fog/serverlove/requests/compute/create_server.rb new file mode 100644 index 000000000..cd044ab2b --- /dev/null +++ b/lib/fog/serverlove/requests/compute/create_server.rb @@ -0,0 +1,33 @@ +module Fog + module Compute + class Serverlove + class Real + + def create_server(options) + return nil if options.empty? || options.nil? + request(:method => "post", :path => "/servers/create", :expects => 200, :options => options) + end + + end + + class Mock + + def create_server(options = {}) + response = Excon::Response.new + response.status = 200 + + data = { + 'name' => options['name'] || 'Test', + 'cpu' => options['cpu'] || 1000, + 'persistent' => options['persistent'] || false, + 'vnc:password' => options['vnc:password'] || 'T35tServER!' + } + + response.body = data + response + end + + end + end + end +end diff --git a/lib/fog/serverlove/requests/compute/destroy_server.rb b/lib/fog/serverlove/requests/compute/destroy_server.rb new file mode 100644 index 000000000..692b8d22a --- /dev/null +++ b/lib/fog/serverlove/requests/compute/destroy_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def destroy_server(server_id) + request(:method => "post", :path => "/servers/#{server_id}/destroy", :expects => 204) + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/compute/update_server.rb b/lib/fog/serverlove/requests/compute/update_server.rb new file mode 100644 index 000000000..2994770e7 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/update_server.rb @@ -0,0 +1,15 @@ +module Fog + module Compute + class Serverlove + class Real + + def update_server(identifier, options) + return nil if identifier.nil? || identifier == "" + return nil if options.empty? || options.nil? + request(:method => "post", :path => "/servers/#{identifier}/set", :expects => 200, :options => options) + end + + end + end + end +end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 57f4dea17..56f963e6a 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -1,10 +1,38 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do + @server_format = { + 'server' => String, + 'name' => String, + 'user' => String, + 'status' => String, + 'started' => String, + 'cpu' => Integer, + 'persistent' => Fog::Nullable::String, + 'vnc:password' => String + } + tests('success') do + + attributes = { 'name' => 'Test', 'cpu' => '1000' } + + tests("#create_server").formats(@server_format) do + @server = Fog::Compute[:serverlove].create_server(attributes).body + end tests("#list_servers").succeeds do Fog::Compute[:serverlove].servers end + + tests("#update_server").returns(true) do + @server['name'] = "Diff" + Fog::Compute[:serverlove].update_server(@server['server'], { name: @server['name']}) + Fog::Compute[:serverlove].servers.get(@server['server']).name == "Diff" + end + + + tests("#destroy_server").succeeds do + Fog::Compute[:serverlove].destroy_server(@server['server']) + end end From b670d5e719feab2a038063008ebacd21b09185d0 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 12:30:45 +0200 Subject: [PATCH 40/57] Added server power cycle actions + basic tests. TODO: More complex scenarios, edges cases, plus feedback tests for state following each power cycle action. --- .../requests/compute/reset_server.rb | 13 +++++++++++++ .../requests/compute/shutdown_server.rb | 13 +++++++++++++ .../requests/compute/start_server.rb | 13 +++++++++++++ .../requests/compute/stop_server.rb | 13 +++++++++++++ .../requests/compute/server_tests.rb | 19 +++++++++++++++++-- 5 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 lib/fog/serverlove/requests/compute/reset_server.rb create mode 100644 lib/fog/serverlove/requests/compute/shutdown_server.rb create mode 100644 lib/fog/serverlove/requests/compute/start_server.rb create mode 100644 lib/fog/serverlove/requests/compute/stop_server.rb diff --git a/lib/fog/serverlove/requests/compute/reset_server.rb b/lib/fog/serverlove/requests/compute/reset_server.rb new file mode 100644 index 000000000..99b0de64d --- /dev/null +++ b/lib/fog/serverlove/requests/compute/reset_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def reset_server(server_id) + request(:method => "post", :path => "/servers/#{server_id}/reset", :expects => 204) + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/compute/shutdown_server.rb b/lib/fog/serverlove/requests/compute/shutdown_server.rb new file mode 100644 index 000000000..ebc24893f --- /dev/null +++ b/lib/fog/serverlove/requests/compute/shutdown_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def shutdown_server(server_id) + request(:method => "post", :path => "/servers/#{server_id}/shutdown", :expects => 204) + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/compute/start_server.rb b/lib/fog/serverlove/requests/compute/start_server.rb new file mode 100644 index 000000000..f0f4801ea --- /dev/null +++ b/lib/fog/serverlove/requests/compute/start_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def start_server(server_id) + request(:method => "post", :path => "/servers/#{server_id}/start", :expects => 204) + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/serverlove/requests/compute/stop_server.rb b/lib/fog/serverlove/requests/compute/stop_server.rb new file mode 100644 index 000000000..2cc73b8e7 --- /dev/null +++ b/lib/fog/serverlove/requests/compute/stop_server.rb @@ -0,0 +1,13 @@ +module Fog + module Compute + class Serverlove + class Real + + def stop_server(server_id) + request(:method => "post", :path => "/servers/#{server_id}/stop", :expects => 204) + end + + end + end + end +end \ No newline at end of file diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 56f963e6a..44ff4a6e8 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -13,7 +13,7 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do tests('success') do - attributes = { 'name' => 'Test', 'cpu' => '1000' } + attributes = { 'name' => 'Test', 'cpu' => '1000', 'persistent' => 'true' } tests("#create_server").formats(@server_format) do @server = Fog::Compute[:serverlove].create_server(attributes).body @@ -28,7 +28,22 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do Fog::Compute[:serverlove].update_server(@server['server'], { name: @server['name']}) Fog::Compute[:serverlove].servers.get(@server['server']).name == "Diff" end - + + tests("#start_server").succeeds do + Fog::Compute[:serverlove].start_server(@server['server']) + end + + tests("#reset_server").succeeds do + Fog::Compute[:serverlove].reset_server(@server['server']) + end + + tests("#shutdown_server").succeeds do + Fog::Compute[:serverlove].shutdown_server(@server['server']) + end + + tests("#stop_server").succeeds do + Fog::Compute[:serverlove].stop_server(@server['server']) + end tests("#destroy_server").succeeds do Fog::Compute[:serverlove].destroy_server(@server['server']) From c74e39d9a875947ecdf29b8eb70e0a891f75adfc Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 13:40:03 +0200 Subject: [PATCH 41/57] Add new request methods to server object. --- lib/fog/serverlove/compute.rb | 8 ++++++ lib/fog/serverlove/models/compute/server.rb | 29 +++++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/fog/serverlove/compute.rb b/lib/fog/serverlove/compute.rb index e2a1e4c59..5b7c97bb1 100644 --- a/lib/fog/serverlove/compute.rb +++ b/lib/fog/serverlove/compute.rb @@ -20,6 +20,14 @@ module Fog # Server request :get_servers + request :get_server + request :destroy_server + request :create_server + request :update_server + request :start_server + request :stop_server + request :shutdown_server + request :reset_server model_path 'fog/serverlove/models/compute' diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index cabb28875..03e10cba9 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -6,22 +6,41 @@ module Fog class Server < Fog::Model - identity :server + identity :id, :aliases => 'server' - attribute :server + attribute :name + attribute :cpu + attribute :persistent + attribute :vnc_password, :aliases => 'vnc:password' attribute :status attribute :user attribute :started def save - # TODO + attributes = {} + + if(identity) + attributes = connection.update_server(identity, allowed_attributes).body + else + requires :name + requires :cpu + attributes = connection.create_server(allowed_attributes).body + end + + merge_attributes(attributes) + self end def destroy requires :identity connection.destroy_server(identity) - true - end + self + end + + def allowed_attributes + allowed = [:name, :cpu, :persistent, :vnc_password] + attributes.select {|k,v| allowed.include? k} + end end end end From 6bc724d9f31af9d9668e90a342de13ae90e05d0a Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 13:40:22 +0200 Subject: [PATCH 42/57] Use get_server, not get_image. --- lib/fog/serverlove/models/compute/servers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/models/compute/servers.rb b/lib/fog/serverlove/models/compute/servers.rb index 2a071a1db..d360b0520 100644 --- a/lib/fog/serverlove/models/compute/servers.rb +++ b/lib/fog/serverlove/models/compute/servers.rb @@ -16,7 +16,7 @@ module Fog end def get(server_id) - load(connection.get_image(server_id).body) + load(connection.get_server(server_id).body) end end From 6c0fd855cc83cc6dadde46320bf9b644fb01534f Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 13:55:06 +0200 Subject: [PATCH 43/57] Need a mock server id. --- lib/fog/serverlove/requests/compute/create_server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fog/serverlove/requests/compute/create_server.rb b/lib/fog/serverlove/requests/compute/create_server.rb index cd044ab2b..e3f3c8351 100644 --- a/lib/fog/serverlove/requests/compute/create_server.rb +++ b/lib/fog/serverlove/requests/compute/create_server.rb @@ -17,6 +17,7 @@ module Fog response.status = 200 data = { + 'server' => Fog::Mock.random_numbers(1000000).to_s, 'name' => options['name'] || 'Test', 'cpu' => options['cpu'] || 1000, 'persistent' => options['persistent'] || false, From 789816cf91c952e0fba0b30746dd5596d8334a79 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 17:19:53 +0200 Subject: [PATCH 44/57] This was plain wrong - works now! --- lib/fog/serverlove/models/compute/servers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fog/serverlove/models/compute/servers.rb b/lib/fog/serverlove/models/compute/servers.rb index d360b0520..a64f5a0c0 100644 --- a/lib/fog/serverlove/models/compute/servers.rb +++ b/lib/fog/serverlove/models/compute/servers.rb @@ -1,6 +1,5 @@ require 'fog/core/collection' require 'fog/serverlove/models/compute/server' -require 'fog/serverlove/models/compute/image' module Fog module Compute @@ -16,7 +15,8 @@ module Fog end def get(server_id) - load(connection.get_server(server_id).body) + data = connection.get_server(server_id).body + new(data) end end From e805e7577bbae2e34e622ad8698d95cad42dffb7 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 17:20:19 +0200 Subject: [PATCH 45/57] Don't start servers by default. This is handy if we haven't yet assigned a boot disk. --- lib/fog/serverlove/requests/compute/create_server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/requests/compute/create_server.rb b/lib/fog/serverlove/requests/compute/create_server.rb index e3f3c8351..34bf6016e 100644 --- a/lib/fog/serverlove/requests/compute/create_server.rb +++ b/lib/fog/serverlove/requests/compute/create_server.rb @@ -5,7 +5,7 @@ module Fog def create_server(options) return nil if options.empty? || options.nil? - request(:method => "post", :path => "/servers/create", :expects => 200, :options => options) + request(:method => "post", :path => "/servers/create/stopped", :expects => 200, :options => options) end end From b5a96c90e99a145cc8a3806875ea3b0dd7098e65 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 17:27:12 +0200 Subject: [PATCH 46/57] Contrary to the documentation, this actually returns a 200 status rather than a 204. --- lib/fog/serverlove/requests/compute/start_server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/requests/compute/start_server.rb b/lib/fog/serverlove/requests/compute/start_server.rb index f0f4801ea..a8e562ff4 100644 --- a/lib/fog/serverlove/requests/compute/start_server.rb +++ b/lib/fog/serverlove/requests/compute/start_server.rb @@ -4,7 +4,7 @@ module Fog class Real def start_server(server_id) - request(:method => "post", :path => "/servers/#{server_id}/start", :expects => 204) + request(:method => "post", :path => "/servers/#{server_id}/start", :expects => 200) end end From 212ea7b3edd0a4fd73d400d90c5751d903e8c405 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 17:27:44 +0200 Subject: [PATCH 47/57] Allow setting of memory and disk drives. --- lib/fog/serverlove/models/compute/server.rb | 8 ++++- .../requests/compute/server_tests.rb | 33 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index 03e10cba9..49ffda088 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -10,6 +10,12 @@ module Fog attribute :name attribute :cpu + attribute :mem + attribute :ide_0_0, :aliases => 'ide:0:0' + attribute :ide_0_1, :aliases => 'ide:0:1' + attribute :ide_1_0, :aliases => 'ide:1:0' + attribute :ide_1_1, :aliases => 'ide:1:1' + attribute :boot attribute :persistent attribute :vnc_password, :aliases => 'vnc:password' attribute :status @@ -38,7 +44,7 @@ module Fog end def allowed_attributes - allowed = [:name, :cpu, :persistent, :vnc_password] + allowed = [:name, :cpu, :mem, :persistent, :vnc_password] attributes.select {|k,v| allowed.include? k} end end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 44ff4a6e8..83834a0f2 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -5,15 +5,16 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do 'name' => String, 'user' => String, 'status' => String, - 'started' => String, + 'started' => Fog::Nullable::String, 'cpu' => Integer, + 'mem' => Integer, 'persistent' => Fog::Nullable::String, - 'vnc:password' => String + 'vnc:password' => Fog::Nullable::String } tests('success') do - attributes = { 'name' => 'Test', 'cpu' => '1000', 'persistent' => 'true' } + attributes = { 'name' => 'Test', 'cpu' => '1000', 'mem' => '1000', 'persistent' => 'true' } tests("#create_server").formats(@server_format) do @server = Fog::Compute[:serverlove].create_server(attributes).body @@ -29,25 +30,43 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do Fog::Compute[:serverlove].servers.get(@server['server']).name == "Diff" end - tests("#start_server").succeeds do - Fog::Compute[:serverlove].start_server(@server['server']) + tests("assigns drive to server").succeeds do + @image = Fog::Compute[:serverlove].create_image('name' => 'Test', 'size' => '4234567890').body + # Load centos + Fog::Compute[:serverlove].load_standard_image(@image['drive'], '88ed067f-d2b8-42ce-a25f-5297818a3b6f') + @server['ide:0:0'] = @image['drive'] + @server['boot'] = 'ide:0:0' + Fog::Compute[:serverlove].update_server(@server['server'], { 'ide:0:0' => @server['ide:0:0'], 'boot' => 'ide:0:0'}) end - tests("#reset_server").succeeds do + tests("#start_server").returns(true) do + Fog::Compute[:serverlove].start_server(@server['server']) + Fog::Compute[:serverlove].servers.get(@server['server']).status == "active" + end + + tests("#reset_server").returns(true) do Fog::Compute[:serverlove].reset_server(@server['server']) + Fog::Compute[:serverlove].servers.get(@server['server']).status == "active" end tests("#shutdown_server").succeeds do Fog::Compute[:serverlove].shutdown_server(@server['server']) + # Can't guarantee the OS will honour this command so don't test status end - tests("#stop_server").succeeds do + tests("#stop_server").returns(true) do + Fog::Compute[:serverlove].start_server(@server['server']) Fog::Compute[:serverlove].stop_server(@server['server']) + Fog::Compute[:serverlove].servers.get(@server['server']).status == "stopped" end tests("#destroy_server").succeeds do Fog::Compute[:serverlove].destroy_server(@server['server']) end + + tests("destroy test drive").succeeds do + Fog::Compute[:serverlove].destroy_image(@image['drive']) + end end From d34abe2a33413bc8787bd6ca5a6533cc41fd2850 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Sun, 15 Jul 2012 18:04:33 +0200 Subject: [PATCH 48/57] Allow DHCP assignment by default. --- lib/fog/serverlove/models/compute/server.rb | 8 +++++++- tests/serverlove/requests/compute/server_tests.rb | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index 49ffda088..f7e2391e2 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -21,6 +21,8 @@ module Fog attribute :status attribute :user attribute :started + attribute :nic_0_model, :aliases => 'nic:0:model' + attribute :nic_0_dhcp, :aliases => 'nic:0:dhcp' def save attributes = {} @@ -30,7 +32,7 @@ module Fog else requires :name requires :cpu - attributes = connection.create_server(allowed_attributes).body + attributes = connection.create_server(self.defaults.merge(allowed_attributes)).body end merge_attributes(attributes) @@ -47,6 +49,10 @@ module Fog allowed = [:name, :cpu, :mem, :persistent, :vnc_password] attributes.select {|k,v| allowed.include? k} end + + def self.defaults + { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto' } + end end end end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 83834a0f2..4e2c118e1 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -9,7 +9,9 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do 'cpu' => Integer, 'mem' => Integer, 'persistent' => Fog::Nullable::String, - 'vnc:password' => Fog::Nullable::String + 'vnc:password' => Fog::Nullable::String, + 'nic:0:dhcp' => String, + 'nic:0:model' => String } tests('success') do @@ -17,7 +19,7 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do attributes = { 'name' => 'Test', 'cpu' => '1000', 'mem' => '1000', 'persistent' => 'true' } tests("#create_server").formats(@server_format) do - @server = Fog::Compute[:serverlove].create_server(attributes).body + @server = Fog::Compute[:serverlove].create_server(Fog::Compute::Serverlove::Server.defaults.merge(attributes)).body end tests("#list_servers").succeeds do From 70efaa16dbd7302046812fae830dd94cdd0cd471 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 20:21:13 +0200 Subject: [PATCH 49/57] Key 'vnc:ip' was invalid. Documentation incorrect again - key is actually called 'vnc'. --- lib/fog/serverlove/models/compute/server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index f7e2391e2..a13f1955b 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -18,6 +18,7 @@ module Fog attribute :boot attribute :persistent attribute :vnc_password, :aliases => 'vnc:password' + attribute :vnc, :aliases => 'vnc' attribute :status attribute :user attribute :started From 9feb2638fbc78d0895c8f45fe4210bad72133b57 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 20:22:30 +0200 Subject: [PATCH 50/57] Update allowed attributes and defaults. --- lib/fog/serverlove/models/compute/server.rb | 11 +++++++++-- tests/serverlove/requests/compute/server_tests.rb | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index a13f1955b..3ef60969c 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -47,12 +47,19 @@ module Fog end def allowed_attributes - allowed = [:name, :cpu, :mem, :persistent, :vnc_password] + allowed = [ + :name, :cpu, :mem, :persistent, + :vnc_password, :vnc, + :ide_0_0, :ide_0_1, :ide_1_0, :ide_1_1, + :boot, :nic_0_model, :nic_0_dhcp + ] attributes.select {|k,v| allowed.include? k} end def self.defaults - { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto' } + # TODO: Document default settings. + # Note that VNC password standards are strict (need explaining) + { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto', 'vnc' => 'auto', 'vnc:password' => 'QXBwKEKQ' } end end end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 4e2c118e1..8f5deab82 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -9,6 +9,7 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do 'cpu' => Integer, 'mem' => Integer, 'persistent' => Fog::Nullable::String, + 'vnc' => Fog::Nullable::String, 'vnc:password' => Fog::Nullable::String, 'nic:0:dhcp' => String, 'nic:0:model' => String From d142bcd2cff33af5e0b16962b6aa3a0ad2614e4a Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 20:23:13 +0200 Subject: [PATCH 51/57] Increase test drive size to accommodate a real image. --- tests/serverlove/requests/compute/image_tests.rb | 2 +- tests/serverlove/requests/compute/server_tests.rb | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index aa20669f1..e0779b007 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -16,7 +16,7 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do tests('success') do - attributes = { 'name' => 'Test', 'size' => '4234567890' } + attributes = { 'name' => 'Test', 'size' => '84234567890' } tests("#create_image").formats(@image_format) do @image = Fog::Compute[:serverlove].create_image(attributes).body diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 8f5deab82..9ca60ef4e 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -34,12 +34,10 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do end tests("assigns drive to server").succeeds do - @image = Fog::Compute[:serverlove].create_image('name' => 'Test', 'size' => '4234567890').body - # Load centos - Fog::Compute[:serverlove].load_standard_image(@image['drive'], '88ed067f-d2b8-42ce-a25f-5297818a3b6f') - @server['ide:0:0'] = @image['drive'] - @server['boot'] = 'ide:0:0' - Fog::Compute[:serverlove].update_server(@server['server'], { 'ide:0:0' => @server['ide:0:0'], 'boot' => 'ide:0:0'}) + @image = Fog::Compute[:serverlove].create_image('name' => 'Test', 'size' => '84234567890').body + # Load debian + Fog::Compute[:serverlove].load_standard_image(@image['drive'], 'aca2fa0b-40bc-4e06-ad99-f1467690d5de') + Fog::Compute[:serverlove].update_server(@server['server'], { 'ide:0:0' => @image['drive'], 'boot' => 'ide:0:0'}) end tests("#start_server").returns(true) do From 759e43f058c7568ea349ec10f9dad0111d8215cd Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 20:50:27 +0200 Subject: [PATCH 52/57] Without setting SMP the web UI won't load :-/ --- lib/fog/serverlove/models/compute/server.rb | 7 ++++--- tests/serverlove/requests/compute/server_tests.rb | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index 3ef60969c..d0e2f3067 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -11,14 +11,15 @@ module Fog attribute :name attribute :cpu attribute :mem + attribute :smp attribute :ide_0_0, :aliases => 'ide:0:0' attribute :ide_0_1, :aliases => 'ide:0:1' attribute :ide_1_0, :aliases => 'ide:1:0' attribute :ide_1_1, :aliases => 'ide:1:1' attribute :boot attribute :persistent + attribute :vnc attribute :vnc_password, :aliases => 'vnc:password' - attribute :vnc, :aliases => 'vnc' attribute :status attribute :user attribute :started @@ -48,7 +49,7 @@ module Fog def allowed_attributes allowed = [ - :name, :cpu, :mem, :persistent, + :name, :cpu, :smp, :mem, :persistent, :vnc_password, :vnc, :ide_0_0, :ide_0_1, :ide_1_0, :ide_1_1, :boot, :nic_0_model, :nic_0_dhcp @@ -59,7 +60,7 @@ module Fog def self.defaults # TODO: Document default settings. # Note that VNC password standards are strict (need explaining) - { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto', 'vnc' => 'auto', 'vnc:password' => 'QXBwKEKQ' } + { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto', 'vnc' => 'auto', 'vnc:password' => 'QXBwKEKQ', 'smp' => 'auto' } end end end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index 9ca60ef4e..f0d333a9a 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -8,6 +8,7 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do 'started' => Fog::Nullable::String, 'cpu' => Integer, 'mem' => Integer, + 'smp' => Fog::Nullable::String, 'persistent' => Fog::Nullable::String, 'vnc' => Fog::Nullable::String, 'vnc:password' => Fog::Nullable::String, From 7f8c8b445bbbcf062810658632a83e5ab6fce891 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 21:01:21 +0200 Subject: [PATCH 53/57] Reduce from 80GB to 20GB - big enough, save space. --- tests/serverlove/requests/compute/image_tests.rb | 2 +- tests/serverlove/requests/compute/server_tests.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index e0779b007..ce271094a 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -16,7 +16,7 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do tests('success') do - attributes = { 'name' => 'Test', 'size' => '84234567890' } + attributes = { 'name' => 'Test', 'size' => '24234567890' } tests("#create_image").formats(@image_format) do @image = Fog::Compute[:serverlove].create_image(attributes).body diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index f0d333a9a..a5a41130f 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -35,7 +35,7 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do end tests("assigns drive to server").succeeds do - @image = Fog::Compute[:serverlove].create_image('name' => 'Test', 'size' => '84234567890').body + @image = Fog::Compute[:serverlove].create_image('name' => 'Test', 'size' => '24234567890').body # Load debian Fog::Compute[:serverlove].load_standard_image(@image['drive'], 'aca2fa0b-40bc-4e06-ad99-f1467690d5de') Fog::Compute[:serverlove].update_server(@server['server'], { 'ide:0:0' => @image['drive'], 'boot' => 'ide:0:0'}) From 858b561ceaffe9730a36cf3b36550714ccc34b79 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 21:29:47 +0200 Subject: [PATCH 54/57] Standard images need to be unzipped. --- lib/fog/serverlove/requests/compute/load_standard_image.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/serverlove/requests/compute/load_standard_image.rb b/lib/fog/serverlove/requests/compute/load_standard_image.rb index 341b5c5c1..c4bcedc6d 100644 --- a/lib/fog/serverlove/requests/compute/load_standard_image.rb +++ b/lib/fog/serverlove/requests/compute/load_standard_image.rb @@ -4,7 +4,7 @@ module Fog class Real def load_standard_image(destination_image, source_image) - request(:method => "post", :path => "/drives/#{destination_image}/image/#{source_image}", :expects => 204) + request(:method => "post", :path => "/drives/#{destination_image}/image/#{source_image}/gunzip", :expects => 204) end end From cfca6798d7b86ce2af87aa7b973fd3eb1541cdfb Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Mon, 16 Jul 2012 21:30:03 +0200 Subject: [PATCH 55/57] Need to wait for imaging to complete. --- tests/serverlove/requests/compute/image_tests.rb | 10 ++++++++++ tests/serverlove/requests/compute/server_tests.rb | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/tests/serverlove/requests/compute/image_tests.rb b/tests/serverlove/requests/compute/image_tests.rb index ce271094a..159ce1bbe 100644 --- a/tests/serverlove/requests/compute/image_tests.rb +++ b/tests/serverlove/requests/compute/image_tests.rb @@ -38,6 +38,16 @@ Shindo.tests('Fog::Compute[:serverlove] | drive requests', ['serverlove']) do Fog::Compute[:serverlove].images.get(@image['drive']).imaging != "" # This will be "x%" when imaging end + tests("waits for imaging...").returns(true) do + while(percent_complete = Fog::Compute[:serverlove].images.get(@image['drive']).imaging) + sleep(1) + STDERR.print "#{percent_complete} " + break if percent_complete.include?("100") + end + STDERR.print "100% " + true + end + tests("#destroy_image").succeeds do Fog::Compute[:serverlove].destroy_image(@image['drive']) end diff --git a/tests/serverlove/requests/compute/server_tests.rb b/tests/serverlove/requests/compute/server_tests.rb index a5a41130f..81f6bbd92 100644 --- a/tests/serverlove/requests/compute/server_tests.rb +++ b/tests/serverlove/requests/compute/server_tests.rb @@ -41,6 +41,16 @@ Shindo.tests('Fog::Compute[:serverlove] | server requests', ['serverlove']) do Fog::Compute[:serverlove].update_server(@server['server'], { 'ide:0:0' => @image['drive'], 'boot' => 'ide:0:0'}) end + tests("waits for imaging...").returns(true) do + while(percent_complete = Fog::Compute[:serverlove].images.get(@image['drive']).imaging) + sleep(1) + STDERR.print "#{percent_complete} " + break if percent_complete.include?("100") + end + STDERR.print "100% " + true + end + tests("#start_server").returns(true) do Fog::Compute[:serverlove].start_server(@server['server']) Fog::Compute[:serverlove].servers.get(@server['server']).status == "active" From 31a5602669713b6ad6488da3cadca39a5f8f5bbb Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Tue, 17 Jul 2012 20:09:07 +0200 Subject: [PATCH 56/57] Add a pseudorandom password generator for VNC. --- .../util/compute/password_generator.rb | 11 +++++++++++ .../util/compute/password_generator_tests.rb | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 lib/fog/serverlove/util/compute/password_generator.rb create mode 100644 tests/serverlove/util/compute/password_generator_tests.rb diff --git a/lib/fog/serverlove/util/compute/password_generator.rb b/lib/fog/serverlove/util/compute/password_generator.rb new file mode 100644 index 000000000..168f247ab --- /dev/null +++ b/lib/fog/serverlove/util/compute/password_generator.rb @@ -0,0 +1,11 @@ +module Fog + module Compute + class Serverlove + class PasswordGenerator + def self.generate + ('a'...'z').to_a.concat(('A'...'Z').to_a).shuffle[0,8].join + end + end + end + end +end \ No newline at end of file diff --git a/tests/serverlove/util/compute/password_generator_tests.rb b/tests/serverlove/util/compute/password_generator_tests.rb new file mode 100644 index 000000000..3913b9a76 --- /dev/null +++ b/tests/serverlove/util/compute/password_generator_tests.rb @@ -0,0 +1,19 @@ +require 'fog/serverlove/util/compute/password_generator' + +Shindo.tests('Fog::Compute::Serverlove::PasswordGenerator | generate password', ['serverlove']) do + + @password = Fog::Compute::Serverlove::PasswordGenerator.generate + + tests("@password.length").returns(8) do + @password.length + end + + tests("@password contains one capital letter").returns(true) do + @password.match(/[A-Z]/) && true + end + + tests("@password contains one lower case letter").returns(true) do + @password.match(/[a-z]/) && true + end + +end \ No newline at end of file From f62cda82123dba78e024e4b146c50f8b6c954ba2 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Tue, 24 Jul 2012 16:27:28 +0100 Subject: [PATCH 57/57] Auto generate VNC password randomly. --- lib/fog/serverlove/models/compute/server.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/fog/serverlove/models/compute/server.rb b/lib/fog/serverlove/models/compute/server.rb index d0e2f3067..ba501476a 100644 --- a/lib/fog/serverlove/models/compute/server.rb +++ b/lib/fog/serverlove/models/compute/server.rb @@ -1,4 +1,5 @@ require 'fog/core/model' +require 'fog/serverlove/util/compute/password_generator' module Fog module Compute @@ -60,7 +61,10 @@ module Fog def self.defaults # TODO: Document default settings. # Note that VNC password standards are strict (need explaining) - { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto', 'vnc' => 'auto', 'vnc:password' => 'QXBwKEKQ', 'smp' => 'auto' } + { 'nic:0:model' => 'e1000', 'nic:0:dhcp' => 'auto', + 'smp' => 'auto', 'vnc' => 'auto', + 'vnc:password' => Fog::Compute::Serverlove::PasswordGenerator.generate + } end end end