diff --git a/app/models/manageiq/providers/inventory/persister/builder.rb b/app/models/manageiq/providers/inventory/persister/builder.rb index 0eaf97f1309..4f11c2d5108 100644 --- a/app/models/manageiq/providers/inventory/persister/builder.rb +++ b/app/models/manageiq/providers/inventory/persister/builder.rb @@ -43,6 +43,9 @@ def self.prepare_data(name, persister_class, options = {}) builder end + attr_accessor :name, :persister_class, :properties, :inventory_object_attributes, + :default_values, :dependency_attributes, :options, :adv_settings, :shared_properties + # @see prepare_data() def initialize(name, persister_class, options = self.class.default_options) @name = name @@ -61,6 +64,17 @@ def initialize(name, persister_class, options = self.class.default_options) @shared_properties = options[:shared_properties] # From persister end + def manager_class + @manager_class ||= begin + provider_module = persister_class.provider_module + manager_module = self.class.name.split('::').last + + "#{provider_module}::#{manager_module}".safe_constantize + rescue ::ManageIQ::Providers::Inflector::ObjectNotNamespacedError + nil + end + end + # Builds data for InventoryCollection # Calls method @name (if exists) with specific properties # Yields for overwriting provider-specific properties @@ -206,29 +220,14 @@ def merge_hashes(source, dest, mode) # # @return [Class | nil] when class doesn't exist, returns nil def auto_model_class - model_class = begin - # a) Provider specific class - provider_module = @persister_class.provider_module - manager_module = self.class.name.split('::').last - - class_name = "#{provider_module}::#{manager_module}::#{@name.to_s.classify}" - - inferred_class = class_name.safe_constantize - - # safe_constantize can return different similar class ( some Rails auto-magic :/ ) - if inferred_class.to_s == class_name - inferred_class - end - rescue ::ManageIQ::Providers::Inflector::ObjectNotNamespacedError - nil - end - - if model_class - model_class - else - # b) general class - "::#{@name.to_s.classify}".safe_constantize - end + class_name = "#{manager_class}::#{name.to_s.classify}" + provider_class = class_name.safe_constantize + + # Check that safe_constantize returns our expected class_name, if not then + # return the base class. + # + # safe_constantize can return different similar class ( some Rails auto-magic :/ ) + provider_class.to_s == class_name ? provider_class : "::#{name.to_s.classify}".safe_constantize end # Enables/disables auto_model_class and exception check diff --git a/app/models/manageiq/providers/inventory/persister/builder/shared.rb b/app/models/manageiq/providers/inventory/persister/builder/shared.rb index eb9b5972f64..71bdc20b0fd 100644 --- a/app/models/manageiq/providers/inventory/persister/builder/shared.rb +++ b/app/models/manageiq/providers/inventory/persister/builder/shared.rb @@ -56,6 +56,9 @@ def miq_templates add_default_values( :template => true ) + + template_class = "#{manager_class}::Template".safe_constantize + add_properties(:model_class => template_class) if template_class end def vm_template_shared