Class: Bosh::Cli::TaskTracking::TaskTracker
- Defined in:
- lib/cli/task_tracking/task_tracker.rb
Overview
This class is responsible for tracking director tasks
Constant Summary collapse
- MAX_POLLS =
not limited
nil
- DEFAULT_POLL_INTERVAL =
second
1
Instance Attribute Summary collapse
-
#output ⇒ Object
readonly
Returns the value of attribute output.
-
#renderer ⇒ Object
readonly
Returns the value of attribute renderer.
Instance Method Summary collapse
-
#initialize(director, task_id, options = {}) ⇒ TaskTracker
constructor
A new instance of TaskTracker.
- #poll ⇒ Object
- #print_task_summary(task_status) ⇒ Object
- #prompt_for_debug_log ⇒ Object
- #prompt_for_task_cancel ⇒ Object
-
#track ⇒ Symbol
Tracks director task.
Constructor Details
#initialize(director, task_id, options = {}) ⇒ TaskTracker
Returns a new instance of TaskTracker.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 13 def initialize(director, task_id, = {}) @director = director @task_id = task_id @options = @quiet = !![:quiet] default_log_type = @quiet ? 'none' : 'event' @log_type = [:log_type] || default_log_type @output = nil @task = Bosh::Cli::DirectorTask.new(@director, @task_id, @log_type) if [:renderer] @renderer = [:renderer] elsif [:raw_output] @renderer = TaskLogRenderer.new else @renderer = TaskLogRenderer.create_for_log_type(@log_type) end @poll_interval = Bosh::Cli::Config.poll_interval || DEFAULT_POLL_INTERVAL end |
Instance Attribute Details
#output ⇒ Object (readonly)
Returns the value of attribute output.
7 8 9 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 7 def output @output end |
#renderer ⇒ Object (readonly)
Returns the value of attribute renderer.
8 9 10 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 8 def renderer @renderer end |
Instance Method Details
#poll ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 52 def poll polls = 0 while true polls += 1 state = @task.state output = @task.output output_received(output) @renderer.refresh if finished?(state) return state.to_sym elsif MAX_POLLS && polls >= MAX_POLLS return :track_timeout end sleep(@poll_interval) end :unknown rescue Interrupt # Local ctrl-c handler prompt_for_task_cancel end |
#print_task_summary(task_status) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 108 def print_task_summary(task_status) output_received(@task.flush_output) @renderer.finish(task_status) nl say("Task #{@task_id} #{task_status.to_s.make_yellow}") if task_status == :done && @renderer.duration_known? nl say("Started\t\t#{@renderer.started_at.utc.to_s}") say("Finished\t#{@renderer.finished_at.utc.to_s}") say("Duration\t#{format_time(@renderer.duration).make_yellow}") end end |
#prompt_for_debug_log ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 77 def prompt_for_debug_log return unless interactive? nl confirm = ask('The task has returned an error status, ' + 'do you want to see debug log? [Yn]: ') if confirm.empty? || confirm =~ /y(es)?/i self.class.new(@director, @task_id, @options.merge(:log_type => 'debug')).track else say("Please use 'bosh task #{@task_id}' command ".make_red + 'to see the debug log'.make_red) end end |
#prompt_for_task_cancel ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 91 def prompt_for_task_cancel return unless interactive? nl confirm = ask("Do you want to cancel task #{@task_id}? [yN] " + '(^C again to detach): ') if confirm =~ /y(es)?/i say("Cancelling task #{@task_id}...") @director.cancel_task(@task_id) end poll rescue Interrupt nl err("Task #{@task_id} is still running") end |
#track ⇒ Symbol
Tracks director task. Blocks until task is in one of the ‘finished’ states (done, error, cancelled). Handles Ctrl+C by prompting to cancel task.
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/cli/task_tracking/task_tracker.rb', line 41 def track nl @renderer.time_adjustment = @director.get_time_difference say("Director task #{@task_id.to_s.make_yellow}") task_status = poll print_task_summary(task_status) task_status end |