class Protoboard::Adapters::StoplightAdapter

This class manages every aspect for the execution of a circuit using the gem stoplight

Public Class Methods

check_state(circuit_name) click to toggle source

Returns the state of a circuit

States returned

  • OK - when that stoplight circuit is green

  • NOT_OK - when that stoplight circuit is yellow or red

# File lib/protoboard/adapters/stoplight_adapter.rb, line 77
def check_state(circuit_name)
  mapper = { 'yellow' => 'NOT_OK', 'green' => 'OK', 'red' => 'NOT_OK' }
  mapper[Stoplight(circuit_name).color]
end
configure(&block) click to toggle source

This methods is used to make it easier to access adapter configurations

# File lib/protoboard/adapters/stoplight_adapter.rb, line 22
def configure(&block)
  Configuration.configure(&block)
end
data_store() click to toggle source

This method is used to make it easier to access adapter data store configuration

# File lib/protoboard/adapters/stoplight_adapter.rb, line 28
def data_store
  Configuration.config.data_store
end
redis_host() click to toggle source

This method is used to make it easier to access adapter redis host configuration

# File lib/protoboard/adapters/stoplight_adapter.rb, line 34
def redis_host
  Configuration.config.redis_host
end
redis_port() click to toggle source

This method is used to make it easier to access adapter redis port configuration

# File lib/protoboard/adapters/stoplight_adapter.rb, line 40
def redis_port
  Configuration.config.redis_port
end
run_circuit(circuit, &block) click to toggle source

Runs the circuit using stoplight

# File lib/protoboard/adapters/stoplight_adapter.rb, line 46
def run_circuit(circuit, &block)
  prepare_data_store

  circuit_execution = Protoboard::CircuitExecution.new(circuit)

  execute_before_circuit_callbacks(circuit_execution)

  stoplight = Stoplight(circuit.name, &block)
              .with_threshold(circuit.open_after)
              .with_cool_off_time(circuit.cool_off_after)

  stoplight.with_fallback(&circuit.fallback) if circuit.fallback
  value = stoplight.run

  circuit_execution = ::Protoboard::CircuitExecution.new(circuit, state: :success, value: value)
  execute_after_circuit_callbacks(circuit_execution)

  value
rescue StandardError =>  exception
  circuit_execution = Protoboard::CircuitExecution.new(circuit, state: :fail, error: exception)
  execute_after_circuit_callbacks(circuit_execution)

  raise circuit_execution.error if circuit_execution.fail?
end

Private Class Methods

prepare_data_store() click to toggle source
# File lib/protoboard/adapters/stoplight_adapter.rb, line 84
def prepare_data_store
  @prepare_data_store ||= case Configuration.config.data_store
                          when :redis
                            require 'redis'
                            redis_host = Configuration.config.redis_host
                            redis_port = Configuration.config.redis_port
                            redis = Redis.new(host: redis_host, port: redis_port)
                            data_store = Stoplight::DataStore::Redis.new(redis)
                            Stoplight::Light.default_data_store = data_store
                          else
                            Stoplight::Light.default_data_store = Stoplight::DataStore::Memory.new
                          end
end