---
 server/lib/deltacloud/base_driver/mock_driver.rb |   92 ++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)
 create mode 100644 server/lib/deltacloud/base_driver/mock_driver.rb

diff --git a/server/lib/deltacloud/base_driver/mock_driver.rb 
b/server/lib/deltacloud/base_driver/mock_driver.rb
new file mode 100644
index 0000000..ef92ada
--- /dev/null
+++ b/server/lib/deltacloud/base_driver/mock_driver.rb
@@ -0,0 +1,92 @@
+require 'base64'
+
+module Deltacloud::Mock
+
+  module Cache
+
+    CACHE_STORAGE = File.join(File.dirname(__FILE__), '..', '..', '..', 
'features', 'support')
+    
+    def cache_dir
+      File.join(CACHE_STORAGE, self.class.name.split('::').last.downcase)
+    end
+
+    def serialize_data(method_name, data, args)
+      File.open(cache_file_name(method_name, args), 'w') do |f|
+        f.puts(Base64.encode64(Marshal.dump(data)))
+      end
+      puts "[MOCK] Serialized #{method_name}"
+      return data
+    end
+
+    def deserialize_data(method_name, args)
+      begin
+        data = File.readlines(cache_file_name(method_name, args)).join
+        puts "[MOCK] Loaded serialized data for #{method_name}"
+        Marshal.load(Base64.decode64(data))
+      rescue Errno::ENOENT
+        return false
+      end
+    end
+
+    def args_hash(args)
+      Digest::SHA1.hexdigest(args.to_s)
+    end
+
+    def cache_file_name(method_name, args)
+      FileUtils.mkdir_p(cache_dir) unless File.directory?(cache_dir)
+      File.join(cache_dir, "#{method_name}.#{args_hash(args)}")
+    end
+
+    def self.wrap_methods(c)
+      c.class_eval do
+        cached_methods.each do |m|
+          alias_method "original_#{m}".to_sym, m.to_sym
+          define_method m.to_sym do |*args|
+            args = args.first if args.size.eql?(1) and 
args.first.class.eql?(Hash)
+            output = deserialize_data(m, args)
+            unless output
+              output = method("original_#{m}".to_sym).to_proc[args]
+              serialize_data(m, output, args)
+            end
+            return output
+          end
+        end
+      end 
+    end
+
+  end
+
+  # Create 'mock' version of original driver client/gem:
+
+  class EC2 < AWS::EC2::Base
+
+    include Deltacloud::Mock::Cache
+
+    def self.cached_methods
+      [
+        :describe_images,
+        :describe_availability_zones,
+        :run_instances,
+        :describe_instances,
+        :reboot_instances,
+        :terminate_instances,
+      ]
+    end
+
+    Deltacloud::Mock::Cache::wrap_methods(self)
+  end
+
+end
+
+# Replace original client with mock client
+Deltacloud::Drivers::EC2::EC2Driver.class_eval do
+  alias_method :original_new_client, :new_client
+
+  def new_client(credentials, opts={})
+    Deltacloud::Mock::EC2.new(
+      :access_key_id => credentials.user,
+      :secret_access_key => credentials.password
+    )
+  end
+
+end
-- 
1.7.1

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to