1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
class RbVmomi::VIM::Task
# Wait for a task to finish.
# @return +info.result+ on success.
# @raise +info.error+ on error.
def wait_for_completion
wait_until('info.state') { %w(success error).member? info.state }
case info.state
when 'success'
info.result
when 'error'
raise info.error
end
end
# Wait for all child tasks to finish. If any one child task failed,
# the exception of the first failing task is thrown.
# @return [Hash] Map of tasks to their +info.result+ on success.
# @raise +info.error+ on error.
def wait_for_childtask_completion
si = _connection.serviceInstance
tasks_props = si.wait_for_multiple_tasks(
['info.state', 'info.result', 'info.error'],
self.child_tasks
)
Hash[tasks_props.map do |task, props|
case props['info.state']
when 'success'
[task, props['info.result']]
when 'error'
raise props['info.error']
end
end]
end
# Wait for a task to finish, with progress notifications.
# @return (see #wait_for_completion)
# @raise (see #wait_for_completion)
# @yield [info.progress]
def wait_for_progress
wait_until('info.state', 'info.progress') do
yield info.progress if block_given?
%w(success error).member? info.state
end
case info.state
when 'success'
info.result
when 'error'
raise info.error
end
end
# Get child tasks of this task.
# @return [Array] List of VIM::Task objects
def child_tasks
tm = _connection.serviceContent.taskManager
col = tm.CreateCollectorForTasks(:filter => {
:rootTaskKey => [self.info.key],
})
# XXX: Likely this is not enough and we need to collect pages other
# than the latest.
tasks = col.latestPage.map{|x| x.task}
col.DestroyCollector()
tasks
end
end
|