simple_deploy 0.5.6 → 0.6.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/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
4
+ script: "rake spec"
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ ## v0.6.0
2
+
3
+ * Updated so it no longer caches simpledb attributes so it works better with stackster changes
4
+ * Upgraded to stackster 0.3.2
5
+ * Added execute subcommand to run arbitray commands against stack
6
+ * Refactored deployment to use ssh library
7
+ * Added specs
8
+
1
9
  ## v0.5.6
2
10
 
3
11
  * Corrected the instances command so it returns all instances
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status](https://secure.travis-ci.org/intuit/simple_deploy.png)](http://travis-ci.org/intuit/simple_deploy)
2
+
1
3
  I use the stackster to manage stacks, however I understand how to connect to different regions / accounts as well as kick off a deployment on instances.
2
4
 
3
5
  Getting Started
@@ -0,0 +1,57 @@
1
+ require 'trollop'
2
+
3
+ module SimpleDeploy
4
+ module CLI
5
+ class Execute
6
+ def execute
7
+ opts = Trollop::options do
8
+ version SimpleDeploy::VERSION
9
+ banner <<-EOS
10
+
11
+ Execute command on given stack(s).
12
+
13
+ simple_deploy execute -n STACK_NAME -n STACK_NAME -e ENVIRONMENT -c "COMMAND"
14
+
15
+ Using Internal IP for SSH:
16
+
17
+ Simple deploy defaults to using the public IP when ssh'ng to stacks. This option instructs it
18
+ to use the private IP, which is needed when ssh'ng from one stack to another.
19
+
20
+ simple_deploy deploy -n STACK_NAME -n STACK_NAME -e ENVIRONMENT -i
21
+
22
+ EOS
23
+ opt :help, "Display Help"
24
+ opt :attributes, "= seperated attribute and it's value", :type => :string,
25
+ :multi => true
26
+ opt :command, "Command to execute.", :type => :string
27
+ opt :environment, "Set the target environment", :type => :string
28
+ opt :internal, "Use internal IP for ssh commands"
29
+ opt :log_level, "Log level: debug, info, warn, error", :type => :string,
30
+ :default => 'info'
31
+ opt :name, "Stack name(s) of stack to deploy", :type => :string,
32
+ :multi => true
33
+ opt :sudo, "Execute command with sudo"
34
+ end
35
+
36
+ CLI::Shared.valid_options? :provided => opts,
37
+ :required => [:environment, :name]
38
+
39
+ logger = SimpleDeployLogger.new :log_level => opts[:log_level]
40
+
41
+ opts[:name].each do |name|
42
+ notifier = Notifier.new :stack_name => name,
43
+ :environment => opts[:environment],
44
+ :logger => logger
45
+
46
+ stack = Stack.new :environment => opts[:environment],
47
+ :name => name,
48
+ :logger => logger,
49
+ :internal => opts[:internal]
50
+
51
+ stack.execute :command => opts[:command],
52
+ :sudo => opts[:sudo]
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -8,6 +8,7 @@ require 'simple_deploy/cli/create'
8
8
  require 'simple_deploy/cli/deploy'
9
9
  require 'simple_deploy/cli/destroy'
10
10
  require 'simple_deploy/cli/events'
11
+ require 'simple_deploy/cli/execute'
11
12
  require 'simple_deploy/cli/instances'
12
13
  require 'simple_deploy/cli/list'
13
14
  require 'simple_deploy/cli/outputs'
@@ -39,6 +40,8 @@ module SimpleDeploy
39
40
  CLI::List.new.environments
40
41
  when 'events'
41
42
  CLI::Events.new.show
43
+ when 'execute'
44
+ CLI::Execute.new.execute
42
45
  when 'instances'
43
46
  CLI::Instances.new.list
44
47
  when 'list'
@@ -60,13 +63,13 @@ module SimpleDeploy
60
63
  when 'update'
61
64
  CLI::Update.new.update
62
65
  when '-h'
63
- puts "simple_deploy [attributes|clone|create|destroy|environments|events|instances|list|template|outputs|parameters|protect|resources|ssh|status|update] [options]"
66
+ puts "simple_deploy [attributes|clone|create|destroy|environments|events|execute|instances|list|template|outputs|parameters|protect|resources|ssh|status|update] [options]"
64
67
  puts "Append -h for help on specific subcommand."
65
68
  when '-v'
66
69
  puts SimpleDeploy::VERSION
67
70
  else
68
71
  puts "Unknown command: '#{cmd}'."
69
- puts "simple_deploy [attributes|clone|create|destroy|environments|events|instances|list|template|outputs|parameters|protect|resources|ssh|status|update] [options]"
72
+ puts "simple_deploy [attributes|clone|create|destroy|environments|events|execute|instances|list|template|outputs|parameters|protect|resources|ssh|status|update] [options]"
70
73
  puts "Append -h for help on specific subcommand."
71
74
  exit 1
72
75
  end
@@ -1,3 +1,5 @@
1
+ require 'logger'
2
+
1
3
  module SimpleDeploy
2
4
  class SimpleDeployLogger
3
5
 
@@ -22,6 +24,11 @@ module SimpleDeploy
22
24
  Logger.const_get @log_level.upcase
23
25
  end
24
26
 
27
+ # Added to support capistrano version 2.13.5
28
+ def tty?
29
+ nil
30
+ end
31
+
25
32
  private
26
33
 
27
34
  def new_logger(args)
@@ -4,11 +4,11 @@ module SimpleDeploy
4
4
  class Status
5
5
 
6
6
  def initialize(args)
7
- @config = args[:config]
8
- @stack = args[:stack]
7
+ @config = args[:config]
8
+ @stack = args[:stack]
9
9
  @ssh_user = args[:ssh_user]
10
- @name = args[:name]
11
- @logger = @config.logger
10
+ @name = args[:name]
11
+ @logger = @config.logger
12
12
  end
13
13
 
14
14
  def clear_for_deployment?
@@ -2,54 +2,36 @@ require 'capistrano'
2
2
  require 'capistrano/cli'
3
3
 
4
4
  require 'simple_deploy/stack/deployment/status'
5
+ require 'simple_deploy/stack/execute'
5
6
 
6
7
  module SimpleDeploy
7
8
  class Stack
9
+
8
10
  class Deployment
11
+
9
12
  def initialize(args)
10
- @config = args[:config]
11
- @instances = args[:instances]
13
+ @config = args[:config]
14
+ @instances = args[:instances]
12
15
  @environment = args[:environment]
13
- @ssh_user = args[:ssh_user]
14
- @ssh_key = args[:ssh_key]
15
- @stack = args[:stack]
16
- @name = args[:name]
17
- @attributes = @stack.attributes
18
- @logger = @config.logger
19
- @region = @config.region @environment
20
- end
21
-
22
- def create_deployment
23
- if @instances.nil? || @instances.empty?
24
- raise "There are no running instances to deploy to"
25
- end
26
-
27
- @deployment = Capistrano::Configuration.new :output => @logger
28
- @deployment.logger.level = 3
29
- @logger.info "Creating deployment to #{@name}."
30
-
31
- set_ssh_gateway
32
- set_ssh_user
33
- set_ssh_options
34
- set_instances
35
- set_deploy_command
16
+ @ssh_user = args[:ssh_user]
17
+ @ssh_key = args[:ssh_key]
18
+ @stack = args[:stack]
19
+ @name = args[:name]
20
+ @logger = @config.logger
21
+ @region = @config.region @environment
36
22
  end
37
23
 
38
- def execute(force = false)
39
- if !clear_for_deployment? && force
40
- clear_deployment_lock true
41
-
42
- Backoff.exp_periods do |p|
43
- sleep p
44
- break if clear_for_deployment?
45
- end
46
- end
24
+ def execute(force=false)
25
+ wait_for_clear_to_deploy(force)
47
26
 
48
27
  if clear_for_deployment?
49
28
  status.set_deployment_in_progress
29
+
50
30
  @logger.info 'Starting deployment.'
51
- @deployment.simpledeploy
31
+ executer.execute :sudo => true,
32
+ :command => deploy_command
52
33
  @logger.info 'Deployment complete.'
34
+
53
35
  status.unset_deployment_in_progress
54
36
  true
55
37
  else
@@ -58,50 +40,44 @@ module SimpleDeploy
58
40
  end
59
41
  end
60
42
 
43
+ def clear_deployment_lock(force = false)
44
+ status.clear_deployment_lock force
45
+ end
46
+
61
47
  def clear_for_deployment?
62
48
  status.clear_for_deployment?
63
49
  end
64
50
 
65
- def clear_deployment_lock(force = false)
66
- status.clear_deployment_lock force
67
- end
51
+ private
52
+
53
+ def wait_for_clear_to_deploy(force)
54
+ if !clear_for_deployment? && force
55
+ clear_deployment_lock true
68
56
 
69
- def ssh
70
- @stack.instances.map do |instance|
71
- info = instance['instancesSet'].first
72
- if info['vpcId']
73
- gw = @attributes['ssh_gateway']
74
- "\nssh -i #{@ssh_key} -l #{@ssh_user} -L 9998:#{info['privateIpAddress']}:22 -N #{gw} &\nssh -p 9998 localhost"
75
- else
76
- "\nssh -i #{@ssh_key} -l #{@ssh_user} #{info['ipAddress']}"
57
+ Backoff.exp_periods do |p|
58
+ sleep p
59
+ break if clear_for_deployment?
77
60
  end
78
61
  end
79
62
  end
80
63
 
81
- private
82
-
83
- def set_deploy_command
64
+ def deploy_command
84
65
  cmd = 'env '
85
66
  get_artifact_endpoints.each_pair do |key,value|
86
67
  cmd += "#{key}=#{value} "
87
68
  end
88
69
  cmd += "PRIMARY_HOST=#{primary_instance} #{deploy_script}"
89
-
90
- @logger.info "Deploy command: '#{cmd}'."
91
- @deployment.load :string => "task :simpledeploy do
92
- sudo '#{cmd}'
93
- end"
94
70
  end
95
71
 
96
72
  def get_artifact_endpoints
97
73
  h = {}
98
74
  @config.artifacts.each do |artifact|
99
- variable = @config.artifact_deploy_variable artifact
100
- bucket_prefix = @attributes["#{artifact}_bucket_prefix"]
101
- domain = @attributes["#{artifact}_domain"]
75
+ variable = @config.artifact_deploy_variable artifact
76
+ bucket_prefix = attributes["#{artifact}_bucket_prefix"]
77
+ domain = attributes["#{artifact}_domain"]
102
78
 
103
79
  artifact = Artifact.new :name => artifact,
104
- :id => @attributes[artifact],
80
+ :id => attributes[artifact],
105
81
  :region => @region,
106
82
  :domain => domain,
107
83
  :bucket_prefix => bucket_prefix
@@ -111,34 +87,6 @@ module SimpleDeploy
111
87
  h
112
88
  end
113
89
 
114
- def set_instances
115
- @instances.each do |instance|
116
- @logger.debug "Deploying to instance #{instance}."
117
- @deployment.server instance, :instances
118
- end
119
- end
120
-
121
- def set_ssh_options
122
- @logger.debug "Setting key to #{@ssh_key}."
123
- @deployment.variables[:ssh_options] = { :keys => @ssh_key,
124
- :paranoid => false }
125
- end
126
-
127
- def set_ssh_gateway
128
- ssh_gateway = @attributes['ssh_gateway']
129
- if ssh_gateway && !ssh_gateway.empty?
130
- @deployment.set :gateway, ssh_gateway
131
- @logger.info "Proxying via gateway #{ssh_gateway}."
132
- else
133
- @logger.debug "Not using an ssh gateway."
134
- end
135
- end
136
-
137
- def set_ssh_user
138
- @logger.debug "Setting user to #{@ssh_user}."
139
- @deployment.set :user, @ssh_user
140
- end
141
-
142
90
  def primary_instance
143
91
  if @stack.instances.any?
144
92
  @stack.instances.first['instancesSet'].first['privateIpAddress']
@@ -149,6 +97,17 @@ module SimpleDeploy
149
97
  @config.deploy_script
150
98
  end
151
99
 
100
+ def executer
101
+ options = { :config => @config,
102
+ :instances => @instances,
103
+ :environment => @environment,
104
+ :ssh_user => @ssh_user,
105
+ :ssh_key => @ssh_key,
106
+ :stack => @stack,
107
+ :name => @name }
108
+ @executer ||= SimpleDeploy::Stack::Execute.new options
109
+ end
110
+
152
111
  def status
153
112
  options = { :name => @name,
154
113
  :environment => @environment,
@@ -158,7 +117,12 @@ module SimpleDeploy
158
117
  @status ||= SimpleDeploy::Stack::Deployment::Status.new options
159
118
  end
160
119
 
120
+ def attributes
121
+ @stack.attributes
122
+ end
123
+
161
124
  end
125
+
162
126
  end
163
127
  end
164
128
 
@@ -0,0 +1,36 @@
1
+ require 'simple_deploy/stack/ssh'
2
+
3
+ module SimpleDeploy
4
+ class Stack
5
+ class Execute
6
+ def initialize(args)
7
+ @config = args[:config]
8
+ @instances = args[:instances]
9
+ @environment = args[:environment]
10
+ @ssh_user = args[:ssh_user]
11
+ @ssh_key = args[:ssh_key]
12
+ @stack = args[:stack]
13
+ @name = args[:name]
14
+ end
15
+
16
+ def execute(args)
17
+ ssh.execute args
18
+ end
19
+
20
+ private
21
+
22
+ def ssh
23
+ options = { :config => @config,
24
+ :instances => @instances,
25
+ :environment => @environment,
26
+ :ssh_user => @ssh_user,
27
+ :ssh_key => @ssh_key,
28
+ :stack => @stack,
29
+ :name => @name }
30
+ @ssh ||= SimpleDeploy::Stack::SSH.new options
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,93 @@
1
+ require 'capistrano'
2
+ require 'capistrano/cli'
3
+
4
+ module SimpleDeploy
5
+ class Stack
6
+ class SSH
7
+
8
+ def initialize(args)
9
+ @config = args[:config]
10
+ @instances = args[:instances]
11
+ @environment = args[:environment]
12
+ @ssh_user = args[:ssh_user]
13
+ @ssh_key = args[:ssh_key]
14
+ @stack = args[:stack]
15
+ @name = args[:name]
16
+ @logger = @config.logger
17
+ @region = @config.region @environment
18
+ end
19
+
20
+ def execute(args)
21
+ create_execute_task args
22
+ @task.execute
23
+ end
24
+
25
+ private
26
+
27
+ def create_execute_task(args)
28
+ if @instances.nil? || @instances.empty?
29
+ raise "There are no running instances to execute this command."
30
+ end
31
+
32
+ @task = Capistrano::Configuration.new :output => @logger
33
+ @task.logger.level = 3
34
+
35
+ set_ssh_gateway
36
+ set_ssh_user
37
+ set_ssh_options
38
+ set_instances
39
+ set_execute_command args
40
+ end
41
+
42
+ def set_execute_command(args)
43
+ command = args[:command]
44
+ sudo = args[:sudo]
45
+
46
+ @logger.info "Setting command: '#{command}'."
47
+ if sudo
48
+ @task.load :string => "task :execute do
49
+ sudo '#{command}'
50
+ end"
51
+ else
52
+ @task.load :string => "task :execute do
53
+ run '#{command}'
54
+ end"
55
+ end
56
+ end
57
+
58
+ def set_instances
59
+ @instances.each do |instance|
60
+ @logger.debug "Executing command on instance #{instance}."
61
+ @task.server instance, :instances
62
+ end
63
+ end
64
+
65
+ def set_ssh_options
66
+ @logger.debug "Setting key to #{@ssh_key}."
67
+ @task.variables[:ssh_options] = { :keys => @ssh_key,
68
+ :paranoid => false }
69
+ end
70
+
71
+ def set_ssh_gateway
72
+ ssh_gateway = attributes['ssh_gateway']
73
+ if ssh_gateway && !ssh_gateway.empty?
74
+ @task.set :gateway, ssh_gateway
75
+ @logger.info "Proxying via gateway #{ssh_gateway}."
76
+ else
77
+ @logger.debug "Not using an ssh gateway."
78
+ end
79
+ end
80
+
81
+ def set_ssh_user
82
+ @logger.debug "Setting user to #{@ssh_user}."
83
+ @task.set :user, @ssh_user
84
+ end
85
+
86
+ def attributes
87
+ @stack.attributes
88
+ end
89
+
90
+ end
91
+ end
92
+ end
93
+
@@ -1,5 +1,6 @@
1
1
  require 'stackster'
2
2
  require 'simple_deploy/stack/deployment'
3
+ require 'simple_deploy/stack/execute'
3
4
  require 'simple_deploy/stack/stack_attribute_formater'
4
5
 
5
6
  module SimpleDeploy
@@ -43,10 +44,13 @@ module SimpleDeploy
43
44
  end
44
45
 
45
46
  def deploy(force = false)
46
- deployment.create_deployment
47
47
  deployment.execute force
48
48
  end
49
49
 
50
+ def execute(args)
51
+ executer.execute args
52
+ end
53
+
50
54
  def ssh
51
55
  deployment.ssh
52
56
  end
@@ -118,6 +122,16 @@ module SimpleDeploy
118
122
  :main_attributes => attributes
119
123
  end
120
124
 
125
+ def executer
126
+ @executer ||= Stack::Execute.new :config => @config,
127
+ :environment => @environment,
128
+ :name => @name,
129
+ :stack => stack,
130
+ :instances => instances,
131
+ :ssh_user => ssh_user,
132
+ :ssh_key => ssh_key
133
+ end
134
+
121
135
  def deployment
122
136
  @deployment ||= Stack::Deployment.new :config => @config,
123
137
  :environment => @environment,
@@ -1,3 +1,3 @@
1
1
  module SimpleDeploy
2
- VERSION = "0.5.6"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -18,10 +18,11 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_development_dependency "rspec"
21
+ s.add_development_dependency "rake"
22
+ s.add_development_dependency "rspec", "~> 2.11.0"
22
23
 
23
- s.add_runtime_dependency "capistrano"
24
- s.add_runtime_dependency "stackster", '= 0.3.1'
25
- s.add_runtime_dependency "tinder"
26
- s.add_runtime_dependency "trollop"
24
+ s.add_runtime_dependency "capistrano", "= 2.13.5"
25
+ s.add_runtime_dependency "stackster", '= 0.3.2'
26
+ s.add_runtime_dependency "tinder", "= 1.9.1"
27
+ s.add_runtime_dependency "trollop", "= 2.0"
27
28
  end
data/spec/logger_spec.rb CHANGED
@@ -2,33 +2,39 @@ require 'spec_helper'
2
2
 
3
3
  describe SimpleDeploy do
4
4
 
5
- it "should create a new logger object from the hash passed as :logger" do
6
- logger_mock = mock 'logger'
7
- logger_mock.should_receive(:info).with 'a message'
8
- logger = SimpleDeploy::SimpleDeployLogger.new :logger => logger_mock
9
- logger.info 'a message'
5
+ before do
6
+ @logger_mock = mock 'logger'
10
7
  end
11
8
 
12
- it "should create a new logger object when one is not passed" do
13
- logger_mock = mock 'logger'
14
- Logger.should_receive(:new).with(STDOUT).and_return logger_mock
15
- logger_mock.should_receive(:info).with 'a message'
16
- logger_mock.should_receive(:datetime_format=).with '%Y-%m-%dT%H:%M:%S%z'
17
- logger_mock.should_receive(:formatter=)
18
- logger_mock.should_receive(:level=).with 1
19
- logger = SimpleDeploy::SimpleDeployLogger.new
20
- logger.info 'a message'
9
+ context "with new logger" do
10
+ before do
11
+ @logger_mock.should_receive(:datetime_format=).with '%Y-%m-%dT%H:%M:%S%z'
12
+ @logger_mock.should_receive(:formatter=)
13
+ @logger_mock.should_receive(:level=).with 1
14
+ Logger.should_receive(:new).with(STDOUT).and_return @logger_mock
15
+ end
16
+
17
+ it "should create a new logger object when one is not passed" do
18
+ @logger = SimpleDeploy::SimpleDeployLogger.new
19
+ @logger_mock.should_receive(:info).with 'a message'
20
+ @logger.info 'a message'
21
+ end
22
+
23
+ it "accept puts with msg and pass it to debug" do
24
+ @logger = SimpleDeploy::SimpleDeployLogger.new
25
+ @logger_mock.should_receive(:debug).with 'a message'
26
+ @logger.puts 'a message'
27
+ end
28
+
29
+ it "tty? return false" do
30
+ @logger = SimpleDeploy::SimpleDeployLogger.new
31
+ @logger.tty?.should be_false
32
+ end
21
33
  end
22
34
 
23
- it "accept puts with msg and pass it to debug" do
24
- logger_mock = mock 'logger'
25
- Logger.should_receive(:new).with(STDOUT).and_return logger_mock
26
- logger_mock.should_receive(:debug).with 'a message'
27
- logger_mock.should_receive(:datetime_format=).with '%Y-%m-%dT%H:%M:%S%z'
28
- logger_mock.should_receive(:formatter=)
29
- logger_mock.should_receive(:level=).with 1
30
- logger = SimpleDeploy::SimpleDeployLogger.new
31
- logger.puts 'a message'
35
+ it "should create a new logger object from the hash passed as :logger" do
36
+ Logger.should_receive(:new).exactly(0).times
37
+ @logger = SimpleDeploy::SimpleDeployLogger.new :logger => @logger_mock
32
38
  end
33
39
 
34
40
  end
@@ -2,6 +2,68 @@ require 'spec_helper'
2
2
 
3
3
  describe SimpleDeploy do
4
4
 
5
- it "should test status"
5
+ before do
6
+ @logger_stub = stub 'logger', :debug => true,
7
+ :info => true
8
+ @config_mock = mock 'config'
9
+ @config_mock.stub :logger => @logger_stub
10
+ @stack_mock = mock 'stack'
11
+
12
+ options = { :config => @config_mock,
13
+ :stack => @stack_mock,
14
+ :ssh_user => 'user',
15
+ :name => 'dastack' }
16
+ @status = SimpleDeploy::Stack::Deployment::Status.new options
17
+ end
18
+
19
+ describe "clear_for_deployment?" do
20
+ it "should return true if clear for deployment" do
21
+ @stack_mock.stub :attributes => { 'deployment_in_progress' => 'false' }
22
+ @status.clear_for_deployment?.should be_true
23
+ end
24
+
25
+ it "should return false if not clear for deployment" do
26
+ @stack_mock.stub :attributes => { 'deployment_in_progress' => 'true' }
27
+ @status.clear_for_deployment?.should be_false
28
+ end
29
+ end
30
+
31
+ describe "deployment_in_progress?" do
32
+ it "should return false if no deployment in progress" do
33
+ @stack_mock.stub :attributes => { 'deployment_in_progress' => 'false' }
34
+ @status.deployment_in_progress?.should be_false
35
+ end
36
+
37
+ it "should return true if deployment in progress" do
38
+ @stack_mock.stub :attributes => { 'deployment_in_progress' => 'true' }
39
+ @status.deployment_in_progress?.should be_true
40
+ end
41
+ end
42
+
43
+ describe "clear_deployment_lock" do
44
+ it "should unset deploy in progress if force & deploy in progress" do
45
+ @stack_mock.stub :attributes => { 'deployment_in_progress' => 'true' }
46
+ @stack_mock.should_receive(:update).
47
+ with( { :attributes => [ { 'deployment_in_progress' => 'false'} ] })
48
+ @status.clear_deployment_lock(true)
49
+ end
50
+ end
51
+
52
+ describe "set_deployment_in_prgoress" do
53
+ it "set deployment as in progress" do
54
+ Time.stub :now => 'thetime'
55
+ @stack_mock.should_receive(:update).
56
+ with( { :attributes => [ { "deployment_in_progress" => "true", "deployment_user" => "user", "deployment_datetime" => "thetime" } ] })
57
+ @status.set_deployment_in_progress
58
+ end
59
+ end
60
+
61
+ describe "unset_deployment_in_prgoress" do
62
+ it "clears deployment in progress" do
63
+ @stack_mock.should_receive(:update).
64
+ with( { :attributes => [ { 'deployment_in_progress' => 'false'} ] })
65
+ @status.unset_deployment_in_progress
66
+ end
67
+ end
6
68
 
7
69
  end