Merge pull request #137 from sschneid/token_vm_list

(QENG-2995) Display associated VMs in GET /token/:token endpoint
This commit is contained in:
Michael Stahnke 2015-11-05 10:36:15 -08:00
commit 36f83fef82
3 changed files with 34 additions and 24 deletions

14
API.md
View file

@ -40,18 +40,24 @@ Enter host password for user 'jdoe':
##### GET /token/<token> ##### GET /token/<token>
Get information about an existing token. Get information about an existing token (including associated VMs).
``` ```
$ curl -u jdoe --url vmpooler.company.com/api/v1/token/utpg2i2xswor6h8ttjhu3d47z53yy47y $ curl --url vmpooler.company.com/api/v1/token/utpg2i2xswor6h8ttjhu3d47z53yy47y
Enter host password for user 'jdoe':
``` ```
```json ```json
{ {
"ok": true, "ok": true,
"utpg2i2xswor6h8ttjhu3d47z53yy47y": { "utpg2i2xswor6h8ttjhu3d47z53yy47y": {
"user": "jdoe", "user": "jdoe",
"timestamp": "2015-04-28 19:17:47 -0700" "created": "2015-04-28 19:17:47 -0700",
"last": "2015-11-04 12:28:37 -0700",
"vms": {
"running": [
"dqs4914g2wjyy5w",
"hul7ib0ssr0f4o0"
]
}
} }
} }
``` ```

View file

@ -201,17 +201,22 @@ module Vmpooler
result = { 'ok' => false } result = { 'ok' => false }
if Vmpooler::API.settings.config[:auth] if Vmpooler::API.settings.config[:auth]
status 401
need_auth!
token = backend.hgetall('vmpooler__token__' + params[:token]) token = backend.hgetall('vmpooler__token__' + params[:token])
if not token.nil? and not token.empty? if not token.nil? and not token.empty?
status 200 status 200
pools.each do |pool|
backend.smembers('vmpooler__running__' + pool['name']).each do |vm|
if backend.hget('vmpooler__vm__' + vm, 'token:token') == params[:token]
token['vms'] ||= {}
token['vms']['running'] ||= []
token['vms']['running'].push(vm)
end
end
end
result = { 'ok' => true, params[:token] => token } result = { 'ok' => true, params[:token] => token }
else
status 404
end end
end end

View file

@ -120,24 +120,23 @@ describe Vmpooler::API::V1 do
end end
context '(auth configured)' do context '(auth configured)' do
before do let(:config) { {
allow(redis).to receive(:hgetall).and_return 'atoken' auth: true,
end pools: [
{'name' => 'pool1', 'size' => 5}
]
} }
let(:config) { { auth: true } } it 'returns a token' do
expect(redis).to receive(:hgetall).with('vmpooler__token__this').and_return({'user' => 'admin'})
it 'returns a 401 if not authed' do expect(redis).to receive(:smembers).with('vmpooler__running__pool1').and_return(['vmhostname'])
get "#{prefix}/token/this" expect(redis).to receive(:hget).with('vmpooler__vm__vmhostname', 'token:token').and_return('this')
expect_json(ok = false, http = 401)
end
it 'returns a token if authed' do
authorize 'admin', 's3cr3t'
get "#{prefix}/token/this" get "#{prefix}/token/this"
expect(last_response.body).to include('"this": "atoken"') expect(JSON.parse(last_response.body)['ok']).to eq(true)
expect(JSON.parse(last_response.body)['this']['user']).to eq('admin')
expect(JSON.parse(last_response.body)['this']['vms']['running']).to include('vmhostname')
expect_json(ok = true, http = 200) expect_json(ok = true, http = 200)
end end