From: Jozef Zigmund <[email protected]> This is short-term fix. It prevents setting of provider name, that causes failing image push in imagefactory.
https://bugzilla.redhat.com/show_bug.cgi?id=847798 --- src/app/controllers/providers_controller.rb | 86 +++++++++++++++++++---------- src/app/models/provider.rb | 40 ++++++++++++++ src/config/locales/activerecord/en.yml | 4 ++ src/config/locales/en.yml | 1 + 4 files changed, 101 insertions(+), 30 deletions(-) diff --git a/src/app/controllers/providers_controller.rb b/src/app/controllers/providers_controller.rb index f3a9302..80474de 100644 --- a/src/app/controllers/providers_controller.rb +++ b/src/app/controllers/providers_controller.rb @@ -121,24 +121,38 @@ class ProvidersController < ApplicationController @provider = Provider.new(params[:provider]) - if @provider.save + begin + if @provider.save + @provider.assign_owner_roles(current_user) + respond_to do |format| + format.html do + flash[:notice] = t"providers.flash.notice.added" + redirect_to edit_provider_path(@provider) + end + format.xml { render :partial => 'detail', :locals => { :provider => @provider } } + end + else + respond_to do |format| + format.html do + flash[:warning] = t"providers.flash.error.not_added" + render :action => "new" + end + format.xml { render :template => 'api/validation_error', :locals => { :errors => @provider.errors }, :status => :bad_request } + end + end + rescue Errno::EACCES + Provider.skip_callback :save, :check_name + @provider.save @provider.assign_owner_roles(current_user) respond_to do |format| format.html do flash[:notice] = t"providers.flash.notice.added" + flash[:warning] = t"providers.flash.warning.check_config_file" redirect_to edit_provider_path(@provider) end - format.xml { render :partial => 'detail', :locals => { :provider => @provider } } - end - else - respond_to do |format| - format.html do - flash[:warning] = t"providers.flash.error.not_added" - render :action => "new" - end - format.xml { render :template => 'api/validation_error', :locals => { :errors => @provider.errors }, :status => :bad_request } end end + end def update @@ -152,31 +166,43 @@ class ProvidersController < ApplicationController return end - if @provider.save - @provider.update_availability - respond_to do |format| - format.html do - flash[:notice] = t"providers.flash.notice.updated" - redirect_to edit_provider_path(@provider) + begin + if @provider.save + @provider.update_availability + respond_to do |format| + format.html do + flash[:notice] = t"providers.flash.notice.updated" + redirect_to edit_provider_path(@provider) + end + format.xml { render :partial => 'detail', :locals => { :provider => @provider } } + end + else + # we reset 'enabled' attribute to real state + # if save failed + @provider.reset_enabled! + respond_to do |format| + format.html do + unless @provider.connect + flash.now[:warning] = t"providers.flash.warning.connect_failed" + else + flash[:error] = t"providers.flash.error.not_updated" + end + load_provider_tabs + @alerts = provider_alerts(@provider) + render :action => "edit" + end + format.xml { render :template => 'api/validation_error', :locals => { :errors => @provider.errors }, :status => :bad_request } end - format.xml { render :partial => 'detail', :locals => { :provider => @provider } } end - else - # we reset 'enabled' attribute to real state - # if save failed - @provider.reset_enabled! + rescue Errno::EACCES + Provider.skip_callback :save, :check_name + @provider.save respond_to do |format| format.html do - unless @provider.connect - flash.now[:warning] = t"providers.flash.warning.connect_failed" - else - flash[:error] = t"providers.flash.error.not_updated" - end - load_provider_tabs - @alerts = provider_alerts(@provider) - render :action => "edit" + flash[:notice] = t"providers.flash.notice.updated" + flash[:warning] = t"providers.flash.warning.check_config_file" + redirect_to edit_provider_path(@provider) end - format.xml { render :template => 'api/validation_error', :locals => { :errors => @provider.errors }, :status => :bad_request } end end end diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 64ddb33..80f57fc 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -63,6 +63,28 @@ class Provider < ActiveRecord::Base has_many :provider_priority_groups, :through => :provider_priority_group_elements before_destroy :destroyable? + before_save :check_name + + def check_name + case provider_type.name + when "Mock" + if name.starts_with?("mock") + true + else + errors.add(:name, :start_with_mock) + false + end + when "RHEV-M" + load_rhevm_json(name) + when "Amazon EC2" + if name.starts_with?("ec2-") + true + else + errors.add(:name, :start_with_ec2) + false + end + end + end def derived_subtree(role = nil) subtree = super(role) @@ -144,6 +166,7 @@ class Provider < ActiveRecord::Base end end if res[:failed_to_stop].blank? and res[:failed_to_terminate].blank? + Provider.skip_callback :save, :check_name update_attribute(:enabled, false) end res @@ -277,4 +300,21 @@ class Provider < ActiveRecord::Base end true end + + def load_rhevm_json(provider_name) + path_to_json = "/etc/imagefactory/rhevm.json" + if File.exists?(path_to_json) + json = File.read(path_to_json) + json_hash = ActiveSupport::JSON.decode(json) + if json_hash.key?(provider_name) + true + else + errors.add(:name, :not_found_in_config) + false + end + else + errors.add(:name, :config_not_exist) + false + end + end end diff --git a/src/config/locales/activerecord/en.yml b/src/config/locales/activerecord/en.yml index ae2514d..9d2242e 100644 --- a/src/config/locales/activerecord/en.yml +++ b/src/config/locales/activerecord/en.yml @@ -360,6 +360,10 @@ en: attributes: name: invalid: "must only contain: numbers, letters, spaces, '_' and '-'" + not_found_in_config: "was not found in configuration file" + config_not_exist: "cannot be verified, configuration file does not exist" + start_with_mock: "must start with 'mock'" + start_with_ec2: "must start with 'ec2-'" url: invalid_framework: "Must be a valid provider uri" deltacloud_provider: diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index c8fd262..2652dd5 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -1201,6 +1201,7 @@ en: connect_failed: "Failed to connect to Provider" not_stopped_instances: "Provider was not disabled. Failed to stop following instances:" not_terminated_instances: "Provider was not disabled. Failed to change status to 'stopped' for following instances:" + check_config_file: Cannot check if provider name is right. Please check config file alerts: type: critical: Critical -- 1.7.11.4
