heirloom 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/README.md +10 -9
- data/lib/heirloom/archive.rb +1 -0
- data/lib/heirloom/archive/checker.rb +30 -0
- data/lib/heirloom/aws/s3.rb +39 -0
- data/lib/heirloom/cli/setup.rb +3 -0
- data/lib/heirloom/cli/shared.rb +19 -0
- data/lib/heirloom/config.rb +14 -8
- data/lib/heirloom/version.rb +1 -1
- data/spec/archive/checker_spec.rb +57 -0
- data/spec/archive/verifier_spec.rb +1 -0
- data/spec/aws/s3_spec.rb +118 -6
- data/spec/cli/setup_spec.rb +9 -0
- data/spec/cli/shared_spec.rb +35 -0
- data/spec/config_spec.rb +29 -20
- metadata +17 -14
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 0.8.2:
|
2
|
+
|
3
|
+
* Updated docs based on feedback from mint.
|
4
|
+
* Added check for other account owning a given bucket.
|
5
|
+
* Fixed config to read CLI variables and override file config.
|
6
|
+
* When delete bucket raise not found, return true (eventually consistent)
|
7
|
+
|
1
8
|
## v0.8.1:
|
2
9
|
|
3
10
|
* Moving verification on entry exists into catalog class
|
data/README.md
CHANGED
@@ -7,13 +7,19 @@ The goal of Heirloom is to securely and easily transport data to cloud hosted ap
|
|
7
7
|
|
8
8
|
Heirloom creates archives from directories. Their archives are versioned and hosted in geographic distributed locations. Heirloom tracks metadata about those archives, both about the archive locations, as well as arbitrary tags which can be set by an engineer or process. It supports encryption and authorization to allow for securely transporting sensitive data over cloud storage services.
|
9
9
|
|
10
|
+
Prerequisites
|
11
|
+
-------------
|
12
|
+
|
13
|
+
* Ruby version 1.9.2 or higher installed.
|
14
|
+
* AWS account access key and secret key.
|
15
|
+
|
10
16
|
Installation
|
11
17
|
------------
|
12
18
|
|
13
19
|
Install the gem
|
14
20
|
|
15
21
|
```
|
16
|
-
gem install heirloom
|
22
|
+
gem install heirloom --no-ri --no-rdoc
|
17
23
|
```
|
18
24
|
|
19
25
|
To get started copy the sample below into ~/.heirloom.yml and update the specified fields.
|
@@ -22,25 +28,20 @@ To get started copy the sample below into ~/.heirloom.yml and update the specifi
|
|
22
28
|
aws:
|
23
29
|
access_key: UPDATE_ME
|
24
30
|
secret_key: UPDATE_ME
|
31
|
+
metadata_region: us-west-1
|
25
32
|
```
|
26
33
|
|
27
34
|
Proxy Support
|
28
35
|
-------------
|
29
36
|
|
30
|
-
Heirloom
|
37
|
+
Heirloom supports accessing AWS API endpoint throught a proxy. This can be set via the http_proxy and https_proxy variables.
|
31
38
|
|
32
39
|
```
|
33
40
|
export http_proxy=http://1.2.3.4:80
|
34
41
|
export http_proxys=http://1.2.3.4:80
|
35
42
|
```
|
36
43
|
|
37
|
-
Platforms
|
38
|
-
---------
|
39
|
-
|
40
|
-
Currently I support AWS S3 for object storage and AWS SimpleDB for metadata management. One day I'd like to expand to other providers.
|
41
|
-
|
42
|
-
|
43
44
|
Documentation
|
44
45
|
-------------
|
45
46
|
|
46
|
-
For more information, please view the [Heirloom Wiki](https://github.com/
|
47
|
+
For more information, please view the [Heirloom Wiki](https://github.com/intuit/heirloom/wiki).
|
data/lib/heirloom/archive.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Heirloom
|
2
|
+
|
3
|
+
class Checker
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@config = args[:config]
|
7
|
+
@logger = @config.logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def bucket_name_available?(args)
|
11
|
+
bucket_prefix = args[:bucket_prefix]
|
12
|
+
regions = args[:regions]
|
13
|
+
result = true
|
14
|
+
|
15
|
+
regions.each do |region|
|
16
|
+
s3 = AWS::S3.new :config => @config,
|
17
|
+
:region => region
|
18
|
+
bucket = "#{bucket_prefix}-#{region}"
|
19
|
+
|
20
|
+
unless s3.bucket_name_available? bucket
|
21
|
+
@logger.warn "#{bucket} unavailable in #{region}."
|
22
|
+
result = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/heirloom/aws/s3.rb
CHANGED
@@ -7,6 +7,7 @@ module Heirloom
|
|
7
7
|
def initialize(args)
|
8
8
|
@config = args[:config]
|
9
9
|
@region = args[:region]
|
10
|
+
@logger = @config.logger
|
10
11
|
|
11
12
|
@s3 = Fog::Storage.new :provider => 'AWS',
|
12
13
|
:aws_access_key_id => @config.access_key,
|
@@ -22,8 +23,46 @@ module Heirloom
|
|
22
23
|
@s3.directories.get bucket
|
23
24
|
end
|
24
25
|
|
26
|
+
def bucket_exists?(bucket)
|
27
|
+
get_bucket(bucket) != nil
|
28
|
+
rescue Excon::Errors::Forbidden
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
def bucket_exists_in_another_region?(bucket)
|
33
|
+
if bucket_exists? bucket
|
34
|
+
get_bucket(bucket).location != @region
|
35
|
+
else
|
36
|
+
false
|
37
|
+
end
|
38
|
+
rescue Excon::Errors::Forbidden
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def bucket_owned_by_another_account?(bucket)
|
43
|
+
get_bucket bucket
|
44
|
+
false
|
45
|
+
rescue Excon::Errors::Forbidden
|
46
|
+
@logger.warn "#{bucket} owned by another account."
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def bucket_name_available?(bucket)
|
51
|
+
@logger.info "Checking for #{bucket} availability in #{@region}."
|
52
|
+
|
53
|
+
if bucket_owned_by_another_account?(bucket) ||
|
54
|
+
bucket_exists_in_another_region?(bucket)
|
55
|
+
false
|
56
|
+
else
|
57
|
+
true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
25
61
|
def delete_bucket(bucket)
|
26
62
|
@s3.delete_bucket bucket
|
63
|
+
rescue Excon::Errors::NotFound
|
64
|
+
@logger.info "#{bucket} already destroyed."
|
65
|
+
true
|
27
66
|
end
|
28
67
|
|
29
68
|
def get_object(bucket_name, object_name)
|
data/lib/heirloom/cli/setup.rb
CHANGED
@@ -29,6 +29,9 @@ module Heirloom
|
|
29
29
|
:config => @config
|
30
30
|
ensure_metadata_in_upload_region :config => @config,
|
31
31
|
:regions => @opts[:region]
|
32
|
+
ensure_buckets_available :config => @config,
|
33
|
+
:bucket_prefix => @opts[:bucket_prefix],
|
34
|
+
:regions => @opts[:region]
|
32
35
|
|
33
36
|
@catalog.create_catalog_domain
|
34
37
|
|
data/lib/heirloom/cli/shared.rb
CHANGED
@@ -170,6 +170,25 @@ module Heirloom
|
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
173
|
+
def ensure_buckets_available(args)
|
174
|
+
config = args[:config]
|
175
|
+
regions = args[:regions]
|
176
|
+
bucket_prefix = args[:bucket_prefix]
|
177
|
+
logger = config.logger
|
178
|
+
|
179
|
+
checker = Heirloom::Checker.new :config => config
|
180
|
+
|
181
|
+
available = checker.bucket_name_available? :bucket_prefix => bucket_prefix,
|
182
|
+
:regions => regions,
|
183
|
+
:config => config
|
184
|
+
if available
|
185
|
+
true
|
186
|
+
else
|
187
|
+
logger.error "Bucket prefix #{bucket_prefix} not available across regions #{regions.join}."
|
188
|
+
exit 1
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
173
192
|
def latest_id(args)
|
174
193
|
archive = Archive.new :name => args[:name],
|
175
194
|
:config => args[:config]
|
data/lib/heirloom/config.rb
CHANGED
@@ -3,26 +3,32 @@ module Heirloom
|
|
3
3
|
|
4
4
|
attr_accessor :access_key, :secret_key, :metadata_region, :logger
|
5
5
|
|
6
|
-
def initialize(args
|
7
|
-
@
|
6
|
+
def initialize(args={})
|
7
|
+
@opts = args[:opts] ||= Hash.new
|
8
|
+
@config = load_config_file
|
8
9
|
self.logger = args[:logger] ||= HeirloomLogger.new
|
9
10
|
load_config
|
10
11
|
end
|
11
12
|
|
12
13
|
def load_config
|
13
|
-
|
14
|
-
|
15
|
-
self.secret_key
|
16
|
-
|
14
|
+
self.access_key = @opts.fetch :aws_access_key,
|
15
|
+
@config['access_key']
|
16
|
+
self.secret_key = @opts.fetch :aws_secret_key,
|
17
|
+
@config['secret_key']
|
18
|
+
self.metadata_region = @opts.fetch :metadata_region,
|
19
|
+
@config['metadata_region']
|
17
20
|
end
|
18
21
|
|
22
|
+
private
|
23
|
+
|
19
24
|
def load_config_file
|
20
25
|
config_file = "#{ENV['HOME']}/.heirloom.yml"
|
21
26
|
|
22
27
|
if File.exists? config_file
|
23
|
-
YAML::load File.open(config_file)
|
28
|
+
data = YAML::load File.open(config_file)
|
29
|
+
data['aws']
|
24
30
|
else
|
25
|
-
{
|
31
|
+
{ }
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
data/lib/heirloom/version.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Heirloom do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@config_mock = double 'config'
|
7
|
+
@logger_stub = stub 'logger', :debug => true,
|
8
|
+
:info => true,
|
9
|
+
:warn => true
|
10
|
+
@config_mock.stub :logger => @logger_stub
|
11
|
+
@checker = Heirloom::Checker.new :config => @config_mock
|
12
|
+
@regions = ['us-west-1', 'us-west-2']
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return true if all bucket names are available" do
|
16
|
+
s3_mock = mock 's3'
|
17
|
+
Heirloom::AWS::S3.should_receive(:new).
|
18
|
+
with(:config => @config_mock,
|
19
|
+
:region => 'us-west-1').
|
20
|
+
and_return s3_mock
|
21
|
+
Heirloom::AWS::S3.should_receive(:new).
|
22
|
+
with(:config => @config_mock,
|
23
|
+
:region => 'us-west-2').
|
24
|
+
and_return s3_mock
|
25
|
+
s3_mock.should_receive(:bucket_name_available?).
|
26
|
+
with('bp-us-west-1').
|
27
|
+
and_return true
|
28
|
+
s3_mock.should_receive(:bucket_name_available?).
|
29
|
+
with('bp-us-west-2').
|
30
|
+
and_return true
|
31
|
+
@checker.bucket_name_available?(:bucket_prefix => 'bp',
|
32
|
+
:regions => @regions).
|
33
|
+
should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return false if any buckets are unavailable" do
|
37
|
+
s3_mock = mock 's3'
|
38
|
+
Heirloom::AWS::S3.should_receive(:new).
|
39
|
+
with(:config => @config_mock,
|
40
|
+
:region => 'us-west-1').
|
41
|
+
and_return s3_mock
|
42
|
+
Heirloom::AWS::S3.should_receive(:new).
|
43
|
+
with(:config => @config_mock,
|
44
|
+
:region => 'us-west-2').
|
45
|
+
and_return s3_mock
|
46
|
+
s3_mock.should_receive(:bucket_name_available?).
|
47
|
+
with('bp-us-west-1').
|
48
|
+
and_return false
|
49
|
+
s3_mock.should_receive(:bucket_name_available?).
|
50
|
+
with('bp-us-west-2').
|
51
|
+
and_return true
|
52
|
+
@checker.bucket_name_available?(:bucket_prefix => 'bp',
|
53
|
+
:regions => @regions).
|
54
|
+
should be_false
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/spec/aws/s3_spec.rb
CHANGED
@@ -2,15 +2,89 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Heirloom do
|
4
4
|
before do
|
5
|
+
@directories_mock = mock 'directories'
|
6
|
+
@bucket_mock = mock 'bucket'
|
7
|
+
@logger_stub = stub 'logger', :debug => true,
|
8
|
+
:info => true,
|
9
|
+
:warn => true
|
5
10
|
@config_mock = mock 'config'
|
6
|
-
@config_mock.
|
7
|
-
|
11
|
+
@config_mock.stub :access_key => 'the-key',
|
12
|
+
:secret_key => 'the-secret',
|
13
|
+
:logger => @logger_stub
|
8
14
|
@fog_mock = mock 'fog'
|
15
|
+
@fog_mock.stub :directories => @directories_mock
|
9
16
|
Fog::Storage.should_receive(:new).and_return @fog_mock
|
10
17
|
@s3 = Heirloom::AWS::S3.new :config => @config_mock,
|
11
18
|
:region => 'us-west-1'
|
19
|
+
end
|
20
|
+
|
21
|
+
context "bucket_exists?" do
|
22
|
+
it "should return true if the bucket exists" do
|
23
|
+
@directories_mock.should_receive(:get).
|
24
|
+
with('bucket').and_return @bucket_mock
|
25
|
+
@s3.bucket_exists?('bucket').should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return false if the bucket does not exist" do
|
29
|
+
@directories_mock.should_receive(:get).
|
30
|
+
with('bucket').and_return nil
|
31
|
+
@s3.bucket_exists?('bucket').should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return false if bucket owned by another account" do
|
35
|
+
@directories_mock.should_receive(:get).
|
36
|
+
with('bucket').
|
37
|
+
and_raise Excon::Errors::Forbidden.new('msg')
|
38
|
+
@s3.bucket_exists?('bucket').should be_false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "bucket_exists_in_another_region?" do
|
43
|
+
it "should return true if the bucket exists in another region" do
|
44
|
+
@bucket_mock.stub :location => 'us-east-1'
|
45
|
+
@directories_mock.should_receive(:get).
|
46
|
+
with('bucket').at_least(:once).
|
47
|
+
and_return @bucket_mock
|
48
|
+
@s3.bucket_exists_in_another_region?('bucket').should be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return false if the bucket exists in the curren region" do
|
52
|
+
@bucket_mock.stub :location => 'us-west-1'
|
53
|
+
@directories_mock.should_receive(:get).
|
54
|
+
with('bucket').at_least(:once).
|
55
|
+
and_return @bucket_mock
|
56
|
+
@s3.bucket_exists_in_another_region?('bucket').should be_false
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return false if bucket owned by another account" do
|
60
|
+
@directories_mock.should_receive(:get).
|
61
|
+
with('bucket').
|
62
|
+
and_raise Excon::Errors::Forbidden.new('msg')
|
63
|
+
@s3.bucket_exists_in_another_region?('bucket').should be_false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "bucket_owned_by_another_account?" do
|
68
|
+
it "should return false if bucket owned by this account" do
|
69
|
+
@directories_mock.should_receive(:get).
|
70
|
+
with('bucket').
|
71
|
+
and_return @bucket_mock
|
72
|
+
@s3.bucket_owned_by_another_account?('bucket').should be_false
|
73
|
+
end
|
12
74
|
|
75
|
+
it "should return false if bucket does not exist" do
|
76
|
+
@directories_mock.should_receive(:get).
|
77
|
+
with('bucket').
|
78
|
+
and_return nil
|
79
|
+
@s3.bucket_owned_by_another_account?('bucket').should be_false
|
80
|
+
end
|
13
81
|
|
82
|
+
it "should return true if bucket is not owned by another account" do
|
83
|
+
@directories_mock.should_receive(:get).
|
84
|
+
with('bucket').
|
85
|
+
and_raise Excon::Errors::Forbidden.new('msg')
|
86
|
+
@s3.bucket_owned_by_another_account?('bucket').should be_true
|
87
|
+
end
|
14
88
|
end
|
15
89
|
|
16
90
|
it "should delete an object from s3" do
|
@@ -20,18 +94,56 @@ describe Heirloom do
|
|
20
94
|
end
|
21
95
|
|
22
96
|
it "should get a bucket from s3" do
|
23
|
-
directories_mock
|
24
|
-
@fog_mock.should_receive(:directories).
|
25
|
-
and_return directories_mock
|
26
|
-
directories_mock.should_receive(:get).with 'bucket'
|
97
|
+
@directories_mock.should_receive(:get).with 'bucket'
|
27
98
|
@s3.get_bucket 'bucket'
|
28
99
|
end
|
29
100
|
|
101
|
+
context "testing bucket availability" do
|
102
|
+
|
103
|
+
it "should return false if the bucket is forbidden" do
|
104
|
+
@directories_mock.should_receive(:get).
|
105
|
+
with('bucket').
|
106
|
+
and_raise Excon::Errors::Forbidden.new('msg')
|
107
|
+
@s3.bucket_name_available?('bucket').should be_false
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should return false if bucket in different region" do
|
111
|
+
@directories_mock.should_receive(:get).
|
112
|
+
with('bucket').at_least(:once).
|
113
|
+
and_return @bucket_mock
|
114
|
+
@bucket_mock.stub :location => 'us-east-1'
|
115
|
+
@s3.bucket_name_available?('bucket').should be_false
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return true if the bucket is in this account / region" do
|
119
|
+
@directories_mock.should_receive(:get).
|
120
|
+
with('bucket').at_least(:once).
|
121
|
+
and_return @bucket_mock
|
122
|
+
@bucket_mock.stub :location => 'us-west-1'
|
123
|
+
@s3.bucket_name_available?('bucket').should be_true
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return true if the bucket is not found" do
|
127
|
+
@directories_mock.should_receive(:get).
|
128
|
+
with('bucket').at_least(:once).
|
129
|
+
and_return nil
|
130
|
+
@s3.bucket_name_available?('bucket').should be_true
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
30
135
|
it "should delete a bucket from s3" do
|
31
136
|
@fog_mock.should_receive(:delete_bucket).with 'bucket'
|
32
137
|
@s3.delete_bucket 'bucket'
|
33
138
|
end
|
34
139
|
|
140
|
+
it "should return true if Excon::Errors::NotFound raised when deleting bucket" do
|
141
|
+
@fog_mock.should_receive(:delete_bucket).
|
142
|
+
with('bucket').
|
143
|
+
and_raise Excon::Errors::NotFound.new 'Bucket does not exist.'
|
144
|
+
@s3.delete_bucket 'bucket'
|
145
|
+
end
|
146
|
+
|
35
147
|
it "should get an object from s3" do
|
36
148
|
body_mock = mock 'body'
|
37
149
|
@fog_mock.should_receive(:get_object).
|
data/spec/cli/setup_spec.rb
CHANGED
@@ -19,6 +19,7 @@ describe Heirloom do
|
|
19
19
|
:metadata_region => 'us-west-1'
|
20
20
|
@archive_mock = mock 'archive'
|
21
21
|
@catalog_mock = mock 'catalog'
|
22
|
+
@checker_mock = mock 'checker'
|
22
23
|
Trollop.stub(:options).and_return options
|
23
24
|
Heirloom::HeirloomLogger.should_receive(:new).with(:log_level => 'info').
|
24
25
|
and_return @logger_stub
|
@@ -34,10 +35,18 @@ describe Heirloom do
|
|
34
35
|
with(:name => 'archive_name',
|
35
36
|
:config => @config_mock).
|
36
37
|
and_return @catalog_mock
|
38
|
+
Heirloom::Checker.should_receive(:new).
|
39
|
+
with(:config => @config_mock).
|
40
|
+
and_return @checker_mock
|
37
41
|
@setup = Heirloom::CLI::Setup.new
|
38
42
|
end
|
39
43
|
|
40
44
|
it "should setup s3 buckets, catalog and simpledb domain" do
|
45
|
+
@checker_mock.should_receive(:bucket_name_available?).
|
46
|
+
with(:bucket_prefix => "bp",
|
47
|
+
:regions => @regions,
|
48
|
+
:config => @config_mock).
|
49
|
+
and_return true
|
41
50
|
@catalog_mock.should_receive(:create_catalog_domain)
|
42
51
|
@catalog_mock.stub :entry_exists_in_catalog? => false
|
43
52
|
@catalog_mock.should_receive(:add_to_catalog).
|
data/spec/cli/shared_spec.rb
CHANGED
@@ -318,4 +318,39 @@ describe Heirloom do
|
|
318
318
|
end
|
319
319
|
|
320
320
|
end
|
321
|
+
|
322
|
+
context "ensure buckets are available or owned by account" do
|
323
|
+
before do
|
324
|
+
@logger_stub = stub 'logger', :error => true
|
325
|
+
@config_stub = stub 'config', :logger => @logger_stub
|
326
|
+
@checker_mock = mock 'checker'
|
327
|
+
@args = { :config => @config_stub,
|
328
|
+
:bucket_prefix => 'intu-lc',
|
329
|
+
:regions => ['us-west-1', 'us-west-2'] }
|
330
|
+
@object = Object.new
|
331
|
+
@object.extend Heirloom::CLI::Shared
|
332
|
+
Heirloom::Checker.should_receive(:new).
|
333
|
+
with(:config => @config_stub).
|
334
|
+
and_return @checker_mock
|
335
|
+
end
|
336
|
+
|
337
|
+
it "should return true if buckets available in all regions" do
|
338
|
+
@checker_mock.should_receive(:bucket_name_available?).
|
339
|
+
with(:bucket_prefix => 'intu-lc',
|
340
|
+
:regions => ['us-west-1', 'us-west-2'],
|
341
|
+
:config => @config_stub).
|
342
|
+
and_return true
|
343
|
+
@object.ensure_buckets_available(@args).should be_true
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should return raise and error if any bucket un-available in all regions" do
|
347
|
+
@checker_mock.should_receive(:bucket_name_available?).
|
348
|
+
with(:bucket_prefix => 'intu-lc',
|
349
|
+
:regions => ['us-west-1', 'us-west-2'],
|
350
|
+
:config => @config_stub).
|
351
|
+
and_return false
|
352
|
+
lambda { @object.ensure_buckets_available(@args) }.
|
353
|
+
should raise_error SystemExit
|
354
|
+
end
|
355
|
+
end
|
321
356
|
end
|
data/spec/config_spec.rb
CHANGED
@@ -3,38 +3,47 @@ require 'spec_helper'
|
|
3
3
|
describe Heirloom do
|
4
4
|
|
5
5
|
before do
|
6
|
-
@
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
@config_file = { 'aws' =>
|
7
|
+
{ 'access_key' => 'key',
|
8
|
+
'secret_key' => 'secret',
|
9
|
+
'metadata_region' => 'us-west-2'
|
10
|
+
}
|
11
|
+
}
|
12
|
+
@opts = { :aws_access_key => 'optkey',
|
13
|
+
:aws_secret_key => 'optsec',
|
14
|
+
:metadata_region => 'optmd' }
|
15
|
+
|
12
16
|
end
|
13
17
|
|
14
18
|
it "should create a new config object from the hash passed as config" do
|
15
|
-
|
19
|
+
File.stub :exists? => false
|
20
|
+
File.should_receive(:open).never
|
21
|
+
config = Heirloom::Config.new :opts => @opts,
|
16
22
|
:logger => 'da-logger'
|
17
|
-
config.access_key.should == @
|
18
|
-
config.secret_key.should == @
|
19
|
-
config.metadata_region.should == @
|
23
|
+
config.access_key.should == @opts[:aws_access_key]
|
24
|
+
config.secret_key.should == @opts[:aws_secret_key]
|
25
|
+
config.metadata_region.should == @opts[:metadata_region]
|
20
26
|
config.logger.should == 'da-logger'
|
21
27
|
end
|
22
28
|
|
23
29
|
it "should create a new config object and read from ~/.heirloom.yml" do
|
24
30
|
File.stub :exists? => true
|
25
31
|
File.should_receive(:open).with("#{ENV['HOME']}/.heirloom.yml").
|
26
|
-
and_return(@
|
32
|
+
and_return(@config_file.to_yaml)
|
27
33
|
config = Heirloom::Config.new
|
28
|
-
config.access_key.should == @
|
29
|
-
config.secret_key.should == @
|
30
|
-
config.metadata_region.should == @
|
34
|
+
config.access_key.should == @config_file['aws']['access_key']
|
35
|
+
config.secret_key.should == @config_file['aws']['secret_key']
|
36
|
+
config.metadata_region.should == @config_file['aws']['metadata_region']
|
31
37
|
end
|
32
|
-
|
33
|
-
it "should
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
config.
|
38
|
+
|
39
|
+
it "should override config settings in file from opts" do
|
40
|
+
File.stub :exists? => true
|
41
|
+
File.should_receive(:open).with("#{ENV['HOME']}/.heirloom.yml").
|
42
|
+
and_return(@config_file.to_yaml)
|
43
|
+
config = Heirloom::Config.new :opts => @opts
|
44
|
+
config.access_key.should == @opts[:aws_access_key]
|
45
|
+
config.secret_key.should == @opts[:aws_secret_key]
|
46
|
+
config.metadata_region.should == @opts[:metadata_region]
|
38
47
|
end
|
39
48
|
|
40
49
|
it "should load a blank config if the file does not exist and no config passed" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heirloom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70116641456840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.11.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70116641456840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70116641456000 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70116641456000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: fog
|
38
|
-
requirement: &
|
38
|
+
requirement: &70116641455120 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.5.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70116641455120
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: grit
|
49
|
-
requirement: &
|
49
|
+
requirement: &70116641469900 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.5.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70116641469900
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: trollop
|
60
|
-
requirement: &
|
60
|
+
requirement: &70116641467720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - =
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '2.0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70116641467720
|
69
69
|
description: I help build and manage building tar.gz files and deploying them into
|
70
70
|
the cloud
|
71
71
|
email:
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/heirloom/archive.rb
|
92
92
|
- lib/heirloom/archive/authorizer.rb
|
93
93
|
- lib/heirloom/archive/builder.rb
|
94
|
+
- lib/heirloom/archive/checker.rb
|
94
95
|
- lib/heirloom/archive/destroyer.rb
|
95
96
|
- lib/heirloom/archive/downloader.rb
|
96
97
|
- lib/heirloom/archive/lister.rb
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- spec/acl/s3_spec.rb
|
145
146
|
- spec/archive/authorizer_spec.rb
|
146
147
|
- spec/archive/builder_spec.rb
|
148
|
+
- spec/archive/checker_spec.rb
|
147
149
|
- spec/archive/destroyer_spec.rb
|
148
150
|
- spec/archive/downloader_spec.rb
|
149
151
|
- spec/archive/lister_spec.rb
|
@@ -200,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
202
|
version: '0'
|
201
203
|
segments:
|
202
204
|
- 0
|
203
|
-
hash:
|
205
|
+
hash: 3388616083800809289
|
204
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
207
|
none: false
|
206
208
|
requirements:
|
@@ -209,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
211
|
version: '0'
|
210
212
|
segments:
|
211
213
|
- 0
|
212
|
-
hash:
|
214
|
+
hash: 3388616083800809289
|
213
215
|
requirements: []
|
214
216
|
rubyforge_project: heirloom
|
215
217
|
rubygems_version: 1.8.16
|
@@ -220,6 +222,7 @@ test_files:
|
|
220
222
|
- spec/acl/s3_spec.rb
|
221
223
|
- spec/archive/authorizer_spec.rb
|
222
224
|
- spec/archive/builder_spec.rb
|
225
|
+
- spec/archive/checker_spec.rb
|
223
226
|
- spec/archive/destroyer_spec.rb
|
224
227
|
- spec/archive/downloader_spec.rb
|
225
228
|
- spec/archive/lister_spec.rb
|