module Kontena::Cli::Common

Public Class Methods

exit_with_error(msg, code = 1) click to toggle source
# File lib/kontena/cli/common.rb, line 165
def exit_with_error(msg, code = 1)
  error = pastel.red('error')
  $stderr.puts " [#{error}] #{msg}"
  exit code
end

Public Instance Methods

access_token=(token) click to toggle source
# File lib/kontena/cli/common.rb, line 289
def access_token=(token)
  require_current_master.token.access_token = token
  config.write
end
add_master(server_name, master_info) click to toggle source
# File lib/kontena/cli/common.rb, line 294
def add_master(server_name, master_info)
  config.add_server(master_info.merge('name' => server_name))
end
any_key_to_continue(timeout = nil) click to toggle source
# File lib/kontena/cli/common.rb, line 304
def any_key_to_continue(timeout = nil)
  return nil if running_silent?
  return nil unless $stdout.tty?
  return any_key_to_continue_with_timeout(timeout) if timeout
  prompt.keypress("Press any key to continue or ctrl-c to cancel.. ")
end
any_key_to_continue_with_timeout(timeout=9) click to toggle source
# File lib/kontena/cli/common.rb, line 298
def any_key_to_continue_with_timeout(timeout=9)
  return nil if running_silent?
  return nil unless $stdout.tty?
  prompt.keypress("Press any key to continue or ctrl-c to cancel (Automatically continuing in :countdown seconds) ...", timeout: timeout)
end
api_url() click to toggle source
# File lib/kontena/cli/common.rb, line 243
def api_url
  config.require_current_master.url
end
api_url=(api_url) click to toggle source
# File lib/kontena/cli/common.rb, line 284
def api_url=(api_url)
  config.current_master.url = api_url
  config.write
end
caret(msg, dots: true) click to toggle source

Output a message like: “> Reading foofoo ..” @param message [String] the message to display @param dots [TrueClass,FalseClass] set to false if you don't want to add “..” after the message

# File lib/kontena/cli/common.rb, line 127
def caret(msg, dots: true)
  puts "#{pastel.green('>')} #{msg}#{" #{pastel.green('..')}" if dots}"
end
clear_current_grid() click to toggle source
# File lib/kontena/cli/common.rb, line 247
def clear_current_grid
  current_master.delete_field(:grid) if require_current_master.respond_to?(:grid)
  config.write
end
client(token = nil, api_url = nil) click to toggle source
# File lib/kontena/cli/common.rb, line 224
def client(token = nil, api_url = nil)
  return @client if @client

  if token.kind_of?(String)
    token = Kontena::Cli::Config::Token.new(access_token: token)
  end

  @client = Kontena::Client.new(
    api_url || require_current_master.url,
    token || require_current_master.token,
    ssl_cert_path: require_current_master.ssl_cert_path,
    ssl_subject_cn: require_current_master.ssl_subject_cn,
  )
end
cloud_auth?() click to toggle source
# File lib/kontena/cli/common.rb, line 209
def cloud_auth?
  return false unless kontena_account
  return false unless kontena_account.token
  return false unless kontena_account.token.access_token
  true
end
cloud_client() click to toggle source
# File lib/kontena/cli/common.rb, line 216
def cloud_client
  @cloud_client ||= Kontena::Client.new(kontena_account.url, kontena_account.token, prefix: '/')
end
config() click to toggle source
# File lib/kontena/cli/common.rb, line 39
def config
  Kontena::Cli::Config.instance
end
confirm(message = 'Destructive command. You can skip this prompt by running this command with --force option. Are you sure?') click to toggle source
# File lib/kontena/cli/common.rb, line 276
def confirm(message = 'Destructive command. You can skip this prompt by running this command with --force option. Are you sure?')
  if self.respond_to?(:force?) && self.force?
    return
  end
  exit_with_error 'Command requires --force' unless $stdout.tty? && $stdin.tty?
  prompt.yes?(message) || error('Aborted command.')
end
confirm_command(name, message = nil) click to toggle source
# File lib/kontena/cli/common.rb, line 265
def confirm_command(name, message = nil)
  if self.respond_to?(:force?) && self.force?
    return
  end
  puts message if message
  exit_with_error 'Command requires --force' unless $stdout.tty? && $stdin.tty?
  puts "Destructive command. To proceed, type \"#{name}\" or re-run this command with --force option."

  ask("Enter '#{name}' to confirm: ") == name.to_s || error("Confirmation did not match #{name}. Aborted command.")
end
current_grid() click to toggle source
# File lib/kontena/cli/common.rb, line 252
def current_grid
  (self.respond_to?(:grid) ? self.grid : nil) || config.current_grid
end
current_master_index() click to toggle source
# File lib/kontena/cli/common.rb, line 256
def current_master_index
  config.find_server_index(require_current_master.name)
end
debug?() click to toggle source
# File lib/kontena/cli/common.rb, line 43
def debug?
  Kontena.debug?
end
display_account_login_info() click to toggle source
# File lib/kontena/cli/common.rb, line 311
def display_account_login_info
  if kontena_account
    if kontena_account.token && kontena_account.token.access_token
      begin
        puts [
          pastel.green("Authenticated to Kontena Cloud at"),
          pastel.yellow(kontena_account.url),
          pastel.green("as"),
          pastel.yellow(kontena_account.username)
        ].join(' ')
      rescue
      end
    else
      puts pastel.cyan("Not authenticated to Kontena Cloud")
    end
  end
end
display_login_info(only: nil) click to toggle source
# File lib/kontena/cli/common.rb, line 349
def display_login_info(only: nil)
  display_master_login_info  unless only == :account
  display_account_login_info unless only == :master
end
display_master_login_info() click to toggle source
# File lib/kontena/cli/common.rb, line 329
def display_master_login_info
  server = config.current_master
  if server
    if server.token && server.token.access_token
      puts [
        pastel.green('Authenticated to Kontena Master'),
        pastel.yellow(server.name),
        pastel.green('at'),
        pastel.yellow(server.url),
        pastel.green('as'),
        pastel.yellow(server.token.username || server.username)
      ].join(' ')
    else
      puts pastel.cyan("Not authenticated to current master #{server.name}")
    end
  else
    puts pastel.cyan("Current master not selected")
  end
end
error(message = "Error") click to toggle source
# File lib/kontena/cli/common.rb, line 260
def error(message = "Error")
  prompt.error(message)
  exit(1)
end
kontena_account() click to toggle source
# File lib/kontena/cli/common.rb, line 205
def kontena_account
  @kontena_account ||= config.current_account
end
logger() click to toggle source
# File lib/kontena/cli/common.rb, line 23
def logger
  Kontena.logger
end
pastel() click to toggle source
# File lib/kontena/cli/common.rb, line 31
def pastel
  Kontena.pastel
end
print(*msgs) click to toggle source

Print that doesn't print if self.silent?

Calls superclass method
prompt() click to toggle source
# File lib/kontena/cli/common.rb, line 27
def prompt
  Kontena.prompt
end
puts(*msgs) click to toggle source

Puts that doesn't puts if self.silent?

Calls superclass method
# File lib/kontena/cli/common.rb, line 92
def puts(*msgs)
  if running_silent?
    msgs.compact.each { |msg| logger.debug(msg) }
  elsif Thread.main['spinners'] && !Thread.main['spinners'].empty?
    Thread.main['spinner_msgs'] ||= []
    msgs.each { |msg| Thread.main['spinner_msgs'] << msg }
  else
    super(*msgs)
  end
end
require_api_url() click to toggle source
# File lib/kontena/cli/common.rb, line 172
def require_api_url
  config.require_current_master.url
end
require_token() click to toggle source
# File lib/kontena/cli/common.rb, line 176
def require_token
  retried ||= false
  config.require_current_master_token
rescue Kontena::Cli::Config::TokenExpiredError
  if retried
    raise ArgumentError, "Current master access token has expired and refresh failed."
  else
    logger.debug "Access token expired, trying to refresh"
    retried = true
    client.refresh_token && retry
  end
end
reset_client() click to toggle source
# File lib/kontena/cli/common.rb, line 239
def reset_client
  @client = nil
end
reset_cloud_client() click to toggle source
# File lib/kontena/cli/common.rb, line 220
def reset_cloud_client
  @cloud_client = nil
end
running_quiet?() click to toggle source
# File lib/kontena/cli/common.rb, line 68
def running_quiet?
  self.respond_to?(:quiet?) && self.quiet?
end
running_silent?() click to toggle source
# File lib/kontena/cli/common.rb, line 60
def running_silent?
  self.respond_to?(:silent?) && self.silent?
end
running_verbose?() click to toggle source
# File lib/kontena/cli/common.rb, line 64
def running_verbose?
  self.respond_to?(:verbose?) && self.verbose?
end
spin_if(obj_or_proc, message) { || ... } click to toggle source

Run a spinner with a message for the block if a truthy value or a proc returns true. @example

spin_if(proc { prompt.yes?("for real?") }, "Doing as requested") do
  # doing stuff
end
spin_if(a == 1, "Value of 'a' is 1, so let's do this") do
  # doing stuff
end

@param obj_or_proc [Object,Proc] something that responds to .call or is truthy/falsey @param message [String] the message to display @return anything the block returns

# File lib/kontena/cli/common.rb, line 142
def spin_if(obj_or_proc, message, &block)
  if (obj_or_proc.respond_to?(:call) && obj_or_proc.call) || obj_or_proc
    spinner(message, &block)
  else
    logger.debug { message }
    yield
  end
end
spinner(msg, &block) click to toggle source
# File lib/kontena/cli/common.rb, line 35
def spinner(msg, &block)
   Kontena::Cli::Spinner.spin(msg, &block)
end
sprint(*msgs) click to toggle source

Print that prints even when self.silent?

# File lib/kontena/cli/common.rb, line 78
def sprint(*msgs)
  ::Kernel.print(*msgs)
end
sputs(*msgs) click to toggle source

Puts that puts even when self.silent?

# File lib/kontena/cli/common.rb, line 73
def sputs(*msgs)
  ::Kernel.puts(*msgs)
end
stdin_input(message = nil, mode = :ask) click to toggle source

Read from STDIN. If stdin is a console, use prompt to ask. @param [String] message @param [Symbol] mode (prompt method: :ask, :multiline, etc)

# File lib/kontena/cli/common.rb, line 50
def stdin_input(message = nil, mode = :ask)
  if $stdin.tty?
    Array(prompt.send(mode, message)).join.chomp
  elsif !$stdin.eof?
    $stdin.read.chomp
  else
    exit_with_error 'Missing input'
  end
end
use_refresh_token(server) click to toggle source
Invalidate refresh_token

@param [Kontena::Cli::Config::Server] server

# File lib/kontena/cli/common.rb, line 191
def use_refresh_token(server)
  return unless server.token
  return unless server.token.refresh_token
  return if server.token.expired?
  client = Kontena::Client.new(server.url, server.token,
    ssl_cert_path: server.ssl_cert_path,
    ssl_subject_cn: server.ssl_subject_cn,
  )
  logger.debug "Trying to invalidate refresh token on #{server.name}"
  client.refresh_token
rescue => ex
  logger.debug "Refreshing failed: #{ex.class.name} : #{ex.message}"
end
vfakespinner(msg, success: true) click to toggle source

Like vspinner but without actually running any block

# File lib/kontena/cli/common.rb, line 152
def vfakespinner(msg, success: true)
  if !running_verbose?
    logger.debug { msg }
    return
  end
  puts " [#{ success ? pastel.green('done') : pastel.red('fail')}] #{msg}"
end
vputs(msg = nil) click to toggle source

Only output message if in verbose mode

# File lib/kontena/cli/common.rb, line 104
def vputs(msg = nil)
  if running_verbose?
    puts msg
  elsif debug? && msg
    logger.debug msg
  end
end
vspinner(msg) { || ... } click to toggle source

Only show spinner when in verbose mode

# File lib/kontena/cli/common.rb, line 113
def vspinner(msg, &block)
  return vfakespinner(msg) unless block_given?

  if running_verbose? && $stdout.tty?
    spinner(msg, &block)
  else
    logger.debug { msg }
    yield
  end
end
warning(msg) click to toggle source
# File lib/kontena/cli/common.rb, line 160
def warning(msg)
  warning = pastel.yellow('warn')
  $stderr.puts " [#{warning}] #{msg}"
end

Private Instance Methods

exit_with_error(msg, code = 1) click to toggle source
# File lib/kontena/cli/common.rb, line 165
def exit_with_error(msg, code = 1)
  error = pastel.red('error')
  $stderr.puts " [#{error}] #{msg}"
  exit code
end