Module: RSMP::Proxy::Modules::Versions

Included in:
RSMP::Proxy
Defined in:
lib/rsmp/proxy/modules/versions.rb

Overview

Version negotiation and handling Manages RSMP version handshake between sites and supervisors

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.version_meets_requirement?(version, requirement) ⇒ Boolean

Use Gem class to check version requirement Requirement must be a string like ‘1.1’, ‘>=1.0.3’ or ‘<2.1.4’, or list of strings, like [‘<=1.4’,‘<1.5’]

Returns:

  • (Boolean)


134
135
136
# File 'lib/rsmp/proxy/modules/versions.rb', line 134

def self.version_meets_requirement?(version, requirement)
  Gem::Requirement.new(requirement).satisfied_by?(Gem::Version.new(version))
end

Instance Method Details

#check_core_version(message) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/rsmp/proxy/modules/versions.rb', line 39

def check_core_version(message)
  versions = core_versions
  # find versions that both we and the client support
  candidates = message.versions & versions
  if candidates.any?
    @core_version = candidates.max_by { |v| Gem::Version.new(v) } # pick latest version
  else
    reason = "RSMP versions [#{message.versions.join(', ')}] requested, " \
             "but only [#{versions.join(', ')}] supported."
    dont_acknowledge message, 'Version message rejected', reason, force: true
    raise HandshakeError, reason
  end
end

#component_list_acknowledgedObject



129
# File 'lib/rsmp/proxy/modules/versions.rb', line 129

def component_list_acknowledged; end

#configured_sxlsObject



22
23
24
# File 'lib/rsmp/proxy/modules/versions.rb', line 22

def configured_sxls
  (@site_settings['sxls'] || []).map { |item| item.transform_keys(&:to_s) }
end

#core_3_3?Boolean

Returns:

  • (Boolean)


18
19
20
# File 'lib/rsmp/proxy/modules/versions.rb', line 18

def core_3_3?
  core_version && version_meets_requirement?(core_version, '>=3.3.0')
end

#core_versionsObject



7
8
9
10
11
12
13
14
15
16
# File 'lib/rsmp/proxy/modules/versions.rb', line 7

def core_versions
  version = @site_settings['core_version']
  if version == 'latest'
    [RSMP::Schema.latest_core_version]
  elsif version
    [version]
  else
    RSMP::Schema.core_versions
  end
end

#extraneous_version(message) ⇒ Object



55
56
57
# File 'lib/rsmp/proxy/modules/versions.rb', line 55

def extraneous_version(message)
  dont_acknowledge message, 'Received', 'extraneous Version message'
end

#normalized_core_versions(core_versions) ⇒ Object



101
102
103
104
105
106
107
108
109
110
# File 'lib/rsmp/proxy/modules/versions.rb', line 101

def normalized_core_versions(core_versions)
  case core_versions
  when 'latest'
    [RSMP::Schema.latest_core_version]
  when 'all'
    RSMP::Schema.core_versions
  else
    [core_versions].flatten
  end
end

#primary_configured_sxlObject



26
27
28
# File 'lib/rsmp/proxy/modules/versions.rb', line 26

def primary_configured_sxl
  configured_sxls.first
end

#process_version(message) ⇒ Object



53
# File 'lib/rsmp/proxy/modules/versions.rb', line 53

def process_version(message); end

#send_version(site_id, core_versions) ⇒ Object



59
60
61
# File 'lib/rsmp/proxy/modules/versions.rb', line 59

def send_version(site_id, core_versions)
  send_version_message(site_id, core_versions, step: nil)
end

#send_version_message(site_id, core_versions, step:) ⇒ Object



81
82
83
84
85
# File 'lib/rsmp/proxy/modules/versions.rb', line 81

def send_version_message(site_id, core_versions, step:)
  attributes = version_message_attributes(site_id, core_versions)
  attributes.merge!(version_request_attributes) if step == 'Request'
  send_message Version.new(attributes), validate: false
end

#send_version_request(site_id, core_versions) ⇒ Object



63
64
65
# File 'lib/rsmp/proxy/modules/versions.rb', line 63

def send_version_request(site_id, core_versions)
  send_version_message(site_id, core_versions, step: 'Request')
end

#send_version_response(site_id, core_versions) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rsmp/proxy/modules/versions.rb', line 67

def send_version_response(site_id, core_versions)
  if core_3_3?
    send_message Version.new({
                               'step' => 'Response',
                               'RSMP' => [{ 'vers' => core_version }],
                               'supervisorId' => site_id,
                               'SXLS' => version_response_sxls,
                               'receiveAlarms' => @site_settings['receive_alarms'] != false
                             }), validate: false
  else
    send_version_message(site_id, core_versions, step: nil)
  end
end

#site_id_items(site_id) ⇒ Object



112
113
114
# File 'lib/rsmp/proxy/modules/versions.rb', line 112

def site_id_items(site_id)
  [site_id].flatten.map { |id| { 'sId' => id } }
end

#sxl_request_itemsObject



30
31
32
33
34
35
36
37
# File 'lib/rsmp/proxy/modules/versions.rb', line 30

def sxl_request_items
  configured_sxls.map do |sxl|
    item = { 'name' => sxl['name'], 'version' => sxl['version'].to_s }
    prefix = RSMP::Schema.sxl_prefix(sxl['name'], sxl['version'], lenient: true)
    item['prefix'] = prefix if prefix
    item
  end
end

#version_acknowledgedObject



127
# File 'lib/rsmp/proxy/modules/versions.rb', line 127

def version_acknowledged; end

#version_items(core_versions) ⇒ Object



97
98
99
# File 'lib/rsmp/proxy/modules/versions.rb', line 97

def version_items(core_versions)
  normalized_core_versions(core_versions).map { |version| { 'vers' => version } }
end

#version_meets_requirement?(version, requirement) ⇒ Boolean

Returns:

  • (Boolean)


138
139
140
# File 'lib/rsmp/proxy/modules/versions.rb', line 138

def version_meets_requirement?(version, requirement)
  RSMP::Proxy::Modules::Versions.version_meets_requirement?(version, requirement)
end

#version_message_attributes(site_id, core_versions) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/rsmp/proxy/modules/versions.rb', line 87

def version_message_attributes(site_id, core_versions)
  primary = primary_configured_sxl
  attributes = {
    'RSMP' => version_items(core_versions),
    'siteId' => site_id_items(site_id)
  }
  attributes['SXL'] = primary['version'].to_s if primary
  attributes
end

#version_request_attributesObject



116
117
118
119
120
121
# File 'lib/rsmp/proxy/modules/versions.rb', line 116

def version_request_attributes
  {
    'step' => 'Request',
    'SXLS' => sxl_request_items
  }
end

#version_response_sxlsObject



123
124
125
# File 'lib/rsmp/proxy/modules/versions.rb', line 123

def version_response_sxls
  accepted_sxls + rejected_sxls
end