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
-
.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’].
Instance Method Summary collapse
- #check_core_version(message) ⇒ Object
- #component_list_acknowledged ⇒ Object
- #configured_sxls ⇒ Object
- #core_3_3? ⇒ Boolean
- #core_versions ⇒ Object
- #extraneous_version(message) ⇒ Object
- #normalized_core_versions(core_versions) ⇒ Object
- #primary_configured_sxl ⇒ Object
- #process_version(message) ⇒ Object
- #send_version(site_id, core_versions) ⇒ Object
- #send_version_message(site_id, core_versions, step:) ⇒ Object
- #send_version_request(site_id, core_versions) ⇒ Object
- #send_version_response(site_id, core_versions) ⇒ Object
- #site_id_items(site_id) ⇒ Object
- #sxl_request_items ⇒ Object
- #version_acknowledged ⇒ Object
- #version_items(core_versions) ⇒ Object
- #version_meets_requirement?(version, requirement) ⇒ Boolean
- #version_message_attributes(site_id, core_versions) ⇒ Object
- #version_request_attributes ⇒ Object
- #version_response_sxls ⇒ Object
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’]
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() versions = core_versions # find versions that both we and the client support candidates = .versions & versions if candidates.any? @core_version = candidates.max_by { |v| Gem::Version.new(v) } # pick latest version else reason = "RSMP versions [#{.versions.join(', ')}] requested, " \ "but only [#{versions.join(', ')}] supported." dont_acknowledge , 'Version message rejected', reason, force: true raise HandshakeError, reason end end |
#component_list_acknowledged ⇒ Object
129 |
# File 'lib/rsmp/proxy/modules/versions.rb', line 129 def component_list_acknowledged; end |
#configured_sxls ⇒ Object
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
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_versions ⇒ Object
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() dont_acknowledge , '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_sxl ⇒ Object
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(); 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) (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 (site_id, core_versions, step:) attributes = (site_id, core_versions) attributes.merge!(version_request_attributes) if step == 'Request' 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) (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? Version.new({ 'step' => 'Response', 'RSMP' => [{ 'vers' => core_version }], 'supervisorId' => site_id, 'SXLS' => version_response_sxls, 'receiveAlarms' => @site_settings['receive_alarms'] != false }), validate: false else (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_items ⇒ Object
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_acknowledged ⇒ Object
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
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 (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_attributes ⇒ Object
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_sxls ⇒ Object
123 124 125 |
# File 'lib/rsmp/proxy/modules/versions.rb', line 123 def version_response_sxls accepted_sxls + rejected_sxls end |