Skip to content

Commit

Permalink
Merge pull request ManageIQ#11992 from Fryguy/evm_owner_regionally
Browse files Browse the repository at this point in the history
Fix ownership to work across multiple regions.
  • Loading branch information
carbonin committed Oct 19, 2016
2 parents 63996cc + fd2a3da commit 76f78dc
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 3 deletions.
16 changes: 13 additions & 3 deletions app/models/mixins/ownership_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,25 @@ def set_ownership(ids, options)

def user_or_group_owned(user, miq_group)
if user && miq_group
where("evm_owner_id" => user.id).or(where("miq_group_id" => miq_group.id))
user_owned(user).or(group_owned(miq_group))
elsif user
where("evm_owner_id" => user.id)
user_owned(user)
elsif miq_group
where("miq_group_id" => miq_group.id)
group_owned(miq_group)
else
none
end
end

private

def user_owned(user)
where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_attribute(:evm_owner_userid)]).eq(user.userid)))
end

def group_owned(miq_group)
where(:miq_group_id => miq_group.id)
end
end

def owned_by_current_user
Expand Down
54 changes: 54 additions & 0 deletions spec/support/examples_group/shared_examples_for_ownership_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,60 @@
end
end

describe ".user_or_group_owned" do
let(:factory) { described_class.name == "Vm" ? :vm_vmware : described_class.table_name.singularize }
let(:owned_resource) { FactoryGirl.create(factory) }
let(:owning_user) {
FactoryGirl.create :user, :userid => "user_owner", :miq_groups => FactoryGirl.create_list(:miq_group, 1)
}

context "by user in this region" do
it "returns resource owned by user" do
owned_resource.evm_owner = owning_user
owned_resource.save!

expect(described_class.user_or_group_owned(owning_user, nil)).to eq([owned_resource])
end

it "returns resource owned by user or group" do
owned_resource.evm_owner = owning_user
owned_resource.save!

expect(described_class.user_or_group_owned(owning_user, owning_user.current_group)).to eq([owned_resource])
end
end

context "by user in a remote region" do
let(:remote_owning_user) { FactoryGirl.create :user, :id => remote_id, :userid => "user_owner" }
let(:remote_id) do
my_region_number = ApplicationRecord.my_region_number
remote_region_number = my_region_number + 1
ApplicationRecord.region_to_range(remote_region_number).first
end

it "returns resource owned by user" do
owned_resource.id = remote_id
owned_resource.evm_owner = remote_owning_user
owned_resource.save!

expect(owned_resource.evm_owner_id).not_to eq(owning_user.id)
expect(described_class.user_or_group_owned(owning_user, nil)).to eq([owned_resource])
end

it "returns resource owned by user or group" do
remote_owning_user.current_group = remote_owning_user.miq_groups.first
remote_owning_user.save!

owned_resource.id = remote_id
owned_resource.evm_owner = remote_owning_user
owned_resource.save!

expect(owned_resource.evm_owner_id).not_to eq(owning_user.id)
expect(described_class.user_or_group_owned(owning_user, owning_user.current_group)).to eq([owned_resource])
end
end
end

describe ".owned_by_current_user" do
before { User.current_user = user }

Expand Down

0 comments on commit 76f78dc

Please sign in to comment.