Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add rake task to export custom buttons #17699

Merged
merged 1 commit into from
Jul 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions lib/task_helpers/exports/custom_buttons.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module TaskHelpers
class Exports
class CustomButtons
class ExportArInstances
EXCLUDE_ATTRS = %w(id created_on updated_on created_at updated_at dialog_id resource_id).freeze
def self.export_object(obj, hash)
class_name = obj.class.name.underscore

$log.send(:info, "Exporting #{obj.class.name} [#{obj.try('name')}] with ID: #{obj&.id}")
(hash[class_name] ||= []) << item = { 'attributes' => build_attr_list(obj.try(:attributes)) }
create_association_list(obj, item)
descendant_list(obj, item)
end

def self.build_attr_list(attrs)
attrs&.except(*EXCLUDE_ATTRS)
end

def self.create_association_list(obj, item)
associations = obj.class.try(:reflections)
if associations
associations = associations.collect { |model, assoc| { model => assoc.class.to_s.demodulize } }.select { |as| as.values.first != "BelongsToReflection" && as.keys.first != "all_relationships" }
associations.each do |assoc|
assoc.each do |a|
next if obj.try(a.first.to_sym).blank?
export_object(obj.try(a.first.to_sym), (item['associations'] ||= {}))
end
end
end
end

def self.descendant_list(obj, item)
obj.try(:children)&.each { |c| export_object(c, (item['children'] ||= {})) }
end
end

def export(options = {})
parent_id_list = []
objects = CustomButton.where.not(:applies_to_class => %w(ServiceTemplate GenericObject))

export = objects.each_with_object({}) do |obj, export_hash|
if obj.try(:parent).present?
next if parent_id_list.include?(obj.parent.id)
ExportArInstances.export_object(obj.parent, export_hash)
parent_id_list << obj.parent.id
else
ExportArInstances.export_object(obj, export_hash)
end
end

export_dir = options[:directory]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@d-m-u Should we have some validation that this directory exists?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

File.write("#{export_dir}/CustomButtons.yaml", YAML.dump(export))
end
end
end
end
8 changes: 8 additions & 0 deletions lib/tasks/evm_export_import.rake
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@ namespace :evm do

exit # exit so that parameters to the first rake task are not run as rake tasks
end

desc 'Exports all custom buttons to a single YAML file'
task :custom_buttons => :environment do
options = TaskHelpers::Exports.parse_options
TaskHelpers::Exports::CustomButtons.new.export(options)

exit # exit so that parameters to the first rake task are not run as rake tasks
end
end

namespace :import do
Expand Down
80 changes: 80 additions & 0 deletions spec/lib/task_helpers/exports/custom_buttons_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
describe TaskHelpers::Exports::CustomButtons do
let!(:custom_button) { FactoryGirl.create(:custom_button, :name => "export_test_button", :description => "Export Test", :applies_to_class => "Vm") }
let!(:custom_button2) { FactoryGirl.create(:custom_button, :name => "export_test_button2", :description => "Export Test", :applies_to_class => "Service") }
let!(:custom_button_set) { FactoryGirl.create(:custom_button_set, :name => "custom_button_set", :description => "Default Export Test") }
let(:export_dir) { Dir.mktmpdir('miq_exp_dir') }

let(:custom_button_export_test) do
{"custom_button_set" => [{
"attributes" => {
"name" => "custom_button_set",
"description" => "Default Export Test",
"set_type" => "CustomButtonSet",
"guid" => custom_button_set.guid,
"read_only" => nil,
"set_data" => nil,
"mode" => nil,
"owner_type" => nil,
"owner_id" => nil,
"userid" => nil,
"group_id" => nil
},
"children" => {
"custom_button" => [{
"attributes" => {
"guid" => custom_button.guid,
"description" => "Export Test",
"applies_to_class" => "Vm",
"visibility_expression" => nil,
"options" => nil,
"userid" => nil,
"wait_for_complete" => nil,
"name" => "export_test_button",
"visibility" => nil,
"applies_to_id" => nil,
"enablement_expression" => nil,
"disabled_text" => nil
}
}]
}
}],
"custom_button" => [{
"attributes" => {
"guid" => custom_button2.guid,
"description" => "Export Test",
"applies_to_class" => "Service",
"visibility_expression" => nil,
"options" => nil,
"userid" => nil,
"wait_for_complete" => nil,
"name" => "export_test_button2",
"visibility" => nil,
"applies_to_id" => nil,
"enablement_expression" => nil,
"disabled_text" => nil
}
}]}
end

before do
custom_button_set.add_member(custom_button)
end

after do
FileUtils.remove_entry export_dir
end

it 'exports custom buttons to a given directory' do
TaskHelpers::Exports::CustomButtons.new.export(:directory => export_dir)
file_contents = File.read("#{export_dir}/CustomButtons.yaml")
expect(YAML.safe_load(file_contents)).to contain_exactly(*custom_button_export_test)
expect(Dir[File.join(export_dir, '**', '*')].count { |file| File.file?(file) }).to eq(1)
end

it 'exports all custom buttons to a given directory' do
TaskHelpers::Exports::CustomButtons.new.export(:directory => export_dir, :all => true)
file_contents = File.read("#{export_dir}/CustomButtons.yaml")
expect(YAML.safe_load(file_contents)).to contain_exactly(*custom_button_export_test)
expect(Dir[File.join(export_dir, '**', '*')].count { |file| File.file?(file) }).to eq(1)
end
end