heirloom 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|