Class: Kontena::Cli::Services::ExecCommand

Inherits:
Kontena::Command show all
Includes:
Common, GridOptions, ServicesHelper
Defined in:
lib/kontena/cli/services/exec_command.rb

Instance Attribute Summary

Attributes inherited from Kontena::Command

#arguments, #exit_code, #result

Instance Method Summary collapse

Methods included from ServicesHelper

#create_service, #delete_service, #deploy_service, #get_service, #health_status, #health_status_icon, #int_to_filesize, #parse_build_args, #parse_container_name, #parse_deploy_opts, #parse_health_check, #parse_image, #parse_links, #parse_log_opts, #parse_memory, #parse_ports, #parse_relative_time, #parse_secrets, #parse_service_id, #render_service_deploy_instances, #restart_service, #scale_service, #show_service, #show_service_containers, #show_service_instances, #start_service, #stop_service, #update_service, #wait_for_deploy_to_finish

Methods included from Common

#access_token=, #add_master, #any_key_to_continue, #any_key_to_continue_with_timeout, #api_url, #api_url=, #api_url_version, #ask, #clear_current_grid, #client, #cloud_auth?, #cloud_client, #config, #confirm, #confirm_command, #current_account, #current_grid, #current_grid=, #current_master, #current_master=, #current_master_index, #display_account_login_info, #display_login_info, #display_logo, #display_master_login_info, #error, #exit_with_error, #kontena_account, #logger, #pastel, #print, #prompt, #puts, #require_api_url, #require_current_account, #require_current_grid, #require_current_master, #require_token, #reset_client, #reset_cloud_client, #running_silent?, #running_verbose?, #settings, #settings_filename, #spinner, #sprint, #sputs, #stdin_input, #use_refresh_token, #vfakespinner, #vputs, #vspinner, #warning, #yes?

Methods included from GridOptions

included

Methods inherited from Kontena::Command

banner, callback_matcher, #help_requested?, inherited, load_subcommand, requires_current_account_token, requires_current_account_token?, requires_current_grid, requires_current_grid?, requires_current_master, requires_current_master?, requires_current_master_token, requires_current_master_token?, #run, #run_callbacks, #verify_current_account_token, #verify_current_grid, #verify_current_master, #verify_current_master_token

Instance Method Details

#exec_container(container) ⇒ Object

Exits if exec returns with non-zero



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
# File 'lib/kontena/cli/services/exec_command.rb', line 23

def exec_container(container)
  if shell?
    cmd = ['sh', '-c', cmd_list.join(' ')]
  else
    cmd = cmd_list
  end

  stdout = stderr = exit_status = nil

  if !silent? && (verbose? || all?)
    spinner "Executing command on #{container['name']}" do
      stdout, stderr, exit_status = client.post("containers/#{container['id']}/exec", {cmd: cmd})

      raise Kontena::Cli::SpinAbort if exit_status != 0
    end
  else
    stdout, stderr, exit_status = client.post("containers/#{container['id']}/exec", {cmd: cmd})
  end

  stdout.each do |chunk| $stdout.write chunk end
  stderr.each do |chunk| $stderr.write chunk end

  exit exit_status if exit_status != 0 && !skip?

  return exit_status == 0
end

#execute ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/kontena/cli/services/exec_command.rb', line 50

def execute
  service_containers = client.get("services/#{parse_service_id(name)}/containers")['containers']
  service_containers.sort_by! { |container| container['instance_number'] }
  running_containers = service_containers.select{|container| container['status'] == 'running' }

  if running_containers.empty?
    exit_with_error "Service #{name} does not have any running containers"
  end

  if all?
    ret = true
    service_containers.each do |container|
      if container['status'] == 'running'
        if !exec_container(container)
          ret = false
        end
      else
        warning "Service #{name} container #{container['name']} is #{container['status']}, skipping"
      end
    end
    return ret
  elsif instance
    if !(container = service_containers.find{|container| container['instance_number'] == instance})
      exit_with_error "Service #{name} does not have container instance #{instance}"
    elsif container['status'] != 'running'
      exit_with_error "Service #{name} container #{container['name']} is not running, it is #{container['status']}"
    else
      exec_container(container)
    end
  else
    exec_container(running_containers.first)
  end
end