heirloom 0.1.3 → 0.1.4
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 +6 -0
- data/README.md +0 -1
- data/lib/heirloom/acl/s3.rb +10 -8
- data/lib/heirloom/artifact.rb +44 -43
- data/lib/heirloom/artifact/artifact_authorizer.rb +20 -22
- data/lib/heirloom/artifact/artifact_builder.rb +41 -37
- data/lib/heirloom/artifact/artifact_destroyer.rb +16 -14
- data/lib/heirloom/artifact/artifact_downloader.rb +22 -40
- data/lib/heirloom/artifact/artifact_lister.rb +10 -7
- data/lib/heirloom/artifact/artifact_reader.rb +17 -20
- data/lib/heirloom/artifact/artifact_updater.rb +6 -5
- data/lib/heirloom/artifact/artifact_uploader.rb +8 -8
- data/lib/heirloom/aws/s3.rb +1 -1
- data/lib/heirloom/cli.rb +37 -30
- data/lib/heirloom/cli/build.rb +40 -0
- data/lib/heirloom/cli/destroy.rb +20 -0
- data/lib/heirloom/cli/download.rb +23 -0
- data/lib/heirloom/cli/list.rb +17 -0
- data/lib/heirloom/cli/show.rb +27 -0
- data/lib/heirloom/cli/update.rb +23 -0
- data/lib/heirloom/config.rb +11 -6
- data/lib/heirloom/destroyer/s3.rb +6 -4
- data/lib/heirloom/directory/directory.rb +15 -11
- data/lib/heirloom/directory/git_directory.rb +4 -3
- data/lib/heirloom/downloader/s3.rb +1 -1
- data/lib/heirloom/logger.rb +6 -4
- data/lib/heirloom/version.rb +1 -1
- data/spec/acl/s3_spec.rb +51 -0
- data/spec/artifact/artifact_authorizer_spec.rb +34 -0
- data/spec/artifact/artifact_builder_spec.rb +41 -0
- data/spec/artifact/artifact_destroyer_spec.rb +45 -0
- data/spec/artifact/artifact_downloader_spec.rb +93 -0
- data/spec/artifact/artifact_lister_spec.rb +21 -0
- data/spec/artifact/artifact_reader_spec.rb +55 -0
- data/spec/artifact/artifact_updater_spec.rb +16 -0
- data/spec/artifact/artifact_uploader_spec.rb +16 -0
- data/spec/artifact_spec.rb +69 -19
- data/spec/aws/s3_spec.rb +55 -0
- data/spec/aws/simpledb_spec.rb +50 -0
- data/spec/config_spec.rb +32 -3
- data/spec/destroyer/s3_spec.rb +21 -0
- data/spec/directory/directory_spec.rb +26 -0
- data/spec/directory/git_directory_spec.rb +28 -0
- data/spec/downloader/s3_spec.rb +23 -0
- data/spec/logger_spec.rb +20 -0
- metadata +55 -16
data/CHANGELOG
ADDED
data/README.md
CHANGED
data/lib/heirloom/acl/s3.rb
CHANGED
@@ -2,14 +2,16 @@ module Heirloom
|
|
2
2
|
module ACL
|
3
3
|
class S3
|
4
4
|
|
5
|
+
attr_accessor :accounts, :config, :logger, :region
|
6
|
+
|
5
7
|
def initialize(args)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
self.config = args[:config]
|
9
|
+
self.region = args[:region]
|
10
|
+
self.logger = config.logger
|
11
|
+
self.accounts = config.authorized_aws_accounts
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
14
|
+
def allow_read_access_from_accounts(args)
|
13
15
|
bucket = args[:bucket]
|
14
16
|
key_name = args[:key_name]
|
15
17
|
key_folder = args[:key_folder]
|
@@ -23,10 +25,10 @@ module Heirloom
|
|
23
25
|
|
24
26
|
grants = build_bucket_grants :id => id,
|
25
27
|
:name => name,
|
26
|
-
:accounts =>
|
28
|
+
:accounts => accounts
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
+
accounts.each do |a|
|
31
|
+
logger.info "Authorizing #{a} to s3://#{bucket}/#{key}."
|
30
32
|
end
|
31
33
|
s3.put_object_acl bucket, key, grants
|
32
34
|
end
|
data/lib/heirloom/artifact.rb
CHANGED
@@ -12,98 +12,99 @@ module Heirloom
|
|
12
12
|
class Artifact
|
13
13
|
|
14
14
|
def initialize(args)
|
15
|
-
@config = Config.new :config => args[:config]
|
16
|
-
|
15
|
+
@config = Config.new :config => args[:config],
|
16
|
+
:logger => args[:logger]
|
17
|
+
@name = args[:name]
|
18
|
+
@id = args[:id]
|
19
|
+
end
|
20
|
+
|
21
|
+
def authorize
|
22
|
+
artifact_authorizer.authorize
|
17
23
|
end
|
18
24
|
|
19
25
|
def build(args)
|
20
|
-
|
21
|
-
|
22
|
-
destroy(args)
|
23
|
-
end
|
24
|
-
|
25
|
-
file = artifact_builder.build args
|
26
|
-
|
27
|
-
artifact_uploader.upload :id => args[:id],
|
28
|
-
:name => args[:name],
|
29
|
-
:bucket_prefix => args[:bucket_prefix],
|
30
|
-
:public_readable => args[:public],
|
31
|
-
:file => file
|
32
|
-
|
33
|
-
artifact_authorizer.authorize :id => args[:id],
|
34
|
-
:name => args[:name],
|
35
|
-
:public_readable => args[:public]
|
36
|
-
|
37
|
-
artifact_builder.cleanup
|
26
|
+
artifact_builder.build args
|
27
|
+
end
|
38
28
|
|
39
|
-
|
29
|
+
def download(args)
|
30
|
+
artifact_downloader.download args
|
40
31
|
end
|
41
32
|
|
42
33
|
def update(args)
|
43
|
-
artifact_updater.update
|
44
|
-
@logger.info "Artifact update completed."
|
34
|
+
artifact_updater.update args
|
45
35
|
end
|
46
36
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
37
|
+
def upload(args)
|
38
|
+
artifact_uploader.upload args
|
39
|
+
end
|
40
|
+
|
41
|
+
def exists?
|
42
|
+
artifact_reader.exists?
|
50
43
|
end
|
51
44
|
|
52
|
-
def destroy
|
53
|
-
artifact_destroyer.destroy
|
54
|
-
@logger.info "Artifact destroyed."
|
45
|
+
def destroy
|
46
|
+
artifact_destroyer.destroy
|
55
47
|
end
|
56
48
|
|
57
|
-
def show
|
58
|
-
artifact_reader.show
|
49
|
+
def show
|
50
|
+
artifact_reader.show
|
59
51
|
end
|
60
52
|
|
61
|
-
def list(
|
62
|
-
artifact_lister.list(
|
53
|
+
def list(limit=10)
|
54
|
+
artifact_lister.list(limit)
|
63
55
|
end
|
64
56
|
|
65
|
-
def
|
66
|
-
|
57
|
+
def cleanup
|
58
|
+
artifact_builder.cleanup
|
67
59
|
end
|
68
60
|
|
69
61
|
private
|
70
62
|
|
71
63
|
def artifact_lister
|
72
|
-
@artifact_lister ||= ArtifactLister.new :config => @config
|
64
|
+
@artifact_lister ||= ArtifactLister.new :config => @config,
|
65
|
+
:name => @name
|
73
66
|
end
|
74
67
|
|
75
68
|
def artifact_reader
|
76
|
-
@artifact_reader ||= ArtifactReader.new :config => @config
|
69
|
+
@artifact_reader ||= ArtifactReader.new :config => @config,
|
70
|
+
:name => @name,
|
71
|
+
:id => @id
|
77
72
|
end
|
78
73
|
|
79
74
|
def artifact_builder
|
80
75
|
@artifact_builder ||= ArtifactBuilder.new :config => @config,
|
81
|
-
:
|
76
|
+
:name => @name,
|
77
|
+
:id => @id
|
82
78
|
end
|
83
79
|
|
84
80
|
def artifact_updater
|
85
81
|
@artifact_updater ||= ArtifactUpdater.new :config => @config,
|
86
|
-
:
|
82
|
+
:name => @name,
|
83
|
+
:id => @id
|
87
84
|
end
|
88
85
|
|
89
86
|
def artifact_uploader
|
90
87
|
@artifact_uploader ||= ArtifactUploader.new :config => @config,
|
91
|
-
:
|
88
|
+
:name => @name,
|
89
|
+
:id => @id
|
92
90
|
end
|
93
91
|
|
94
92
|
def artifact_downloader
|
95
93
|
@artifact_downloader ||= ArtifactDownloader.new :config => @config,
|
96
|
-
:
|
94
|
+
:name => @name,
|
95
|
+
:id => @id
|
97
96
|
end
|
98
97
|
|
99
98
|
def artifact_authorizer
|
100
99
|
@artifact_authorizer ||= ArtifactAuthorizer.new :config => @config,
|
101
|
-
:
|
100
|
+
:name => @name,
|
101
|
+
:id => @id
|
102
102
|
end
|
103
103
|
|
104
104
|
def artifact_destroyer
|
105
105
|
@artifact_destroyer ||= ArtifactDestroyer.new :config => @config,
|
106
|
-
:
|
106
|
+
:name => @name,
|
107
|
+
:id => @id
|
107
108
|
end
|
108
109
|
|
109
110
|
end
|
@@ -4,36 +4,34 @@ module Heirloom
|
|
4
4
|
|
5
5
|
def initialize(args)
|
6
6
|
@config = args[:config]
|
7
|
-
@
|
7
|
+
@name = args[:name]
|
8
|
+
@id = args[:id]
|
9
|
+
@logger = @config.logger
|
8
10
|
end
|
9
11
|
|
10
|
-
def authorize
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
s3_acl = ACL::S3.new :config => @config,
|
23
|
-
:logger => @logger,
|
24
|
-
:region => region
|
25
|
-
|
26
|
-
s3_acl.allow_read_acccess_from_accounts :key_name => id,
|
27
|
-
:key_folder => name,
|
28
|
-
:bucket => bucket
|
29
|
-
end
|
12
|
+
def authorize
|
13
|
+
@logger.info "Authorizing access to artifact."
|
14
|
+
|
15
|
+
@config.regions.each do |region|
|
16
|
+
bucket = artifact_reader.get_bucket :region => region
|
17
|
+
|
18
|
+
s3_acl = ACL::S3.new :config => @config,
|
19
|
+
:region => region
|
20
|
+
|
21
|
+
s3_acl.allow_read_access_from_accounts :key_name => @id,
|
22
|
+
:key_folder => @name,
|
23
|
+
:bucket => bucket
|
30
24
|
end
|
25
|
+
|
26
|
+
@logger.info "Authorization complete."
|
31
27
|
end
|
32
28
|
|
33
29
|
private
|
34
30
|
|
35
31
|
def artifact_reader
|
36
|
-
@artifact_reader ||= ArtifactReader.new :config => @config
|
32
|
+
@artifact_reader ||= ArtifactReader.new :config => @config,
|
33
|
+
:name => @name,
|
34
|
+
:id => @id
|
37
35
|
end
|
38
36
|
|
39
37
|
end
|
@@ -5,73 +5,77 @@ module Heirloom
|
|
5
5
|
|
6
6
|
class ArtifactBuilder
|
7
7
|
|
8
|
+
attr_accessor :config, :id, :local_build, :logger, :name, :source
|
9
|
+
|
8
10
|
def initialize(args)
|
9
|
-
|
10
|
-
|
11
|
+
self.config = args[:config]
|
12
|
+
self.name = args[:name]
|
13
|
+
self.id = args[:id]
|
14
|
+
self.logger = config.logger
|
15
|
+
sdb.create_domain name
|
11
16
|
end
|
12
17
|
|
13
18
|
def build(args)
|
14
|
-
|
15
|
-
@id = args[:id]
|
16
|
-
@exclude = args[:exclude]
|
19
|
+
self.source = args[:directory] ||= '.'
|
17
20
|
|
18
|
-
directory =
|
21
|
+
directory = Directory.new :path => source,
|
22
|
+
:exclude => args[:exclude],
|
23
|
+
:config => config
|
19
24
|
|
20
|
-
|
21
|
-
:exclude => @exclude,
|
22
|
-
:logger => @logger
|
25
|
+
directory.build_artifact_from_directory
|
23
26
|
|
24
|
-
|
27
|
+
self.local_build = directory.local_build
|
25
28
|
|
26
29
|
create_artifact_record
|
27
30
|
|
28
|
-
if args[:git]
|
29
|
-
|
30
|
-
|
31
|
-
@logger.info "Adding git commit to attributes."
|
32
|
-
@commit = git_directory.commit @id
|
33
|
-
add_git_commit_to_artifact_record
|
34
|
-
end
|
31
|
+
add_git_commit if args[:git]
|
32
|
+
|
33
|
+
logger.info "Build complete."
|
35
34
|
|
36
|
-
|
35
|
+
local_build
|
37
36
|
end
|
38
37
|
|
39
38
|
def cleanup
|
40
|
-
|
41
|
-
File.delete
|
39
|
+
logger.info "Cleaning up local build #{local_build}."
|
40
|
+
File.delete local_build
|
42
41
|
end
|
43
42
|
|
44
43
|
private
|
45
44
|
|
45
|
+
def add_git_commit
|
46
|
+
git_commit = GitDirectory.new(:path => source).commit
|
47
|
+
add_git_commit_to_artifact_record git_commit
|
48
|
+
end
|
49
|
+
|
46
50
|
def create_artifact_domain
|
47
|
-
|
48
|
-
sdb.create_domain @name
|
51
|
+
logger.info "Verifying artifact domain #{name} exists."
|
49
52
|
end
|
50
53
|
|
51
54
|
def create_artifact_record
|
52
55
|
create_artifact_domain
|
53
56
|
attributes = { 'built_by' => "#{user}@#{hostname}",
|
54
57
|
'built_at' => Time.now.utc.iso8601,
|
55
|
-
'id' =>
|
56
|
-
|
57
|
-
sdb.put_attributes
|
58
|
+
'id' => id }
|
59
|
+
logger.info "Create artifact record #{id}."
|
60
|
+
sdb.put_attributes name, id, attributes
|
58
61
|
end
|
59
62
|
|
60
|
-
def add_git_commit_to_artifact_record
|
61
|
-
attributes = { 'sha' =>
|
62
|
-
'abbreviated_sha' =>
|
63
|
-
'message' =>
|
64
|
-
'author' =>
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
63
|
+
def add_git_commit_to_artifact_record(commit)
|
64
|
+
attributes = { 'sha' => id,
|
65
|
+
'abbreviated_sha' => commit.id_abbrev,
|
66
|
+
'message' => commit.message,
|
67
|
+
'author' => commit.author.name }
|
68
|
+
|
69
|
+
logger.info "Git sha: #{id}"
|
70
|
+
logger.info "Git abbreviated_sha: #{commit.id_abbrev}"
|
71
|
+
logger.info "Git message: #{commit.message}"
|
72
|
+
logger.info "Git author: #{commit.author.name}"
|
73
|
+
|
74
|
+
sdb.put_attributes name, id, attributes
|
71
75
|
end
|
72
76
|
|
73
77
|
def sdb
|
74
|
-
@sdb ||= AWS::SimpleDB.new :config =>
|
78
|
+
@sdb ||= AWS::SimpleDB.new :config => config
|
75
79
|
end
|
76
80
|
|
77
81
|
def user
|
@@ -2,27 +2,26 @@ module Heirloom
|
|
2
2
|
|
3
3
|
class ArtifactDestroyer
|
4
4
|
|
5
|
+
attr_accessor :config, :id, :logger, :name
|
6
|
+
|
5
7
|
def initialize(args)
|
6
|
-
|
7
|
-
|
8
|
+
self.config = args[:config]
|
9
|
+
self.name = args[:name]
|
10
|
+
self.id = args[:id]
|
11
|
+
self.logger = config.logger
|
8
12
|
end
|
9
13
|
|
10
|
-
def destroy
|
11
|
-
|
12
|
-
name = args[:name]
|
14
|
+
def destroy
|
15
|
+
logger.info "Destroying #{@name} - #{@id}"
|
13
16
|
|
14
|
-
|
17
|
+
config.regions.each do |region|
|
18
|
+
bucket = artifact_reader.get_bucket :region => region
|
15
19
|
|
16
|
-
@config.regions.each do |region|
|
17
|
-
puts "#{region}, #{name}, #{id}"
|
18
|
-
bucket = artifact_reader.get_bucket :region => region,
|
19
|
-
:name => name,
|
20
|
-
:id => id
|
21
20
|
key = "#{id}.tar.gz"
|
22
21
|
|
23
|
-
|
22
|
+
logger.info "Destroying 's3://#{bucket}/#{name}/#{key}'."
|
24
23
|
|
25
|
-
s3_destroyer = Destroyer::S3.new :config =>
|
24
|
+
s3_destroyer = Destroyer::S3.new :config => config,
|
26
25
|
:region => region
|
27
26
|
|
28
27
|
s3_destroyer.destroy_file :key_name => key,
|
@@ -31,6 +30,7 @@ module Heirloom
|
|
31
30
|
|
32
31
|
end
|
33
32
|
sdb.delete name, id
|
33
|
+
logger.info "Destroy complete."
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
@@ -40,7 +40,9 @@ module Heirloom
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def artifact_reader
|
43
|
-
@artifact_reader ||= ArtifactReader.new :config =>
|
43
|
+
@artifact_reader ||= ArtifactReader.new :config => config,
|
44
|
+
:name => name,
|
45
|
+
:id => id
|
44
46
|
end
|
45
47
|
|
46
48
|
end
|
@@ -2,65 +2,47 @@ module Heirloom
|
|
2
2
|
|
3
3
|
class ArtifactDownloader
|
4
4
|
|
5
|
+
attr_accessor :config, :id, :name, :logger
|
6
|
+
|
5
7
|
def initialize(args)
|
6
|
-
|
7
|
-
|
8
|
+
self.config = args[:config]
|
9
|
+
self.name = args[:name]
|
10
|
+
self.id = args[:id]
|
11
|
+
self.logger = config.logger
|
8
12
|
end
|
9
13
|
|
10
14
|
def download(args)
|
11
|
-
|
12
|
-
@name = args[:name]
|
13
|
-
@output = args[:output]
|
14
|
-
@region = args[:region]
|
15
|
-
|
16
|
-
s3_downloader = Downloader::S3.new :config => @config,
|
17
|
-
:logger => @logger,
|
18
|
-
:region => @region
|
15
|
+
region = args[:region]
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
s3_downloader = Downloader::S3.new :config => config,
|
18
|
+
:logger => logger,
|
19
|
+
:region => region
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
:id => @id
|
21
|
+
bucket = artifact_reader.get_bucket :region => region
|
22
|
+
key = artifact_reader.get_key :region => region
|
27
23
|
|
28
|
-
|
24
|
+
logger.info "Downloading s3://#{bucket}/#{key} from #{region}."
|
29
25
|
|
30
26
|
file = s3_downloader.download_file :bucket => bucket,
|
31
27
|
:key => key
|
32
28
|
|
33
|
-
|
29
|
+
output = args[:output] ||= "./#{key.split('/').last}"
|
30
|
+
|
31
|
+
logger.info "Writing file to #{output}."
|
34
32
|
|
35
|
-
File.open(
|
33
|
+
File.open(output, 'w') do |local_file|
|
36
34
|
local_file.write file
|
37
35
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
36
|
|
42
|
-
|
43
|
-
artifact = artifact_reader.show :name => @name,
|
44
|
-
:id => @id
|
45
|
-
|
46
|
-
url = artifact["#{@region}-s3-url"].first
|
47
|
-
|
48
|
-
bucket = url.gsub('s3://', '').split('/').first
|
37
|
+
logger.info "Download complete."
|
49
38
|
end
|
50
39
|
|
51
|
-
|
52
|
-
artifact = artifact_reader.show :name => @name,
|
53
|
-
:id => @id
|
54
|
-
|
55
|
-
url = artifact["#{@region}-s3-url"].first
|
56
|
-
|
57
|
-
bucket = url.gsub('s3://', '').gsub(get_bucket, '')
|
58
|
-
bucket.slice!(0)
|
59
|
-
bucket
|
60
|
-
end
|
40
|
+
private
|
61
41
|
|
62
42
|
def artifact_reader
|
63
|
-
@artifact_reader ||= ArtifactReader.new :config =>
|
43
|
+
@artifact_reader ||= ArtifactReader.new :config => config,
|
44
|
+
:name => name,
|
45
|
+
:id => id
|
64
46
|
end
|
65
47
|
|
66
48
|
end
|