Merge pull request #125 from sschneid/token_last

Track token use times
This commit is contained in:
Justin Stoller 2015-08-20 20:31:33 -07:00
commit 9ae19e0d4d
3 changed files with 31 additions and 14 deletions

View file

@ -15,7 +15,11 @@ module Vmpooler
end end
def validate_token(backend) def validate_token(backend)
return if valid_token?(backend) if valid_token?(backend)
backend.hset('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'last', Time.now)
return true
end
content_type :json content_type :json

View file

@ -20,10 +20,6 @@ module Vmpooler
Vmpooler::API.settings.config[:pools] Vmpooler::API.settings.config[:pools]
end end
def has_valid_token?
valid_token?(backend)
end
def need_auth! def need_auth!
validate_auth(backend) validate_auth(backend)
end end
@ -180,7 +176,9 @@ module Vmpooler
token = key.split('__').last token = key.split('__').last
result[token] ||= {} result[token] ||= {}
result[token]['created'] = data['timestamp']
result[token]['created'] = data['created']
result[token]['last'] = data['last'] || 'never'
result['ok'] = true result['ok'] = true
end end
@ -255,7 +253,7 @@ module Vmpooler
result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
backend.hset('vmpooler__token__' + result['token'], 'user', @auth.username) backend.hset('vmpooler__token__' + result['token'], 'user', @auth.username)
backend.hset('vmpooler__token__' + result['token'], 'timestamp', Time.now) backend.hset('vmpooler__token__' + result['token'], 'created', Time.now)
status 200 status 200
result['ok'] = true result['ok'] = true
@ -307,7 +305,9 @@ module Vmpooler
backend.hset('vmpooler__active__' + key, vm, Time.now) backend.hset('vmpooler__active__' + key, vm, Time.now)
backend.hset('vmpooler__vm__' + vm, 'checkout', Time.now) backend.hset('vmpooler__vm__' + vm, 'checkout', Time.now)
if Vmpooler::API.settings.config[:auth] and has_valid_token? if Vmpooler::API.settings.config[:auth] and has_token?
validate_token(backend)
backend.hset('vmpooler__vm__' + vm, 'token:token', request.env['HTTP_X_AUTH_TOKEN']) backend.hset('vmpooler__vm__' + vm, 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
backend.hset('vmpooler__vm__' + vm, 'token:user', backend.hset('vmpooler__vm__' + vm, 'token:user',
backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user') backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user')
@ -352,17 +352,17 @@ module Vmpooler
content_type :json content_type :json
result = {} result = {}
request = {} payload = {}
params[:template].split('+').each do |template| params[:template].split('+').each do |template|
request[template] ||= 0 payload[template] ||= 0
request[template] = request[template] + 1 payload[template] = payload[template] + 1
end end
available = 1 available = 1
request.keys.each do |template| payload.keys.each do |template|
if backend.scard('vmpooler__ready__' + template) < request[template] if backend.scard('vmpooler__ready__' + template) < payload[template]
available = 0 available = 0
end end
end end
@ -382,6 +382,19 @@ module Vmpooler
backend.hset('vmpooler__active__' + template, vm, Time.now) backend.hset('vmpooler__active__' + template, vm, Time.now)
backend.hset('vmpooler__vm__' + vm, 'checkout', Time.now) backend.hset('vmpooler__vm__' + vm, 'checkout', Time.now)
if Vmpooler::API.settings.config[:auth] and has_token?
validate_token(backend)
backend.hset('vmpooler__vm__' + vm, 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
backend.hset('vmpooler__vm__' + vm, 'token:user',
backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user')
)
if config['vm_lifetime_auth'].to_i > 0
backend.hset('vmpooler__vm__' + vm, 'lifetime', config['vm_lifetime_auth'].to_i)
end
end
result[template] ||= {} result[template] ||= {}
if result[template]['hostname'] if result[template]['hostname']

View file

@ -49,7 +49,7 @@ describe Vmpooler::API::V1 do
it 'returns a list of tokens if authed' do it 'returns a list of tokens if authed' do
expect(redis).to receive(:keys).with('vmpooler__token__*').and_return(["vmpooler__token__abc"]) expect(redis).to receive(:keys).with('vmpooler__token__*').and_return(["vmpooler__token__abc"])
expect(redis).to receive(:hgetall).with('vmpooler__token__abc').and_return({"user" => "admin", "timestamp" => "now"}) expect(redis).to receive(:hgetall).with('vmpooler__token__abc').and_return({"user" => "admin", "created" => "now"})
authorize 'admin', 's3cr3t' authorize 'admin', 's3cr3t'