From: Jan Provaznik <[email protected]>

---
 src/app/models/deployment.rb       |    8 +++++-
 src/spec/models/deployment_spec.rb |   55 ++++++++++++++++++++++++++++++------
 2 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
index 277f9b3..fa8605f 100644
--- a/src/app/models/deployment.rb
+++ b/src/app/models/deployment.rb
@@ -660,13 +660,19 @@ class Deployment < ActiveRecord::Base
 
   def state_transition_from_running(instance)
     if instance.state != STATE_RUNNING
-      self.state = STATE_INCOMPLETE
+      if instances.all? {|i| i.state == Instance::STATE_STOPPED}
+        self.state = STATE_STOPPED
+      else
+        self.state = STATE_INCOMPLETE
+      end
     end
   end
 
   def state_transition_from_incomplete(instance)
     if instances.all? {|i| i.state == Instance::STATE_RUNNING}
       self.state = STATE_RUNNING
+    elsif instances.all? {|i| i.state == Instance::STATE_STOPPED}
+      self.state = STATE_STOPPED
     end
   end
 
diff --git a/src/spec/models/deployment_spec.rb 
b/src/spec/models/deployment_spec.rb
index 9b2a37e..8627169 100644
--- a/src/spec/models/deployment_spec.rb
+++ b/src/spec/models/deployment_spec.rb
@@ -376,17 +376,45 @@ describe Deployment do
       before :each do
         @deployment.state = Deployment::STATE_RUNNING
         @deployment.save!
-        @inst1 = Factory.create(:instance, :deployment => @deployment, :state 
=> Instance::STATE_RUNNING)
-        @inst2 = Factory.create(:instance, :deployment => @deployment, :state 
=> Instance::STATE_RUNNING)
-        @deployment.instances << @inst1
-        @deployment.instances << @inst2
       end
 
-      it "should be incomplete if only some instances are running" do
-        @inst1.state = Instance::STATE_ERROR
-        @inst1.save!
-        @deployment.reload
-        @deployment.state.should == Deployment::STATE_INCOMPLETE
+      describe "multi-instance deployment" do
+        before :each do
+          @inst1 = Factory.create(:instance, :deployment => @deployment, 
:state => Instance::STATE_RUNNING)
+          @inst2 = Factory.create(:instance, :deployment => @deployment, 
:state => Instance::STATE_RUNNING)
+          @deployment.instances << @inst1
+          @deployment.instances << @inst2
+        end
+
+        it "should be incomplete if only some instances are running" do
+          @inst1.state = Instance::STATE_ERROR
+          @inst1.save!
+          @deployment.reload
+          @deployment.state.should == Deployment::STATE_INCOMPLETE
+        end
+
+        it "should be stopped if all instances are stopped" do
+          @inst1.state = Instance::STATE_STOPPED
+          @inst1.save!
+          @inst2.state = Instance::STATE_STOPPED
+          @inst2.save!
+          @deployment.reload
+          @deployment.state.should == Deployment::STATE_STOPPED
+        end
+      end
+
+      describe "single-instance deployment" do
+        before :each do
+          @inst1 = Factory.create(:instance, :deployment => @deployment, 
:state => Instance::STATE_RUNNING)
+          @deployment.instances << @inst1
+        end
+
+        it "should be stopped if all instances are stopped" do
+          @inst1.state = Instance::STATE_STOPPED
+          @inst1.save!
+          @deployment.reload
+          @deployment.state.should == Deployment::STATE_STOPPED
+        end
       end
     end
 
@@ -544,6 +572,15 @@ describe Deployment do
         @deployment.reload
         @deployment.state.should == Deployment::STATE_RUNNING
       end
+
+      it "should be stopped if all instances are stopped" do
+        @inst1.state = Instance::STATE_STOPPED
+        @inst1.save!
+        @inst2.state = Instance::STATE_STOPPED
+        @inst2.save!
+        @deployment.reload
+        @deployment.state.should == Deployment::STATE_STOPPED
+      end
     end
 
   end
-- 
1.7.10.4

Reply via email to