File: Task.rb

package info (click to toggle)
ruby-rbvmomi 1.8.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,756 kB
  • sloc: ruby: 5,590; sh: 36; makefile: 7
file content (65 lines) | stat: -rw-r--r-- 1,849 bytes parent folder | download | duplicates (3)
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