Skip to content

Multiprovider support #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion lib/microstatic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
require 'microstatic/uses_fog'

require "microstatic/s3_deployer"
require "microstatic/s3_bucket_creator"

module Microstatic
def self.aws_creds_from_env
Expand Down
69 changes: 69 additions & 0 deletions lib/microstatic/base_deployer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require 'digest/md5'
require 'pathname'

module Microstatic

# The following is based on code generously
# shared by Giles Alexander (@gga)
class BaseDeployer
include UsesFog
def initialize( local_dir, bucket, creds )
store_creds(creds)

@local_dir = Pathname.new(local_dir)
@bucket = bucket
end

def self.factory( local_dir, bucket, creds )
case creds[:provider]
when 'AWS'
S3Deployer.new local_dir, bucket, creds
else
BaseDeployer.new local_dir, bucket, creds
end
end

def upload
Pathname.glob(@local_dir+"**/*") do |child|
upload_file(child) unless child.directory?
end
end

def file_metadata
# Override this if you need more!
{ :public => true }
end

def upload_file( file )
file_key = file.relative_path_from(@local_dir).to_s

begin
file_object = connection.head_object(@bucket,file_key)
rescue Excon::Errors::NotFound
file_object = false
end

if !file_object
log_action('CREATE', file_key)
connection.put_object( @bucket, file_key, file.open, file_metadata )
else
etag = file_object.headers['ETag'] || file_object.headers['Etag']
file_md5 = etag.sub(/"(.*)"/,'\1')
local_md5 = Digest::MD5.hexdigest( file.read )

if( file_md5 == local_md5 )
log_action('NO CHANGE', file_key)
else
log_action('UPDATE', file_key)
connection.put_object( @bucket, file_key, file.open )
end
end
end

def log_action(action,file)
message = action.to_s.rjust(10) + " " + file
puts message
end
end

end
17 changes: 0 additions & 17 deletions lib/microstatic/s3_bucket_creator.rb

This file was deleted.

47 changes: 5 additions & 42 deletions lib/microstatic/s3_deployer.rb
Original file line number Diff line number Diff line change
@@ -1,53 +1,16 @@
require 'digest/md5'
require 'pathname'
require File.expand_path '../base_deployer', __FILE__

module Microstatic

# The following is based on code generously
# shared by Giles Alexander (@gga)
class S3Deployer
class S3Deployer < BaseDeployer
include UsesFog
def initialize( local_dir, bucket, aws_creds )
check_and_store_aws_creds(aws_creds)

@local_dir = Pathname.new(local_dir)
@bucket = bucket
end

def upload
Pathname.glob(@local_dir+"**/*") do |child|
upload_file(child) unless child.directory?
end
end

def upload_file( file )
s3_key = file.relative_path_from(@local_dir).to_s

begin
s3_object = connection.head_object(@bucket,s3_key)
rescue Excon::Errors::NotFound
s3_object = false
end

if !s3_object
log_action('CREATE', s3_key)
connection.put_object( @bucket, s3_key, file.open, 'x-amz-acl' => 'public-read' )
else
s3_md5 = s3_object.headers['ETag'].sub(/"(.*)"/,'\1')
local_md5 = Digest::MD5.hexdigest( file.read )

if( s3_md5 == local_md5 )
log_action('NO CHANGE', s3_key)
else
log_action('UPDATE', s3_key)
connection.put_object( @bucket, s3_key, file.open )
end
end
end

def log_action(action,file)
message = action.to_s.rjust(10) + " " + file
puts message
def initialize( local_dir, bucket, creds )
check_and_store_aws_creds(creds)
super(local_dir, bucket, creds)
end
end

Expand Down
14 changes: 7 additions & 7 deletions lib/microstatic/uses_fog.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
module Microstatic
module UsesFog
def check_and_store_aws_creds( aws_creds )
[:access_key_id,:secret_access_key].each do |required_key|
[:aws_access_key_id,:aws_secret_access_key].each do |required_key|
raise ArgumentError, "must supply :#{required_key}" unless aws_creds.key?(required_key)
end

@aws_creds = aws_creds
store_creds(aws_creds.merge({:provider => 'AWS'}))
end

def store_creds(creds)
@creds = creds
end

def connection
@_connection ||= Fog::Storage.new({
:provider => 'AWS',
:aws_access_key_id => @aws_creds.fetch(:access_key_id),
:aws_secret_access_key => @aws_creds.fetch(:secret_access_key)
})
@_connection ||= Fog::Storage.new @creds
end
end
end
1 change: 1 addition & 0 deletions spec/integration/fixtures/subdir/foo.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
asdf
11 changes: 8 additions & 3 deletions spec/integration/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@
# require_relative '../../lib/microstatic/uses_fog'

if ENV['FOG_MOCK']
%w{RAX_USERNAME RAX_API_KEY AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY}.each do |key|
ENV[key] = 'dummy'
end
Fog.mock!
include Microstatic::UsesFog
check_and_store_aws_creds(Microstatic.aws_creds_from_env)
connection.directories.create(:key => 'microstatic-test-bucket')
end

def create_bucket(bucket, creds)
puts "Creating #{bucket}"
Fog::Storage.new(creds).directories.create(:key => bucket)
end
require 'pry'
28 changes: 19 additions & 9 deletions spec/integration/upload_to_test_bucket_spec.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require_relative 'spec_helper'
require_relative '../../lib/microstatic/base_deployer'
require_relative '../../lib/microstatic/s3_deployer'

module Microstatic
Expand All @@ -11,17 +12,26 @@ def test_dir
File.expand_path( "../fixtures", __FILE__ )
end

def aws_creds
{
:access_key_id => ENV.fetch('AWS_ACCESS_KEY_ID'),
:secret_access_key => ENV.fetch('AWS_SECRET_ACCESS_KEY')
creds = {
:aws => {
:provider => 'AWS',
:aws_access_key_id => ENV.fetch('AWS_ACCESS_KEY_ID'),
:aws_secret_access_key => ENV.fetch('AWS_SECRET_ACCESS_KEY')
},
:rax => {
:provider => 'Rackspace',
:rackspace_username => ENV.fetch('RAX_USERNAME'),
:rackspace_api_key => ENV.fetch('RAX_API_KEY'),
}
end
}

it 'succeeds' do
deployer = S3Deployer.new( test_dir, test_bucket, aws_creds )
deployer.upload
creds.each do |provider, creds|
it "succeeds (#{provider})" do
create_bucket(test_bucket, creds) # if Fog.mock?
deployer = BaseDeployer.factory( test_dir, test_bucket, creds )
deployer.upload
end
end

end
end