From 5bc897158fbb3dbec9736ddf0effc35fff8cebd4 Mon Sep 17 00:00:00 2001 From: Nazir Date: Thu, 9 Jan 2020 08:44:08 +0100 Subject: [PATCH 01/15] Export by safer element's filename or id --- lib/task_helpers/exports.rb | 51 +++++++++++++++++-- .../exports/customization_templates.rb | 4 +- lib/task_helpers/exports/provision_dialogs.rb | 4 +- lib/task_helpers/exports/roles.rb | 8 +-- lib/task_helpers/exports/service_dialogs.rb | 7 ++- 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index da6c1d0cd17..2d603ba8ad3 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -1,8 +1,52 @@ module TaskHelpers class Exports - def self.safe_filename(filename, keep_spaces = false) - new_filename = keep_spaces ? filename : filename.gsub(%r{[ ]}, '_') - new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') + def get_tmp_filename(object) + # Description: This method is used to generate a legacy, error-prone filename based on selected string fields. + # There is no handling of CustomButtons because safe_filename is not called. + + # Build Arrays for plain classes where filenames are either set by name or description + description_types = [MiqAlert, MiqAlertSet, MiqPolicy, MiqPolicySet, Classification, MiqWidget] + names_types = [GenericObjectDefinition, MiqReport, ScanItemSet, MiqSchedule] + + if names_types.include? object.class then + tmp_filename = object.name + elsif description_types.include? object.class then + tmp_filename = object.description + # Handle specifically crafted Hashes + elsif object.class == Hash then + # CustomizationTemplate Hash + if object[:class].include? "CustomizationTemplate" then + image_type_name = object.fetch_path(:pxe_image_type, :name) || "Examples" + tmp_filename = "#{image_type_name}-#{object[:name]}" + # Provisioning Dialog Hash + elsif object[:class].include? "MiqDialog" then + tmp_filename = "#{object[:dialog_type]}-#{object[:name]}" + # Role Hash + elsif object[:class].include? "MiqUserRole" then + tmp_filename = role_hash[:name] + # Service Dialog Hash + elsif object[:class].include? "Dialog" then + tmp_filename = object[:label] + end + end + + def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) + # Description: generate a safe filename either by some string fields or by object id's. + # We expect parameter object to be a crafted hash or a miq class suitable for export. + + if super_safe_filename then + # Generate filename by id. Hashes and Miq classes must be handled. + if object.class == Hash then + new_filename = object[:id] + else + new_filename = object.id + end + # Generate filename by not so safe strings. + else + tmp_filename = Exports.get_tmp_filename(object) + new_filename = keep_spaces ? tmp_filename : tmp_filename.gsub(%r{[ ]}, '_') + new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') + end end def self.parse_options @@ -11,6 +55,7 @@ def self.parse_options opt :keep_spaces, 'Keep spaces in filenames', :type => :boolean, :short => 's', :default => false opt :directory, 'Directory to place exported files in', :type => :string, :required => true opt :all, 'Export read-only objects', :type => :boolean, :default => false + opt :super_safe_filename, 'Filenames are generated by object id', :type => :boolean, :default => true end error = validate_directory(options[:directory]) diff --git a/lib/task_helpers/exports/customization_templates.rb b/lib/task_helpers/exports/customization_templates.rb index 1372bb4221a..417cc2d6099 100644 --- a/lib/task_helpers/exports/customization_templates.rb +++ b/lib/task_helpers/exports/customization_templates.rb @@ -1,7 +1,7 @@ module TaskHelpers class Exports class CustomizationTemplates - EXCLUDE_ATTRS = %i(created_at updated_at id pxe_image_type_id class).freeze + EXCLUDE_ATTRS = %i(created_at updated_at pxe_image_type_id).freeze def export(options = {}) export_dir = options[:directory] @@ -14,7 +14,7 @@ def export(options = {}) ct_hash.merge!(pxe_image_type_hash(customization_template.pxe_image_type)) image_type_name = ct_hash.fetch_path(:pxe_image_type, :name) || "Examples" - filename = Exports.safe_filename("#{image_type_name}-#{ct_hash[:name]}", options[:keep_spaces]) + filename = Exports.safe_filename(ct_hash, options[:keep_spaces]) File.write("#{export_dir}/#{filename}.yaml", ct_hash.to_yaml) end end diff --git a/lib/task_helpers/exports/provision_dialogs.rb b/lib/task_helpers/exports/provision_dialogs.rb index 70daefb500c..c195d935bdb 100644 --- a/lib/task_helpers/exports/provision_dialogs.rb +++ b/lib/task_helpers/exports/provision_dialogs.rb @@ -1,7 +1,7 @@ module TaskHelpers class Exports class ProvisionDialogs - EXCLUDE_ATTRS = %i(file_mtime created_at updated_at id class).freeze + EXCLUDE_ATTRS = %i(file_mtime created_at updated_at).freeze def export(options = {}) export_dir = options[:directory] @@ -12,7 +12,7 @@ def export(options = {}) dialog_hash = Exports.exclude_attributes(dialog.to_model_hash, EXCLUDE_ATTRS) - filename = Exports.safe_filename("#{dialog_hash[:dialog_type]}-#{dialog_hash[:name]}", options[:keep_spaces]) + filename = Exports.safe_filename(dialog_hash, options[:keep_spaces]) File.write("#{export_dir}/#{filename}.yaml", dialog_hash.to_yaml) end end diff --git a/lib/task_helpers/exports/roles.rb b/lib/task_helpers/exports/roles.rb index a9cdc3bc696..8b17d8882c6 100644 --- a/lib/task_helpers/exports/roles.rb +++ b/lib/task_helpers/exports/roles.rb @@ -1,7 +1,7 @@ module TaskHelpers class Exports class Roles - EXCLUDE_ATTRS = %w(created_at updated_at id).freeze + EXCLUDE_ATTRS = %w(created_at updated_at).freeze def export(options = {}) export_dir = options[:directory] @@ -11,8 +11,10 @@ def export(options = {}) $log.info("Exporting Role: #{role.name} (ID: #{role.id})") role_hash = Exports.exclude_attributes(role.attributes, EXCLUDE_ATTRS).merge('feature_identifiers' => role.feature_identifiers.sort) - - filename = Exports.safe_filename(role_hash['name'], options[:keep_spaces]) + role_hash["class"] = role.class.to_s + role_hash = role_hash.symbolize_keys + + filename = Exports.safe_filename(role_hash, options[:keep_spaces]) File.write("#{export_dir}/#{filename}.yaml", [role_hash].to_yaml) end end diff --git a/lib/task_helpers/exports/service_dialogs.rb b/lib/task_helpers/exports/service_dialogs.rb index 2e63ea37aff..0ab2354fb5a 100644 --- a/lib/task_helpers/exports/service_dialogs.rb +++ b/lib/task_helpers/exports/service_dialogs.rb @@ -9,9 +9,12 @@ def export(options = {}) dialogs.each do |dialog| $log.info("Exporting Service Dialog: #{dialog.name} (ID: #{dialog.id})") - dialog_hash = DialogSerializer.new.serialize([dialog]) + dialog_hash = DialogSerializer.new.serialize([dialog]).first + dialog_hash["id"] = dialog.id + dialog_hash["class"] = dialog.class + dialog_hash = dialog_hash.symbolize_keys - filename = Exports.safe_filename(dialog_hash.first['label'], options[:keep_spaces]) + filename = Exports.safe_filename(dialog_hash, options[:keep_spaces]) File.write("#{export_dir}/#{filename}.yaml", dialog_hash.to_yaml) end end From 4a74832d84fcba0928f94fc4673548383deacf64 Mon Sep 17 00:00:00 2001 From: Nazir Date: Thu, 9 Jan 2020 09:55:52 +0100 Subject: [PATCH 02/15] Fix syntax error --- lib/task_helpers/exports.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 2d603ba8ad3..e2530afae4d 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -29,6 +29,7 @@ def get_tmp_filename(object) tmp_filename = object[:label] end end + end def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) # Description: generate a safe filename either by some string fields or by object id's. From 9ce816ec39b0e08157363c26e6897fafaf34f6e7 Mon Sep 17 00:00:00 2001 From: Nazir Date: Thu, 9 Jan 2020 10:06:47 +0100 Subject: [PATCH 03/15] Return tmp_filename value from the function --- lib/task_helpers/exports.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index e2530afae4d..1fc13b797bc 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -8,6 +8,7 @@ def get_tmp_filename(object) description_types = [MiqAlert, MiqAlertSet, MiqPolicy, MiqPolicySet, Classification, MiqWidget] names_types = [GenericObjectDefinition, MiqReport, ScanItemSet, MiqSchedule] + tmp_filename = '' if names_types.include? object.class then tmp_filename = object.name elsif description_types.include? object.class then @@ -29,6 +30,7 @@ def get_tmp_filename(object) tmp_filename = object[:label] end end + return tmp_filename end def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) From cfb27b10eb645b36725e66ce41ef4d3dfc6fd074 Mon Sep 17 00:00:00 2001 From: Nazir Date: Thu, 9 Jan 2020 11:58:44 +0100 Subject: [PATCH 04/15] Return new_filename from safe_filename function --- lib/task_helpers/exports.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 1fc13b797bc..21eeb9fee86 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -50,6 +50,7 @@ def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) new_filename = keep_spaces ? tmp_filename : tmp_filename.gsub(%r{[ ]}, '_') new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') end + return new_filename end def self.parse_options From c63b4d9fc3f4db9e285121a2ec093011f4092240 Mon Sep 17 00:00:00 2001 From: Nazir Date: Thu, 9 Jan 2020 14:36:55 +0100 Subject: [PATCH 05/15] Refactor code following rubocop criteria --- lib/task_helpers/exports.rb | 97 +++++++++++++++---------------- lib/task_helpers/exports/roles.rb | 1 - 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 21eeb9fee86..3dbace12032 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -1,56 +1,51 @@ module TaskHelpers class Exports - def get_tmp_filename(object) - # Description: This method is used to generate a legacy, error-prone filename based on selected string fields. - # There is no handling of CustomButtons because safe_filename is not called. - - # Build Arrays for plain classes where filenames are either set by name or description - description_types = [MiqAlert, MiqAlertSet, MiqPolicy, MiqPolicySet, Classification, MiqWidget] - names_types = [GenericObjectDefinition, MiqReport, ScanItemSet, MiqSchedule] - - tmp_filename = '' - if names_types.include? object.class then - tmp_filename = object.name - elsif description_types.include? object.class then - tmp_filename = object.description - # Handle specifically crafted Hashes - elsif object.class == Hash then - # CustomizationTemplate Hash - if object[:class].include? "CustomizationTemplate" then - image_type_name = object.fetch_path(:pxe_image_type, :name) || "Examples" - tmp_filename = "#{image_type_name}-#{object[:name]}" - # Provisioning Dialog Hash - elsif object[:class].include? "MiqDialog" then - tmp_filename = "#{object[:dialog_type]}-#{object[:name]}" - # Role Hash - elsif object[:class].include? "MiqUserRole" then - tmp_filename = role_hash[:name] - # Service Dialog Hash - elsif object[:class].include? "Dialog" then - tmp_filename = object[:label] - end - end - return tmp_filename - end - + def get_tmp_filename(object) + # Description: This method is used to generate a legacy, error-prone filename based on selected string fields. + # There is no handling of CustomButtons because safe_filename is not called. + # Build Arrays for plain classes where filenames are either set by name or description + description_types = [MiqAlert, MiqAlertSet, MiqPolicy, MiqPolicySet, Classification, MiqWidget] + names_types = [GenericObjectDefinition, MiqReport, ScanItemSet, MiqSchedule] + tmp_filename = '' + if names_types.include?(object.class) + tmp_filename = object.name + elsif description_types.include?(object.class) + tmp_filename = object.description + # Handle specifically crafted Hashes + elsif object.class == Hash + # CustomizationTemplate Hash + if object[:class].include?("CustomizationTemplate") + image_type_name = object.fetch_path(:pxe_image_type, :name) || "Examples" + tmp_filename = "#{image_type_name}-#{object[:name]}" + # Provisioning Dialog Hash + elsif object[:class].include?("MiqDialog") + tmp_filename = "#{object[:dialog_type]}-#{object[:name]}" + # Role Hash + elsif object[:class].include?("MiqUserRole") + tmp_filename = role_hash[:name] + # Service Dialog Hash + elsif object[:class].include?("Dialog") + tmp_filename = object[:label] + end + end + tmp_filename + end + def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) - # Description: generate a safe filename either by some string fields or by object id's. - # We expect parameter object to be a crafted hash or a miq class suitable for export. - - if super_safe_filename then - # Generate filename by id. Hashes and Miq classes must be handled. - if object.class == Hash then - new_filename = object[:id] - else - new_filename = object.id - end - # Generate filename by not so safe strings. - else - tmp_filename = Exports.get_tmp_filename(object) - new_filename = keep_spaces ? tmp_filename : tmp_filename.gsub(%r{[ ]}, '_') - new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') - end - return new_filename + # Description: generate a safe filename either by some string fields or by object id's. + # We expect parameter object to be a crafted hash or a miq class suitable for export. + + new_filename = '' + # Generate filename by id. Hashes and Miq classes must be handled. + if super_safe_filename + new_filename = object.class == Hash ? object[:id] : object.id + # Generate filename by not so safe strings. + else + tmp_filename = Exports.get_tmp_filename(object) + new_filename = keep_spaces ? tmp_filename : tmp_filename.gsub(%r{[ ]}, '_') + new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') + end + new_filename end def self.parse_options @@ -59,7 +54,7 @@ def self.parse_options opt :keep_spaces, 'Keep spaces in filenames', :type => :boolean, :short => 's', :default => false opt :directory, 'Directory to place exported files in', :type => :string, :required => true opt :all, 'Export read-only objects', :type => :boolean, :default => false - opt :super_safe_filename, 'Filenames are generated by object id', :type => :boolean, :default => true + opt :super_safe_filename, 'Filenames are generated by object id', :type => :boolean, :default => true end error = validate_directory(options[:directory]) diff --git a/lib/task_helpers/exports/roles.rb b/lib/task_helpers/exports/roles.rb index 8b17d8882c6..eb9dee62b0a 100644 --- a/lib/task_helpers/exports/roles.rb +++ b/lib/task_helpers/exports/roles.rb @@ -13,7 +13,6 @@ def export(options = {}) role_hash = Exports.exclude_attributes(role.attributes, EXCLUDE_ATTRS).merge('feature_identifiers' => role.feature_identifiers.sort) role_hash["class"] = role.class.to_s role_hash = role_hash.symbolize_keys - filename = Exports.safe_filename(role_hash, options[:keep_spaces]) File.write("#{export_dir}/#{filename}.yaml", [role_hash].to_yaml) end From 5657291ddbde7327b17ed08bab9d44711cac5ddd Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 13:58:30 +0100 Subject: [PATCH 06/15] Add self to the method definition --- lib/task_helpers/exports.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 3dbace12032..1836913ba21 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -1,6 +1,6 @@ module TaskHelpers class Exports - def get_tmp_filename(object) + def self.get_tmp_filename(my_object) # Description: This method is used to generate a legacy, error-prone filename based on selected string fields. # There is no handling of CustomButtons because safe_filename is not called. # Build Arrays for plain classes where filenames are either set by name or description From b0cf1051d8450c47f6d04a758552c951c03270c0 Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 14:01:29 +0100 Subject: [PATCH 07/15] Rename object to my_object --- lib/task_helpers/exports.rb | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 1836913ba21..159f30f51ea 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -7,41 +7,41 @@ def self.get_tmp_filename(my_object) description_types = [MiqAlert, MiqAlertSet, MiqPolicy, MiqPolicySet, Classification, MiqWidget] names_types = [GenericObjectDefinition, MiqReport, ScanItemSet, MiqSchedule] tmp_filename = '' - if names_types.include?(object.class) - tmp_filename = object.name - elsif description_types.include?(object.class) - tmp_filename = object.description + if names_types.include?(my_object.class) + tmp_filename = my_object.name + elsif description_types.include?(my_object.class) + tmp_filename = my_object.description # Handle specifically crafted Hashes - elsif object.class == Hash + elsif my_object.class == Hash # CustomizationTemplate Hash - if object[:class].include?("CustomizationTemplate") - image_type_name = object.fetch_path(:pxe_image_type, :name) || "Examples" - tmp_filename = "#{image_type_name}-#{object[:name]}" - # Provisioning Dialog Hash - elsif object[:class].include?("MiqDialog") - tmp_filename = "#{object[:dialog_type]}-#{object[:name]}" - # Role Hash - elsif object[:class].include?("MiqUserRole") - tmp_filename = role_hash[:name] - # Service Dialog Hash - elsif object[:class].include?("Dialog") - tmp_filename = object[:label] - end + if my_object[:class].include?("CustomizationTemplate") + image_type_name = my_object.fetch_path(:pxe_image_type, :name) || "Examples" + tmp_filename = "#{image_type_name}-#{object[:name]}" + # Provisioning Dialog Hash + elsif my_object[:class].include?("MiqDialog") + tmp_filename = "#{my_object[:dialog_type]}-#{my_object[:name]}" + # Role Hash + elsif my_object[:class].include?("MiqUserRole") + tmp_filename = role_hash[:name] + # Service Dialog Hash + elsif my_object[:class].include?("Dialog") + tmp_filename = my_object[:label] + end end tmp_filename end - def self.safe_filename(object, keep_spaces = false, super_safe_filename = false) + def self.safe_filename(my_object, keep_spaces = false, super_safe_filename = false) # Description: generate a safe filename either by some string fields or by object id's. # We expect parameter object to be a crafted hash or a miq class suitable for export. new_filename = '' # Generate filename by id. Hashes and Miq classes must be handled. if super_safe_filename - new_filename = object.class == Hash ? object[:id] : object.id + new_filename = my_object.class == Hash ? my_object[:id] : my_object.id # Generate filename by not so safe strings. else - tmp_filename = Exports.get_tmp_filename(object) + tmp_filename = Exports.get_tmp_filename(my_object) new_filename = keep_spaces ? tmp_filename : tmp_filename.gsub(%r{[ ]}, '_') new_filename.gsub(%r{[|/]}, '/' => 'slash', '|' => 'pipe') end From 4b0afa0c5bffeeb5fe47ff9b8ff2d1db5c20d6ce Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 14:03:02 +0100 Subject: [PATCH 08/15] Add class name into hash as string --- lib/task_helpers/exports/service_dialogs.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task_helpers/exports/service_dialogs.rb b/lib/task_helpers/exports/service_dialogs.rb index 0ab2354fb5a..ec311f411ec 100644 --- a/lib/task_helpers/exports/service_dialogs.rb +++ b/lib/task_helpers/exports/service_dialogs.rb @@ -11,7 +11,7 @@ def export(options = {}) dialog_hash = DialogSerializer.new.serialize([dialog]).first dialog_hash["id"] = dialog.id - dialog_hash["class"] = dialog.class + dialog_hash["class"] = dialog.class.to_s dialog_hash = dialog_hash.symbolize_keys filename = Exports.safe_filename(dialog_hash, options[:keep_spaces]) From 5c9d2525cb3727741f45705c64340ae9940d8535 Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 14:04:35 +0100 Subject: [PATCH 09/15] Pass super_safe_filename parameter to safe_filename function to make export work with id --- lib/task_helpers/exports/service_dialogs.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task_helpers/exports/service_dialogs.rb b/lib/task_helpers/exports/service_dialogs.rb index ec311f411ec..722d3256246 100644 --- a/lib/task_helpers/exports/service_dialogs.rb +++ b/lib/task_helpers/exports/service_dialogs.rb @@ -14,7 +14,7 @@ def export(options = {}) dialog_hash["class"] = dialog.class.to_s dialog_hash = dialog_hash.symbolize_keys - filename = Exports.safe_filename(dialog_hash, options[:keep_spaces]) + filename = Exports.safe_filename(dialog_hash, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", dialog_hash.to_yaml) end end From 51e6c3380c3f73d656151585aa2260a880608868 Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 14:44:40 +0100 Subject: [PATCH 10/15] Pass super_safe_filename parameter to all safe_filename function calls to make export work with id --- lib/task_helpers/exports/alert_sets.rb | 2 +- lib/task_helpers/exports/alerts.rb | 2 +- lib/task_helpers/exports/customization_templates.rb | 2 +- lib/task_helpers/exports/generic_object_definitions.rb | 2 +- lib/task_helpers/exports/policies.rb | 2 +- lib/task_helpers/exports/policy_sets.rb | 2 +- lib/task_helpers/exports/provision_dialogs.rb | 2 +- lib/task_helpers/exports/reports.rb | 2 +- lib/task_helpers/exports/roles.rb | 2 +- lib/task_helpers/exports/scan_profiles.rb | 2 +- lib/task_helpers/exports/schedules.rb | 2 +- lib/task_helpers/exports/tags.rb | 2 +- lib/task_helpers/exports/widgets.rb | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/task_helpers/exports/alert_sets.rb b/lib/task_helpers/exports/alert_sets.rb index f82d37d5f5a..a205ffd007c 100644 --- a/lib/task_helpers/exports/alert_sets.rb +++ b/lib/task_helpers/exports/alert_sets.rb @@ -7,7 +7,7 @@ def export(options = {}) MiqAlertSet.order(:id).all.each do |alert_set| $log.info("Exporting Alert Profile: #{alert_set.description} (ID: #{alert_set.id})") - filename = Exports.safe_filename(alert_set.description, options[:keep_spaces]) + filename = Exports.safe_filename(alert_set.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", alert_set.export_to_yaml) end end diff --git a/lib/task_helpers/exports/alerts.rb b/lib/task_helpers/exports/alerts.rb index 04e14217e0d..dbd1cfa3838 100644 --- a/lib/task_helpers/exports/alerts.rb +++ b/lib/task_helpers/exports/alerts.rb @@ -7,7 +7,7 @@ def export(options = {}) MiqAlert.order(:id).all.each do |alert| $log.info("Exporting Alert: #{alert.description} (ID: #{alert.id})") - filename = Exports.safe_filename(alert.description, options[:keep_spaces]) + filename = Exports.safe_filename(alert.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", alert.export_to_yaml) end end diff --git a/lib/task_helpers/exports/customization_templates.rb b/lib/task_helpers/exports/customization_templates.rb index 417cc2d6099..332d3aab3ae 100644 --- a/lib/task_helpers/exports/customization_templates.rb +++ b/lib/task_helpers/exports/customization_templates.rb @@ -14,7 +14,7 @@ def export(options = {}) ct_hash.merge!(pxe_image_type_hash(customization_template.pxe_image_type)) image_type_name = ct_hash.fetch_path(:pxe_image_type, :name) || "Examples" - filename = Exports.safe_filename(ct_hash, options[:keep_spaces]) + filename = Exports.safe_filename(ct_hash, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", ct_hash.to_yaml) end end diff --git a/lib/task_helpers/exports/generic_object_definitions.rb b/lib/task_helpers/exports/generic_object_definitions.rb index d566f344987..be19c8fee23 100644 --- a/lib/task_helpers/exports/generic_object_definitions.rb +++ b/lib/task_helpers/exports/generic_object_definitions.rb @@ -4,7 +4,7 @@ class GenericObjectDefinitions def export(options = {}) export_dir = options[:directory] GenericObjectDefinition.all.each do |god| - filename = Exports.safe_filename(god.name, options[:keep_spaces]) + filename = Exports.safe_filename(god.name, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", god.export_to_array.to_yaml) end end diff --git a/lib/task_helpers/exports/policies.rb b/lib/task_helpers/exports/policies.rb index c3dde052c72..ff937da6640 100644 --- a/lib/task_helpers/exports/policies.rb +++ b/lib/task_helpers/exports/policies.rb @@ -9,7 +9,7 @@ def export(options = {}) policies.order(:id).each do |policy| $log.info("Exporting Policy: #{policy.description} (ID: #{policy.id})") - filename = Exports.safe_filename(policy.description, options[:keep_spaces]) + filename = Exports.safe_filename(policy.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", policy.export_to_yaml) end end diff --git a/lib/task_helpers/exports/policy_sets.rb b/lib/task_helpers/exports/policy_sets.rb index be991b8cd1e..0d6dfa2ca67 100644 --- a/lib/task_helpers/exports/policy_sets.rb +++ b/lib/task_helpers/exports/policy_sets.rb @@ -9,7 +9,7 @@ def export(options = {}) policy_sets.order(:id).each do |policy_set| $log.info("Exporting Policy Profile: #{policy_set.description} (ID: #{policy_set.id})") - filename = Exports.safe_filename(policy_set.description, options[:keep_spaces]) + filename = Exports.safe_filename(policy_set.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", policy_set.export_to_yaml) end end diff --git a/lib/task_helpers/exports/provision_dialogs.rb b/lib/task_helpers/exports/provision_dialogs.rb index c195d935bdb..f97d0a5c79f 100644 --- a/lib/task_helpers/exports/provision_dialogs.rb +++ b/lib/task_helpers/exports/provision_dialogs.rb @@ -12,7 +12,7 @@ def export(options = {}) dialog_hash = Exports.exclude_attributes(dialog.to_model_hash, EXCLUDE_ATTRS) - filename = Exports.safe_filename(dialog_hash, options[:keep_spaces]) + filename = Exports.safe_filename(dialog_hash, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", dialog_hash.to_yaml) end end diff --git a/lib/task_helpers/exports/reports.rb b/lib/task_helpers/exports/reports.rb index 6974d4de8d0..75292baa37e 100644 --- a/lib/task_helpers/exports/reports.rb +++ b/lib/task_helpers/exports/reports.rb @@ -7,7 +7,7 @@ def export(options = {}) custom_reports = options[:all] ? MiqReport.all : MiqReport.where(:rpt_type => "Custom") custom_reports.each do |report| - filename = Exports.safe_filename(report.name, options[:keep_spaces]) + filename = Exports.safe_filename(report.name, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", report.export_to_array.to_yaml) end end diff --git a/lib/task_helpers/exports/roles.rb b/lib/task_helpers/exports/roles.rb index eb9dee62b0a..76b8b1dc0da 100644 --- a/lib/task_helpers/exports/roles.rb +++ b/lib/task_helpers/exports/roles.rb @@ -13,7 +13,7 @@ def export(options = {}) role_hash = Exports.exclude_attributes(role.attributes, EXCLUDE_ATTRS).merge('feature_identifiers' => role.feature_identifiers.sort) role_hash["class"] = role.class.to_s role_hash = role_hash.symbolize_keys - filename = Exports.safe_filename(role_hash, options[:keep_spaces]) + filename = Exports.safe_filename(role_hash, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", [role_hash].to_yaml) end end diff --git a/lib/task_helpers/exports/scan_profiles.rb b/lib/task_helpers/exports/scan_profiles.rb index 5325a1b8a29..19b18dceeb2 100644 --- a/lib/task_helpers/exports/scan_profiles.rb +++ b/lib/task_helpers/exports/scan_profiles.rb @@ -18,7 +18,7 @@ def export(options = {}) scan_profile = profile.to_yaml - filename = Exports.safe_filename(scan_item_set.name, options[:keep_spaces]) + filename = Exports.safe_filename(scan_item_set.name, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", scan_profile) end end diff --git a/lib/task_helpers/exports/schedules.rb b/lib/task_helpers/exports/schedules.rb index d0405d7fed3..90ff08db15c 100644 --- a/lib/task_helpers/exports/schedules.rb +++ b/lib/task_helpers/exports/schedules.rb @@ -7,7 +7,7 @@ def export(options = {}) schedules = options[:all] ? MiqSchedule.all : MiqSchedule.where(:userid => 'system', :prod_default => 'system') schedules.each do |schedule| - filename = Exports.safe_filename(schedule.name, options[:keep_spaces]) + filename = Exports.safe_filename(schedule.name, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", MiqSchedule.export_to_yaml([schedule], MiqSchedule)) end end diff --git a/lib/task_helpers/exports/tags.rb b/lib/task_helpers/exports/tags.rb index cfc9cd54604..283194d0d73 100644 --- a/lib/task_helpers/exports/tags.rb +++ b/lib/task_helpers/exports/tags.rb @@ -32,7 +32,7 @@ def export(options = {}) category_array = category.export_to_array category_array.first["ns"] = category.ns unless category.ns == '/managed' - filename = Exports.safe_filename(category.description, options[:keep_spaces]) + filename = Exports.safe_filename(category.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", category_array.to_yaml) end end diff --git a/lib/task_helpers/exports/widgets.rb b/lib/task_helpers/exports/widgets.rb index 4247381021c..2de7a7cc9a6 100644 --- a/lib/task_helpers/exports/widgets.rb +++ b/lib/task_helpers/exports/widgets.rb @@ -7,7 +7,7 @@ def export(options = {}) widgets = options[:all] ? MiqWidget.all : MiqWidget.where(:read_only => false) widgets.each do |widget| - filename = Exports.safe_filename(widget.description, options[:keep_spaces]) + filename = Exports.safe_filename(widget.description, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", MiqWidget.export_to_yaml([widget.id], MiqWidget)) end end From 28bd71375527f175c0158070ff86714cc48985fa Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 14:51:54 +0100 Subject: [PATCH 11/15] Fix indentation --- lib/task_helpers/exports.rb | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index 159f30f51ea..a87af63ae0a 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -14,19 +14,19 @@ def self.get_tmp_filename(my_object) # Handle specifically crafted Hashes elsif my_object.class == Hash # CustomizationTemplate Hash - if my_object[:class].include?("CustomizationTemplate") - image_type_name = my_object.fetch_path(:pxe_image_type, :name) || "Examples" - tmp_filename = "#{image_type_name}-#{object[:name]}" - # Provisioning Dialog Hash - elsif my_object[:class].include?("MiqDialog") - tmp_filename = "#{my_object[:dialog_type]}-#{my_object[:name]}" - # Role Hash - elsif my_object[:class].include?("MiqUserRole") - tmp_filename = role_hash[:name] - # Service Dialog Hash - elsif my_object[:class].include?("Dialog") - tmp_filename = my_object[:label] - end + if my_object[:class].include?("CustomizationTemplate") + image_type_name = my_object.fetch_path(:pxe_image_type, :name) || "Examples" + tmp_filename = "#{image_type_name}-#{object[:name]}" + # Provisioning Dialog Hash + elsif my_object[:class].include?("MiqDialog") + tmp_filename = "#{my_object[:dialog_type]}-#{my_object[:name]}" + # Role Hash + elsif my_object[:class].include?("MiqUserRole") + tmp_filename = role_hash[:name] + # Service Dialog Hash + elsif my_object[:class].include?("Dialog") + tmp_filename = my_object[:label] + end end tmp_filename end From f4a5c1c76482e53532c0a688b7547b295f19bcbb Mon Sep 17 00:00:00 2001 From: Nazir Date: Fri, 10 Jan 2020 16:22:21 +0100 Subject: [PATCH 12/15] Remove unused code --- lib/task_helpers/exports/customization_templates.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/task_helpers/exports/customization_templates.rb b/lib/task_helpers/exports/customization_templates.rb index 332d3aab3ae..26f3764bc2f 100644 --- a/lib/task_helpers/exports/customization_templates.rb +++ b/lib/task_helpers/exports/customization_templates.rb @@ -13,7 +13,6 @@ def export(options = {}) ct_hash = Exports.exclude_attributes(customization_template.to_model_hash, EXCLUDE_ATTRS) ct_hash.merge!(pxe_image_type_hash(customization_template.pxe_image_type)) - image_type_name = ct_hash.fetch_path(:pxe_image_type, :name) || "Examples" filename = Exports.safe_filename(ct_hash, options[:keep_spaces], options[:super_safe_filename]) File.write("#{export_dir}/#{filename}.yaml", ct_hash.to_yaml) end From 86c4b0ef29b7a8683e3641568f31e808a792c4f2 Mon Sep 17 00:00:00 2001 From: Nazir Date: Wed, 15 Jan 2020 16:21:37 +0100 Subject: [PATCH 13/15] Make import work with single service dialog files --- lib/services/dialog_import_service.rb | 39 +++++++++++++++------ lib/task_helpers/imports/service_dialogs.rb | 2 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/services/dialog_import_service.rb b/lib/services/dialog_import_service.rb index 97e93212782..96e00baea51 100644 --- a/lib/services/dialog_import_service.rb +++ b/lib/services/dialog_import_service.rb @@ -21,19 +21,36 @@ def cancel_import(import_file_upload_id) def import_from_file(filename) dialogs = YAML.load_file(filename) - begin - dialogs.each do |dialog| - dialog.except!(:blueprint_id, 'blueprint_id') # blueprint_id might appear in some old dialogs, but no longer exists - if dialog_with_label?(dialog["label"]) + if dialogs.class == Hash + begin + dialogs.except!(:blueprint_id, 'blueprint_id') # blueprint_id might appear in some old dialogs, but no longer exists + if dialog_with_label?(dialogs["label"]) yield dialog if block_given? else - Dialog.create(dialog.except('export_version').merge("dialog_tabs" => build_dialog_tabs(dialog, dialog['export_version'] || DEFAULT_DIALOG_VERSION))) + puts dialogs.keys + Dialog.create(dialogs.except(:export_version, 'export_version', :class, 'class', :id, 'id').merge("dialog_tabs" => build_dialog_tabs(dialogs, dialogs['export_version'] || DEFAULT_DIALOG_VERSION))) end + rescue DialogFieldImporter::InvalidDialogFieldTypeError + raise + rescue + raise ParsedNonDialogYamlError + end + + elsif dialogs.class == Array + begin + dialogs.each do |dialog| + dialog.except!(:blueprint_id, 'blueprint_id') # blueprint_id might appear in some old dialogs, but no longer exists + if dialog_with_label?(dialog["label"]) + yield dialog if block_given? + else + Dialog.create(dialog.except(:export_version, 'export_version', :class, 'class', :id, 'id').merge("dialog_tabs" => build_dialog_tabs(dialog, dialog['export_version'] || DEFAULT_DIALOG_VERSION))) + end + end + rescue DialogFieldImporter::InvalidDialogFieldTypeError + raise + rescue + raise ParsedNonDialogYamlError end - rescue DialogFieldImporter::InvalidDialogFieldTypeError - raise - rescue - raise ParsedNonDialogYamlError end end @@ -68,7 +85,7 @@ def store_for_import(file_contents) end def build_dialog_tabs(dialog, export_version = CURRENT_DIALOG_VERSION) - dialog["dialog_tabs"].collect do |dialog_tab| + dialog[:dialog_tabs].collect do |dialog_tab| DialogTab.create(dialog_tab.merge("dialog_groups" => build_dialog_groups(dialog_tab, export_version))) end end @@ -100,7 +117,7 @@ def check_field_associations(fields) def import(dialog) @dialog_import_validator.determine_dialog_validity(dialog) - new_dialog = Dialog.create(dialog.except('dialog_tabs', 'export_version')) + new_dialog = Dialog.create(dialog.except(:dialog_tabs, 'dialog_tabs', :export_version, 'export_version', :class, 'class', :id, 'id')) association_list = build_association_list(dialog) new_dialog.update!(dialog.merge('dialog_tabs' => build_dialog_tabs(dialog, dialog['export_version'] || DEFAULT_DIALOG_VERSION))) build_associations(new_dialog, association_list) diff --git a/lib/task_helpers/imports/service_dialogs.rb b/lib/task_helpers/imports/service_dialogs.rb index 563c8da6702..c7af6cceae8 100644 --- a/lib/task_helpers/imports/service_dialogs.rb +++ b/lib/task_helpers/imports/service_dialogs.rb @@ -8,7 +8,7 @@ def import(options = {}) Dir.glob(glob) do |filename| $log.info("Importing Service Dialogs from: #{filename}") - DialogImportService.new.import_all_service_dialogs_from_yaml_file(filename) + DialogImportService.new.import_from_file(filename) end end end From a3c32b1b67e574e913de46460d17b9a157752ec8 Mon Sep 17 00:00:00 2001 From: Nazir Date: Wed, 15 Jan 2020 16:27:03 +0100 Subject: [PATCH 14/15] Remove console log --- lib/services/dialog_import_service.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/services/dialog_import_service.rb b/lib/services/dialog_import_service.rb index 96e00baea51..5dc258b51cd 100644 --- a/lib/services/dialog_import_service.rb +++ b/lib/services/dialog_import_service.rb @@ -27,7 +27,6 @@ def import_from_file(filename) if dialog_with_label?(dialogs["label"]) yield dialog if block_given? else - puts dialogs.keys Dialog.create(dialogs.except(:export_version, 'export_version', :class, 'class', :id, 'id').merge("dialog_tabs" => build_dialog_tabs(dialogs, dialogs['export_version'] || DEFAULT_DIALOG_VERSION))) end rescue DialogFieldImporter::InvalidDialogFieldTypeError From cb01e28e459111ce65fa4bafc883812b8403ae9f Mon Sep 17 00:00:00 2001 From: inazir Date: Fri, 24 Jan 2020 16:02:44 +0100 Subject: [PATCH 15/15] Rename object to my_object (amend commit: b0cf105) --- lib/task_helpers/exports.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task_helpers/exports.rb b/lib/task_helpers/exports.rb index a87af63ae0a..550ad490e87 100644 --- a/lib/task_helpers/exports.rb +++ b/lib/task_helpers/exports.rb @@ -16,7 +16,7 @@ def self.get_tmp_filename(my_object) # CustomizationTemplate Hash if my_object[:class].include?("CustomizationTemplate") image_type_name = my_object.fetch_path(:pxe_image_type, :name) || "Examples" - tmp_filename = "#{image_type_name}-#{object[:name]}" + tmp_filename = "#{image_type_name}-#{my_object[:name]}" # Provisioning Dialog Hash elsif my_object[:class].include?("MiqDialog") tmp_filename = "#{my_object[:dialog_type]}-#{my_object[:name]}"