Experimental library for managing Aviator sessions.
require'aviator'require'aviator/session_pool'Aviator::SessionPool.configure(config_file: 'path/to/aviator.yml',environment: :production,log_file: 'path/to/aviator.log',redis_host: 'localhost',redis_port: 6785)#==================# LOGIN CONTROLLER#==================# Create an unscoped sessionAviator::SessionPool.get_or_create(session[:session_id])do |creds|
creds.username=usernamecreds.password=passwordend# Moments pass...# Now the user is requesting access to a specific project/tenant#===============================# IN A CONTROLLER BEFORE_FILTER#===============================# Attempt to get the unscoped session which is an indicator that# the user has been previously authenticated.## When getting a session from the pool, SessionPool calls the# object's validate method. If that method returns false, then# SessionPool will return nil. If there is no session with the# given key, SessionPool will also return nil.unlessunscoped=Aviator::SessionPool.get(session[:session_id])# This means the user is not yet authenticated or# her session with OpenStack has expired. Do the ff:# - Log out user# - Redirect user to login pageend#=====================================# IN ANOTHER CONTROLLER BEFORE_FILTER#=====================================# Since user is asking for resources for a specific tenant, let's# get a session scoped to that tenant.Aviator::SessionPool.get_or_create(session[:session_id] + tenant_name.underscore)do |creds|
creds.token_id=unscoped[:auth_info][:access][:token][:id]creds.tenant_name=tenant_nameend# scoped will have to be shared between the controller and# whichever model or object will need to use it. Aviator::SessionPool.set_current(session[:session_id] + tenant_name.underscore)#=========================# IN SOME MODEL OR OBJECT#=========================# Use current session like any other Aviator session. If set_current was not# called prior to this, get_current will raise a CurrentSessionNotDefinedError## WARNING: Since get_current uses a class instance variable, it will contain# a value between http requests whether set_current was called or not for as long# as it was called at least once.Aviator::SessionPool.get_current.compute_service.request(:list_servers)# Maintaining an admin session# Authentication will use credentials in the config file since# a block is not provided in this call.admin=Aviator::SessionPool.get_or_create('admin')#=========================# IN SOME MODEL OR OBJECT#=========================# Use the admin sessionAviator::SessionPool.get_or_create('admin').identity_service.request(:list_tenants,endpoint_type: :admin)
