diff --git a/README.md b/README.md index 4588384..1824a14 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,15 @@ $ curl --url vmpooler.company.com/vm/pxpmtoonx7fiqg6 Modify a checked-out VM. +The following are valid PUT parameters and their required data structures: + +parameter | description | required structure +--------- | ----------- | ------------------ +*lifetime* | VM TTL (in hours) | integer +*tags* | free-form VM tagging | hash + +Any modifications can be verified using the [GET /vm/<hostname>](#get-vmhostname) endpoint. + ``` $ curl -X PUT -d '{"lifetime":"2"}' --url vmpooler.company.com/vm/fq6qlpjlsskycq6 ``` @@ -177,6 +186,15 @@ $ curl -X PUT -d '{"lifetime":"2"}' --url vmpooler.company.com/vm/fq6qlpjlsskycq } ``` +``` +$ curl -X PUT -d '{"tags":{"department":"engineering","user":"sschneid"}}' --url vmpooler.company.com/vm/fq6qlpjlsskycq6 +``` +```json +{ + "ok": true +} +``` + ##### DELETE /vm/<hostname> Schedule a checked-out VM for deletion. diff --git a/lib/vmpooler/api/v1.rb b/lib/vmpooler/api/v1.rb index 0134b8c..e54979d 100644 --- a/lib/vmpooler/api/v1.rb +++ b/lib/vmpooler/api/v1.rb @@ -445,12 +445,21 @@ module Vmpooler status 200 result['ok'] = true + rdata = $redis.hgetall('vmpooler__vm__' + params[:hostname]) + 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]]['template'] = rdata['template'] + result[params[:hostname]]['lifetime'] = rdata['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) + rdata.keys.each do |key| + if key.match('^tag\:(.+?)$') + result[params[:hostname]]['tags'] ||= {} + result[params[:hostname]]['tags'][$1] = rdata[key] + end + end + if $config[:config]['domain'] result[params[:hostname]]['domain'] = $config[:config]['domain'] end @@ -485,6 +494,8 @@ module Vmpooler put "#{api_prefix}/vm/:hostname/?" do content_type :json + failure = false + result = {} status 404 @@ -495,19 +506,41 @@ module Vmpooler if $redis.exists('vmpooler__vm__' + params[:hostname]) jdata = JSON.parse(request.body.read) + # Validate data payload jdata.each do |param, arg| case param when 'lifetime' - arg = arg.to_i - - if arg > 0 - $redis.hset('vmpooler__vm__' + params[:hostname], param, arg) - - status 200 - result['ok'] = true + unless arg.to_i > 0 + failure = true end + when 'tags' + unless arg.is_a?(Hash) + failure = true + end + else + failure = true end end + + if failure + status 400 + else + jdata.each do |param, arg| + case param + when 'lifetime' + arg = arg.to_i + + $redis.hset('vmpooler__vm__' + params[:hostname], param, arg) + when 'tags' + arg.keys.each do |tag| + $redis.hset('vmpooler__vm__' + params[:hostname], 'tag:' + tag, arg[tag]) + end + end + end + + status 200 + result['ok'] = true + end end JSON.pretty_generate(result)