[PATCH conductor] BZ 790860 - improved availability checking

jprovazn at redhat.com jprovazn at redhat.com
Mon Feb 27 12:17:17 UTC 2012


From: Jan Provazník <jan.provaznik at gmail.com>

'available' flag is now set also on 'test connect' and successful 'update' action

this patch also fixes bug with missing provider_types if new/edit form is
rendered from update/create actions
---
 src/app/controllers/providers_controller.rb      |    5 +++--
 src/app/models/provider.rb                       |   21 ++++++++++-----------
 src/spec/controllers/provider_controller_spec.rb |   15 +++++++++++++++
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/src/app/controllers/providers_controller.rb b/src/app/controllers/providers_controller.rb
index 0819b99..9de75dd 100644
--- a/src/app/controllers/providers_controller.rb
+++ b/src/app/controllers/providers_controller.rb
@@ -17,7 +17,7 @@
 class ProvidersController < ApplicationController
   before_filter :require_user
   before_filter :load_providers, :only => [:index, :show, :new, :edit, :create, :update]
-  before_filter :load_providers_types, :only => [:new, :edit]
+  before_filter :load_providers_types, :only => [:new, :edit, :update, :create]
 
   def index
     @params = params
@@ -129,6 +129,7 @@ class ProvidersController < ApplicationController
     end
 
     if @provider.save
+      @provider.update_availability
       flash[:notice] = t"providers.flash.notice.updated"
       redirect_to edit_provider_path(@provider)
     else
@@ -166,7 +167,7 @@ class ProvidersController < ApplicationController
 
   def test_connection(provider)
     @provider.errors.clear
-    if @provider.connect
+    if @provider.update_availability
       flash.now[:notice] = t"providers.flash.notice.connected"
     else
       flash.now[:warning] = t"providers.flash.warning.connect_failed"
diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb
index 9d5877c..2033a04 100644
--- a/src/app/models/provider.rb
+++ b/src/app/models/provider.rb
@@ -140,22 +140,21 @@ class Provider < ActiveRecord::Base
     provider_accounts.inject([]) {|all, pa| all += pa.instances.stoppable_inaccessible}
   end
 
+  def update_availability
+    self.available = valid_framework?
+    if self.available_changed? and !new_record?
+      update_attribute(:available, self.available)
+      logger.warn "#{name} provider's availability changed to #{self.available}"
+    end
+    self.available
+  end
+
   def populate_realms
     reload
 
-    self.available = valid_framework?
-    if self.available_changed?
-      if self.available
-        logger.warn "provider #{name} is now available"
-        save!
-      else
-        logger.warn "provider #{name} is not available"
-        update_attribute(:available, false)
-      end
-    end
     # if the provider is not running, mark as unavailable and don't refresh its
     # realms
-    return unless self.available
+    return unless update_availability
 
     conductor_acct_realms = {}
     conductor_acct_realm_ids = {}
diff --git a/src/spec/controllers/provider_controller_spec.rb b/src/spec/controllers/provider_controller_spec.rb
index f7fac96..3098523 100644
--- a/src/spec/controllers/provider_controller_spec.rb
+++ b/src/spec/controllers/provider_controller_spec.rb
@@ -35,4 +35,19 @@ describe ProvidersController do
     it { assigns[:realm_names].size.should == @provider.realms.size }
     it { response.should render_template(:partial => "providers/_realms") }
   end
+
+  describe "check availability" do
+    context "when provider is not accessible" do
+      before do
+        @provider.update_attribute(:url, "invalid_url")
+      end
+
+      it "should update availability status on test connection" do
+        @provider.available.should_not be_false
+        get :edit, :id => @provider.id, :test_provider => true
+        @provider.reload
+        @provider.available.should be_false
+      end
+    end
+  end
 end
-- 
1.7.7.6




More information about the aeolus-devel mailing list