From 4363d8e06706573652eca0107015aff6ca07338d Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 3 Nov 2014 09:27:28 -0800 Subject: [PATCH 1/4] Store template name in vmpooler__vm__$vm Redis hash --- lib/vmpooler/pool_manager.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index 4437d01..9cb2e5f 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -184,6 +184,7 @@ module Vmpooler # Add VM to Redis inventory ('pending' pool) $redis.sadd('vmpooler__pending__'+vm['template'], vm['hostname']) $redis.hset('vmpooler__vm__'+vm['hostname'], 'clone', Time.now) + $redis.hset('vmpooler__vm__'+vm['hostname'], 'template', vm['template']) # Annotate with creation time, origin template, etc. configSpec = RbVmomi::VIM.VirtualMachineConfigSpec( From 4035114152b3ab4931055b5fe93bcaf4b9b51397 Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 3 Nov 2014 09:28:40 -0800 Subject: [PATCH 2/4] Allow VM metadata to be queryable via 'GET' --- lib/vmpooler/api.rb | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/vmpooler/api.rb b/lib/vmpooler/api.rb index 7ab4a08..4ae70e4 100644 --- a/lib/vmpooler/api.rb +++ b/lib/vmpooler/api.rb @@ -228,16 +228,6 @@ module Vmpooler JSON.pretty_generate(result) end - get '/vm/:template/?' do - content_type :json - - result = {} - result[params[:template]] = {} - result[params[:template]]['hosts'] = $redis.smembers('vmpooler__ready__'+params[:template]) - - JSON.pretty_generate(result) - end - post '/vm/:template/?' do content_type :json @@ -296,6 +286,34 @@ module Vmpooler JSON.pretty_generate(result) end + get '/vm/:hostname/?' do + content_type :json + + result = {} + + result['ok'] = false + + if ( $config[:config]['domain'] and params[:hostname] =~ /^\w+\.#{$config[:config]['domain']}$/ ) + params[:hostname] = params[:hostname][/[^\.]+/] + end + + if $redis.exists('vmpooler__vm__'+params[:hostname]) + result['ok'] = true + + result[params[:hostname]] = {} + + result[params[:hostname]]['template'] = $redis.hget('vmpooler__vm__'+params[:hostname], 'template') + result[params[:hostname]]['lifetime'] = $redis.hget('vmpooler__vm__'+params[:hostname], 'lifetime') || $config[:config]['vm_lifetime'] + result[params[:hostname]]['running'] = ((Time.now - Time.parse($redis.hget('vmpooler__active__'+result[params[:hostname]]['template'], params[:hostname])))/60/60).round(2) + + if ( $config[:config]['domain'] ) + result[params[:hostname]]['domain'] = $config[:config]['domain'] + end + end + + JSON.pretty_generate(result) + end + delete '/vm/:hostname/?' do content_type :json @@ -325,6 +343,10 @@ module Vmpooler result['ok'] = false + if ( $config[:config]['domain'] and params[:hostname] =~ /^\w+\.#{$config[:config]['domain']}$/ ) + params[:hostname] = params[:hostname][/[^\.]+/] + end + if $redis.exists('vmpooler__vm__'+params[:hostname]) jdata = JSON.parse(request.body.read) From 489abd713a80f8c053bd513b6f05f5ee287f6d5b Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 3 Nov 2014 13:07:22 -0800 Subject: [PATCH 3/4] Wrap hostname-shortening into a [Sinatra helper] method --- lib/vmpooler/api.rb | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/vmpooler/api.rb b/lib/vmpooler/api.rb index 4ae70e4..40c9156 100644 --- a/lib/vmpooler/api.rb +++ b/lib/vmpooler/api.rb @@ -22,6 +22,16 @@ module Vmpooler set :environment, 'production' + helpers do + def hostname_shorten hostname + if ( $config[:config]['domain'] and hostname =~ /^\w+\.#{$config[:config]['domain']}$/ ) + hostname = hostname[/[^\.]+/] + end + + hostname + end + end + get '/' do erb :dashboard, locals: { site_name: $config[:config]['site_name'] || 'vmpooler', @@ -293,9 +303,7 @@ module Vmpooler result['ok'] = false - if ( $config[:config]['domain'] and params[:hostname] =~ /^\w+\.#{$config[:config]['domain']}$/ ) - params[:hostname] = params[:hostname][/[^\.]+/] - end + params[:hostname] = hostname_shorten(params[:hostname]) if $redis.exists('vmpooler__vm__'+params[:hostname]) result['ok'] = true @@ -321,9 +329,7 @@ module Vmpooler result['ok'] = false - if ( $config[:config]['domain'] and params[:hostname] =~ /^\w+\.#{$config[:config]['domain']}$/ ) - params[:hostname] = params[:hostname][/[^\.]+/] - end + params[:hostname] = hostname_shorten(params[:hostname]) $config[:pools].each do |pool| if $redis.sismember('vmpooler__running__'+pool['name'], params[:hostname]) @@ -343,9 +349,7 @@ module Vmpooler result['ok'] = false - if ( $config[:config]['domain'] and params[:hostname] =~ /^\w+\.#{$config[:config]['domain']}$/ ) - params[:hostname] = params[:hostname][/[^\.]+/] - end + params[:hostname] = hostname_shorten(params[:hostname]) if $redis.exists('vmpooler__vm__'+params[:hostname]) jdata = JSON.parse(request.body.read) From ce50f450f59baf9594ce8af6402af681c5509d96 Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 3 Nov 2014 13:13:34 -0800 Subject: [PATCH 4/4] Adding 'GET /vm/' documentation --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 574139a..b06717d 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,25 @@ $ curl -d --url vmpooler.company.com/vm/debian-7-i386+debian-7-i386+debian-7-x86 } ``` +#### GET /vm/<hostname%gt; + +Query a checked-out VM. + +``` +$ curl --url vmpooler.company.com/vm/pxpmtoonx7fiqg6 +``` +```json +{ + "ok": true, + "pxpmtoonx7fiqg6": { + "template": "centos-6-x86_64", + "lifetime": 12, + "running": 3, + "domain": "company.com" + } +} +``` + #### PUT /vm/<hostname> Modify a checked-out VM.