diff --git a/vmdb/app/models/miq_ae_class.rb b/vmdb/app/models/miq_ae_class.rb index d0b0839683b..1832cfc4109 100644 --- a/vmdb/app/models/miq_ae_class.rb +++ b/vmdb/app/models/miq_ae_class.rb @@ -113,6 +113,16 @@ def editable? ae_namespace.editable? end + def field_names + ae_fields.collect { |x| x.name.downcase } + end + + def field_hash(name) + field = ae_fields.detect { |f| f.name.casecmp(name) == 0 } + raise "field #{name} not found in class #{@name}" if field.nil? + field.attributes + end + private def scoped_methods(s) diff --git a/vmdb/app/models/miq_ae_class_compare_fields.rb b/vmdb/app/models/miq_ae_class_compare_fields.rb new file mode 100644 index 00000000000..58a8ef181d1 --- /dev/null +++ b/vmdb/app/models/miq_ae_class_compare_fields.rb @@ -0,0 +1,87 @@ +class MiqAeClassCompareFields + attr_reader :compatibilities + attr_reader :incompatibilities + attr_reader :fields_in_use + attr_reader :adds + IGNORE_PROPERTY_NAMES = %w(name owner created_on updated_on updated_by + updated_by_user_id id class_id) + WARNING_PROPERTY_NAMES = %w(priority message display_name default_value substitute + visibility collect scope description condition on_entry + on_exit on_error max_retries max_time) + ERROR_PROPERTY_NAMES = %w(aetype datatype) + + CONGRUENT_SCHEMA = 1 + COMPATIBLE_SCHEMA = 2 + INCOMPATIBLE_SCHEMA = 4 + + def initialize(new_class, old_class) + @new_class = new_class + @old_class = old_class + end + + def compare + load_field_names + initialize_results + venn_list + validate_similar + status + end + + def status + return CONGRUENT_SCHEMA if congruent? + return COMPATIBLE_SCHEMA if compatible? + INCOMPATIBLE_SCHEMA + end + + def congruent? + @adds.empty? && @incompatibilities.empty? && + @compatibilities.empty? && @fields_in_use.empty? && + @deletes.empty? + end + + def compatible? + @incompatibilities.empty? && @deletes.empty? + end + + private + + def initialize_results + @incompatibilities = [] + @compatibilities = [] + @fields_in_use = [] + @adds = [] + @deletes = [] + end + + def load_field_names + @old_names = @old_class.field_names + @new_names = @new_class.field_names + end + + def venn_list + @similar = @new_names & @old_names + @adds = @new_names - @old_names + @deletes = @old_names - @new_names + end + + def validate_similar + @similar.each do |name| + old_field = @old_class.field_hash(name) + new_field = @new_class.field_hash(name) + compare_field_properties(name, old_field, new_field) + end + end + + def compare_field_properties(field_name, old_field, new_field) + old_field.each do |property, value| + next if IGNORE_PROPERTY_NAMES.include?(property) + next if value == new_field[property] + hash = {'property' => property, + 'old_value' => value, + 'new_value' => new_field[property], + 'field_name' => field_name} + @compatibilities << hash if WARNING_PROPERTY_NAMES.include?(property) + @incompatibilities << hash if ERROR_PROPERTY_NAMES.include?(property) + end + end +end diff --git a/vmdb/app/models/miq_ae_class_copy.rb b/vmdb/app/models/miq_ae_class_copy.rb new file mode 100644 index 00000000000..a877d2f89f1 --- /dev/null +++ b/vmdb/app/models/miq_ae_class_copy.rb @@ -0,0 +1,80 @@ +class MiqAeClassCopy + include MiqAeCopyMixin + DELETE_PROPERTIES = %w(updated_by updated_by_user_id updated_on id + created_on updated_on method_id owner class_id) + + def initialize(class_fqname) + @class_fqname = class_fqname + @src_domain, @partial_ns, @ae_class = MiqAeClassCopy.split(@class_fqname, false) + @src_class = MiqAeClass.find_by_fqname(@class_fqname) + raise "Source class not found #{@class_fqname}" unless @src_class + end + + def to_domain(domain, ns = nil, overwrite = false) + check_duplicity(domain, ns, @src_class.name) + @overwrite = overwrite + @target_ns_fqname = target_ns(domain, ns) + @target_name = @src_class.name + copy + end + + def as(new_name, ns = nil, overwrite = false) + check_duplicity(@src_domain, ns, new_name) + @overwrite = overwrite + @target_ns_fqname = target_ns(@src_domain, ns) + @target_name = new_name + copy + end + + private + + def target_ns(domain, ns) + return "#{domain}/#{@partial_ns}" if ns.nil? + MiqAeNamespace.find_by_fqname(ns, false).nil? ? "#{domain}/#{ns}" : ns + end + + def copy + validate + create_class + copy_schema + @dest_class + end + + def create_class + ns = MiqAeNamespace.find_or_create_by_fqname(@target_ns_fqname, false) + ns.save! + @dest_class = MiqAeClass.create!(:namespace_id => ns.id, + :name => @target_name, + :description => @src_class.description, + :type => @src_class.type, + :display_name => @src_class.display_name, + :inherits => @src_class.inherits, + :visibility => @src_class.visibility) + end + + def copy_schema + @dest_class.ae_fields = add_fields + @dest_class.save! + end + + def add_fields + @src_class.ae_fields.collect do |src_field| + attrs = src_field.attributes.reject { |k, _| DELETE_PROPERTIES.include?(k) } + MiqAeField.new(attrs) + end + end + + def validate + dest_class = MiqAeClass.find_by_fqname("#{@target_ns_fqname}/#{@target_name}") + if dest_class + dest_class.destroy if @overwrite + raise "Destination Class already exists #{dest_class.fqname}" unless @overwrite + end + end + + def check_duplicity(domain, ns, classname) + if domain.downcase == @src_domain.downcase && classname.downcase == @ae_class.downcase + raise "Cannot copy class onto itself" if ns.nil? || ns.downcase == @partial_ns.downcase + end + end +end diff --git a/vmdb/app/models/miq_ae_class_yaml.rb b/vmdb/app/models/miq_ae_class_yaml.rb new file mode 100644 index 00000000000..b4fbb0811c1 --- /dev/null +++ b/vmdb/app/models/miq_ae_class_yaml.rb @@ -0,0 +1,19 @@ +class MiqAeClassYaml + attr_accessor :ae_class_obj + def initialize(filename = nil) + @filename = filename + @ae_class_obj = YAML.load_file(filename) if filename + end + + def field_names + raise "class object has not been set" unless @ae_class_obj + @ae_class_obj['object']['schema'].collect { |x| x['field']['name'].downcase } + end + + def field_hash(name) + raise "class object has not been set" unless @ae_class_obj + field = @ae_class_obj['object']['schema'].detect { |f| f['field']['name'].casecmp(name) == 0 } + raise "field #{name} not found in yaml class #{@filename}" if field.nil? + field['field'] + end +end diff --git a/vmdb/app/models/miq_ae_instance.rb b/vmdb/app/models/miq_ae_instance.rb index 9c77e786cbb..08a5c868c9a 100644 --- a/vmdb/app/models/miq_ae_instance.rb +++ b/vmdb/app/models/miq_ae_instance.rb @@ -102,8 +102,20 @@ def editable? ae_class.ae_namespace.editable? end - private + def field_names + fields = ae_values.collect { |v| v.field_id } + ae_class.ae_fields.select { |x| fields.include?(x.id) }.collect { |f| f.name.downcase } + end + def field_value_hash(name) + field = ae_class.ae_fields.detect { |f| f.name.casecmp(name) == 0 } + raise "Field #{name} not found in class #{ae_class.fqname}" if field.nil? + value = ae_values.detect { |v| v.field_id == field.id } + raise "Field #{name} not found in instance #{self.name} in class #{ae_class.fqname}" if value.nil? + value.attributes + end + + private def validate_field(field) if field.kind_of?(MiqAeField) diff --git a/vmdb/app/models/miq_ae_instance_compare_values.rb b/vmdb/app/models/miq_ae_instance_compare_values.rb new file mode 100644 index 00000000000..204edfd86d3 --- /dev/null +++ b/vmdb/app/models/miq_ae_instance_compare_values.rb @@ -0,0 +1,87 @@ +class MiqAeInstanceCompareValues + attr_reader :compatibilities + attr_reader :incompatibilities + attr_reader :fields_in_use + attr_reader :adds + IGNORE_PROPERTY_NAMES = %w(name owner created_on updated_on updated_by + updated_by_user_id id class_id instance_id field_id) + WARNING_PROPERTY_NAMES = %w(priority message display_name default_value substitute + visibility collect scope description condition on_entry + on_exit on_error max_retries max_time) + ERROR_PROPERTY_NAMES = %w(aetype datatype) + + CONGRUENT_INSTANCE = 1 + COMPATIBLE_INSTANCE = 2 + INCOMPATIBLE_INSTANCE = 4 + + def initialize(new_instance, old_instance) + @new_instance = new_instance + @old_instance = old_instance + end + + def compare + load_field_names + initialize_results + venn_list + validate_similar + status + end + + def status + return CONGRUENT_INSTANCE if congruent? + return COMPATIBLE_INSTANCE if compatible? + INCOMPATIBLE_INSTANCE + end + + def congruent? + @adds.empty? && @incompatibilities.empty? && + @compatibilities.empty? && @fields_in_use.empty? && + @deletes.empty? + end + + def compatible? + @incompatibilities.empty? && @deletes.empty? + end + + private + + def initialize_results + @incompatibilities = [] + @compatibilities = [] + @fields_in_use = [] + @adds = [] + @deletes = [] + end + + def load_field_names + @old_names = @old_instance.field_names + @new_names = @new_instance.field_names + end + + def venn_list + @similar = @new_names & @old_names + @adds = @new_names - @old_names + @deletes = @old_names - @new_names + end + + def validate_similar + @similar.each do |name| + old_value = @old_instance.field_value_hash(name) + new_value = @new_instance.field_value_hash(name) + compare_value_properties(name, old_value, new_value) + end + end + + def compare_value_properties(field_name, old_value, new_value) + old_value.each do |property, data| + next if IGNORE_PROPERTY_NAMES.include?(property) + next if data == new_value[property] + hash = {'property' => property, + 'old_data' => data, + 'new_data' => new_value[property], + 'field_name' => field_name} + @compatibilities << hash if WARNING_PROPERTY_NAMES.include?(property) + @incompatibilities << hash if ERROR_PROPERTY_NAMES.include?(property) + end + end +end diff --git a/vmdb/app/models/miq_ae_instance_copy.rb b/vmdb/app/models/miq_ae_instance_copy.rb new file mode 100644 index 00000000000..33204a60aac --- /dev/null +++ b/vmdb/app/models/miq_ae_instance_copy.rb @@ -0,0 +1,94 @@ +class MiqAeInstanceCopy + attr_accessor :flags + include MiqAeCopyMixin + DELETE_PROPERTIES = %w(id instance_id field_id updated_on created_on + updated_by updated_by_user_id) + + def initialize(instance_fqname) + @src_domain, @partial_ns, @ae_class, @instance_name = MiqAeInstanceCopy.split(instance_fqname, true) + @class_fqname = "#{@src_domain}/#{@partial_ns}/#{@ae_class}" + @src_class = MiqAeClass.find_by_fqname("#{@src_domain}/#{@partial_ns}/#{@ae_class}") + raise "Source class not found #{@class_fqname}" unless @src_class + @src_instance = MiqAeInstance.find_by_name_and_class_id(@instance_name, @src_class.id) + raise "Source instance #{@instance_name} not found #{@class_fqname}" unless @src_instance + @target_class_name = @ae_class + @flags = MiqAeClassCompareFields::CONGRUENT_SCHEMA | MiqAeClassCompareFields::COMPATIBLE_SCHEMA + end + + def to_domain(domain, ns = nil, overwrite = false) + check_duplicity(domain, ns, @instance_name) + @overwrite = overwrite + @target_ns = ns.nil? ? @partial_ns : ns + @target_name = @instance_name + @target_domain = domain + copy + end + + def as(new_name, ns = nil, overwrite = false) + check_duplicity(@src_domain, ns, new_name) + @overwrite = overwrite + @target_ns = ns.nil? ? @partial_ns : ns + @target_name = new_name + @target_domain = @src_domain + copy + end + + private + + def find_or_create_class + @dest_class = MiqAeClass.find_by_fqname("#{@target_domain}/#{@target_ns}/#{@target_class_name}") + return unless @dest_class.nil? + @dest_class = MiqAeClassCopy.new(@class_fqname).to_domain(@target_domain, @target_ns) + end + + def copy + validate + create_instance + @dest_instance.ae_values << add_values + @dest_instance.save! + @dest_instance + end + + def add_values + @src_instance.ae_values.collect do |v| + attrs = v.attributes.delete_if { |k, _| DELETE_PROPERTIES.include?(k) } + field_id = get_new_field_id(v.field_id) + next if field_id.nil? + MiqAeValue.new({:field_id => field_id}.merge(attrs)) + end.compact + end + + def get_new_field_id(field_id) + src_field = @src_class.ae_fields.detect { |f| f.id == field_id } + raise "Field id #{field_id} not found in source class #{@src_class.name}" if src_field.nil? + dest_field = @dest_class.ae_fields.detect { |f| f.name == src_field.name } + return nil if dest_field.nil? && @class_schema_status & @flags > 0 + raise "Field name #{src_field.name} not found in target class #{@dest_class.name}" if dest_field.nil? + dest_field.id + end + + def create_instance + @dest_instance = MiqAeInstance.find_by_class_id_and_name(@dest_class.id, @target_name) + if @dest_instance + @dest_instance.destroy if @overwrite + raise "Instance #{@target_name} exists in #{@target_ns_fqname} class #{@target_class_name}" unless @overwrite + end + @dest_instance = MiqAeInstance.create!(:name => @target_name, + :description => @src_instance.description, + :display_name => @src_instance.display_name, + :inherits => @src_instance.inherits, + :class_id => @dest_class.id) + end + + def validate + find_or_create_class + @class_schema_status = MiqAeClassCompareFields.new(@src_class, @dest_class).compare + raise "Instance cannot be copied, automation class schema mismatch" if @flags & @class_schema_status == 0 + end + + def check_duplicity(domain, ns, instance_name) + if domain.downcase == @src_domain.downcase && instance_name.downcase == @instance_name.downcase + raise "Cannot copy instance onto itself" if ns.nil? || ns.downcase == @partial_ns.downcase + end + end +end diff --git a/vmdb/app/models/miq_ae_instance_yaml.rb b/vmdb/app/models/miq_ae_instance_yaml.rb new file mode 100644 index 00000000000..918163a2919 --- /dev/null +++ b/vmdb/app/models/miq_ae_instance_yaml.rb @@ -0,0 +1,19 @@ +class MiqAeInstanceYaml + attr_accessor :ae_instance_obj + def initialize(filename = nil) + @filename = filename + @ae_instance_obj = YAML.load_file(@filename) if @filename + end + + def field_names + raise "ae instance object has not been initialize" unless @ae_instance_obj + @ae_instance_obj['object']['fields'].collect { |item| item.keys }.flatten + end + + def field_value_hash(name) + raise "ae instance object has not been initialize" unless @ae_instance_obj + value = @ae_instance_obj['object']['fields'].detect { |item| item.keys[0].casecmp(name) == 0 } + raise "field name #{name} not found in instance #{@filename}" if value.nil? + value[name] + end +end diff --git a/vmdb/app/models/miq_ae_method.rb b/vmdb/app/models/miq_ae_method.rb index d29bf681192..8618717dc35 100644 --- a/vmdb/app/models/miq_ae_method.rb +++ b/vmdb/app/models/miq_ae_method.rb @@ -77,4 +77,14 @@ def to_export_xml(options = {}) def editable? ae_class.ae_namespace.editable? end + + def field_names + inputs.collect { |f| f.name.downcase } + end + + def field_value_hash(name) + field = inputs.detect { |f| f.name.casecmp(name) == 0 } + raise "Field #{name} not found in method #{self.name}" if field.nil? + field.attributes + end end diff --git a/vmdb/app/models/miq_ae_method_compare.rb b/vmdb/app/models/miq_ae_method_compare.rb new file mode 100644 index 00000000000..0e4515b205f --- /dev/null +++ b/vmdb/app/models/miq_ae_method_compare.rb @@ -0,0 +1,100 @@ +class MiqAeMethodCompare + attr_reader :compatibilities + attr_reader :incompatibilities + attr_reader :fields_in_use + attr_reader :adds + IGNORE_PROPERTY_NAMES = %w(name owner created_on updated_on updated_by + updated_by_user_id id class_id instance_id field_id) + WARNING_PROPERTY_NAMES = %w(priority message display_name default_value substitute + visibility collect scope description condition on_entry + on_exit on_error max_retries max_time) + ERROR_PROPERTY_NAMES = %w(aetype datatype) + MAIN_METHOD_ATTRIBUTES = %w(scope language location data) + + CONGRUENT_METHOD = 1 + COMPATIBLE_METHOD = 2 + INCOMPATIBLE_METHOD = 4 + + def initialize(new_method, old_method) + @new_method = new_method + @old_method = old_method + end + + def compare + load_field_names + initialize_results + venn_list + validate_similar + compare_main_attributes + status + end + + def status + return CONGRUENT_METHOD if congruent? + return COMPATIBLE_METHOD if compatible? + INCOMPATIBLE_METHOD + end + + def congruent? + @adds.empty? && @incompatibilities.empty? && + @compatibilities.empty? && @fields_in_use.empty? && + @deletes.empty? + end + + def compatible? + @incompatibilities.empty? && @deletes.empty? + end + + private + + def initialize_results + @incompatibilities = [] + @compatibilities = [] + @fields_in_use = [] + @adds = [] + @deletes = [] + end + + def compare_main_attributes + MAIN_METHOD_ATTRIBUTES.each { |f| add_to_incompatibilities_if_different(f) } + end + + def add_to_incompatibilities_if_different(method) + old_value = @old_method.send(method) if @old_method.respond_to? method + new_value = @new_method.send(method) if @new_method.respond_to? method + return if old_value == new_value + @incompatibilities << {'attribute' => method, 'old_data' => old_value, 'new_data' => new_value} + end + + def load_field_names + @old_names = @old_method.field_names + @new_names = @new_method.field_names + end + + def venn_list + @similar = @new_names & @old_names + @adds = @new_names - @old_names + @deletes = @old_names - @new_names + end + + def validate_similar + @similar.each do |name| + old_value = @old_method.field_value_hash(name) + new_value = @new_method.field_value_hash(name) + compare_value_properties(name, old_value, new_value) + end + end + + def compare_value_properties(field_name, old_value, new_value) + old_value.each do |property, data| + next if IGNORE_PROPERTY_NAMES.include?(property) + next if data == new_value[property] + hash = {'property' => property, + 'old_data' => data, + 'new_data' => new_value[property], + 'field_name' => field_name} + @compatibilities << hash if WARNING_PROPERTY_NAMES.include?(property) + @incompatibilities << hash if ERROR_PROPERTY_NAMES.include?(property) + end + end +end diff --git a/vmdb/app/models/miq_ae_method_copy.rb b/vmdb/app/models/miq_ae_method_copy.rb new file mode 100644 index 00000000000..8e6712e39f9 --- /dev/null +++ b/vmdb/app/models/miq_ae_method_copy.rb @@ -0,0 +1,82 @@ +class MiqAeMethodCopy + include MiqAeCopyMixin + DELETE_PROPERTIES = %w(id class_id method_id field_id updated_on created_on + updated_by updated_by_user_id) + + def initialize(method_fqname) + @src_domain, @partial_ns, @ae_class, @method_name = MiqAeMethodCopy.split(method_fqname, true) + @class_fqname = "#{@src_domain}/#{@partial_ns}/#{@ae_class}" + @src_class = MiqAeClass.find_by_fqname("#{@src_domain}/#{@partial_ns}/#{@ae_class}") + raise "Source class not found #{@class_fqname}" unless @src_class + @src_method = MiqAeMethod.find_by_name_and_class_id(@method_name, @src_class.id) + raise "Source method #{@method_name} not found #{@class_fqname}" unless @src_method + @target_class_name = @ae_class + end + + def to_domain(domain, ns = nil, overwrite = false) + check_duplicity(domain, ns, @method_name) + @overwrite = overwrite + @target_ns = ns.nil? ? @partial_ns : ns + @target_name = @method_name + @target_domain = domain + copy + end + + def as(new_name, ns = nil, overwrite = false) + check_duplicity(@src_domain, ns, new_name) + @overwrite = overwrite + @target_ns = ns.nil? ? @partial_ns : ns + @target_name = new_name + @target_domain = @src_domain + copy + end + + private + + def find_or_create_class + @dest_class = MiqAeClass.find_by_fqname("#{@target_domain}/#{@target_ns}/#{@target_class_name}") + return unless @dest_class.nil? + @dest_class = MiqAeClassCopy.new(@class_fqname).to_domain(@target_domain, @target_ns) + end + + def copy + validate + create_method + @dest_method.inputs << add_inputs + @dest_method.save! + @dest_method + end + + def add_inputs + @src_method.inputs.collect do |v| + attrs = v.attributes.delete_if { |k, _| DELETE_PROPERTIES.include?(k) } + MiqAeField.new(attrs) + end + end + + def create_method + @dest_method = MiqAeMethod.find_by_class_id_and_name(@dest_class.id, @target_name) + if @dest_method + @dest_method.destroy if @overwrite + raise "Instance #{@target_name} exists in #{@target_ns_fqname} class #{@target_class_name}" unless @overwrite + end + @dest_method = MiqAeMethod.create!(:name => @target_name, + :display_name => @src_method.display_name, + :description => @src_method.description, + :scope => @src_method.scope, + :language => @src_method.language, + :location => @src_method.location, + :data => @src_method.data, + :class_id => @dest_class.id) + end + + def validate + find_or_create_class + end + + def check_duplicity(domain, ns, method_name) + if domain.downcase == @src_domain.downcase && method_name.downcase == @method_name.downcase + raise "Cannot copy method onto itself" if ns.nil? || ns.downcase == @partial_ns.downcase + end + end +end diff --git a/vmdb/app/models/miq_ae_method_yaml.rb b/vmdb/app/models/miq_ae_method_yaml.rb new file mode 100644 index 00000000000..7ac5e21d244 --- /dev/null +++ b/vmdb/app/models/miq_ae_method_yaml.rb @@ -0,0 +1,45 @@ +class MiqAeMethodYaml + attr_accessor :ae_method_obj + attr_accessor :data + def initialize(filename = nil) + @filename = filename + @ae_method_obj = YAML.load_file(@filename) if @filename + load_method_file if @filename + end + + def define_instance_variables + @ae_method_obj['object']['attributes'].each do |k, v| + instance_variable_set("@#{k}", v) + singleton_class.class_eval { attr_accessor "#{k}" } + send("#{k}=", v) + end + end + + def load_method_file + define_instance_variables + file_name = method_file_name + contents = "" + contents = File.open(file_name) { |f| f.read } if file_name + instance_variable_set("@data", contents) + end + + def method_file_name + return nil if location.casecmp('builtin') == 0 + return nil if location.casecmp('uri') == 0 + return @filename.gsub('.yaml', '.rb') if language.casecmp('ruby') == 0 + end + + def field_names + raise "ae_method_obj has not been set" unless @ae_method_obj + define_instance_variables + @ae_method_obj['object']['inputs'].collect { |item| item['field']['name'] }.flatten + end + + def field_value_hash(name) + raise "ae_method_obj has not been set" unless @ae_method_obj + define_instance_variables + value = @ae_method_obj['object']['inputs'].detect { |item| item['field']['name'].casecmp(name) == 0 } + raise "field name #{name} not found in instance #{@filename}" if value.nil? + value['field'] + end +end diff --git a/vmdb/app/models/miq_ae_namespace.rb b/vmdb/app/models/miq_ae_namespace.rb index 81dc0b177bb..4a51c60ed21 100644 --- a/vmdb/app/models/miq_ae_namespace.rb +++ b/vmdb/app/models/miq_ae_namespace.rb @@ -19,16 +19,16 @@ def self.find_by_fqname(fqname, include_classes = true) query.where(low_name.eq(last)).detect { |namespace| namespace.fqname.downcase == fqname } end - def self.find_or_create_by_fqname(fqname) + def self.find_or_create_by_fqname(fqname, include_classes = true) return nil if fqname.blank? - found = self.find_by_fqname(fqname) + found = find_by_fqname(fqname, include_classes) return found unless found.nil? parts = fqname.split('/') new_parts = [parts.pop] loop do - found = self.find_by_fqname(parts.join('/')) + found = find_by_fqname(parts.join('/'), include_classes) break unless found.nil? new_parts.unshift(parts.pop) break if parts.empty? diff --git a/vmdb/app/models/mixins/miq_ae_copy_mixin.rb b/vmdb/app/models/mixins/miq_ae_copy_mixin.rb new file mode 100644 index 00000000000..e37f21e2fc8 --- /dev/null +++ b/vmdb/app/models/mixins/miq_ae_copy_mixin.rb @@ -0,0 +1,20 @@ +module MiqAeCopyMixin + extend ActiveSupport::Concern + + module ClassMethods + def split(fqname, has_instance_name) + ns, ae_class, ae_instance, _ = MiqAeEngine::MiqAePath.split(fqname, :has_instance_name => has_instance_name) + parts = ns.split('/') + domain = parts.shift + partial_ns = parts.join('/') + return domain, partial_ns, ae_class, ae_instance if has_instance_name + return domain, partial_ns, ae_class + end + + def same_class(from_class, to_class) + diff_obj = MiqAeClassCompareFields.new(from_class, to_class) + diff_obj.compare + diff_obj.congruent? + end + end +end diff --git a/vmdb/spec/models/miq_ae_class_compare_fields_spec.rb b/vmdb/spec/models/miq_ae_class_compare_fields_spec.rb new file mode 100644 index 00000000000..20cb5650eb3 --- /dev/null +++ b/vmdb/spec/models/miq_ae_class_compare_fields_spec.rb @@ -0,0 +1,201 @@ +require "spec_helper" +include MiqAeYamlImportExportMixin +describe MiqAeClassCompareFields do + + before do + @domain = 'SPEC_DOMAIN' + @namespace = 'NS1' + @yaml_folder = File.join(File.dirname(__FILE__), 'miq_ae_copy_data') + MiqAeDatastore.reset + @export_dir = File.join(Dir.tmpdir, 'rspec_copy_tests') + end + + context "same fields" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy1.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS1") + end + + it "both class in DB should be equivalent" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class_check_status(class1, class1, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + end + + it "one class in DB and other in YAML should be equivalent" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class1_file) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + end + + end + + context "same fields mixed case" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy2.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS1", "MIXED_CASE_NAMES") + end + + it "both class in DB should be equivalent" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + end + + it "one class in DB and other in YAML should be equivalent" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + end + end + + context "same field but aetype changes" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy3.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS1", "CLASS_AETYPE_OFF") + end + + it "both classes in DB should be incompatible" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be incompatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + end + + context "same field but datatype changes" do + before(:each) do + @yaml_file = File.join(@yaml_folder, 'class_copy4.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS1", "CLASS_DATATYPE_OFF") + end + + it "both classes in DB should be incompatible" do + ns1 = MiqAeNamespace.find_by_fqname("#{@domain}/#{@namespace}") + class1 = MiqAeClass.find_by_namespace_id_and_name(ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be incompatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + end + + context "same fields but priority changes" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy5.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS1", "CLASS_PRIORITY_OFF") + end + + it "both classes in DB should be compatible" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::COMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be compatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::COMPATIBLE_SCHEMA) + end + end + + context "mostly same fields except a new additon" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy6.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS_ADD_A_FIELD", "CLASS1") + end + + it "both classes in DB should be compatible" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::COMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be compatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::COMPATIBLE_SCHEMA) + end + end + + context "mostly same fields except a deletion of a in use field" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy7.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS_IN_USE_FIELD_DELETED", "CLASS1") + end + + it "both classes in DB should be incompatible" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be incompatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + end + + context "mostly same fields except a deletion of a field not in use" do + before do + @yaml_file = File.join(@yaml_folder, 'class_copy8.yaml') + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + prep_class_file_names("CLASS_FIELD_DELETED", "CLASS1") + end + + it "both classes in DB should be incompatible" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @second_class) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + + it "one class in DB and other in YAML should be incompatible" do + export_model(@domain) + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @first_class) + class2 = MiqAeClassYaml.new(@class2_file) + class_check_status(class1, class2, MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA) + end + end + + def class_check_status(class1, class2, status) + diff_obj = MiqAeClassCompareFields.new(class1, class2) + diff_obj.compare + diff_obj.status.should equal(status) + end + + def prep_class_file_names(class1 = nil, class2 = nil) + @first_class = class1 if class1 + @second_class = class2 if class2 + @class1_file = File.join(@export_dir, @domain, @namespace, "#{@first_class}.class", "__class__.yaml") if class1 + @class2_file = File.join(@export_dir, @domain, @namespace, "#{@second_class}.class", "__class__.yaml") if class2 + @ns1 = MiqAeNamespace.find_by_fqname("#{@domain}/#{@namespace}") + end + + def export_model(domain, export_options = {}) + FileUtils.rm_rf(@export_dir) if File.exist?(@export_dir) + export_options['export_dir'] = @export_dir if export_options.empty? + MiqAeExport.new(domain, export_options).export + end +end diff --git a/vmdb/spec/models/miq_ae_class_copy_spec.rb b/vmdb/spec/models/miq_ae_class_copy_spec.rb new file mode 100644 index 00000000000..a641dd82fb3 --- /dev/null +++ b/vmdb/spec/models/miq_ae_class_copy_spec.rb @@ -0,0 +1,107 @@ +require "spec_helper" + +describe MiqAeClassCopy do + + before do + @src_domain = 'SPEC_DOMAIN' + @dest_domain = 'FRED' + @src_ns = 'NS1' + @dest_ns = 'NS1' + @src_class = 'CLASS1' + @dest_class = 'CLASS1' + @src_fqname = "#{@src_domain}/#{@src_ns}/#{@src_class}" + @yaml_file = File.join(File.dirname(__FILE__), 'miq_ae_copy_data', 'class_copy1.yaml') + MiqAeDatastore.reset + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @src_domain) + end + + context "clone the class to a new domain" do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + end + + it "after copy both classes in DB should be congruent" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + class2 = MiqAeClassCopy.new(@src_fqname).to_domain(@dest_domain) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + @ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@src_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns2.id, @src_class) + class2.should_not be_nil + end + end + + context "clone the class to a new domain with a different namespace" do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + end + + it "after copy both classes in DB should be congruent" do + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + new_ns = "NS3/NS4" + class2 = MiqAeClassCopy.new(@src_fqname).to_domain(@dest_domain, new_ns) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + @ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{new_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns2.id, @src_class) + class2.should_not be_nil + end + end + + context "copy to a new classname in the same domain" do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + end + + it "after copy both classes in DB should be congruent" do + new_name = "SAME_AS_#{@src_class}" + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + class2 = MiqAeClassCopy.new(@src_fqname).as(new_name) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, new_name) + class2.should_not be_nil + end + end + + context "copy to a existing class in the same domain" do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + end + + it "copy should fail with error" do + expect { MiqAeClassCopy.new(@src_fqname).as(@src_class) }.to raise_error(RuntimeError) + end + end + + context "copy to a new class name in the same domain but different namespace" do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + end + + it "after copy both classes in DB should be congruent" do + new_name = "SAME_AS_#{@src_class}" + new_ns = "NS3/NS4" + class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + class2 = MiqAeClassCopy.new(@src_fqname).as(new_name, new_ns) + class_check_status(class1, class2, MiqAeClassCompareFields::CONGRUENT_SCHEMA) + @ns2 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{new_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(@ns2.id, new_name) + class2.should_not be_nil + end + end + + context "copy class onto itself" do + it "pass in same domain" do + expect { MiqAeClassCopy.new(@src_fqname).to_domain(@src_domain, nil, true) }.to raise_error(RuntimeError) + end + + it "pass in same classname" do + expect { MiqAeClassCopy.new(@src_fqname).as(@src_class, nil, true) }.to raise_error(RuntimeError) + end + end + + def class_check_status(class1, class2, status) + diff_obj = MiqAeClassCompareFields.new(class1, class2) + diff_obj.compare + diff_obj.status.should equal(status) + end + +end diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy1.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy1.yaml new file mode 100644 index 00000000000..3b14768af11 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy1.yaml @@ -0,0 +1,245 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + .manifest.yaml: + __domain__.yaml: + classes: 1 + instances: 1 + created_on: 2014-06-30 20:47:01.376685000 Z + updated_on: 2014-06-30 20:47:01.376685000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:47:01.839006000 Z + updated_on: 2014-06-30 20:47:01.839006000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:47:01.913797000 Z + updated_on: 2014-06-30 20:47:01.913797000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:47:01.940447000 Z + updated_on: 2014-06-30 20:47:01.940447000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy2.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy2.yaml new file mode 100644 index 00000000000..900e0fc9996 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy2.yaml @@ -0,0 +1,442 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + MIXED_CASE_NAMES.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: MIXED_CASE_NAMES + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: MfIeld1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: RfIeLd1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: MfIeLd2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: RfIeLd2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: MfiEld3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: AfIeLd1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: AfIeLd2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:48:47.569569000 Z + updated_on: 2014-06-30 20:48:47.569569000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:48:48.054027000 Z + updated_on: 2014-06-30 20:48:48.054027000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:48:48.093772000 Z + updated_on: 2014-06-30 20:48:48.093772000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:48:48.151685000 Z + updated_on: 2014-06-30 20:48:48.151685000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/MIXED_CASE_NAMES.class/__class__.yaml: + created_on: 2014-06-30 20:48:48.181252000 Z + updated_on: 2014-06-30 20:48:48.181252000 Z + size: 3466 + sha1: Hrp9Abma0d8W3/UX3lOmnosi4E8= + NS1/MIXED_CASE_NAMES.class/default.yaml: + created_on: 2014-06-30 20:48:48.201399000 Z + updated_on: 2014-06-30 20:48:48.201399000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy3.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy3.yaml new file mode 100644 index 00000000000..edd4646a466 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy3.yaml @@ -0,0 +1,444 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_AETYPE_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_AETYPE_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: attribute + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: attribute + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:50:45.629912000 Z + updated_on: 2014-06-30 20:50:45.629912000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:50:46.114955000 Z + updated_on: 2014-06-30 20:50:46.114955000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:50:46.157703000 Z + updated_on: 2014-06-30 20:50:46.157703000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:50:46.219414000 Z + updated_on: 2014-06-30 20:50:46.219414000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_AETYPE_OFF.class/__class__.yaml: + created_on: 2014-06-30 20:50:46.250173000 Z + updated_on: 2014-06-30 20:50:46.250173000 Z + size: 3470 + sha1: fW1gMEn1/upePurHX7exFp4Kk+w= + NS1/CLASS_AETYPE_OFF.class/default.yaml: + created_on: 2014-06-30 20:50:46.271145000 Z + updated_on: 2014-06-30 20:50:46.271145000 Z + size: 176 + sha1: oF3mUKYqXKWIJ8NgnLkoUcdgyfU= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy4.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy4.yaml new file mode 100644 index 00000000000..1c1b0440f83 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy4.yaml @@ -0,0 +1,442 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_DATATYPE_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_DATATYPE_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: integer + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: integer + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: integer + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: integer + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: integer + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: integer + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: string + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:52:26.234109000 Z + updated_on: 2014-06-30 20:52:26.234109000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:52:26.972154000 Z + updated_on: 2014-06-30 20:52:26.972154000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:52:27.041224000 Z + updated_on: 2014-06-30 20:52:27.041224000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:52:27.123759000 Z + updated_on: 2014-06-30 20:52:27.123759000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_DATATYPE_OFF.class/__class__.yaml: + created_on: 2014-06-30 20:52:27.164758000 Z + updated_on: 2014-06-30 20:52:27.164758000 Z + size: 3473 + sha1: D1AMoYjXDgT+P+hV/HMxxIJw3sE= + NS1/CLASS_DATATYPE_OFF.class/default.yaml: + created_on: 2014-06-30 20:52:27.195341000 Z + updated_on: 2014-06-30 20:52:27.195341000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy5.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy5.yaml new file mode 100644 index 00000000000..a1c73a4d081 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy5.yaml @@ -0,0 +1,442 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_PRIORITY_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_PRIORITY_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 2 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 4 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 7 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 21 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 51 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:54:20.787936000 Z + updated_on: 2014-06-30 20:54:20.787936000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:54:21.275082000 Z + updated_on: 2014-06-30 20:54:21.275082000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:54:21.315737000 Z + updated_on: 2014-06-30 20:54:21.315737000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:54:21.374196000 Z + updated_on: 2014-06-30 20:54:21.374196000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_PRIORITY_OFF.class/__class__.yaml: + created_on: 2014-06-30 20:54:21.403790000 Z + updated_on: 2014-06-30 20:54:21.403790000 Z + size: 3470 + sha1: HoemsQComxh371c5U2mTqrnQ0bM= + NS1/CLASS_PRIORITY_OFF.class/default.yaml: + created_on: 2014-06-30 20:54:21.423972000 Z + updated_on: 2014-06-30 20:54:21.423972000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy6.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy6.yaml new file mode 100644 index 00000000000..bd20ace095e --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy6.yaml @@ -0,0 +1,462 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_ADD_A_FIELD.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_ADD_A_FIELD + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield3 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:55:48.586481000 Z + updated_on: 2014-06-30 20:55:48.586481000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:55:49.073003000 Z + updated_on: 2014-06-30 20:55:49.073003000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:55:49.114112000 Z + updated_on: 2014-06-30 20:55:49.114112000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:55:49.172615000 Z + updated_on: 2014-06-30 20:55:49.172615000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_ADD_A_FIELD.class/__class__.yaml: + created_on: 2014-06-30 20:55:49.203880000 Z + updated_on: 2014-06-30 20:55:49.203880000 Z + size: 3845 + sha1: OIZEqQZrQaF7ieQ4hwjkI6AQ1EA= + NS1/CLASS_ADD_A_FIELD.class/default.yaml: + created_on: 2014-06-30 20:55:49.226735000 Z + updated_on: 2014-06-30 20:55:49.226735000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy7.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy7.yaml new file mode 100644 index 00000000000..bef7799ccc3 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy7.yaml @@ -0,0 +1,432 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_IN_USE_FIELD_DELETED.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_IN_USE_FIELD_DELETED + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield1: + value: barney + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 2 + created_on: 2014-06-30 20:56:59.016859000 Z + updated_on: 2014-06-30 20:56:59.016859000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:56:59.516294000 Z + updated_on: 2014-06-30 20:56:59.516294000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:56:59.556772000 Z + updated_on: 2014-06-30 20:56:59.556772000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:56:59.617518000 Z + updated_on: 2014-06-30 20:56:59.617518000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_IN_USE_FIELD_DELETED.class/__class__.yaml: + created_on: 2014-06-30 20:56:59.649731000 Z + updated_on: 2014-06-30 20:56:59.649731000 Z + size: 3098 + sha1: /uv7doHWvGzmpJgJgKNFAqAkif8= + NS1/CLASS_IN_USE_FIELD_DELETED.class/default.yaml: + created_on: 2014-06-30 20:56:59.671554000 Z + updated_on: 2014-06-30 20:56:59.671554000 Z + size: 320 + sha1: c9vQ5PLWam6NFmfkBbIv/WCOPgo= diff --git a/vmdb/spec/models/miq_ae_copy_data/class_copy8.yaml b/vmdb/spec/models/miq_ae_copy_data/class_copy8.yaml new file mode 100644 index 00000000000..1e56243e6d3 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/class_copy8.yaml @@ -0,0 +1,449 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + CLASS_FIELD_DELETED.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_FIELD_DELETED + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + default2.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default2 + inherits: + description: + fields: + - afield2: + value: betty lou + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 3 + created_on: 2014-06-30 20:58:10.989511000 Z + updated_on: 2014-06-30 20:58:10.989511000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:58:11.489027000 Z + updated_on: 2014-06-30 20:58:11.489027000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:58:11.530114000 Z + updated_on: 2014-06-30 20:58:11.530114000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:58:11.589995000 Z + updated_on: 2014-06-30 20:58:11.589995000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_FIELD_DELETED.class/__class__.yaml: + created_on: 2014-06-30 20:58:11.624508000 Z + updated_on: 2014-06-30 20:58:11.624508000 Z + size: 3091 + sha1: 70GhR5SEeJL3TARWCEpkw8Gev38= + NS1/CLASS_FIELD_DELETED.class/default.yaml: + created_on: 2014-06-30 20:58:11.646293000 Z + updated_on: 2014-06-30 20:58:11.646293000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_FIELD_DELETED.class/default2.yaml: + created_on: 2014-06-30 20:58:11.657176000 Z + updated_on: 2014-06-30 20:58:11.657176000 Z + size: 178 + sha1: 9EHeX/gPnTi5mg4uVrroUeYUMmo= diff --git a/vmdb/spec/models/miq_ae_copy_data/miq_ae_copy_classes.yaml b/vmdb/spec/models/miq_ae_copy_data/miq_ae_copy_classes.yaml new file mode 100644 index 00000000000..af15196847a --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/miq_ae_copy_classes.yaml @@ -0,0 +1,2829 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + default2.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default2 + inherits: + description: + fields: + - afield2: + value: betty lou + delete1.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: delete1 + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + instance1.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: instance1 + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + one_field.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: one_field + inherits: + description: + fields: + - afield2: + value: betty lou + __methods__: + send_email.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: send_email + display_name: + description: + scope: instance + language: ruby + location: builtin + inputs: + - field: + aetype: + name: to + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: subject + display_name: + datatype: string + priority: 2 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: body + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method.rb: ! 'puts "Hello World" + +' + test_method.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_parameter.rb: ! 'puts "Hello World" + +' + test_method_diff_parameter.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_parameter + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: redis + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_script.rb: ! 'puts "Hello Morld" + +' + test_method_diff_script.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_script + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + CLASS_ADD_A_FIELD.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_ADD_A_FIELD + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield3 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + CLASS_AETYPE_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_AETYPE_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: attribute + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: attribute + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + CLASS_DATATYPE_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_DATATYPE_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: integer + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: integer + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: integer + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: integer + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: integer + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: integer + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: string + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + CLASS_FIELD_DELETED.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_FIELD_DELETED + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + default2.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default2 + inherits: + description: + fields: + - afield2: + value: betty lou + CLASS_IN_USE_FIELD_DELETED.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_IN_USE_FIELD_DELETED + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield1: + value: barney + CLASS_PRIORITY_OFF.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS_PRIORITY_OFF + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 2 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 4 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 7 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 21 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 51 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + MIXED_CASE_NAMES.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: MIXED_CASE_NAMES + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: MfIeld1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: RfIeLd1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: MfIeLd2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: RfIeLd2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: MfiEld3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: AfIeLd1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: AfIeLd2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: [] + __methods__: + send_email.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: send_email + display_name: + description: + scope: instance + language: ruby + location: builtin + inputs: + - field: + aetype: + name: to + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: subject + display_name: + datatype: string + priority: 2 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: body + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method.rb: ! 'puts "Hello World" + +' + test_method.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_parameter.rb: ! 'puts "Hello World" + +' + test_method_diff_parameter.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_parameter + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: redis + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_script.rb: ! 'puts "Hello Morld" + +' + test_method_diff_script.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_script + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + NS2: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS2 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: attribute + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: attribute + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + .manifest.yaml: + __domain__.yaml: + classes: 9 + instances: 14 + method_instances: 8 + method_files: 6 + created_on: 2014-06-23 18:57:19.884194000 Z + updated_on: 2014-06-23 18:57:19.884194000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-23 18:57:20.278041000 Z + updated_on: 2014-06-23 18:57:20.278041000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-23 18:57:20.523547000 Z + updated_on: 2014-06-23 18:57:20.523547000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-23 18:57:20.550704000 Z + updated_on: 2014-06-23 18:57:20.550704000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS1.class/default2.yaml: + created_on: 2014-06-23 18:57:20.564058000 Z + updated_on: 2014-06-23 18:57:20.564058000 Z + size: 178 + sha1: 9EHeX/gPnTi5mg4uVrroUeYUMmo= + NS1/CLASS1.class/delete1.yaml: + created_on: 2014-06-23 18:57:20.587093000 Z + updated_on: 2014-06-23 18:57:20.587093000 Z + size: 287 + sha1: curqnhUE1FXeiK33uidHVzdR1VY= + NS1/CLASS1.class/instance1.yaml: + created_on: 2014-06-23 18:57:20.571308000 Z + updated_on: 2014-06-23 18:57:20.571308000 Z + size: 321 + sha1: kp2xNMz/vNNYuKoSS1yCJEU03gs= + NS1/CLASS1.class/one_field.yaml: + created_on: 2014-06-23 18:57:20.597059000 Z + updated_on: 2014-06-23 18:57:20.597059000 Z + size: 179 + sha1: VlZH2Wv7MwDG967YVH4sDZrT89I= + NS1/CLASS1.class/__methods__/send_email.yaml: + created_on: 2014-06-23 18:57:20.671558000 Z + updated_on: 2014-06-23 18:57:20.671558000 Z + size: 1269 + sha1: d8T7CTsfDT3hbBLzcwMZWE5qoHc= + NS1/CLASS1.class/__methods__/test_method.rb: + created_on: 2014-06-23 18:57:20.608141000 Z + updated_on: 2014-06-23 18:57:20.608141000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/CLASS1.class/__methods__/test_method.yaml: + created_on: 2014-06-23 18:57:20.608141000 Z + updated_on: 2014-06-23 18:57:20.608141000 Z + size: 2064 + sha1: vIrEIKekZ0T6IGv3MVjCZodWZfA= + NS1/CLASS1.class/__methods__/test_method_diff_parameter.rb: + created_on: 2014-06-23 18:57:20.654061000 Z + updated_on: 2014-06-23 18:57:20.654061000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/CLASS1.class/__methods__/test_method_diff_parameter.yaml: + created_on: 2014-06-23 18:57:20.654061000 Z + updated_on: 2014-06-23 18:57:20.654061000 Z + size: 2077 + sha1: cj2xuKlC4AZ+npIK2PdstWawxPQ= + NS1/CLASS1.class/__methods__/test_method_diff_script.rb: + created_on: 2014-06-23 18:57:20.633523000 Z + updated_on: 2014-06-23 18:57:20.633523000 Z + size: 19 + sha1: BVvFyPC7YOv1NP49ttoH30DW1yo= + NS1/CLASS1.class/__methods__/test_method_diff_script.yaml: + created_on: 2014-06-23 18:57:20.633523000 Z + updated_on: 2014-06-23 18:57:20.633523000 Z + size: 2076 + sha1: 1zZEqljbwx8zT98U4fGeY8EhDG8= + NS1/CLASS_ADD_A_FIELD.class/__class__.yaml: + created_on: 2014-06-23 18:57:21.037967000 Z + updated_on: 2014-06-23 18:57:21.037967000 Z + size: 3845 + sha1: ygtgunIGxrj29yn+D8YIusovHgw= + NS1/CLASS_ADD_A_FIELD.class/default.yaml: + created_on: 2014-06-23 18:57:21.060688000 Z + updated_on: 2014-06-23 18:57:21.060688000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= + NS1/CLASS_AETYPE_OFF.class/__class__.yaml: + created_on: 2014-06-23 18:57:20.920763000 Z + updated_on: 2014-06-23 18:57:20.920763000 Z + size: 3470 + sha1: fW1gMEn1/upePurHX7exFp4Kk+w= + NS1/CLASS_AETYPE_OFF.class/default.yaml: + created_on: 2014-06-23 18:57:20.942250000 Z + updated_on: 2014-06-23 18:57:20.942250000 Z + size: 176 + sha1: oF3mUKYqXKWIJ8NgnLkoUcdgyfU= + NS1/CLASS_DATATYPE_OFF.class/__class__.yaml: + created_on: 2014-06-23 18:57:20.961073000 Z + updated_on: 2014-06-23 18:57:20.961073000 Z + size: 3473 + sha1: D1AMoYjXDgT+P+hV/HMxxIJw3sE= + NS1/CLASS_DATATYPE_OFF.class/default.yaml: + created_on: 2014-06-23 18:57:20.981727000 Z + updated_on: 2014-06-23 18:57:20.981727000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= + NS1/CLASS_FIELD_DELETED.class/__class__.yaml: + created_on: 2014-06-23 18:57:21.133142000 Z + updated_on: 2014-06-23 18:57:21.133142000 Z + size: 3091 + sha1: 70GhR5SEeJL3TARWCEpkw8Gev38= + NS1/CLASS_FIELD_DELETED.class/default.yaml: + created_on: 2014-06-23 18:57:21.154630000 Z + updated_on: 2014-06-23 18:57:21.154630000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS_FIELD_DELETED.class/default2.yaml: + created_on: 2014-06-23 18:57:21.165502000 Z + updated_on: 2014-06-23 18:57:21.165502000 Z + size: 178 + sha1: 9EHeX/gPnTi5mg4uVrroUeYUMmo= + NS1/CLASS_IN_USE_FIELD_DELETED.class/__class__.yaml: + created_on: 2014-06-23 18:57:21.080595000 Z + updated_on: 2014-06-23 18:57:21.080595000 Z + size: 3098 + sha1: /uv7doHWvGzmpJgJgKNFAqAkif8= + NS1/CLASS_IN_USE_FIELD_DELETED.class/default.yaml: + created_on: 2014-06-23 18:57:21.102394000 Z + updated_on: 2014-06-23 18:57:21.102394000 Z + size: 320 + sha1: c9vQ5PLWam6NFmfkBbIv/WCOPgo= + NS1/CLASS_PRIORITY_OFF.class/__class__.yaml: + created_on: 2014-06-23 18:57:20.998956000 Z + updated_on: 2014-06-23 18:57:20.998956000 Z + size: 3470 + sha1: HoemsQComxh371c5U2mTqrnQ0bM= + NS1/CLASS_PRIORITY_OFF.class/default.yaml: + created_on: 2014-06-23 18:57:21.019398000 Z + updated_on: 2014-06-23 18:57:21.019398000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= + NS1/MIXED_CASE_NAMES.class/__class__.yaml: + created_on: 2014-06-23 18:57:20.732322000 Z + updated_on: 2014-06-23 18:57:20.732322000 Z + size: 3466 + sha1: Hrp9Abma0d8W3/UX3lOmnosi4E8= + NS1/MIXED_CASE_NAMES.class/default.yaml: + created_on: 2014-06-23 18:57:20.753229000 Z + updated_on: 2014-06-23 18:57:20.753229000 Z + size: 144 + sha1: xQRcXVq5zXQFu4eo8J7bkb4w0MU= + NS1/MIXED_CASE_NAMES.class/__methods__/send_email.yaml: + created_on: 2014-06-23 18:57:20.893698000 Z + updated_on: 2014-06-23 18:57:20.893698000 Z + size: 1269 + sha1: d8T7CTsfDT3hbBLzcwMZWE5qoHc= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method.rb: + created_on: 2014-06-23 18:57:20.762892000 Z + updated_on: 2014-06-23 18:57:20.762892000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method.yaml: + created_on: 2014-06-23 18:57:20.762892000 Z + updated_on: 2014-06-23 18:57:20.762892000 Z + size: 2064 + sha1: vIrEIKekZ0T6IGv3MVjCZodWZfA= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method_diff_parameter.rb: + created_on: 2014-06-23 18:57:20.875782000 Z + updated_on: 2014-06-23 18:57:20.875782000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method_diff_parameter.yaml: + created_on: 2014-06-23 18:57:20.875782000 Z + updated_on: 2014-06-23 18:57:20.875782000 Z + size: 2077 + sha1: cj2xuKlC4AZ+npIK2PdstWawxPQ= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method_diff_script.rb: + created_on: 2014-06-23 18:57:20.853962000 Z + updated_on: 2014-06-23 18:57:20.853962000 Z + size: 19 + sha1: BVvFyPC7YOv1NP49ttoH30DW1yo= + NS1/MIXED_CASE_NAMES.class/__methods__/test_method_diff_script.yaml: + created_on: 2014-06-23 18:57:20.853962000 Z + updated_on: 2014-06-23 18:57:20.853962000 Z + size: 2076 + sha1: 1zZEqljbwx8zT98U4fGeY8EhDG8= + NS2/__namespace__.yaml: + created_on: 2014-06-23 18:57:21.203492000 Z + updated_on: 2014-06-23 18:57:21.203492000 Z + size: 155 + sha1: +bli10RLw4va4CY+FkUXTkSG614= + NS2/CLASS1.class/__class__.yaml: + created_on: 2014-06-23 18:57:21.222951000 Z + updated_on: 2014-06-23 18:57:21.222951000 Z + size: 3079 + sha1: 2iu8PtXEjFUEZ2BDNSJt2iYVARY= + NS2/CLASS1.class/default.yaml: + created_on: 2014-06-23 18:57:21.242171000 Z + updated_on: 2014-06-23 18:57:21.242171000 Z + size: 176 + sha1: oF3mUKYqXKWIJ8NgnLkoUcdgyfU= diff --git a/vmdb/spec/models/miq_ae_copy_data/miq_ae_instance_copy.yaml b/vmdb/spec/models/miq_ae_copy_data/miq_ae_instance_copy.yaml new file mode 100644 index 00000000000..3be641440ce --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/miq_ae_instance_copy.yaml @@ -0,0 +1,458 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: wilma + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + default2.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default2 + inherits: + description: + fields: + - afield2: + value: betty lou + NS2: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS2 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: attribute + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: attribute + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + .manifest.yaml: + __domain__.yaml: + classes: 2 + instances: 3 + created_on: 2014-06-30 20:06:33.083034000 Z + updated_on: 2014-06-30 20:06:33.083034000 Z + size: 163 + sha1: 8CUgrwvnaF6Y2LRqmidR9zfd+ns= + NS1/__namespace__.yaml: + created_on: 2014-06-30 20:06:33.203413000 Z + updated_on: 2014-06-30 20:06:33.203413000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:06:33.302356000 Z + updated_on: 2014-06-30 20:06:33.302356000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:06:33.399780000 Z + updated_on: 2014-06-30 20:06:33.399780000 Z + size: 319 + sha1: zx4UL7SzOWMSjhJ4+1Q8BFJ7wcQ= + NS1/CLASS1.class/default2.yaml: + created_on: 2014-06-30 20:06:33.416110000 Z + updated_on: 2014-06-30 20:06:33.416110000 Z + size: 178 + sha1: 9EHeX/gPnTi5mg4uVrroUeYUMmo= + NS2/__namespace__.yaml: + created_on: 2014-06-30 20:06:34.101561000 Z + updated_on: 2014-06-30 20:06:34.101561000 Z + size: 155 + sha1: +bli10RLw4va4CY+FkUXTkSG614= + NS2/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 20:06:34.121661000 Z + updated_on: 2014-06-30 20:06:34.121661000 Z + size: 3079 + sha1: 2iu8PtXEjFUEZ2BDNSJt2iYVARY= + NS2/CLASS1.class/default.yaml: + created_on: 2014-06-30 20:06:34.148657000 Z + updated_on: 2014-06-30 20:06:34.148657000 Z + size: 176 + sha1: oF3mUKYqXKWIJ8NgnLkoUcdgyfU= diff --git a/vmdb/spec/models/miq_ae_copy_data/miq_ae_method_copy.yaml b/vmdb/spec/models/miq_ae_copy_data/miq_ae_method_copy.yaml new file mode 100644 index 00000000000..869d418c859 --- /dev/null +++ b/vmdb/spec/models/miq_ae_copy_data/miq_ae_method_copy.yaml @@ -0,0 +1,782 @@ +--- +SPEC_DOMAIN: + __domain__.yaml: + object_type: domain + version: 1.0 + object: + attributes: + name: SPEC_DOMAIN + description: + display_name: + system: + priority: 100 + enabled: false + NS1: + __namespace__.yaml: + object_type: namespace + version: 1.0 + object: + attributes: + name: NS1 + description: + display_name: + system: + priority: + enabled: + CLASS1.class: + __class__.yaml: + object_type: class + version: 1.0 + object: + attributes: + description: + display_name: + name: CLASS1 + type: + inherits: + visibility: + owner: + schema: + - field: + aetype: state + name: CustomizeRequest + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: update_provision_status(status => 'Customizing Request',status_state + => 'on_entry') + on_exit: update_provision_status(status => 'Customized Request',status_state + => 'on_exit') + on_error: update_provision_status(status => 'error in Customizing Request',status_state + => 'on_error') + max_retries: '100' + max_time: + - field: + aetype: method + name: mfield1 + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield1 + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield2 + display_name: + datatype: string + priority: 4 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: relationship + name: rfield2 + display_name: + datatype: string + priority: 5 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: method + name: mfield3 + display_name: + datatype: string + priority: 6 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield1 + display_name: + datatype: integer + priority: 7 + owner: + default_value: wilma + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: attribute + name: afield2 + display_name: + datatype: string + priority: 8 + owner: + default_value: barney + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + default.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: pebbles + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + default2.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: default2 + inherits: + description: + fields: + - afield2: + value: betty lou + delete1.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: delete1 + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: pebbles + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + instance1.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: instance1 + inherits: + description: + fields: + - mfield1: + value: dinosaur + - rfield1: + value: pebbles + - mfield2: + value: woolly mammoth + - mfield3: + value: saber tooth + - afield2: + value: betty + one_field.yaml: + object_type: instance + version: 1.0 + object: + attributes: + display_name: + name: one_field + inherits: + description: + fields: + - afield2: + value: betty lou + __methods__: + send_email.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: send_email + display_name: + description: + scope: instance + language: ruby + location: builtin + inputs: + - field: + aetype: + name: to + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: subject + display_name: + datatype: string + priority: 2 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: body + display_name: + datatype: string + priority: 3 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method.rb: ! 'puts "Hello World" + +' + test_method.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_parameter.rb: ! 'puts "Hello World" + +' + test_method_diff_parameter.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_parameter + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: redis + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + test_method_diff_script.rb: ! 'puts "Hello Morld" + +' + test_method_diff_script.yaml: + object_type: method + version: 1.0 + object: + attributes: + name: test_method_diff_script + display_name: + description: + scope: instance + language: ruby + location: inline + inputs: + - field: + aetype: + name: database + display_name: + datatype: string + priority: 1 + owner: + default_value: couchdb + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: username + display_name: + datatype: string + priority: 2 + owner: + default_value: fred + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: password + display_name: + datatype: password + priority: 3 + owner: + default_value: v2:{rLoUV68K3awm6YlKoQnAYg==} + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: procedure_name + display_name: + datatype: string + priority: 4 + owner: + default_value: larry + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + - field: + aetype: + name: params + display_name: + datatype: string + priority: 5 + owner: + default_value: curly + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: + .manifest.yaml: + __domain__.yaml: + classes: 1 + instances: 5 + method_instances: 4 + method_files: 3 + created_on: 2014-06-30 18:23:27.258317000 Z + updated_on: 2014-06-30 18:23:27.258317000 Z + size: 168 + sha1: 9g2g8XRTYab2z9EphoFs6xKZgoM= + NS1/__namespace__.yaml: + created_on: 2014-06-30 18:23:27.599205000 Z + updated_on: 2014-06-30 18:23:27.599205000 Z + size: 155 + sha1: cq/oyFF9/djhEY2xkPvpL3ugqUM= + NS1/CLASS1.class/__class__.yaml: + created_on: 2014-06-30 18:23:27.859243000 Z + updated_on: 2014-06-30 18:23:27.859243000 Z + size: 3456 + sha1: 0NpGjj70OxNuYohgW9A/uOgBjsc= + NS1/CLASS1.class/default.yaml: + created_on: 2014-06-30 18:23:27.893947000 Z + updated_on: 2014-06-30 18:23:27.893947000 Z + size: 321 + sha1: HnK8Z2bkWmOiKYB4Tq7em6G2scc= + NS1/CLASS1.class/default2.yaml: + created_on: 2014-06-30 18:23:27.932947000 Z + updated_on: 2014-06-30 18:23:27.932947000 Z + size: 178 + sha1: 9EHeX/gPnTi5mg4uVrroUeYUMmo= + NS1/CLASS1.class/delete1.yaml: + created_on: 2014-06-30 18:23:27.953109000 Z + updated_on: 2014-06-30 18:23:27.953109000 Z + size: 289 + sha1: kqi1EDrslBBTPVIClAZDrzzQvxs= + NS1/CLASS1.class/instance1.yaml: + created_on: 2014-06-30 18:23:27.939892000 Z + updated_on: 2014-06-30 18:23:27.939892000 Z + size: 323 + sha1: 3S5HOs9kKMykymTPUJFS3wF16HQ= + NS1/CLASS1.class/one_field.yaml: + created_on: 2014-06-30 18:23:27.962777000 Z + updated_on: 2014-06-30 18:23:27.962777000 Z + size: 179 + sha1: VlZH2Wv7MwDG967YVH4sDZrT89I= + NS1/CLASS1.class/__methods__/send_email.yaml: + created_on: 2014-06-30 18:23:28.042187000 Z + updated_on: 2014-06-30 18:23:28.042187000 Z + size: 1269 + sha1: d8T7CTsfDT3hbBLzcwMZWE5qoHc= + NS1/CLASS1.class/__methods__/test_method.rb: + created_on: 2014-06-30 18:23:27.973718000 Z + updated_on: 2014-06-30 18:23:27.973718000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/CLASS1.class/__methods__/test_method.yaml: + created_on: 2014-06-30 18:23:27.973718000 Z + updated_on: 2014-06-30 18:23:27.973718000 Z + size: 2064 + sha1: vIrEIKekZ0T6IGv3MVjCZodWZfA= + NS1/CLASS1.class/__methods__/test_method_diff_parameter.rb: + created_on: 2014-06-30 18:23:28.024860000 Z + updated_on: 2014-06-30 18:23:28.024860000 Z + size: 19 + sha1: yQWqqJJtskjOtTFDwpQ96adU1z0= + NS1/CLASS1.class/__methods__/test_method_diff_parameter.yaml: + created_on: 2014-06-30 18:23:28.024860000 Z + updated_on: 2014-06-30 18:23:28.024860000 Z + size: 2077 + sha1: cj2xuKlC4AZ+npIK2PdstWawxPQ= + NS1/CLASS1.class/__methods__/test_method_diff_script.rb: + created_on: 2014-06-30 18:23:28.004688000 Z + updated_on: 2014-06-30 18:23:28.004688000 Z + size: 19 + sha1: BVvFyPC7YOv1NP49ttoH30DW1yo= + NS1/CLASS1.class/__methods__/test_method_diff_script.yaml: + created_on: 2014-06-30 18:23:28.004688000 Z + updated_on: 2014-06-30 18:23:28.004688000 Z + size: 2076 + sha1: 1zZEqljbwx8zT98U4fGeY8EhDG8= diff --git a/vmdb/spec/models/miq_ae_instance_compare_values_spec.rb b/vmdb/spec/models/miq_ae_instance_compare_values_spec.rb new file mode 100644 index 00000000000..4e2435f2c72 --- /dev/null +++ b/vmdb/spec/models/miq_ae_instance_compare_values_spec.rb @@ -0,0 +1,74 @@ +require "spec_helper" +include MiqAeYamlImportExportMixin +describe MiqAeInstanceCompareValues do + + before do + @domain = 'SPEC_DOMAIN' + @namespace = 'NS1' + @classname = 'CLASS1' + @yaml_file = File.join(File.dirname(__FILE__), 'miq_ae_copy_data', 'miq_ae_method_copy.yaml') + MiqAeDatastore.reset + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + @export_dir = File.join(Dir.tmpdir, 'rspec_copy_tests') + @yaml_model = YAML.load_file(@yaml_file) + end + + context "same instances" do + before do + prep_instance_file_names("instance1") + end + + it "both instances in DB should be equivalent" do + inst1 = MiqAeInstance.find_by_class_id_and_name(@class.id, @first_instance) + instance_check_status(inst1, inst1, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + + it "one instance in DB and other in YAML should be equivalent" do + export_model(@domain) + inst1 = MiqAeInstance.find_by_class_id_and_name(@class.id, @first_instance) + inst2 = MiqAeInstanceYaml.new(@instance1_file) + instance_check_status(inst1, inst2, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + end + + context 'add a field in one of the instances' do + before do + prep_instance_file_names('instance1', 'delete1') + end + + it 'both instances in DB should be compatible' do + inst1 = MiqAeInstance.find_by_class_id_and_name(@class.id, @first_instance) + inst2 = MiqAeInstance.find_by_class_id_and_name(@class.id, @second_instance) + instance_check_status(inst1, inst2, MiqAeInstanceCompareValues::COMPATIBLE_INSTANCE) + end + + it "one instance in DB and other in YAML should be compatible" do + export_model(@domain) + inst1 = MiqAeInstance.find_by_class_id_and_name(@class.id, @first_instance) + inst2 = MiqAeInstanceYaml.new(@instance2_file) + instance_check_status(inst1, inst2, MiqAeInstanceCompareValues::COMPATIBLE_INSTANCE) + end + + end + + def instance_check_status(instance1, instance2, status) + diff_obj = MiqAeInstanceCompareValues.new(instance1, instance2) + diff_obj.compare + diff_obj.status.should equal(status) + end + + def prep_instance_file_names(inst1 = nil, inst2 = nil) + @first_instance = inst1 if inst1 + @second_instance = inst2 if inst2 + @instance1_file = File.join(@export_dir, @domain, @namespace, "#{@classname}.class", "#{inst1}.yaml") if inst1 + @instance2_file = File.join(@export_dir, @domain, @namespace, "#{@classname}.class", "#{inst2}.yaml") if inst2 + @ns1 = MiqAeNamespace.find_by_fqname("#{@domain}/#{@namespace}") + @class = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @classname) + end + + def export_model(domain, export_options = {}) + FileUtils.rm_rf(@export_dir) if File.exist?(@export_dir) + export_options['export_dir'] = @export_dir if export_options.empty? + MiqAeExport.new(domain, export_options).export + end +end diff --git a/vmdb/spec/models/miq_ae_instance_copy_spec.rb b/vmdb/spec/models/miq_ae_instance_copy_spec.rb new file mode 100644 index 00000000000..da2a6ebdc37 --- /dev/null +++ b/vmdb/spec/models/miq_ae_instance_copy_spec.rb @@ -0,0 +1,105 @@ +require "spec_helper" + +describe MiqAeInstanceCopy do + + before do + @src_domain = 'SPEC_DOMAIN' + @dest_domain = 'FRED' + @src_ns = 'NS1' + @dest_ns = 'NS1' + @src_class = 'CLASS1' + @dest_class = 'CLASS1' + @src_instance = 'default' + @dest_instance = 'default2' + @dest_ns = 'NSX/NSY' + @src_fqname = "#{@src_domain}/#{@src_ns}/#{@src_class}/#{@src_instance}" + @yaml_file = File.join(File.dirname(__FILE__), 'miq_ae_copy_data', 'miq_ae_instance_copy.yaml') + MiqAeDatastore.reset + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @src_domain) + end + + context 'clone instance' do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + @class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + @inst1 = MiqAeInstance.find_by_class_id_and_name(@class1.id, @src_instance) + end + + it 'after copy both instances in DB should be congruent' do + MiqAeInstanceCopy.new(@src_fqname).to_domain(@dest_domain) + ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@src_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + inst2 = MiqAeInstance.find_by_class_id_and_name(class2.id, @src_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + + it 'with overwrite an existing instance should get updated' do + inst2 = MiqAeInstance.find_by_class_id_and_name(@class1.id, @dest_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::COMPATIBLE_INSTANCE) + MiqAeInstanceCopy.new(@src_fqname).as(@dest_instance, nil, true) + inst2 = MiqAeInstance.find_by_class_id_and_name(@class1.id, @dest_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + + it 'without overwrite an existing instance should raise error' do + inst2 = MiqAeInstance.find_by_class_id_and_name(@class1.id, @dest_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::COMPATIBLE_INSTANCE) + expect { MiqAeInstanceCopy.new(@src_fqname).as(@dest_instance) }.to raise_error(RuntimeError) + end + + it 'copy instance to a different namespace in the same domain' do + MiqAeInstanceCopy.new(@src_fqname).as(@src_instance, @dest_ns, true) + ns2 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@dest_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + inst2 = MiqAeInstance.find_by_class_id_and_name(class2.id, @src_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + + it 'copy instance to a different namespace in a different domain' do + MiqAeInstanceCopy.new(@src_fqname).to_domain(@dest_domain, @dest_ns, true) + ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@dest_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + inst2 = MiqAeInstance.find_by_class_id_and_name(class2.id, @src_instance) + validate_instance(@inst1, inst2, MiqAeInstanceCompareValues::CONGRUENT_INSTANCE) + end + + end + + context 'incompatible schema' do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + @class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + @inst1 = MiqAeInstance.find_by_class_id_and_name(@class1.id, @src_instance) + end + + it 'by default copy should fail' do + expect { MiqAeInstanceCopy.new(@src_fqname).as('incompatible_one', 'NS2', true) }.to raise_error(RuntimeError) + end + + it 'allow if the incompatible flag is set' do + cp = MiqAeInstanceCopy.new(@src_fqname) + cp.flags = MiqAeClassCompareFields::INCOMPATIBLE_SCHEMA + cp.as('incompatible_one', 'NS2', true) + ns2 = MiqAeNamespace.find_by_fqname("#{@src_domain}/ns2", false) + ic_class = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + MiqAeInstance.find_by_class_id_and_name(ic_class.id, 'incompatible_one').should_not be_nil + end + end + + context 'copy onto itself' do + it 'copy into the same domain' do + expect { MiqAeInstanceCopy.new(@src_fqname).to_domain(@src_domain, nil, true) }.to raise_error(RuntimeError) + end + + it 'copy with the same name' do + expect { MiqAeInstanceCopy.new(@src_fqname).as(@src_instance, nil, true) }.to raise_error(RuntimeError) + end + end + + def validate_instance(instance1, instance2, status) + obj = MiqAeInstanceCompareValues.new(instance1, instance2) + obj.compare + obj.status.should eq(status) + end + +end diff --git a/vmdb/spec/models/miq_ae_method_compare_spec.rb b/vmdb/spec/models/miq_ae_method_compare_spec.rb new file mode 100644 index 00000000000..f393b35e883 --- /dev/null +++ b/vmdb/spec/models/miq_ae_method_compare_spec.rb @@ -0,0 +1,95 @@ +require "spec_helper" +include MiqAeYamlImportExportMixin + +describe MiqAeMethodCompare do + + before do + @domain = 'SPEC_DOMAIN' + @namespace = 'NS1' + @classname = 'CLASS1' + @yaml_file = File.join(File.dirname(__FILE__), 'miq_ae_copy_data', 'miq_ae_method_copy.yaml') + MiqAeDatastore.reset + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @domain) + @export_dir = File.join(Dir.tmpdir, 'rspec_copy_tests') + @yaml_model = YAML.load_file(@yaml_file) + end + + context 'same methods' do + before do + prep_method_file_names('test_method') + end + + it 'both methods in DB should be equivalent' do + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + method_check_status(meth1, meth1, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + it 'one method in DB and other in YAML should be equivalent' do + export_model(@domain) + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + meth2 = MiqAeMethodYaml.new(@method1_file) + method_check_status(meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + end + + context 'method slightly off' do + before do + prep_method_file_names('test_method', 'test_method_diff_script') + end + + it 'both method in DB should be incompatible' do + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + meth2 = MiqAeMethod.find_by_class_id_and_name(@class.id, @second_method) + method_check_status(meth1, meth2, MiqAeMethodCompare::INCOMPATIBLE_METHOD) + end + + it 'one method in DB and other in YAML should be incompatible' do + export_model(@domain) + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + meth2 = MiqAeMethodYaml.new(@method2_file) + method_check_status(meth1, meth2, MiqAeMethodCompare::INCOMPATIBLE_METHOD) + end + end + + context 'one parameter slightly off' do + before do + prep_method_file_names('test_method', 'test_method_diff_parameter') + end + + it 'both method in DB should be compatible' do + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + meth2 = MiqAeMethod.find_by_class_id_and_name(@class.id, @second_method) + method_check_status(meth1, meth2, MiqAeMethodCompare::COMPATIBLE_METHOD) + end + + it 'one method in DB and other in YAML should be compatible' do + export_model(@domain) + meth1 = MiqAeMethod.find_by_class_id_and_name(@class.id, @first_method) + meth2 = MiqAeMethodYaml.new(@method2_file) + method_check_status(meth1, meth2, MiqAeMethodCompare::COMPATIBLE_METHOD) + end + end + + def method_check_status(method1, method2, status) + diff_obj = MiqAeMethodCompare.new(method1, method2) + diff_obj.compare + diff_obj.status.should equal(status) + end + + def prep_method_file_names(meth1 = nil, meth2 = nil) + @first_method = meth1 if meth1 + @second_method = meth2 if meth2 + @method1_file = File.join(@export_dir, @domain, @namespace, + "#{@classname}.class", '__methods__', "#{meth1}.yaml") if meth1 + @method2_file = File.join(@export_dir, @domain, @namespace, + "#{@classname}.class", '__methods__', "#{meth2}.yaml") if meth2 + @ns1 = MiqAeNamespace.find_by_fqname("#{@domain}/#{@namespace}") + @class = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @classname) + end + + def export_model(domain, export_options = {}) + FileUtils.rm_rf(@export_dir) if File.exist?(@export_dir) + export_options['export_dir'] = @export_dir if export_options.empty? + MiqAeExport.new(domain, export_options).export + end +end diff --git a/vmdb/spec/models/miq_ae_method_copy_spec.rb b/vmdb/spec/models/miq_ae_method_copy_spec.rb new file mode 100644 index 00000000000..0219dd5c4a0 --- /dev/null +++ b/vmdb/spec/models/miq_ae_method_copy_spec.rb @@ -0,0 +1,96 @@ +require "spec_helper" + +describe MiqAeMethodCopy do + + before do + @src_domain = 'SPEC_DOMAIN' + @dest_domain = 'FRED' + @src_ns = 'NS1' + @dest_ns = 'NS1' + @src_class = 'CLASS1' + @dest_class = 'CLASS1' + @src_method = 'test_method' + @dest_method = 'test_method_diff_script' + @builtin_method = 'send_email' + @dest_ns = 'NSX/NSY' + @src_fqname = "#{@src_domain}/#{@src_ns}/#{@src_class}/#{@src_method}" + @yaml_file = File.join(File.dirname(__FILE__), 'miq_ae_copy_data', 'miq_ae_method_copy.yaml') + MiqAeDatastore.reset + EvmSpecHelper.import_yaml_model_from_file(@yaml_file, @src_domain) + end + + context 'clone method' do + before do + @ns1 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@src_ns}", false) + @class1 = MiqAeClass.find_by_namespace_id_and_name(@ns1.id, @src_class) + @meth1 = MiqAeMethod.find_by_class_id_and_name(@class1.id, @src_method) + end + + it 'after copy both inline methods in DB should be congruent' do + MiqAeMethodCopy.new(@src_fqname).to_domain(@dest_domain) + ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@src_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + meth2 = MiqAeMethod.find_by_class_id_and_name(class2.id, @src_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + it 'after copy both builtin methods in DB should be congruent' do + builtin_fqname = "#{@src_domain}/#{@src_ns}/#{@src_class}/#{@builtin_method}" + meth1 = MiqAeMethod.find_by_class_id_and_name(@class1.id, @builtin_method) + MiqAeMethodCopy.new(builtin_fqname).to_domain(@dest_domain) + ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@src_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + meth2 = MiqAeMethod.find_by_class_id_and_name(class2.id, @builtin_method) + validate_method(meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + it 'overwrite an existing method' do + meth2 = MiqAeMethod.find_by_class_id_and_name(@class1.id, @dest_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::INCOMPATIBLE_METHOD) + MiqAeMethodCopy.new(@src_fqname).as(@dest_method, nil, true) + meth2 = MiqAeMethod.find_by_class_id_and_name(@class1.id, @dest_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + it 'overwrite an existing method should raise error' do + meth2 = MiqAeMethod.find_by_class_id_and_name(@class1.id, @dest_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::INCOMPATIBLE_METHOD) + expect { MiqAeMethodCopy.new(@src_fqname).as(@dest_method) }.to raise_error(RuntimeError) + end + + it 'copy method to a different namespace in the same domain' do + MiqAeMethodCopy.new(@src_fqname).as(@src_method, @dest_ns, true) + ns2 = MiqAeNamespace.find_by_fqname("#{@src_domain}/#{@dest_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + meth2 = MiqAeMethod.find_by_class_id_and_name(class2.id, @src_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + it 'copy method to a different namespace in a different domain' do + MiqAeMethodCopy.new(@src_fqname).to_domain(@dest_domain, @dest_ns, true) + ns2 = MiqAeNamespace.find_by_fqname("#{@dest_domain}/#{@dest_ns}", false) + class2 = MiqAeClass.find_by_namespace_id_and_name(ns2.id, @src_class) + meth2 = MiqAeMethod.find_by_class_id_and_name(class2.id, @src_method) + validate_method(@meth1, meth2, MiqAeMethodCompare::CONGRUENT_METHOD) + end + + end + + context 'copy onto itself' do + it 'copy into the same domain' do + expect { MiqAeMethodCopy.new(@src_fqname).to_domain(@src_domain, nil, true) }.to raise_error(RuntimeError) + end + + it 'copy with the same name' do + expect { MiqAeMethodCopy.new(@src_fqname).as(@src_method, nil, true) }.to raise_error(RuntimeError) + end + + end + + def validate_method(meth1, meth2, status) + obj = MiqAeMethodCompare.new(meth1, meth2) + obj.compare + obj.status.should eq(status) + end + +end diff --git a/vmdb/spec/support/evm_spec_helper.rb b/vmdb/spec/support/evm_spec_helper.rb index 9030e9586e4..c5fb2381d8b 100644 --- a/vmdb/spec/support/evm_spec_helper.rb +++ b/vmdb/spec/support/evm_spec_helper.rb @@ -130,6 +130,15 @@ def self.stub_qpid_natives def self.import_yaml_model(dirname, domain, attrs = {}) options = {'import_dir' => dirname, 'preview' => false, 'domain' => domain} + yaml_import(domain, options, attrs) + end + + def self.import_yaml_model_from_file(yaml_file, domain, attrs = {}) + options = {'yaml_file' => yaml_file, 'preview' => false, 'domain' => domain} + yaml_import(domain, options, attrs) + end + + def self.yaml_import(domain, options, attrs = {}) MiqAeImport.new(domain, options).import dom = MiqAeNamespace.find_by_fqname(domain) dom.update_attributes!(attrs.reverse_merge(:enabled => true)) if dom