aws_one_click_staging 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/aws_one_click_staging/bucket_sync_service.rb +31 -18
- data/lib/aws_one_click_staging/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d779231c0e0dc99fe5f3c7ed558c953517b52eb0
|
4
|
+
data.tar.gz: 6bad4ad285f0cc504c48b32efcecb0ed00660692
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20456486a2357d797831905748a5352a8ad32aed06e11682c2071c3957066ed1341b744f3b5831076f374b1cc3f15085dd5517e0d7f4f2e443573efb0e5c7a01
|
7
|
+
data.tar.gz: 2c3e1a8eb4829d92be2edab97e39fff8edc018a6f51e3c5f6712ad7fe003e1db97f3e0ee4b487e2a36466c30d10041650337e07b68a18781a1a1f1726c01778b
|
@@ -1,36 +1,46 @@
|
|
1
1
|
# props to bantic
|
2
2
|
# https://gist.github.com/bantic/4080793
|
3
3
|
require 'aws/s3' # gem name is 'aws-sdk'
|
4
|
+
require "thwait"
|
4
5
|
|
5
6
|
class BucketSyncService
|
6
7
|
attr_reader :from_bucket, :to_bucket, :logger
|
7
8
|
attr_accessor :debug
|
8
9
|
|
9
|
-
DEFAULT_ACL = :public_read
|
10
|
-
|
11
10
|
# from_credentials and to_credentials are both hashes with these keys:
|
12
11
|
# * :aws_access_key_id
|
13
12
|
# * :aws_secret_access_key
|
14
13
|
# * :bucket
|
15
14
|
def initialize(from_credentials, to_credentials)
|
16
|
-
@from_bucket =
|
17
|
-
@to_bucket =
|
15
|
+
@from_bucket = get_bucket_reference(from_credentials)
|
16
|
+
@to_bucket = get_bucket_reference(to_credentials)
|
18
17
|
end
|
19
18
|
|
20
19
|
def perform(output=STDOUT)
|
20
|
+
AWS.eager_autoload! # this makes threads even more happy
|
21
|
+
|
21
22
|
object_counts = {sync:0, skip:0}
|
22
23
|
create_logger(output)
|
23
24
|
|
25
|
+
threads = []
|
26
|
+
|
24
27
|
logger.info "Starting sync."
|
25
28
|
from_bucket.objects.each do |object|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
threads << Thread.new {
|
30
|
+
if object_needs_syncing?(object)
|
31
|
+
sync(object)
|
32
|
+
object_counts[:sync] += 1
|
33
|
+
else
|
34
|
+
logger.debug "Skipped #{pp object}"
|
35
|
+
object_counts[:skip] += 1
|
36
|
+
end
|
37
|
+
}
|
38
|
+
sleep 0.01 while threads.select {|t| t.alive?}.count > 16
|
33
39
|
end
|
40
|
+
|
41
|
+
|
42
|
+
ThreadsWait.all_waits(threads)
|
43
|
+
|
34
44
|
logger.info "Done. Synced #{object_counts[:sync]}, " +
|
35
45
|
"skipped #{object_counts[:skip]}."
|
36
46
|
end
|
@@ -45,7 +55,7 @@ class BucketSyncService
|
|
45
55
|
|
46
56
|
def sync(object)
|
47
57
|
logger.debug "Syncing #{pp object}"
|
48
|
-
object.copy_to(
|
58
|
+
object.copy_to(to_bucket.objects[object.key])
|
49
59
|
end
|
50
60
|
|
51
61
|
def pp(object)
|
@@ -56,25 +66,28 @@ class BucketSyncService
|
|
56
66
|
|
57
67
|
def object_needs_syncing?(object)
|
58
68
|
to_object = to_bucket.objects[object.key]
|
59
|
-
return true if !to_object.exists?
|
69
|
+
return true if !to_object.exists? # object isn't even present in the dst bucket
|
60
70
|
|
61
|
-
return to_object.etag != object.etag
|
71
|
+
return to_object.etag != object.etag # does the etag on the dst object differ from src?
|
62
72
|
end
|
63
73
|
|
64
|
-
def
|
74
|
+
def get_bucket_reference(credentials)
|
65
75
|
s3 = AWS::S3.new(access_key_id: credentials[:aws_access_key_id],
|
66
76
|
secret_access_key: credentials[:aws_secret_access_key])
|
67
77
|
|
68
78
|
bucket = s3.buckets[ credentials[:bucket] ]
|
69
|
-
|
70
|
-
|
71
|
-
|
79
|
+
create_bucket_if_needed!(bucket)
|
80
|
+
end
|
81
|
+
|
82
|
+
def create_bucket_if_needed!(bucket)
|
83
|
+
return s3.buckets.create( credentials[:bucket] ) if !bucket.exists?
|
72
84
|
bucket
|
73
85
|
end
|
74
86
|
end
|
75
87
|
|
76
88
|
|
77
89
|
|
90
|
+
|
78
91
|
=begin
|
79
92
|
Example usage:
|
80
93
|
from_creds = {aws_access_key_id:"XXX", aws_secret_access_key:"YYY", bucket:"first-bucket"}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws_one_click_staging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TheNotary
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|