simple_deploy 0.6.3 → 0.6.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 +5 -0
- data/lib/simple_deploy/artifact.rb +6 -5
- data/lib/simple_deploy/stack/deployment.rb +3 -1
- data/lib/simple_deploy/stack/stack_attribute_formater.rb +23 -8
- data/lib/simple_deploy/stack.rb +2 -2
- data/lib/simple_deploy/version.rb +1 -1
- data/spec/artifact_spec.rb +32 -12
- data/spec/stack/deployment_spec.rb +66 -42
- data/spec/stack/stack_attribute_formater_spec.rb +55 -11
- metadata +16 -16
data/CHANGELOG
CHANGED
@@ -3,13 +3,14 @@ module SimpleDeploy
|
|
3
3
|
|
4
4
|
def initialize(args)
|
5
5
|
@bucket_prefix = args[:bucket_prefix]
|
6
|
-
@id
|
7
|
-
@name
|
8
|
-
@region
|
9
|
-
@domain
|
6
|
+
@id = args[:id]
|
7
|
+
@name = args[:name]
|
8
|
+
@region = args[:region]
|
9
|
+
@domain = args[:domain]
|
10
|
+
@encrypted = args[:encrypted]
|
10
11
|
|
11
12
|
@bucket = "#{@bucket_prefix}-#{@region}"
|
12
|
-
@key = "#{@id}.tar.gz"
|
13
|
+
@key = @encrypted ? "#{@id}.tar.gz.gpg" : "#{@id}.tar.gz"
|
13
14
|
end
|
14
15
|
|
15
16
|
def endpoints
|
@@ -75,12 +75,14 @@ module SimpleDeploy
|
|
75
75
|
variable = @config.artifact_deploy_variable artifact
|
76
76
|
bucket_prefix = attributes["#{artifact}_bucket_prefix"]
|
77
77
|
domain = attributes["#{artifact}_domain"]
|
78
|
+
encrypted = attributes["#{artifact}_encrypted"] == 'true'
|
78
79
|
|
79
80
|
artifact = Artifact.new :name => artifact,
|
80
81
|
:id => attributes[artifact],
|
81
82
|
:region => @region,
|
82
83
|
:domain => domain,
|
83
|
-
:bucket_prefix => bucket_prefix
|
84
|
+
:bucket_prefix => bucket_prefix,
|
85
|
+
:encrypted => encrypted
|
84
86
|
|
85
87
|
h[variable] = artifact.endpoints['s3']
|
86
88
|
end
|
@@ -2,24 +2,26 @@ module SimpleDeploy
|
|
2
2
|
class StackAttributeFormater
|
3
3
|
|
4
4
|
def initialize(args)
|
5
|
-
@config
|
6
|
-
@environment
|
5
|
+
@config = args[:config]
|
6
|
+
@environment = args[:environment]
|
7
7
|
@main_attributes = args[:main_attributes]
|
8
|
-
@region
|
9
|
-
@logger
|
8
|
+
@region = @config.region @environment
|
9
|
+
@logger = @config.logger
|
10
10
|
end
|
11
11
|
|
12
12
|
def updated_attributes(attributes)
|
13
|
+
@provided_attributes = attributes
|
14
|
+
|
13
15
|
updates = []
|
14
|
-
|
16
|
+
@provided_attributes.each do |attrhash|
|
15
17
|
key = attrhash.keys.first
|
16
18
|
if artifact_names.include? key
|
17
|
-
url_hash = cloud_formation_url attrhash,
|
19
|
+
url_hash = cloud_formation_url attrhash, @provided_attributes
|
18
20
|
updates << url_hash
|
19
21
|
@logger.info "Adding artifact attribute: #{url_hash}"
|
20
22
|
end
|
21
23
|
end
|
22
|
-
|
24
|
+
@provided_attributes + updates
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
@@ -33,15 +35,28 @@ module SimpleDeploy
|
|
33
35
|
id = selected_attribute[name]
|
34
36
|
|
35
37
|
bucket_prefix, domain = find_bucket_prefix_and_domain selected_attribute, updated_attributes
|
38
|
+
|
36
39
|
artifact = Artifact.new :name => name,
|
37
40
|
:id => id,
|
38
41
|
:region => @region,
|
39
42
|
:config => @config,
|
40
43
|
:domain => domain,
|
44
|
+
:encrypted => artifact_encrypted?(name),
|
41
45
|
:bucket_prefix => bucket_prefix
|
42
46
|
|
43
47
|
url_parameter = @config.artifact_cloud_formation_url name
|
44
|
-
|
48
|
+
url_value = artifact.endpoints['s3']
|
49
|
+
|
50
|
+
{ url_parameter => url_value }
|
51
|
+
end
|
52
|
+
|
53
|
+
def artifact_encrypted?(name)
|
54
|
+
provided_attributes_encrypted = @provided_attributes.select do |attribute|
|
55
|
+
attribute["#{name}_encrypted"] == 'true'
|
56
|
+
end.any?
|
57
|
+
main_attributes_encrypted = @main_attributes["#{name}_encrypted"] == 'true'
|
58
|
+
|
59
|
+
provided_attributes_encrypted || main_attributes_encrypted
|
45
60
|
end
|
46
61
|
|
47
62
|
def find_bucket_prefix_and_domain(selected_attribute, updated_attributes)
|
data/lib/simple_deploy/stack.rb
CHANGED
@@ -124,8 +124,8 @@ module SimpleDeploy
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def stack_attribute_formater
|
127
|
-
@saf ||= StackAttributeFormater.new :config
|
128
|
-
:environment
|
127
|
+
@saf ||= StackAttributeFormater.new :config => @config,
|
128
|
+
:environment => @environment,
|
129
129
|
:main_attributes => attributes
|
130
130
|
end
|
131
131
|
|
data/spec/artifact_spec.rb
CHANGED
@@ -4,20 +4,40 @@ describe SimpleDeploy do
|
|
4
4
|
|
5
5
|
describe "an artifact" do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
context "when unencrypted" do
|
8
|
+
before do
|
9
|
+
@artifact = SimpleDeploy::Artifact.new :bucket_prefix => 'test_prefix',
|
10
|
+
:domain => 'us-west-1',
|
11
|
+
:id => 'abc123',
|
12
|
+
:name => 'myapp',
|
13
|
+
:region => 'us-west-1',
|
14
|
+
:encrypted => false
|
15
|
+
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
it "should return the endpoints for the artifact" do
|
18
|
+
endpoints = { "s3" => "s3://test_prefix-us-west-1/us-west-1/abc123.tar.gz",
|
19
|
+
"http" => "http://s3-us-west-1.amazonaws.com/test_prefix-us-west-1/us-west-1/abc123.tar.gz",
|
20
|
+
"https" => "https://s3-us-west-1.amazonaws.com/test_prefix-us-west-1/us-west-1/abc123.tar.gz" }
|
21
|
+
@artifact.endpoints.should == endpoints
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
25
|
+
context "when encrypted" do
|
26
|
+
before do
|
27
|
+
@artifact = SimpleDeploy::Artifact.new :bucket_prefix => 'test_prefix',
|
28
|
+
:domain => 'us-west-1',
|
29
|
+
:id => 'abc123',
|
30
|
+
:name => 'myapp',
|
31
|
+
:region => 'us-west-1',
|
32
|
+
:encrypted => true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return the endpoints for the artifact" do
|
36
|
+
endpoints = { "s3" => "s3://test_prefix-us-west-1/us-west-1/abc123.tar.gz.gpg",
|
37
|
+
"http" => "http://s3-us-west-1.amazonaws.com/test_prefix-us-west-1/us-west-1/abc123.tar.gz.gpg",
|
38
|
+
"https" => "https://s3-us-west-1.amazonaws.com/test_prefix-us-west-1/us-west-1/abc123.tar.gz.gpg" }
|
39
|
+
@artifact.endpoints.should == endpoints
|
40
|
+
end
|
41
|
+
end
|
22
42
|
end
|
23
43
|
end
|
@@ -86,51 +86,75 @@ describe SimpleDeploy do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
describe "when succesful" do
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
89
|
+
before do
|
90
|
+
@execute_mock = mock "execute"
|
91
|
+
execute_options = { :name => 'stack-name',
|
92
|
+
:environment => 'test-us-west-1',
|
93
|
+
:instances => ['1.2.3.4', '4.3.2.1'],
|
94
|
+
:ssh_user => 'user',
|
95
|
+
:ssh_key => 'key',
|
96
|
+
:config => @config_mock,
|
97
|
+
:stack => @stack_mock }
|
98
|
+
SimpleDeploy::Stack::Execute.should_receive(:new).
|
99
|
+
with(execute_options).
|
100
|
+
and_return @execute_mock
|
101
|
+
@config_mock.should_receive(:artifact_deploy_variable).
|
102
|
+
with("cookbooks").
|
103
|
+
and_return('CHEF_REPO_URL')
|
104
|
+
@config_mock.should_receive(:artifact_deploy_variable).
|
105
|
+
with("app").
|
106
|
+
and_return('APP_URL')
|
107
|
+
@config_mock.should_receive(:artifact_deploy_variable).
|
108
|
+
with("chef_repo").
|
109
|
+
and_return('CHEF_REPO_URL')
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when app encrypted" do
|
113
|
+
before do
|
114
|
+
@attributes['app_encrypted'] = 'true'
|
115
|
+
@execute_mock.should_receive(:execute).
|
116
|
+
with( {:sudo=>true, :command=>"env CHEF_REPO_URL=s3://cookbooks_bp-test-us-west-1/cookbooks_d/cookbooks.tar.gz APP_URL=s3://app_bp-test-us-west-1/app_d/app.tar.gz.gpg PRIMARY_HOST=10.1.2.3 /tmp/script"} )
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should deploy if the stack is clear to deploy" do
|
120
|
+
@status_mock.stub :clear_for_deployment? => true
|
121
|
+
@status_mock.should_receive(:set_deployment_in_progress)
|
122
|
+
@status_mock.should_receive(:unset_deployment_in_progress)
|
123
|
+
@deployment.execute(false).should be_true
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should deploy if the stack is not clear to deploy but forced and clear in time" do
|
127
|
+
@status_mock.stub :clear_for_deployment? => false,
|
128
|
+
:clear_deployment_lock => true,
|
129
|
+
:clear_for_deployment? => true
|
130
|
+
@status_mock.should_receive(:set_deployment_in_progress)
|
131
|
+
@status_mock.should_receive(:unset_deployment_in_progress)
|
132
|
+
@deployment.execute(true).should be_true
|
133
|
+
end
|
112
134
|
end
|
113
135
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
136
|
+
context "when unencrypted" do
|
137
|
+
before do
|
138
|
+
@execute_mock.should_receive(:execute).
|
139
|
+
with( {:sudo=>true, :command=>"env CHEF_REPO_URL=s3://cookbooks_bp-test-us-west-1/cookbooks_d/cookbooks.tar.gz APP_URL=s3://app_bp-test-us-west-1/app_d/app.tar.gz PRIMARY_HOST=10.1.2.3 /tmp/script"} )
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should deploy if the stack is clear to deploy" do
|
143
|
+
@status_mock.stub :clear_for_deployment? => true
|
144
|
+
@status_mock.should_receive(:set_deployment_in_progress)
|
145
|
+
@status_mock.should_receive(:unset_deployment_in_progress)
|
146
|
+
@deployment.execute(false).should be_true
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should deploy if the stack is not clear to deploy but forced and clear in time" do
|
150
|
+
@status_mock.stub :clear_for_deployment? => false,
|
151
|
+
:clear_deployment_lock => true,
|
152
|
+
:clear_for_deployment? => true
|
153
|
+
@status_mock.should_receive(:set_deployment_in_progress)
|
154
|
+
@status_mock.should_receive(:unset_deployment_in_progress)
|
155
|
+
@deployment.execute(true).should be_true
|
156
|
+
end
|
132
157
|
end
|
133
|
-
|
134
158
|
end
|
135
159
|
|
136
160
|
describe "when unsuccesful" do
|
@@ -4,20 +4,64 @@ describe SimpleDeploy do
|
|
4
4
|
before do
|
5
5
|
@logger_mock = mock 'logger mock', :info => 'true'
|
6
6
|
@config_mock = mock 'config mock', :logger => @logger_mock, :region => 'us-west-1'
|
7
|
-
@config_mock.stub(:artifact_cloud_formation_url).and_return('
|
7
|
+
@config_mock.stub(:artifact_cloud_formation_url).and_return('ChefRepoURL')
|
8
8
|
@config_mock.stub(:artifacts).and_return(['chef_repo', 'cookbooks', 'app'])
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when chef_repo unencrypted" do
|
12
|
+
before do
|
13
|
+
options = { :config => @config_mock,
|
14
|
+
:environment => 'preprod',
|
15
|
+
:main_attributes => {
|
16
|
+
'chef_repo_bucket_prefix' => 'test-prefix',
|
17
|
+
'chef_repo_domain' => 'test-domain' }
|
18
|
+
}
|
19
|
+
@formater = SimpleDeploy::StackAttributeFormater.new options
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return updated attributes including the un encrypted cloud formation url' do
|
23
|
+
updates = @formater.updated_attributes([ { 'chef_repo' => 'test123' } ])
|
24
|
+
updates.should == [{ 'chef_repo' => 'test123' },
|
25
|
+
{ 'ChefRepoURL' => 's3://test-prefix-us-west-1/test-domain/test123.tar.gz' }]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when main_attributes set chef_repo encrypted" do
|
30
|
+
before do
|
31
|
+
options = { :config => @config_mock,
|
32
|
+
:environment => 'preprod',
|
33
|
+
:main_attributes => {
|
34
|
+
'chef_repo_bucket_prefix' => 'test-prefix',
|
35
|
+
'chef_repo_encrypted' => 'true',
|
36
|
+
'chef_repo_domain' => 'test-domain' }
|
37
|
+
}
|
38
|
+
@formater = SimpleDeploy::StackAttributeFormater.new options
|
39
|
+
end
|
9
40
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}
|
16
|
-
@formater = SimpleDeploy::StackAttributeFormater.new options
|
41
|
+
it 'should return updated attributes including the encrypted cloud formation url ' do
|
42
|
+
updates = @formater.updated_attributes([ { 'chef_repo' => 'test123' } ])
|
43
|
+
updates.should == [{ 'chef_repo' => 'test123' },
|
44
|
+
{ 'ChefRepoURL' => 's3://test-prefix-us-west-1/test-domain/test123.tar.gz.gpg' }]
|
45
|
+
end
|
17
46
|
end
|
18
47
|
|
19
|
-
|
20
|
-
|
21
|
-
|
48
|
+
context "when provided attributes set chef_repo encrypted" do
|
49
|
+
before do
|
50
|
+
options = { :config => @config_mock,
|
51
|
+
:environment => 'preprod',
|
52
|
+
:main_attributes => {
|
53
|
+
'chef_repo_bucket_prefix' => 'test-prefix',
|
54
|
+
'chef_repo_domain' => 'test-domain' }
|
55
|
+
}
|
56
|
+
@formater = SimpleDeploy::StackAttributeFormater.new options
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should return updated attributes including the encrypted cloud formation url ' do
|
60
|
+
updates = @formater.updated_attributes([ { 'chef_repo' => 'test123' },
|
61
|
+
{ 'chef_repo_encrypted' => 'true' } ])
|
62
|
+
updates.should == [{ 'chef_repo' => 'test123' },
|
63
|
+
{ 'chef_repo_encrypted' => 'true' },
|
64
|
+
{ 'ChefRepoURL' => 's3://test-prefix-us-west-1/test-domain/test123.tar.gz.gpg' }]
|
65
|
+
end
|
22
66
|
end
|
23
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
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-12-
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70290261403920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70290261403920
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70290261403200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.11.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70290261403200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: capistrano
|
38
|
-
requirement: &
|
38
|
+
requirement: &70290261402600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - =
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.13.5
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70290261402600
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: stackster
|
49
|
-
requirement: &
|
49
|
+
requirement: &70290261402060 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.4.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70290261402060
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: tinder
|
60
|
-
requirement: &
|
60
|
+
requirement: &70290261506180 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - =
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.9.1
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70290261506180
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: trollop
|
71
|
-
requirement: &
|
71
|
+
requirement: &70290261505540 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - =
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '2.0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70290261505540
|
80
80
|
description: I am designed to deploy artifacts uploaded by Heirloom
|
81
81
|
email:
|
82
82
|
- brett@weav.net
|
@@ -163,7 +163,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
163
|
version: '0'
|
164
164
|
segments:
|
165
165
|
- 0
|
166
|
-
hash:
|
166
|
+
hash: 826964826445741436
|
167
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
168
|
none: false
|
169
169
|
requirements:
|
@@ -172,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
172
|
version: '0'
|
173
173
|
segments:
|
174
174
|
- 0
|
175
|
-
hash:
|
175
|
+
hash: 826964826445741436
|
176
176
|
requirements: []
|
177
177
|
rubyforge_project: simple_deploy
|
178
178
|
rubygems_version: 1.8.16
|