fuel-astute/lib/astute/server/task_queue.rb

89 lines
2.3 KiB
Ruby

# Copyright 2013 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
require 'thread'
module Astute
module Server
class TaskQueue
include Enumerable
attr_reader :current_task_id
attr_reader :current_task_method
def initialize
@queue = []
@semaphore = Mutex.new
@current_task_id = nil
@current_task_method = nil
end
def add_task(data)
@semaphore.synchronize { data.compact.each { |t| @queue << t } }
end
def replace_task(replacing_task_id, new_task_data)
@semaphore.synchronize do
@queue.map! { |x| find_task_id(x) == replacing_task_id ? new_task_data : x }.flatten!
end
end
def remove_task(replacing_task_id)
replace_task(replacing_task_id, nil)
end
def clear_queue
@semaphore.synchronize { @queue.map! { |x| nil } }
end
def task_in_queue?(task_id)
@semaphore.synchronize { @queue.find { |t| find_task_id(t) == task_id } }
end
def each(&block)
@queue.each do |task|
@semaphore.synchronize do
next if task.nil?
@current_task_id = find_task_id(task)
@current_task_method = find_task_method(task)
end
if block_given?
block.call task
else
yield task
end
end
ensure
@semaphore.synchronize do
@current_task_id = nil
@current_task_method = nil
end
end
private
def find_task_id(data)
data && data['args'] && data['args']['task_uuid'] ? data['args']['task_uuid'] : nil
end
def find_task_method(data)
data && data['method']
end
end
end #Server
end #Astute