Module: Legion::Provider::Registry

Extended by:
TSort
Defined in:
lib/legion/provider.rb

Class Method Summary collapse

Class Method Details

.boot!(mode: :full, timeout: 30) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/legion/provider.rb', line 85

def boot!(mode: :full, timeout: 30)
  booted = []
  boot_order.each do |key|
    klass = providers[key]
    instance = klass.new(mode: mode)
    instance.select_adapter(mode)

    Timeout.timeout(timeout) { instance.boot }
    Legion::Readiness.mark_ready(key) if defined?(Legion::Readiness)
    booted << instance
  rescue Timeout::Error => e
    Legion::Logging.error "Provider :#{key} boot timed out (#{timeout}s)" if defined?(Legion::Logging)
    shutdown!(booted)
    raise Provider::MissingDependencyError, "provider :#{key} timed out during boot: #{e.message}"
  rescue StandardError => e
    Legion::Logging.error "Provider :#{key} boot failed: #{e.message}" if defined?(Legion::Logging)
    shutdown!(booted)
    raise
  end
  booted
end

.boot_orderObject



78
79
80
81
82
83
# File 'lib/legion/provider.rb', line 78

def boot_order
  validate_dependencies!
  tsort
rescue TSort::Cyclic => e
  raise Provider::CyclicDependencyError, "cyclic dependency detected: #{e.message}"
end

.providersObject



67
68
69
# File 'lib/legion/provider.rb', line 67

def providers
  @providers ||= {}
end

.register(provider_class) ⇒ Object



71
72
73
74
75
76
# File 'lib/legion/provider.rb', line 71

def register(provider_class)
  key = provider_class.provides
  return unless key

  providers[key] = provider_class
end

.reset!Object



116
117
118
# File 'lib/legion/provider.rb', line 116

def reset!
  @providers = {}
end

.shutdown!(instances) ⇒ Object



107
108
109
110
111
112
113
114
# File 'lib/legion/provider.rb', line 107

def shutdown!(instances)
  instances.reverse_each do |instance|
    instance.shutdown
    Legion::Readiness.mark_not_ready(instance.name) if defined?(Legion::Readiness)
  rescue StandardError => e
    Legion::Logging.warn "Provider shutdown error for #{instance.name}: #{e.message}" if defined?(Legion::Logging)
  end
end