Class: Kitchen::Transport::Base::Connection

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/kitchen/transport/base.rb

Overview

A Connection instance can be generated and re-generated, given new connection details such as connection port, hostname, credentials, etc. This object is responsible for carrying out the actions on the remote host such as executing commands, transferring files, etc.

Author:

Instance Method Summary collapse

Methods included from Logging

#banner, #debug, #error, #fatal, #info, #warn

Constructor Details

#initialize(options = {}) {|self| ... } ⇒ Connection

Create a new Connection instance.

Yields:

  • (self)

    yields itself for block-style invocation



90
91
92
93
94
95
96
# File 'lib/kitchen/transport/base.rb', line 90

def initialize(options = {})
  init_options(options)

  if block_given?
    yield self
  end
end

Instance Method Details

#closeObject

Closes the session connection, if it is still active.



99
100
101
# File 'lib/kitchen/transport/base.rb', line 99

def close
  # this method may be left unimplemented if that is applicable
end

#execute(command) ⇒ Object

Execute a command on the remote host.

Raises:

  • (TransportFailed)

    if the command does not exit successfully, which may vary by implementation



108
109
110
# File 'lib/kitchen/transport/base.rb', line 108

def execute(command)
  raise ClientError, "#{self.class}#execute must be implemented"
end

#execute_with_retry(command, retryable_exit_codes = [], max_retries = 1, wait_time = 30) ⇒ Object

Execute a command on the remote host and retry

Raises:

  • (TransportFailed)

    if the command does not exit successfully, which may vary by implementation



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/kitchen/transport/base.rb', line 120

def execute_with_retry(command, retryable_exit_codes = [], max_retries = 1, wait_time = 30)
  tries = 0
  begin
    tries += 1
    debug("Attempting to execute command - try #{tries} of #{max_retries}.")
    execute(command)
  rescue Kitchen::Transport::TransportFailed => e
    if retry?(tries, max_retries, retryable_exit_codes, e.exit_code)
      close
      sleep wait_time
      retry
    else
      raise e
    end
  end
end

#login_commandLoginCommand

Builds a LoginCommand which can be used to open an interactive session on the remote host.

Raises:



149
150
151
# File 'lib/kitchen/transport/base.rb', line 149

def 
  raise ActionFailed, "Remote login not supported in #{self.class}."
end

#retry?(current_try, max_retries, retryable_exit_codes, exit_code) ⇒ Boolean



137
138
139
140
141
# File 'lib/kitchen/transport/base.rb', line 137

def retry?(current_try, max_retries, retryable_exit_codes, exit_code)
  current_try <= max_retries &&
    !retryable_exit_codes.nil? &&
    retryable_exit_codes.include?(exit_code)
end

#upload(locals, remote) ⇒ Object

Uploads local files or directories to remote host.

Raises:

  • (TransportFailed)

    if the files could not all be uploaded successfully, which may vary by implementation



159
160
161
# File 'lib/kitchen/transport/base.rb', line 159

def upload(locals, remote) # rubocop:disable Lint/UnusedMethodArgument
  raise ClientError, "#{self.class}#upload must be implemented"
end

#wait_until_readyObject

Block and return only when the remote host is prepared and ready to execute command and upload files. The semantics and details will vary by implementation, but a round trip through the hosted service is preferred to simply waiting on a socket to become available.



168
169
170
# File 'lib/kitchen/transport/base.rb', line 168

def wait_until_ready
  # this method may be left unimplemented if that is applicable
end