mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 10:08:40 -05:00
Merge pull request #339 from mattkirby/pooler_150
(POOLER-150) Synchronize checkout operations for API
This commit is contained in:
commit
a6e3e3a98f
6 changed files with 27 additions and 14 deletions
|
|
@ -14,6 +14,7 @@ git logs & PR history.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Correctly detect create\_linked\_clone on a pool level (POOLER-147)
|
- Correctly detect create\_linked\_clone on a pool level (POOLER-147)
|
||||||
|
- Ensure that checkout operations are synchronized
|
||||||
|
|
||||||
# [0.7.0](https://github.com/puppetlabs/vmpooler/compare/0.6.3...0.7.0)
|
# [0.7.0](https://github.com/puppetlabs/vmpooler/compare/0.6.3...0.7.0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,8 @@ if torun.include? 'api'
|
||||||
api = Thread.new do
|
api = Thread.new do
|
||||||
thr = Vmpooler::API.new
|
thr = Vmpooler::API.new
|
||||||
redis = Vmpooler.new_redis(redis_host, redis_port, redis_password)
|
redis = Vmpooler.new_redis(redis_host, redis_port, redis_password)
|
||||||
thr.helpers.configure(config, redis, metrics)
|
checkoutlock = Mutex.new
|
||||||
|
thr.helpers.configure(config, redis, metrics, checkoutlock)
|
||||||
thr.helpers.execute!
|
thr.helpers.execute!
|
||||||
end
|
end
|
||||||
torun_threads << api
|
torun_threads << api
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,11 @@ module Vmpooler
|
||||||
use Vmpooler::API::Reroute
|
use Vmpooler::API::Reroute
|
||||||
use Vmpooler::API::V1
|
use Vmpooler::API::V1
|
||||||
|
|
||||||
def configure(config, redis, metrics)
|
def configure(config, redis, metrics, checkoutlock)
|
||||||
self.settings.set :config, config
|
self.settings.set :config, config
|
||||||
self.settings.set :redis, redis
|
self.settings.set :redis, redis
|
||||||
self.settings.set :metrics, metrics
|
self.settings.set :metrics, metrics
|
||||||
|
self.settings.set :checkoutlock, checkoutlock
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute!
|
def execute!
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,10 @@ module Vmpooler
|
||||||
validate_token(backend)
|
validate_token(backend)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def checkoutlock
|
||||||
|
Vmpooler::API::settings.checkoutlock
|
||||||
|
end
|
||||||
|
|
||||||
def fetch_single_vm(template)
|
def fetch_single_vm(template)
|
||||||
template_backends = [template]
|
template_backends = [template]
|
||||||
aliases = Vmpooler::API.settings.config[:alias]
|
aliases = Vmpooler::API.settings.config[:alias]
|
||||||
|
|
@ -67,21 +71,23 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
template_backends.each do |template_backend|
|
checkoutlock.synchronize do
|
||||||
vms = backend.smembers("vmpooler__ready__#{template_backend}")
|
template_backends.each do |template_backend|
|
||||||
next if vms.empty?
|
vms = backend.smembers("vmpooler__ready__#{template_backend}")
|
||||||
vms.reverse.each do |vm|
|
next if vms.empty?
|
||||||
ready = vm_ready?(vm, config['domain'])
|
vms.reverse.each do |vm|
|
||||||
if ready
|
ready = vm_ready?(vm, config['domain'])
|
||||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm)
|
if ready
|
||||||
return [vm, template_backend, template]
|
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm)
|
||||||
else
|
return [vm, template_backend, template]
|
||||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm)
|
else
|
||||||
metrics.increment("checkout.nonresponsive.#{template_backend}")
|
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm)
|
||||||
|
metrics.increment("checkout.nonresponsive.#{template_backend}")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
[nil, nil, nil]
|
||||||
end
|
end
|
||||||
[nil, nil, nil]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def return_vm_to_ready_state(template, vm)
|
def return_vm_to_ready_state(template, vm)
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,14 @@ describe Vmpooler::API::V1 do
|
||||||
}
|
}
|
||||||
let(:current_time) { Time.now }
|
let(:current_time) { Time.now }
|
||||||
let(:vmname) { 'abcdefghijkl' }
|
let(:vmname) { 'abcdefghijkl' }
|
||||||
|
let(:checkoutlock) { Mutex.new }
|
||||||
|
|
||||||
before(:each) do
|
before(:each) do
|
||||||
app.settings.set :config, config
|
app.settings.set :config, config
|
||||||
app.settings.set :redis, redis
|
app.settings.set :redis, redis
|
||||||
app.settings.set :metrics, metrics
|
app.settings.set :metrics, metrics
|
||||||
app.settings.set :config, auth: false
|
app.settings.set :config, auth: false
|
||||||
|
app.settings.set :checkoutlock, checkoutlock
|
||||||
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
|
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,14 @@ describe Vmpooler::API::V1 do
|
||||||
|
|
||||||
let(:current_time) { Time.now }
|
let(:current_time) { Time.now }
|
||||||
let(:socket) { double('socket') }
|
let(:socket) { double('socket') }
|
||||||
|
let(:checkoutlock) { Mutex.new }
|
||||||
|
|
||||||
before(:each) do
|
before(:each) do
|
||||||
app.settings.set :config, config
|
app.settings.set :config, config
|
||||||
app.settings.set :redis, redis
|
app.settings.set :redis, redis
|
||||||
app.settings.set :metrics, metrics
|
app.settings.set :metrics, metrics
|
||||||
app.settings.set :config, auth: false
|
app.settings.set :config, auth: false
|
||||||
|
app.settings.set :checkoutlock, checkoutlock
|
||||||
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
|
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue