---
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