Module: RSMP::Supervisor::Modules::Configuration

Included in:
RSMP::Supervisor
Defined in:
lib/rsmp/node/supervisor/modules/configuration.rb

Overview

Handles supervisor configuration and site settings

Instance Method Summary collapse

Instance Method Details

#check_configured_core_version(site_id, core_version) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 59

def check_configured_core_version(site_id, core_version)
  return unless core_version
  return if %w[all latest].include? core_version
  return if RSMP::Schema.normalize_core_version core_version

  raise RSMP::ConfigurationError,
        "Configuration error for site '#{site_id}': Unknown core version: #{core_version}"
end

#check_configured_sxls(site_id, sxls) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 45

def check_configured_sxls(site_id, sxls)
  raise RSMP::ConfigurationError, "Configuration error for site '#{site_id}': No SXLs specified" unless sxls

  sxls.each do |sxl|
    name = sxl['name']
    if name.to_s == 'core'
      raise RSMP::ConfigurationError,
            "Configuration error for site '#{site_id}': SXL name cannot be core"
    end

    RSMP::Schema.find_schema! name, sxl['version'], lenient: true
  end
end

#check_site_sxlsObject



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 32

def check_site_sxls
  sites = @supervisor_settings['sites'].clone || {}
  sites['default'] = @supervisor_settings['default']
  sites.each do |site_id, settings|
    raise RSMP::ConfigurationError, "Configuration for site '#{site_id}' is empty" unless settings

    check_configured_sxls site_id, settings['sxls']
    check_configured_core_version site_id, settings['core_version']
  rescue RSMP::Schema::UnknownSchemaError => e
    raise RSMP::ConfigurationError, "Configuration error for site '#{site_id}': #{e}"
  end
end

#denormalize_site_sxls(settings) ⇒ Object



23
24
25
26
27
28
29
30
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 23

def denormalize_site_sxls(settings)
  sxls = settings['sxls']
  return settings unless sxls.is_a?(Array)

  settings.merge(
    'sxls' => sxls.to_h { |sxl| [sxl['name'], sxl['version']] }
  )
end

#denormalize_supervisor_sxls(settings) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 14

def denormalize_supervisor_sxls(settings)
  settings = settings.merge('default' => denormalize_site_sxls(settings['default'])) if settings['default']
  return settings unless settings['sites']

  settings.merge(
    'sites' => settings['sites'].transform_values { |site_settings| denormalize_site_sxls(site_settings) }
  )
end

#handle_supervisor_settings(supervisor_settings) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 6

def handle_supervisor_settings(supervisor_settings)
  supervisor_settings = denormalize_supervisor_sxls(supervisor_settings || {})
  options = RSMP::Supervisor::Options.new(supervisor_settings || {})
  @supervisor_settings = options.to_h
  @core_version = @supervisor_settings.dig('default', 'core_version')
  check_site_sxls
end

#ip_to_site_settings(ip) ⇒ Object



79
80
81
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 79

def ip_to_site_settings(ip)
  @supervisor_settings['sites'][ip] || @supervisor_settings['sites']['default']
end

#site_id_to_site_setting(site_id) ⇒ Object



68
69
70
71
72
73
74
75
76
77
# File 'lib/rsmp/node/supervisor/modules/configuration.rb', line 68

def site_id_to_site_setting(site_id)
  base = @supervisor_settings['default'] || {}

  return base unless @supervisor_settings['sites']

  site_specific = @supervisor_settings['sites'][site_id] || @supervisor_settings['sites']['default']
  return base unless site_specific

  base.deep_merge(site_specific)
end