simple_deploy 0.5.5 → 0.5.6

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 CHANGED
@@ -1,3 +1,10 @@
1
+ ## v0.5.6
2
+
3
+ * Corrected the instances command so it returns all instances
4
+ * Updated the clone command so it can take a new template for the new stack
5
+ * Added region to the message notifications
6
+ * Fixed deployments so they don't try to deploy if the attributes fail to update
7
+
1
8
  ## v0.5.5
2
9
 
3
10
  * Added backoff functionality to updates so they work better with the force option
@@ -20,6 +20,7 @@ EOS
20
20
  opt :new_name, "Stack name for the new stack", :type => :string
21
21
  opt :attributes, "= separated attribute and it's value", :type => :string,
22
22
  :multi => true
23
+ opt :template, "Path to a new template file", :type => :string
23
24
  end
24
25
 
25
26
  CLI::Shared.valid_options? :provided => @opts,
@@ -31,8 +32,12 @@ EOS
31
32
  cloned_attributes = filter_attributes source_stack.attributes
32
33
  new_attributes = merge_attributes cloned_attributes, override_attributes
33
34
 
34
- template_file = Tempfile.new("#{@opts[:new_name]}_template.json").path
35
- File::open(template_file, 'w') { |f| f.write source_stack.template.to_json }
35
+ if @opts[:template]
36
+ template_file = @opts[:template]
37
+ else
38
+ template_file = Tempfile.new("#{@opts[:new_name]}_template.json").path
39
+ File::open(template_file, 'w') { |f| f.write source_stack.template.to_json }
40
+ end
36
41
 
37
42
  new_stack.create :attributes => new_attributes,
38
43
  :template => template_file
@@ -65,14 +65,17 @@ EOS
65
65
  :logger => logger,
66
66
  :internal => opts[:internal]
67
67
 
68
- stack.update :force => opts[:force], :attributes => new_attributes if new_attributes.any?
69
-
70
- notifier.send_deployment_start_message unless opts[:quiet]
71
- if stack.deploy opts[:force]
72
- notifier.send_deployment_complete_message unless opts[:quiet]
73
- else
74
- logger.error "Deployment to #{name} did not complete succesfully."
75
- exit 1
68
+ proceed = true
69
+ proceed = stack.update :force => opts[:force], :attributes => new_attributes if new_attributes.any?
70
+
71
+ if proceed
72
+ notifier.send_deployment_start_message unless opts[:quiet]
73
+ if stack.deploy opts[:force]
74
+ notifier.send_deployment_complete_message unless opts[:quiet]
75
+ else
76
+ logger.error "Deployment to #{name} did not complete succesfully."
77
+ exit 1
78
+ end
76
79
  end
77
80
 
78
81
  end
@@ -11,12 +11,12 @@ module SimpleDeploy
11
11
  end
12
12
 
13
13
  def send_deployment_start_message
14
- message = "Deployment to #{@stack_name} started."
14
+ message = "Deployment to #{@stack_name} in #{@config.region @environment} started."
15
15
  send message
16
16
  end
17
17
 
18
18
  def send_deployment_complete_message
19
- message = "Deployment to #{@stack_name} complete."
19
+ message = "Deployment to #{@stack_name} in #{@config.region @environment} complete."
20
20
  attributes = stack.attributes
21
21
 
22
22
  if attributes['app_github_url']
@@ -35,6 +35,10 @@ module SimpleDeploy
35
35
  attributes = stack_attribute_formater.updated_attributes args[:attributes]
36
36
  stack.update :attributes => attributes
37
37
  @logger.info "Update complete for #{@name}."
38
+ true
39
+ else
40
+ @logger.info "Not clear to update."
41
+ false
38
42
  end
39
43
  end
40
44
 
@@ -72,14 +76,14 @@ module SimpleDeploy
72
76
 
73
77
  def instances
74
78
  stack.instances.map do |instance|
75
- info = instance['instancesSet'].first
76
-
77
- if info['vpcId'] || @use_internal_ips
78
- info['privateIpAddress']
79
- else
80
- info['ipAddress']
79
+ instance['instancesSet'].map do |info|
80
+ if info['vpcId'] || @use_internal_ips
81
+ info['privateIpAddress']
82
+ else
83
+ info['ipAddress']
84
+ end
81
85
  end
82
- end
86
+ end.flatten
83
87
  end
84
88
 
85
89
  def status
@@ -1,3 +1,3 @@
1
1
  module SimpleDeploy
2
- VERSION = "0.5.5"
2
+ VERSION = "0.5.6"
3
3
  end
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency "rspec"
22
22
 
23
23
  s.add_runtime_dependency "capistrano"
24
- s.add_runtime_dependency "stackster", '= 0.3.0'
24
+ s.add_runtime_dependency "stackster", '= 0.3.1'
25
25
  s.add_runtime_dependency "tinder"
26
26
  s.add_runtime_dependency "trollop"
27
27
  end
@@ -136,6 +136,27 @@ describe SimpleDeploy::CLI::Clone do
136
136
 
137
137
  subject.clone
138
138
  end
139
+
140
+ it 'should create the new stack using a new template' do
141
+ @options[:template] = 'brand_new_template.json'
142
+
143
+ SimpleDeploy::CLI::Shared.should_receive(:valid_options?).
144
+ with(:provided => @options,
145
+ :required => [:environment, :source_name, :new_name])
146
+ Trollop.stub(:options).and_return(@options)
147
+
148
+ @new_stack.should_receive(:create) do |options|
149
+ options[:attributes].should == [{ 'AmiId' => 'ami-7b6a4e3e' },
150
+ { 'AppEnv' => 'pod-2-cd-1' },
151
+ { 'MaximumAppInstances' => 1 },
152
+ { 'MinimumAppInstances' => 1 },
153
+ { 'chef_repo_bucket_prefix' => 'updated-intu-lc' },
154
+ { 'chef_repo_domain' => 'updated_community_chef_repo' }]
155
+ options[:template].should match /brand_new_template.json/
156
+ end
157
+
158
+ subject.clone
159
+ end
139
160
  end
140
161
  end
141
162
  end
@@ -110,7 +110,75 @@ describe SimpleDeploy::CLI::Deploy do
110
110
  :internal => false).
111
111
  and_return(@stack)
112
112
 
113
- @stack.should_receive(:update).with(hash_including(:force => true, :attributes => [{'foo' => 'bah'}]))
113
+ @stack.should_receive(:update).with(hash_including(:force => true, :attributes => [{'foo' => 'bah'}])).and_return(true)
114
+ @stack.should_receive(:deploy).with(true).and_return(true)
115
+ @notifier.should_receive(:send_deployment_start_message)
116
+ @notifier.should_receive(:send_deployment_complete_message)
117
+
118
+ subject.deploy
119
+ end
120
+
121
+ it "should skip the deploy if the attributes update is not successful" do
122
+ options = { :environment => 'my_env',
123
+ :log_level => 'debug',
124
+ :name => ['my_stack'],
125
+ :force => true,
126
+ :internal => false,
127
+ :attributes => ['foo=bah'] }
128
+
129
+ SimpleDeploy::CLI::Shared.should_receive(:valid_options?).
130
+ with(:provided => options,
131
+ :required => [:environment, :name])
132
+ Trollop.stub(:options).and_return(options)
133
+
134
+ SimpleDeploy::Notifier.should_receive(:new).
135
+ with(:stack_name => 'my_stack',
136
+ :environment => 'my_env',
137
+ :logger => @logger).
138
+ and_return(@notifier)
139
+
140
+ SimpleDeploy::Stack.should_receive(:new).
141
+ with(:environment => 'my_env',
142
+ :logger => @logger,
143
+ :name => 'my_stack',
144
+ :internal => false).
145
+ and_return(@stack)
146
+
147
+ @stack.should_receive(:update).with(hash_including(:force => true, :attributes => [{'foo' => 'bah'}])).and_return(false)
148
+ @stack.should_not_receive(:deploy)
149
+ @notifier.should_not_receive(:send_deployment_start_message)
150
+ @notifier.should_not_receive(:send_deployment_complete_message)
151
+
152
+ subject.deploy
153
+ end
154
+
155
+ it "should do the deploy if there are no attributes to update" do
156
+ options = { :environment => 'my_env',
157
+ :log_level => 'debug',
158
+ :name => ['my_stack'],
159
+ :force => true,
160
+ :internal => false,
161
+ :attributes => [] }
162
+
163
+ SimpleDeploy::CLI::Shared.should_receive(:valid_options?).
164
+ with(:provided => options,
165
+ :required => [:environment, :name])
166
+ Trollop.stub(:options).and_return(options)
167
+
168
+ SimpleDeploy::Notifier.should_receive(:new).
169
+ with(:stack_name => 'my_stack',
170
+ :environment => 'my_env',
171
+ :logger => @logger).
172
+ and_return(@notifier)
173
+
174
+ SimpleDeploy::Stack.should_receive(:new).
175
+ with(:environment => 'my_env',
176
+ :logger => @logger,
177
+ :name => 'my_stack',
178
+ :internal => false).
179
+ and_return(@stack)
180
+
181
+ @stack.should_not_receive(:update)
114
182
  @stack.should_receive(:deploy).with(true).and_return(true)
115
183
  @notifier.should_receive(:send_deployment_start_message)
116
184
  @notifier.should_receive(:send_deployment_complete_message)
@@ -23,8 +23,10 @@ describe SimpleDeploy do
23
23
  it "should support a basic start message" do
24
24
  campfire_mock = mock 'campfire mock'
25
25
 
26
+ @config_mock.should_receive(:region).with('test').and_return('us-west-1')
27
+
26
28
  SimpleDeploy::Notifier::Campfire.should_receive(:new).and_return campfire_mock
27
- campfire_mock.should_receive(:send).with "Deployment to stack_name started."
29
+ campfire_mock.should_receive(:send).with "Deployment to stack_name in us-west-1 started."
28
30
 
29
31
  @notifier.send_deployment_start_message
30
32
  end
@@ -36,6 +38,7 @@ describe SimpleDeploy do
36
38
  @config_mock.should_receive(:environment).
37
39
  with('test').
38
40
  and_return environment_mock
41
+ @config_mock.should_receive(:region).with('test').and_return('us-west-1')
39
42
  Stackster::Stack.should_receive(:new).
40
43
  with(:environment => 'test',
41
44
  :name => 'stack_name',
@@ -50,7 +53,7 @@ describe SimpleDeploy do
50
53
  SimpleDeploy::Notifier::Campfire.should_receive(:new).
51
54
  and_return campfire_mock
52
55
  campfire_mock.should_receive(:send).
53
- with "Deployment to stack_name complete. App: http://github.com/user/app/commit/appsha Chef: http://github.com/user/chef_repo/commit/chefsha"
56
+ with "Deployment to stack_name in us-west-1 complete. App: http://github.com/user/app/commit/appsha Chef: http://github.com/user/chef_repo/commit/chefsha"
54
57
  @notifier.send_deployment_complete_message
55
58
  end
56
59
 
data/spec/stack_spec.rb CHANGED
@@ -80,7 +80,7 @@ describe SimpleDeploy do
80
80
  and_return @stack_mock
81
81
  @stack_mock.should_receive(:update).with :attributes => @expected_attributes
82
82
 
83
- @stack.update :attributes => [{ 'chef_repo' => 'test123' }]
83
+ @stack.update(:attributes => [{ 'chef_repo' => 'test123' }]).should be_true
84
84
  end
85
85
 
86
86
  it "should not update when the deployment is locked and force is not set" do
@@ -90,7 +90,7 @@ describe SimpleDeploy do
90
90
  SimpleDeploy::StackAttributeFormater.should_not_receive(:new)
91
91
  Stackster::Stack.should_not_receive(:new)
92
92
 
93
- @stack.update :attributes => { 'arg1' => 'val' }
93
+ @stack.update(:attributes => { 'arg1' => 'val' }).should_not be_true
94
94
  end
95
95
 
96
96
  it "should update when the deployment is locked and force is set true" do
@@ -106,7 +106,7 @@ describe SimpleDeploy do
106
106
  and_return @stack_mock
107
107
  @stack_mock.should_receive(:update).with :attributes => @expected_attributes
108
108
 
109
- @stack.update :force => true, :attributes => [{ 'chef_repo' => 'test123' }]
109
+ @stack.update(:force => true, :attributes => [{ 'chef_repo' => 'test123' }]).should be_true
110
110
  end
111
111
 
112
112
  it "should not update when the deployment is locked and force is set false" do
@@ -116,7 +116,7 @@ describe SimpleDeploy do
116
116
  SimpleDeploy::StackAttributeFormater.should_not_receive(:new)
117
117
  Stackster::Stack.should_not_receive(:new)
118
118
 
119
- @stack.update :force => false, :attributes => { 'arg1' => 'val' }
119
+ @stack.update(:force => false, :attributes => { 'arg1' => 'val' }).should_not be_true
120
120
  end
121
121
  end
122
122
 
@@ -176,7 +176,7 @@ describe SimpleDeploy do
176
176
  @instances.first['instancesSet'].first['vpcId'] = 'my-vpc'
177
177
  @stack_mock.stub(:instances).and_return(@instances)
178
178
 
179
- stack.send(:instances).should == ['10.1.2.3']
179
+ stack.instances.should == ['10.1.2.3']
180
180
  end
181
181
 
182
182
  it 'should use the private IP when internal' do
@@ -188,7 +188,7 @@ describe SimpleDeploy do
188
188
  stack.stub(:stack) { @stack_mock }
189
189
  @stack_mock.stub(:instances).and_return(@instances)
190
190
 
191
- stack.send(:instances).should == ['10.1.2.3']
191
+ stack.instances.should == ['10.1.2.3']
192
192
  end
193
193
 
194
194
  it 'should use the public IP when not vpc and not internal' do
@@ -200,7 +200,23 @@ describe SimpleDeploy do
200
200
  stack.stub(:stack) { @stack_mock }
201
201
  @stack_mock.stub(:instances).and_return(@instances)
202
202
 
203
- stack.send(:instances).should == ['50.40.30.20']
203
+ stack.instances.should == ['50.40.30.20']
204
+ end
205
+
206
+ it 'should handle instanceSets with multiple intances' do
207
+ @instances = [{ 'instancesSet' => [
208
+ { 'ipAddress' => '50.40.30.20', 'privateIpAddress' => '10.1.2.3' },
209
+ { 'ipAddress' => '50.40.30.21', 'privateIpAddress' => '10.1.2.4' }] }]
210
+
211
+ stack = SimpleDeploy::Stack.new :environment => 'test-env',
212
+ :name => 'test-stack',
213
+ :logger => 'my-logger',
214
+ :config => @config_stub,
215
+ :internal => false
216
+ stack.stub(:stack) { @stack_mock }
217
+ @stack_mock.stub(:instances).and_return(@instances)
218
+
219
+ stack.instances.should == ['50.40.30.20', '50.40.30.21']
204
220
  end
205
221
  end
206
222
  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.5.5
4
+ version: 0.5.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-19 00:00:00.000000000 Z
12
+ date: 2012-10-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.3.0
53
+ version: 0.3.1
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.3.0
61
+ version: 0.3.1
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: tinder
64
64
  requirement: !ruby/object:Gem::Requirement