Class: Nonnative::Pool

Inherits:
Object
  • Object
show all
Defined in:
lib/nonnative/pool.rb

Overview

Orchestrates lifecycle for configured processes, servers and services.

A pool is created when start is called and is accessible via pool.

Lifecycle order is important:

  • On start: services first, then servers/processes (in parallel port-check threads)
  • On stop: processes/servers first, then services

Readiness and shutdown are determined via TCP port checks (Nonnative::Ports#open? / Nonnative::Ports#closed?).

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Pool

Returns a new instance of Pool.

Parameters:



19
20
21
22
23
24
# File 'lib/nonnative/pool.rb', line 19

def initialize(configuration)
  @configuration = configuration
  @services = nil
  @servers = nil
  @processes = nil
end

Instance Method Details

#process_by_name(name) ⇒ Nonnative::Process

Finds a running process runner by configured name.

Parameters:

  • name (String)

Returns:

Raises:



82
83
84
# File 'lib/nonnative/pool.rb', line 82

def process_by_name(name)
  processes[runner_index(configuration.processes, name)].first
end

#resetvoid

This method returns an undefined value.

Resets service proxies in this pool.

This is used by the Cucumber @reset hook and is safe to call any time after the pool is created.



109
110
111
# File 'lib/nonnative/pool.rb', line 109

def reset
  services.each { |s| s.proxy.reset }
end

#rollbackArray<String>

Stops only runners that have already been instantiated in this pool.

This is used to rollback partial startup after a failed #start without constructing new runner wrappers as a side effect.

Returns:

  • (Array<String>)

    lifecycle and shutdown-check errors collected while rolling back



66
67
68
69
70
71
72
73
74
75
# File 'lib/nonnative/pool.rb', line 66

def rollback
  errors = []

  [existing_processes, existing_servers].each do |runners|
    errors.concat(run_lifecycle_checks(runners, :stop, :closed?, :rollback))
  end
  errors.concat(service_lifecycle(existing_services, :stop, :stop))

  errors
end

#server_by_name(name) ⇒ Nonnative::Server

Finds a running server runner by configured name.

Parameters:

  • name (String)

Returns:

Raises:



91
92
93
# File 'lib/nonnative/pool.rb', line 91

def server_by_name(name)
  servers[runner_index(configuration.servers, name)].first
end

#service_by_name(name) ⇒ Nonnative::Service

Finds a running service runner by configured name.

Parameters:

  • name (String)

Returns:

Raises:



100
101
102
# File 'lib/nonnative/pool.rb', line 100

def service_by_name(name)
  services[runner_index(configuration.services, name)]
end

#startArray<String>

Starts all configured runners and collects lifecycle and readiness errors.

Services are started first (proxy-only) and checked for opt-in readiness, then servers and processes are started and checked for readiness. Each readiness failure is described with the runner and, for a process that exited early, its termination detail.

Returns:

  • (Array<String>)

    lifecycle and readiness-check errors collected while starting



33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/nonnative/pool.rb', line 33

def start
  errors = []

  errors.concat(service_lifecycle(services, :start, :start))
  service_readiness_errors = check_service_readiness(services)
  errors.concat(service_readiness_errors)
  return errors if service_readiness_errors.any?

  [servers, processes].each { |runners| errors.concat(run_lifecycle_checks(runners, :start, :open?, :start)) }

  errors
end

#stopArray<String>

Stops all configured runners and collects lifecycle and shutdown errors.

Processes and servers are stopped first and checked for shutdown, then services are stopped (proxy-only).

Returns:

  • (Array<String>)

    lifecycle and shutdown-check errors collected while stopping



51
52
53
54
55
56
57
58
# File 'lib/nonnative/pool.rb', line 51

def stop
  errors = []

  [processes, servers].each { |runners| errors.concat(run_lifecycle_checks(runners, :stop, :closed?, :stop)) }
  errors.concat(service_lifecycle(services, :stop, :stop))

  errors
end