diff --git a/spec/factories/ems_folder.rb b/spec/factories/ems_folder.rb index 6e34abc9567..846217145b1 100644 --- a/spec/factories/ems_folder.rb +++ b/spec/factories/ems_folder.rb @@ -14,4 +14,83 @@ factory :inventory_root_group, :class => "ManageIQ::Providers::ConfigurationManager::InventoryRootGroup", :parent => :ems_folder + + # + # VMware specific folders + # + + factory :vmware_folder, :parent => :ems_folder do + sequence(:ems_ref) { |n| "group-d#{n}" } + end + + factory :vmware_folder_vm, :parent => :ems_folder do + sequence(:ems_ref) { |n| "group-v#{n}" } + end + + factory :vmware_folder_host, :parent => :ems_folder do + sequence(:ems_ref) { |n| "group-h#{n}" } + end + + factory :vmware_folder_datastore, :parent => :ems_folder do + sequence(:ems_ref) { |n| "group-s#{n}" } + end + + factory :vmware_folder_network, :parent => :ems_folder do + sequence(:ems_ref) { |n| "group-n#{n}" } + end + + factory :vmware_folder_root, :parent => :vmware_folder do + name "Datacenters" + hidden true + end + + factory :vmware_folder_vm_root, :parent => :vmware_folder_vm do + name "vm" + hidden true + end + + factory :vmware_folder_host_root, :parent => :vmware_folder_host do + name "host" + hidden true + end + + factory :vmware_folder_datastore_root, :parent => :vmware_folder_datastore do + name "datastore" + hidden true + end + + factory :vmware_folder_network_root, :parent => :vmware_folder_network do + name "network" + hidden true + end + + factory :vmware_datacenter, :parent => :vmware_folder, :class => "Datacenter" do + sequence(:name) { |n| "Test Datacenter #{seq_padded_for_sorting(n)}" } + end +end + +def build_vmware_folder_structure!(ems) + ems.add_child( + FactoryGirl.create(:vmware_folder_root, :ems_id => ems.id).tap do |root| + root.add_child( + FactoryGirl.create(:vmware_folder, :name => "yellow1", :ems_id => ems.id).tap do |f| + f.add_child( + FactoryGirl.create(:vmware_datacenter, :ems_id => ems.id).tap do |dc| + dc.add_children( + FactoryGirl.create(:vmware_folder_vm_root, :ems_id => ems.id) do |vm| + vm.add_children( + FactoryGirl.create(:vmware_folder_vm, :name => "blue1", :ems_id => ems.id), + FactoryGirl.create(:vmware_folder_vm, :name => "blue2", :ems_id => ems.id) + ) + end, + FactoryGirl.create(:vmware_folder_host_root, :ems_id => ems.id), + FactoryGirl.create(:vmware_folder_datastore_root, :ems_id => ems.id), + FactoryGirl.create(:vmware_folder_network_root, :ems_id => ems.id) + ) + end + ) + end + ) + end + ) end diff --git a/spec/models/vm_or_template_spec.rb b/spec/models/vm_or_template_spec.rb index 0d08e5ff21c..db0812dba83 100644 --- a/spec/models/vm_or_template_spec.rb +++ b/spec/models/vm_or_template_spec.rb @@ -866,4 +866,155 @@ expect(VmOrTemplate.not_archived_nor_orphaned).to eq([vm]) end end + + describe ".post_refresh_ems" do + let(:folder_blue1) { EmsFolder.find_by(:name => "blue1") } + let(:folder_blue2) { EmsFolder.find_by(:name => "blue2") } + let(:folder_vm_root) { EmsFolder.find_by(:name => "vm") } + let(:vm_blue1) { VmOrTemplate.find_by(:name => "vm_blue1") } + let(:vm_blue2) { VmOrTemplate.find_by(:name => "vm_blue2") } + + let!(:ems) do + _, _, zone = EvmSpecHelper.local_guid_miq_server_zone + FactoryGirl.create(:ems_vmware, :zone => zone).tap do |ems| + build_vmware_folder_structure!(ems) + folder_blue1.add_child(FactoryGirl.create(:vm_vmware, :name => "vm_blue1", :ems_id => ems.id)) + folder_blue2.add_child(FactoryGirl.create(:vm_vmware, :name => "vm_blue2", :ems_id => ems.id)) + end + end + + let!(:start_time) { Time.now.utc } + + it "when a folder is created under a folder" do + new_folder = FactoryGirl.create(:vmware_folder_vm, :ems_id => ems.id) + new_folder.parent = folder_blue1 + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(0) + end + + it "when a folder is renamed" do + folder_blue1.update_attributes(:name => "new blue1") + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a folder is moved" do + folder_blue1.parent = folder_blue2 + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a VM is created under a folder" do + new_vm = FactoryGirl.create(:vm_vmware, :ems_id => ems.id) + new_vm.with_relationship_type("ems_metadata") { |v| v.parent = folder_blue1 } + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => new_vm.class.name, + :instance_id => new_vm.id, + :method_name => "post_create_actions" + ) + end + + it "when a VM is moved to another folder" do + vm_blue1.with_relationship_type("ems_metadata") { |v| v.parent = folder_blue2 } + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a folder is created and a folder is moved under it simultaneously" do + new_folder = FactoryGirl.create(:vmware_folder_vm, :ems_id => ems.id) + new_folder.parent = folder_vm_root + folder_blue1.parent = new_folder + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a folder is renamed and a folder is moved under it simultaneously" do + folder_blue1.update_attributes(:name => "new blue1") + folder_blue2.parent = folder_blue1 + + described_class.post_refresh_ems(ems.id, start_time) + + queue_items = MiqQueue.order(:instance_id) + expect(queue_items.count).to eq(2) + expect(queue_items[0]).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + expect(queue_items[1]).to have_attributes( + :class_name => vm_blue2.class.name, + :instance_id => vm_blue2.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a folder is created and a VM is moved under it simultaneously" do + new_folder = FactoryGirl.create(:vmware_folder_vm, :ems_id => ems.id) + new_folder.parent = folder_vm_root + vm_blue1.with_relationship_type("ems_metadata") { |v| v.parent = new_folder } + + described_class.post_refresh_ems(ems.id, start_time) + + expect(MiqQueue.count).to eq(1) + expect(MiqQueue.first).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + end + + it "when a folder is renamed and a VM is moved under it simultaneously" do + folder_blue2.update_attributes(:name => "new blue2") + vm_blue1.with_relationship_type("ems_metadata") { |v| v.parent = folder_blue2 } + + described_class.post_refresh_ems(ems.id, start_time) + + queue_items = MiqQueue.order(:instance_id) + expect(queue_items.count).to eq(2) + expect(queue_items[0]).to have_attributes( + :class_name => vm_blue1.class.name, + :instance_id => vm_blue1.id, + :method_name => "classify_with_parent_folder_path" + ) + expect(queue_items[1]).to have_attributes( + :class_name => vm_blue2.class.name, + :instance_id => vm_blue2.id, + :method_name => "classify_with_parent_folder_path" + ) + end + end end