heirloom 0.7.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +18 -0
- data/lib/heirloom/archive/builder.rb +13 -13
- data/lib/heirloom/archive/downloader.rb +8 -8
- data/lib/heirloom/archive/writer.rb +4 -4
- data/lib/heirloom/catalog.rb +2 -2
- data/lib/heirloom/catalog/add.rb +4 -3
- data/lib/heirloom/catalog/show.rb +2 -2
- data/lib/heirloom/cipher/data.rb +3 -3
- data/lib/heirloom/cli.rb +1 -0
- data/lib/heirloom/cli/catalog.rb +6 -3
- data/lib/heirloom/cli/download.rb +9 -9
- data/lib/heirloom/cli/formatter.rb +2 -0
- data/lib/heirloom/cli/formatter/catalog.rb +42 -0
- data/lib/heirloom/cli/formatter/show.rb +55 -0
- data/lib/heirloom/cli/list.rb +8 -2
- data/lib/heirloom/cli/setup.rb +15 -17
- data/lib/heirloom/cli/shared.rb +20 -7
- data/lib/heirloom/cli/show.rb +10 -1
- data/lib/heirloom/cli/teardown.rb +2 -2
- data/lib/heirloom/cli/upload.rb +11 -11
- data/lib/heirloom/version.rb +1 -1
- data/spec/archive/downloader_spec.rb +15 -15
- data/spec/archive/setup_spec.rb +6 -6
- data/spec/archive/teardowner_spec.rb +3 -3
- data/spec/archive/writer_spec.rb +1 -1
- data/spec/catalog/add_spec.rb +8 -7
- data/spec/catalog/show_spec.rb +6 -4
- data/spec/catalog_spec.rb +12 -12
- data/spec/cipher/data_spec.rb +1 -1
- data/spec/cli/catalog_spec.rb +46 -15
- data/spec/cli/download_spec.rb +13 -13
- data/spec/cli/formatter/catalog_spec.rb +39 -0
- data/spec/cli/formatter/show_spec.rb +29 -0
- data/spec/cli/list_spec.rb +31 -11
- data/spec/cli/setup_spec.rb +5 -4
- data/spec/cli/shared_spec.rb +9 -1
- data/spec/cli/show_spec.rb +45 -12
- data/spec/cli/teardown_spec.rb +2 -1
- data/spec/cli/upload_spec.rb +12 -12
- metadata +19 -12
data/CHANGELOG
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## v0.8.0:
|
2
|
+
|
3
|
+
* Change base to bucket prefix through out code base
|
4
|
+
* Prevent setup from overwriting existing heirlooms
|
5
|
+
* Add human readable format as default for show
|
6
|
+
* Included JSON option to show
|
7
|
+
* Hide heirloom internal attribts in show
|
8
|
+
* Added all option to display all attributes via show
|
9
|
+
* Add human readable format as default for list
|
10
|
+
* Included JSON option in list
|
11
|
+
* Add human readable format as default for catalog
|
12
|
+
* Included JSON option in catalog
|
13
|
+
* Add name filter option to catalog
|
14
|
+
|
15
|
+
## v0.7.5:
|
16
|
+
|
17
|
+
* Create random base if not specified by setup.
|
18
|
+
|
1
19
|
## v0.7.4:
|
2
20
|
|
3
21
|
* Add support to read password from file
|
@@ -9,20 +9,20 @@ module Heirloom
|
|
9
9
|
|
10
10
|
def initialize(args)
|
11
11
|
@config = args[:config]
|
12
|
-
@name
|
12
|
+
@name = args[:name]
|
13
13
|
@domain = "heirloom_#{@name}"
|
14
|
-
@id
|
14
|
+
@id = args[:id]
|
15
15
|
@logger = @config.logger
|
16
16
|
end
|
17
17
|
|
18
18
|
def build(args)
|
19
|
-
@source
|
20
|
-
@secret
|
21
|
-
@
|
19
|
+
@source = args[:directory] ||= '.'
|
20
|
+
@secret = args[:secret]
|
21
|
+
@bucket_prefix = args[:bucket_prefix]
|
22
22
|
|
23
|
-
directory = Directory.new :path
|
24
|
-
:exclude
|
25
|
-
:config
|
23
|
+
directory = Directory.new :path => @source,
|
24
|
+
:exclude => args[:exclude],
|
25
|
+
:config => @config
|
26
26
|
|
27
27
|
unless directory.build_artifact_from_directory :secret => @secret
|
28
28
|
return false
|
@@ -63,11 +63,11 @@ module Heirloom
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def create_artifact_record
|
66
|
-
attributes = { 'built_by'
|
67
|
-
'built_at'
|
68
|
-
'encrypted'
|
69
|
-
'
|
70
|
-
'id'
|
66
|
+
attributes = { 'built_by' => "#{user}@#{hostname}",
|
67
|
+
'built_at' => Time.now.utc.iso8601,
|
68
|
+
'encrypted' => encrypted?,
|
69
|
+
'bucket_prefix' => @bucket_prefix,
|
70
|
+
'id' => @id }
|
71
71
|
@logger.info "Adding entry #{@id}."
|
72
72
|
sdb.put_attributes @domain, @id, attributes
|
73
73
|
end
|
@@ -4,17 +4,17 @@ module Heirloom
|
|
4
4
|
|
5
5
|
def initialize(args)
|
6
6
|
@config = args[:config]
|
7
|
-
@name
|
8
|
-
@id
|
7
|
+
@name = args[:name]
|
8
|
+
@id = args[:id]
|
9
9
|
@logger = @config.logger
|
10
10
|
end
|
11
11
|
|
12
12
|
def download(args)
|
13
|
-
@region
|
14
|
-
@
|
15
|
-
extract
|
16
|
-
secret
|
17
|
-
output
|
13
|
+
@region = args[:region]
|
14
|
+
@bucket_prefix = args[:bucket_prefix]
|
15
|
+
extract = args[:extract]
|
16
|
+
secret = args[:secret]
|
17
|
+
output = args[:output] ||= './'
|
18
18
|
|
19
19
|
@logger.info "Downloading s3://#{bucket}/#{key} from #{@region}."
|
20
20
|
|
@@ -51,7 +51,7 @@ module Heirloom
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def bucket
|
54
|
-
"#{@
|
54
|
+
"#{@bucket_prefix}-#{@region}"
|
55
55
|
end
|
56
56
|
|
57
57
|
def writer
|
@@ -26,7 +26,7 @@ module Heirloom
|
|
26
26
|
|
27
27
|
def write_archive
|
28
28
|
output_file = File.join @output, @file
|
29
|
-
@logger.info "Writing
|
29
|
+
@logger.info "Writing Heirloom to '#{output_file}'."
|
30
30
|
File.open(output_file, 'w') { |local_file| local_file.write @archive }
|
31
31
|
end
|
32
32
|
|
@@ -35,15 +35,15 @@ module Heirloom
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def extract_tmp_archive
|
38
|
-
@logger.info "Extracting
|
38
|
+
@logger.info "Extracting Heirloom to '#{@output}'."
|
39
39
|
cmd = "tar xzf #{@tmp_archive} -C #{@output}"
|
40
40
|
@logger.debug "Executing '#{cmd}'."
|
41
41
|
`#{cmd}`
|
42
42
|
if $?.success?
|
43
|
-
@logger.debug "
|
43
|
+
@logger.debug "Heirloom succesfully extracted."
|
44
44
|
true
|
45
45
|
else
|
46
|
-
@logger.error "Error extracting
|
46
|
+
@logger.error "Error extracting Heirloom."
|
47
47
|
false
|
48
48
|
end
|
49
49
|
end
|
data/lib/heirloom/catalog.rb
CHANGED
data/lib/heirloom/catalog/add.rb
CHANGED
@@ -9,14 +9,15 @@ module Heirloom
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def add_to_catalog(args)
|
12
|
-
regions
|
13
|
-
|
12
|
+
regions = args[:regions]
|
13
|
+
bucket_prefix = args[:bucket_prefix]
|
14
14
|
|
15
15
|
@logger.info "Adding #{@name} to catalog."
|
16
16
|
|
17
17
|
sdb.put_attributes 'heirloom',
|
18
18
|
"heirloom_#{@name}",
|
19
|
-
"regions" => regions,
|
19
|
+
{ "regions" => regions,
|
20
|
+
"bucket_prefix" => bucket_prefix }
|
20
21
|
|
21
22
|
end
|
22
23
|
|
data/lib/heirloom/cipher/data.rb
CHANGED
@@ -15,7 +15,7 @@ module Heirloom
|
|
15
15
|
|
16
16
|
return data unless args[:secret]
|
17
17
|
|
18
|
-
@logger.info "Secret provided. Decrypting
|
18
|
+
@logger.info "Secret provided. Decrypting Heirloom."
|
19
19
|
|
20
20
|
@aes = OpenSSL::Cipher::AES256.new(:CBC)
|
21
21
|
@aes.decrypt
|
@@ -25,9 +25,9 @@ module Heirloom
|
|
25
25
|
@aes.update(data) + @aes.final
|
26
26
|
rescue OpenSSL::Cipher::CipherError => e
|
27
27
|
if e.message == 'wrong final block length'
|
28
|
-
@logger.error 'This
|
28
|
+
@logger.error 'This Heirloom does not appear to be encrypted.'
|
29
29
|
end
|
30
|
-
@logger.error "Unable to decrypt
|
30
|
+
@logger.error "Unable to decrypt Heirloom: '#{e.message}'"
|
31
31
|
false
|
32
32
|
end
|
33
33
|
end
|
data/lib/heirloom/cli.rb
CHANGED
data/lib/heirloom/cli/catalog.rb
CHANGED
@@ -21,10 +21,12 @@ module Heirloom
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def all
|
24
|
-
if @opts[:
|
24
|
+
if @opts[:json]
|
25
25
|
jj catalog_with_heirloom_prefix_removed
|
26
26
|
else
|
27
|
-
|
27
|
+
formatter = Heirloom::CLI::Formatter::Catalog.new
|
28
|
+
puts formatter.format :catalog => catalog_with_heirloom_prefix_removed,
|
29
|
+
:name => @opts[:name]
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -49,7 +51,8 @@ EOS
|
|
49
51
|
opt :help, "Display Help"
|
50
52
|
opt :level, "Log level [debug|info|warn|error].", :type => :string,
|
51
53
|
:default => 'info'
|
52
|
-
opt :
|
54
|
+
opt :json, "Dump full catalog as raw JSON."
|
55
|
+
opt :name, "Name of Heirloom to show full details.", :type => :string
|
53
56
|
opt :metadata_region, "AWS region to store Heirloom metadata.", :type => :string,
|
54
57
|
:default => 'us-west-1'
|
55
58
|
opt :aws_access_key, "AWS Access Key ID", :type => :string,
|
@@ -25,10 +25,10 @@ module Heirloom
|
|
25
25
|
:id => id,
|
26
26
|
:config => @config
|
27
27
|
|
28
|
-
# Lookup region &
|
28
|
+
# Lookup region & bucket_prefix from simpledb unless specified
|
29
29
|
# To Do, valid validation message that simpledb exists
|
30
30
|
@region = @opts[:region] || @catalog.regions.first
|
31
|
-
@
|
31
|
+
@bucket_prefix = @opts[:bucket_prefix] || @catalog.bucket_prefix
|
32
32
|
end
|
33
33
|
|
34
34
|
def download
|
@@ -37,11 +37,11 @@ module Heirloom
|
|
37
37
|
:config => @config
|
38
38
|
ensure_valid_secret :secret => secret,
|
39
39
|
:config => @config
|
40
|
-
archive = @archive.download :output
|
41
|
-
:extract
|
42
|
-
:region
|
43
|
-
:
|
44
|
-
:secret
|
40
|
+
archive = @archive.download :output => @opts[:output],
|
41
|
+
:extract => @opts[:extract],
|
42
|
+
:region => @region,
|
43
|
+
:bucket_prefix => @bucket_prefix,
|
44
|
+
:secret => secret
|
45
45
|
exit 1 unless archive
|
46
46
|
end
|
47
47
|
|
@@ -60,10 +60,10 @@ heirloom download -n NAME -o OUTPUT_DIRECTORY
|
|
60
60
|
|
61
61
|
If id (-i) is not specified, the latest id will be downloaded.
|
62
62
|
|
63
|
-
To download Heirloom without looking up details in SimpleDB, specify region (-r), ID (-i) and
|
63
|
+
To download Heirloom without looking up details in SimpleDB, specify region (-r), ID (-i) and bucket_prefix (-b) options.
|
64
64
|
|
65
65
|
EOS
|
66
|
-
opt :
|
66
|
+
opt :bucket_prefix, "Bucket prefix of the Heirloom to download.", :type => :string
|
67
67
|
opt :extract, "Extract the Heirloom into the given output path.", :short => "-x"
|
68
68
|
opt :help, "Display Help"
|
69
69
|
opt :id, "ID of the Heirloom to download.", :type => :string
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Heirloom
|
2
|
+
module CLI
|
3
|
+
module Formatter
|
4
|
+
class Catalog
|
5
|
+
def format(args)
|
6
|
+
@catalog = args[:catalog]
|
7
|
+
@name = args[:name]
|
8
|
+
|
9
|
+
return summary unless @name
|
10
|
+
|
11
|
+
return "Heirloom #{@name} not found in catalog." unless name_exists?
|
12
|
+
|
13
|
+
filter_by_name
|
14
|
+
details
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def name_exists?
|
20
|
+
@catalog.include? @name
|
21
|
+
end
|
22
|
+
|
23
|
+
def filter_by_name
|
24
|
+
@catalog.select! {|k| @name == k }
|
25
|
+
end
|
26
|
+
|
27
|
+
def summary
|
28
|
+
@catalog.keys.join "\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
def details
|
32
|
+
data = @catalog.each_pair.map do |k,v|
|
33
|
+
d = k + "\n"
|
34
|
+
d << " Regions : " + @catalog[k]["regions"].join(", ") + "\n"
|
35
|
+
d << " Bucket Prefix : " + @catalog[k]["bucket_prefix"].first
|
36
|
+
end
|
37
|
+
data.join "\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Heirloom
|
2
|
+
module CLI
|
3
|
+
module Formatter
|
4
|
+
class Show
|
5
|
+
|
6
|
+
def format(args)
|
7
|
+
@all = args[:all]
|
8
|
+
@attributes = args[:attributes]
|
9
|
+
format_attributes
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def format_attributes
|
15
|
+
remove_internal_attributes unless @all
|
16
|
+
formated = @attributes.each_pair.map do |key,value|
|
17
|
+
"#{padded_key(key)}: #{value}"
|
18
|
+
end
|
19
|
+
formated.join("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
def padded_key(key)
|
23
|
+
max_length ||= longest_attribute_length
|
24
|
+
key + (" " * (max_length - key.length + 1))
|
25
|
+
end
|
26
|
+
|
27
|
+
def longest_attribute_length
|
28
|
+
longest_length = 0
|
29
|
+
@attributes.keys.each do |k|
|
30
|
+
longest_length = k.length if k.length > longest_length
|
31
|
+
end
|
32
|
+
longest_length
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_internal_attributes
|
36
|
+
@attributes.delete_if { |key| is_internal_attribute? key }
|
37
|
+
end
|
38
|
+
|
39
|
+
def is_internal_attribute?(attribute)
|
40
|
+
return true if is_reserved? attribute
|
41
|
+
return true if is_endpoint? attribute
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def is_reserved?(attribute)
|
46
|
+
['bucket_prefix', 'built_at', 'built_by'].include? attribute
|
47
|
+
end
|
48
|
+
|
49
|
+
def is_endpoint?(attribute)
|
50
|
+
attribute.match('^.*-.*-\d*-s3|http|https-url$')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/heirloom/cli/list.rb
CHANGED
@@ -22,8 +22,13 @@ module Heirloom
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def list(count = @opts[:count])
|
25
|
-
@logger.debug "#{@archive.count}
|
26
|
-
|
25
|
+
@logger.debug "#{@archive.count} IDs found."
|
26
|
+
list = @archive.list count
|
27
|
+
if @opts[:json]
|
28
|
+
jj list
|
29
|
+
else
|
30
|
+
puts list.join "\n"
|
31
|
+
end
|
27
32
|
end
|
28
33
|
|
29
34
|
private
|
@@ -43,6 +48,7 @@ EOS
|
|
43
48
|
opt :count, "Number of IDs to return.", :type => :integer,
|
44
49
|
:default => 10
|
45
50
|
opt :help, "Display Help"
|
51
|
+
opt :json, "Display output as raw JSON."
|
46
52
|
opt :level, "Log level [debug|info|warn|error].", :type => :string,
|
47
53
|
:default => 'info'
|
48
54
|
opt :metadata_region, "AWS region to store Heirloom metadata.", :type => :string,
|
data/lib/heirloom/cli/setup.rb
CHANGED
@@ -11,8 +11,9 @@ module Heirloom
|
|
11
11
|
:opts => @opts
|
12
12
|
|
13
13
|
ensure_valid_options :provided => @opts,
|
14
|
-
:required => [:metadata_region,
|
15
|
-
:
|
14
|
+
:required => [:metadata_region,
|
15
|
+
:bucket_prefix,
|
16
|
+
:region, :name],
|
16
17
|
:config => @config
|
17
18
|
|
18
19
|
@catalog = Heirloom::Catalog.new :name => @opts[:name],
|
@@ -30,18 +31,16 @@ module Heirloom
|
|
30
31
|
:regions => @opts[:region]
|
31
32
|
|
32
33
|
@catalog.create_catalog_domain
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
34
|
+
|
35
|
+
ensure_entry_does_not_exist_in_catalog :config => @config,
|
36
|
+
:catalog => @catalog,
|
37
|
+
:entry => @opts[:name]
|
38
|
+
|
39
|
+
@catalog.add_to_catalog :regions => @opts[:region],
|
40
|
+
:bucket_prefix => @opts[:bucket_prefix]
|
42
41
|
|
43
42
|
@archive.setup :regions => @opts[:region],
|
44
|
-
:bucket_prefix => @opts[:
|
43
|
+
:bucket_prefix => @opts[:bucket_prefix]
|
45
44
|
end
|
46
45
|
|
47
46
|
private
|
@@ -55,14 +54,13 @@ Setup S3 and SimpleDB in the given regions.
|
|
55
54
|
|
56
55
|
Usage:
|
57
56
|
|
58
|
-
heirloom setup -b
|
57
|
+
heirloom setup -b BUCKET_PREFIX -n NAME -m REGION1 -r REGION1 -r REGION2
|
59
58
|
|
60
59
|
EOS
|
61
|
-
opt :
|
62
|
-
|
63
|
-
in us-west-1 and test-us-east-1 in us-east-1.", :type => :string
|
60
|
+
opt :bucket_prefix, "The bucket prefix will be combined with specified \
|
61
|
+
regions to create the required buckets. For example: '-b test -r us-west-1 -r \
|
62
|
+
us-east-1' will create bucket test-us-west-1 in us-west-1 and test-us-east-1 in us-east-1.", :type => :string
|
64
63
|
opt :help, "Display Help"
|
65
|
-
opt :force, "Force setup even if entry already exists in catalog."
|
66
64
|
opt :level, "Log level [debug|info|warn|error].", :type => :string,
|
67
65
|
:default => 'info'
|
68
66
|
opt :metadata_region, "AWS region to store Heirloom metadata.", :type => :string,
|