Class: Kitchen::Instance
- Inherits:
-
Object
- Object
- Kitchen::Instance
- Includes:
- Logging
- Defined in:
- lib/kitchen/instance.rb
Overview
An instance of a suite running on a platform. A created instance may be a local virtual machine, cloud instance, container, or even a bare metal server, which is determined by the platform's driver.
Defined Under Namespace
Classes: FSM
Class Attribute Summary collapse
-
.mutexes ⇒ Hash
private
A hash of mutxes, arranged by Driver class names.
Instance Attribute Summary collapse
-
#driver ⇒ Driver::Base
readonly
Driver object which will manage this instance's lifecycle actions.
-
#logger ⇒ Logger
readonly
The logger for this instance.
-
#name ⇒ String
readonly
Name of this instance.
-
#platform ⇒ Platform
readonly
The target platform configuration.
-
#provisioner ⇒ Provisioner::Base
readonly
Provisioner object which will the setup and invocation instructions for configuration management and other automation tools.
-
#suite ⇒ Suite
readonly
The test suite configuration.
-
#transport ⇒ Transport::Base
readonly
Transport object which will communicate with an instance.
-
#verifier ⇒ Verifier
readonly
Verifier object for instance to manage the verifier installation on this instance.
Class Method Summary collapse
-
.name_for(suite, platform) ⇒ String
Generates a name for an instance given a suite and platform.
Instance Method Summary collapse
-
#cleanup! ⇒ void
Clean up any per-instance resources before exiting.
-
#converge ⇒ self
Converges this running instance.
-
#create ⇒ self
Creates this instance.
-
#destroy ⇒ self
Destroys this instance.
-
#diagnose ⇒ Hash
Returns a Hash of configuration and other useful diagnostic information.
-
#diagnose_plugins ⇒ Hash
Returns a Hash of configuration and other useful diagnostic information associated with plugins (such as loaded version, class name, etc.).
-
#initialize(options = {}) ⇒ Instance
constructor
Creates a new instance, given a suite and a platform.
-
#last_action ⇒ String
Returns the last successfully completed action state of the instance.
-
#last_error ⇒ String
Returns the error encountered on the last action on the instance.
-
#login ⇒ Object
Logs in to this instance by invoking a system command, provided by the instance's transport.
-
#package_action ⇒ Object
Perform package.
-
#remote_exec(command) ⇒ Object
Executes an arbitrary command on this instance.
-
#setup ⇒ self
Sets up this converged instance for suite tests.
-
#test(destroy_mode = :passing) ⇒ self
Tests this instance by creating, converging and verifying.
-
#to_str ⇒ String
Returns a displayable representation of the instance.
-
#verify ⇒ self
Verifies this set up instance by executing suite tests.
Methods included from Logging
#debug, #error, #fatal, #info, #warn
Constructor Details
#initialize(options = {}) ⇒ Instance
Creates a new instance, given a suite and a platform.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/kitchen/instance.rb', line 90 def initialize( = {}) () @suite = .fetch(:suite) @platform = .fetch(:platform) @name = self.class.name_for(@suite, @platform) @driver = .fetch(:driver) @provisioner = .fetch(:provisioner) @transport = .fetch(:transport) @verifier = .fetch(:verifier) @logger = .fetch(:logger) { Kitchen.logger } @state_file = .fetch(:state_file) setup_driver setup_provisioner setup_transport setup_verifier end |
Class Attribute Details
.mutexes ⇒ Hash
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a hash of mutxes, arranged by Driver class names.
34 35 36 |
# File 'lib/kitchen/instance.rb', line 34 def mutexes @mutexes end |
Instance Attribute Details
#driver ⇒ Driver::Base (readonly)
Returns driver object which will manage this instance's lifecycle actions.
57 58 59 |
# File 'lib/kitchen/instance.rb', line 57 def driver @driver end |
#logger ⇒ Logger (readonly)
Returns the logger for this instance.
73 74 75 |
# File 'lib/kitchen/instance.rb', line 73 def logger @logger end |
#name ⇒ String (readonly)
Returns name of this instance.
53 54 55 |
# File 'lib/kitchen/instance.rb', line 53 def name @name end |
#platform ⇒ Platform (readonly)
Returns the target platform configuration.
50 51 52 |
# File 'lib/kitchen/instance.rb', line 50 def platform @platform end |
#provisioner ⇒ Provisioner::Base (readonly)
Returns provisioner object which will the setup and invocation instructions for configuration management and other automation tools.
62 63 64 |
# File 'lib/kitchen/instance.rb', line 62 def provisioner @provisioner end |
#suite ⇒ Suite (readonly)
Returns the test suite configuration.
47 48 49 |
# File 'lib/kitchen/instance.rb', line 47 def suite @suite end |
#transport ⇒ Transport::Base (readonly)
Returns transport object which will communicate with an instance.
66 67 68 |
# File 'lib/kitchen/instance.rb', line 66 def transport @transport end |
#verifier ⇒ Verifier (readonly)
Returns verifier object for instance to manage the verifier installation on this instance.
70 71 72 |
# File 'lib/kitchen/instance.rb', line 70 def verifier @verifier end |
Class Method Details
.name_for(suite, platform) ⇒ String
Generates a name for an instance given a suite and platform.
41 42 43 |
# File 'lib/kitchen/instance.rb', line 41 def name_for(suite, platform) "#{suite.name}-#{platform.name}".gsub(%r{[_,/]}, "-").delete(".") end |
Instance Method Details
#cleanup! ⇒ void
This method returns an undefined value.
Clean up any per-instance resources before exiting.
284 285 286 |
# File 'lib/kitchen/instance.rb', line 284 def cleanup! @transport.cleanup! if @transport end |
#converge ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Converges this running instance.
134 135 136 |
# File 'lib/kitchen/instance.rb', line 134 def converge transition_to(:converge) end |
#create ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Creates this instance.
123 124 125 |
# File 'lib/kitchen/instance.rb', line 123 def create transition_to(:create) end |
#destroy ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Destroys this instance.
167 168 169 |
# File 'lib/kitchen/instance.rb', line 167 def destroy transition_to(:destroy) end |
#diagnose ⇒ Hash
Returns a Hash of configuration and other useful diagnostic information.
239 240 241 242 243 244 245 246 247 248 |
# File 'lib/kitchen/instance.rb', line 239 def diagnose result = {} [ :platform, :state_file, :driver, :provisioner, :transport, :verifier ].each do |sym| obj = send(sym) result[sym] = obj.respond_to?(:diagnose) ? obj.diagnose : :unknown end result end |
#diagnose_plugins ⇒ Hash
Returns a Hash of configuration and other useful diagnostic information associated with plugins (such as loaded version, class name, etc.).
254 255 256 257 258 259 260 261 262 263 264 265 |
# File 'lib/kitchen/instance.rb', line 254 def diagnose_plugins result = {} [:driver, :provisioner, :verifier, :transport].each do |sym| obj = send(sym) result[sym] = if obj.respond_to?(:diagnose_plugin) obj.diagnose_plugin else :unknown end end result end |
#last_action ⇒ String
Returns the last successfully completed action state of the instance.
270 271 272 |
# File 'lib/kitchen/instance.rb', line 270 def last_action state_file.read[:last_action] end |
#last_error ⇒ String
Returns the error encountered on the last action on the instance
277 278 279 |
# File 'lib/kitchen/instance.rb', line 277 def last_error state_file.read[:last_error] end |
#login ⇒ Object
Logs in to this instance by invoking a system command, provided by the instance's transport. This could be an SSH command, telnet, or serial console session.
Note This method calls exec and will not return.
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/kitchen/instance.rb', line 203 def login state = state_file.read if state[:last_action].nil? raise UserError, "Instance #{to_str} has not yet been created" end lc = if legacy_ssh_base_driver? legacy_ssh_base_login(state) else transport.connection(state).login_command end debug(%{Login command: #{lc.command} #{lc.arguments.join(' ')} } \ "(Options: #{lc.})") Kernel.exec(*lc.exec_args) end |
#package_action ⇒ Object
Perform package.
231 232 233 234 |
# File 'lib/kitchen/instance.rb', line 231 def package_action "Packaging remote instance" driver.package(state_file.read) end |
#remote_exec(command) ⇒ Object
Executes an arbitrary command on this instance.
223 224 225 226 227 |
# File 'lib/kitchen/instance.rb', line 223 def remote_exec(command) transport.connection(state_file.read) do |conn| conn.execute(command) end end |
#setup ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Sets up this converged instance for suite tests.
145 146 147 |
# File 'lib/kitchen/instance.rb', line 145 def setup transition_to(:setup) end |
#test(destroy_mode = :passing) ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Tests this instance by creating, converging and verifying. If this instance is running, it will be pre-emptively destroyed to ensure a clean slate. The instance will be left post-verify in a running state.
181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/kitchen/instance.rb', line 181 def test(destroy_mode = :passing) elapsed = Benchmark.measure do "Cleaning up any prior instances of #{to_str}" destroy "Testing #{to_str}" verify destroy if destroy_mode == :passing end info "Finished testing #{to_str} #{Util.duration(elapsed.real)}." self ensure destroy if destroy_mode == :always end |
#to_str ⇒ String
Returns a displayable representation of the instance.
112 113 114 |
# File 'lib/kitchen/instance.rb', line 112 def to_str "<#{name}>" end |
#verify ⇒ self
rescue Driver::ActionFailed and return some kind of null object to gracfully stop action chaining
Verifies this set up instance by executing suite tests.
156 157 158 |
# File 'lib/kitchen/instance.rb', line 156 def verify transition_to(:verify) end |