Revision 611f5bff
Added by Amos Benari over 11 years ago
- ID 611f5bff49c1f06ae9ad0dd42b7566df9a02af2f
lib/foreman/threadsession.rb | ||
---|---|---|
unless o.nil? || o.is_a?(self)
|
||
raise(ArgumentError, "Unable to set current User, expected class '#{self}', got #{o.inspect}")
|
||
end
|
||
|
||
Rails.logger.debug "Setting current user thread-local variable to " + (o.is_a?(User) ? o.login : 'nil')
|
||
Thread.current[:user] = o
|
||
end
|
||
... | ... | |
#
|
||
# @param [String] login to find from the database
|
||
# @param [block] block to execute
|
||
def self.as(login, &do_block)
|
||
def self.as login
|
||
old_user = current
|
||
self.current = User.find_by_login(login)
|
||
do_block.call
|
||
yield if block_given?
|
||
ensure
|
||
self.current = old_user
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
# include this in the Organization model object
|
||
module OrganizationModel
|
||
def self.included(base)
|
||
base.class_eval do
|
||
def self.current
|
||
Thread.current[:organization]
|
||
end
|
||
|
||
def self.current=(organization)
|
||
unless organization.nil? || organization.is_a?(self)
|
||
raise(ArgumentError, "Unable to set current organization, expected class '#{self}', got #{organization.inspect}")
|
||
end
|
||
|
||
Rails.logger.debug "Setting current organization thread-local variable to #{organization || "none"}"
|
||
Thread.current[:organization] = organization
|
||
end
|
||
|
||
# Executes given block in the scope of an org:
|
||
#
|
||
# Organization.as_org organization do
|
||
# ...
|
||
# end
|
||
#
|
||
# @param [org]
|
||
# @param [block] block to execute
|
||
def self.as_org org
|
||
old_org = current
|
||
self.current = org
|
||
yield if block_given?
|
||
ensure
|
||
self.current = old_org
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
module LocationModel
|
||
def self.included(base)
|
||
base.class_eval do
|
||
def self.current
|
||
Thread.current[:location]
|
||
end
|
||
|
||
def self.current=(location)
|
||
unless location.nil? || location.is_a?(self)
|
||
raise(ArgumentError, "Unable to set current location, expected class '#{self}'. got #{location.inspect}")
|
||
end
|
||
|
||
Rails.logger.debug "Setting current location thread-local variable to #{location || "none"}"
|
||
Thread.current[:location] = location
|
||
end
|
||
|
||
# Executes given block without the scope of a location:
|
||
#
|
||
# Location.as_location location do
|
||
# ...
|
||
# end
|
||
#
|
||
# @param [location]
|
||
# @param [block] block to execute
|
||
def self.as_location location
|
||
old_location = current
|
||
self.current = location
|
||
yield if block_given?
|
||
ensure
|
||
self.current = old_location
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
end
|
||
end
|
Also available in: Unified diff
Add organization and location to foreman.
This feature allows foreman to provide multi location, multi tenant and
multi organizations capablities.
the idea is that resources within foreman (e.g. hosts, subnets, users,
environments etc) can belong to one or more locations and organization,
effectivily hidding resources from users.
Organization may contain multiple locations, and Locations can belong
to multiple Organization, this is an extermily flexiable design,
however, it is up to the user to allocate the resources across the
organizations and locations.
When creating new hosts, the resources that can be consumed are only
resources in which exists in both the currently used organization and location.
fixes #1578
fixes #1593