diff --git a/app/models/manageiq/providers/openstack/cloud_manager.rb b/app/models/manageiq/providers/openstack/cloud_manager.rb index e6cb234b5a..2d3654b28c 100644 --- a/app/models/manageiq/providers/openstack/cloud_manager.rb +++ b/app/models/manageiq/providers/openstack/cloud_manager.rb @@ -29,7 +29,11 @@ class ManageIQ::Providers::Openstack::CloudManager < ManageIQ::Providers::CloudM supports :create_flavor supports :label_mapping supports :events do - _("Events are not supported") unless capabilities["events"] + if capabilities["events"] != true + _("Events are not configured") + elsif capabilities["events_available"] != true + _("Event monitor is not available") + end end supports :metrics supports :storage_manager @@ -481,12 +485,15 @@ def swift_service def verify_credentials(auth_type = nil, options = {}) options[:service] ||= "Compute" ret = super - return ret unless auth_type.nil? - capabilities["events"] = !!event_monitor_available? - save! if changed? + event_auth_types = %w[amqp stf ceilometer] - true + if event_auth_types.include?(auth_type.to_s) && capabilities["events"].to_s == "true" + capabilities["events_available"] = !!event_monitor_available? + update_columns(:capabilities => capabilities) + end + + ret end def self.ems_type diff --git a/app/models/manageiq/providers/openstack/manager_mixin.rb b/app/models/manageiq/providers/openstack/manager_mixin.rb index d81aca81e9..c219fcb20a 100644 --- a/app/models/manageiq/providers/openstack/manager_mixin.rb +++ b/app/models/manageiq/providers/openstack/manager_mixin.rb @@ -4,6 +4,7 @@ module ManageIQ::Providers::Openstack::ManagerMixin included do after_save :stop_event_monitor_queue_on_change + after_save :update_event_capabilities_on_config_change, if: :event_configuration_changed? before_destroy :stop_event_monitor end @@ -263,6 +264,31 @@ def event_monitor_available? false end + def event_configuration_changed? + return false unless self.class.name.include?("CloudManager") + + event_roles = %w[amqp ceilometer stf amqp_fallback1 amqp_fallback2] + event_auth_types = %w[amqp ceilometer] + + ep_changed = endpoints.any? { |ep| (ep.saved_changes.present? || ep.destroyed?) && event_roles.include?(ep.role) } + auth_changed = authentications.any? { |auth| (auth.saved_changes.present? || auth.destroyed?) && event_auth_types.include?(auth.authtype) } + config_inconsistent = capabilities&.fetch("events", false) && event_monitor_options&.fetch(:events_monitor, nil).blank? + + ep_changed || auth_changed || config_inconsistent + end + private :event_configuration_changed? + + def update_event_capabilities_on_config_change + @event_monitor_options = nil + events_enabled = event_monitor_options&.fetch(:events_monitor, nil).present? + + capabilities["events"] = events_enabled + capabilities["events_available"] &&= events_enabled + + update_columns(:capabilities => capabilities) + end + private :update_event_capabilities_on_config_change + def stop_event_monitor_queue_on_change if event_monitor_class && !self.new_record? && (authentications.detect{ |x| x.previous_changes.present? } || endpoints.detect{ |x| x.previous_changes.present? })