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