Class: CapistranoMulticonfigParallel::TerminalTable

Inherits:
Object
  • Object
show all
Includes:
ApplicationHelper, Celluloid, Celluloid::Logger, Celluloid::Notifications
Defined in:
lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb

Overview

class used to display the progress of each worker on terminal screen using a table rubocop:disable ClassLength

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ApplicationHelper

parse_task_string, strip_characters_from_string

Methods included from StagesHelper

check_stage_path, checks_paths, fetch_stages, fetch_stages_paths, stages_paths

Methods included from CoreHelper

app_configuration, app_debug_enabled?, app_logger, ask_confirm, check_terminal_tty, debug_websocket?, execute_with_rescue, find_config_type, find_loaded_gem, find_worker_log, force_confirmation, format_error, log_error, log_to_file, rescue_error, rescue_interrupt, show_warning, websocket_config, websocket_server_config

Methods included from InternalHelper

config_file, custom_commands, default_internal_config, detect_root, enable_main_log_file, find_env_multi_cap_root, internal_config_directory, internal_config_file, log_directory, main_log_file, root, try_detect_capfile

Constructor Details

#initialize(manager, job_manager) ⇒ TerminalTable

Returns a new instance of TerminalTable.



14
15
16
17
18
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 14

def initialize(manager, job_manager)
  @manager = manager
  @job_manager = job_manager
  async.run
end

Class Method Details

.topic ⇒ Object



10
11
12
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 10

def self.topic
  'sshkit_terminal'
end

Instance Method Details

#add_job_to_table(table, job_id, count) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 106

def add_job_to_table(table, job_id, count)
  worker = @manager.get_worker_for_job(job_id)
  details = get_worker_details(job_id, worker)

  row = [{ value: count.to_s },
         { value: job_id.to_s },
         { value: details['full_stage'] },
         { value: details['action_name'] },
         { value: details['env_options'] },
         { value: "#{details['state']}" }
        ]

  #   if  worker.alive?
  #     row << { value: worker.rake_tasks.size }
  #     row << { value: worker_progress(details, worker) }
  #   else
  #     row << { value: 0 }
  #     row << { value:  worker_state(worker) }
  #   end
  table.add_row(row)
  table.add_separator if @manager.jobs.keys.last.to_i != job_id.to_i
end

#get_worker_details(job_id, worker) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 90

def get_worker_details(job_id, worker)
  job = @manager.jobs[job_id]
  processed_job = @manager.process_job(job)

  {
    'job_id' => job_id,
    'app_name' => processed_job['app_name'],
    'env_name' => processed_job['env_name'],
    'full_stage' => worker_stage(processed_job),
    'action_name' => worker_action(processed_job),
    'env_options' => worker_env_options(processed_job),
    'task_arguments' => job['task_arguments'],
    'state' => worker_state(worker)
  }
end

#message_valid?(message) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 50

def message_valid?(message)
  message[:type].present? && message[:type] == 'output' || message[:type] == 'event'
end

#notify_time_change(topic, message) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 24

def notify_time_change(topic, message)
  return unless topic == CapistranoMulticonfigParallel::TerminalTable.topic
  default_headings = ['Job ID', 'Job UUID', 'App/Stage', 'Action', 'ENV Variables', 'Current Task']
  #   default_headings << 'Total'
  #   default_headings << 'Progress'
  table = Terminal::Table.new(title: 'Deployment Status Table', headings: default_headings)
  if @manager.jobs.present? && message_valid?(message)
    count = 0
    @manager.jobs.each do |job_id, _job|
      count += 1
      add_job_to_table(table, job_id, count)
    end
  end
  show_terminal_screen(table)
rescue => ex
  info "Terminal Table  client disconnected due to error #{ex.inspect}"
  info ex.backtrace
  terminate
end

#percent_of(index, total) ⇒ Object



152
153
154
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 152

def percent_of(index, total)
  index.to_f / total.to_f * 100.0
end

#run ⇒ Object



20
21
22
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 20

def run
  subscribe(CapistranoMulticonfigParallel::TerminalTable.topic, :notify_time_change)
end

#show_confirmation(message, default) ⇒ Object



44
45
46
47
48
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 44

def show_confirmation(message, default)
  exclusive do
    ask_confirm(message, default)
  end
end

#show_terminal_screen(table) ⇒ Object



54
55
56
57
58
59
60
61
62
63
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 54

def show_terminal_screen(table)
  return unless table.rows.present?
  terminal_clear
  puts "\n"
  #  table.style = { width: 20 }
  puts table
  puts "\n"
  sleep(1)
  @job_manager.condition.signal('completed') if @manager.all_workers_finished?
end

#show_worker_percent(worker, tasks, current_task) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 140

def show_worker_percent(worker, tasks, current_task)
  total_tasks = worker.alive? ? tasks.size : nil
  task_index = worker.alive? ? tasks.index(current_task.to_s).to_i + 1 : 0
  percent = percent_of(task_index, total_tasks)
  result  = "Progress [#{format('%.2f', percent)}%]  (executed #{task_index} of #{total_tasks})"
  if worker.alive?
    worker.crashed? ? result.red : result.green
  else
    worker_state(worker)
  end
end

#terminal_clear ⇒ Object



129
130
131
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 129

def terminal_clear
  system('cls') || system('clear') || puts("\e[H\e[2J")
end

#worker_action(processed_job) ⇒ Object



82
83
84
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 82

def worker_action(processed_job)
  processed_job['task_arguments'].present? ? "#{processed_job['action_name']}[#{processed_job['task_arguments'].join(',')}]" : processed_job['action_name']
end

#worker_env_options(processed_job) ⇒ Object



74
75
76
77
78
79
80
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 74

def worker_env_options(processed_job)
  worker_optons = ''
  processed_job['job_argv'].each do |elem|
    worker_optons << "#{elem}\n"
  end
  worker_optons
end

#worker_progress(_details, worker) ⇒ Object



133
134
135
136
137
138
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 133

def worker_progress(_details, worker)
  return worker_state(worker) unless worker.alive?
  tasks = worker.alive? ? worker.invocation_chain : []
  current_task = worker.alive? ? worker.machine.state.to_s : ''
  show_worker_percent(worker, tasks, current_task)
end

#worker_stage(processed_job) ⇒ Object



86
87
88
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 86

def worker_stage(processed_job)
  processed_job['app_name'].present? ? "#{processed_job['app_name']}\n#{processed_job['env_name']}" : "#{processed_job['env_name']}"
end

#worker_state(worker) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 65

def worker_state(worker)
  if worker.alive?
    state = worker.machine.state.to_s
    worker.crashed? ? state.red : state.green
  else
    'dead'.upcase.red
  end
end