openc3 5.1.1 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/bin/openc3cli +48 -9
  3. data/data/config/interface_modifiers.yaml +14 -0
  4. data/data/config/parameter_modifiers.yaml +5 -3
  5. data/data/config/screen.yaml +12 -8
  6. data/data/config/target.yaml +33 -0
  7. data/ext/openc3/ext/config_parser/config_parser.c +66 -63
  8. data/ext/openc3/ext/packet/packet.c +1 -4
  9. data/lib/openc3/api/README.md +5 -0
  10. data/lib/openc3/api/api.rb +3 -1
  11. data/lib/openc3/api/cmd_api.rb +43 -112
  12. data/lib/openc3/api/interface_api.rb +3 -3
  13. data/lib/openc3/api/offline_access_api.rb +78 -0
  14. data/lib/openc3/api/settings_api.rb +3 -1
  15. data/lib/openc3/api/stash_api.rb +63 -0
  16. data/lib/openc3/api/target_api.rb +4 -5
  17. data/lib/openc3/config/config_parser.rb +47 -47
  18. data/lib/openc3/interfaces/interface.rb +11 -1
  19. data/lib/openc3/interfaces/protocols/burst_protocol.rb +30 -16
  20. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +8 -2
  21. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +2 -2
  22. data/lib/openc3/interfaces/protocols/override_protocol.rb +2 -2
  23. data/lib/openc3/interfaces/tcpip_server_interface.rb +3 -1
  24. data/lib/openc3/io/json_api_object.rb +30 -9
  25. data/lib/openc3/io/json_drb.rb +6 -1
  26. data/lib/openc3/io/json_drb_object.rb +18 -9
  27. data/lib/openc3/io/json_rpc.rb +5 -3
  28. data/lib/openc3/logs/buffered_packet_log_writer.rb +1 -1
  29. data/lib/openc3/logs/log_writer.rb +8 -2
  30. data/lib/openc3/microservices/cleanup_microservice.rb +3 -3
  31. data/lib/openc3/microservices/decom_microservice.rb +8 -8
  32. data/lib/openc3/microservices/interface_microservice.rb +86 -71
  33. data/lib/openc3/microservices/log_microservice.rb +5 -3
  34. data/lib/openc3/microservices/microservice.rb +18 -14
  35. data/lib/openc3/microservices/multi_microservice.rb +62 -0
  36. data/lib/openc3/microservices/periodic_microservice.rb +58 -0
  37. data/lib/openc3/microservices/reaction_microservice.rb +61 -47
  38. data/lib/openc3/microservices/reducer_microservice.rb +64 -40
  39. data/lib/openc3/microservices/router_microservice.rb +4 -4
  40. data/lib/openc3/microservices/text_log_microservice.rb +2 -2
  41. data/lib/openc3/microservices/timeline_microservice.rb +44 -30
  42. data/lib/openc3/microservices/trigger_group_microservice.rb +39 -36
  43. data/lib/openc3/migrations/20221202214600_add_target_names.rb +30 -0
  44. data/lib/openc3/migrations/20221210174900_convert_to_multi.rb +65 -0
  45. data/lib/openc3/models/cvt_model.rb +1 -1
  46. data/lib/openc3/models/gem_model.rb +24 -20
  47. data/lib/openc3/models/interface_model.rb +69 -35
  48. data/lib/openc3/models/metadata_model.rb +1 -1
  49. data/lib/openc3/models/microservice_model.rb +7 -24
  50. data/lib/openc3/models/migration_model.rb +52 -0
  51. data/lib/openc3/models/model.rb +2 -7
  52. data/lib/openc3/models/note_model.rb +1 -1
  53. data/lib/openc3/models/offline_access_model.rb +55 -0
  54. data/lib/openc3/models/plugin_model.rb +12 -3
  55. data/lib/openc3/models/reaction_model.rb +6 -2
  56. data/lib/openc3/models/scope_model.rb +89 -13
  57. data/lib/openc3/models/settings_model.rb +1 -1
  58. data/lib/openc3/models/stash_model.rb +53 -0
  59. data/lib/openc3/models/target_model.rb +301 -130
  60. data/lib/openc3/models/tool_model.rb +1 -12
  61. data/lib/openc3/models/widget_model.rb +1 -6
  62. data/lib/openc3/operators/microservice_operator.rb +45 -6
  63. data/lib/openc3/operators/operator.rb +27 -5
  64. data/lib/openc3/packets/commands.rb +1 -25
  65. data/lib/openc3/packets/limits.rb +0 -75
  66. data/lib/openc3/packets/packet.rb +0 -28
  67. data/lib/openc3/packets/packet_item.rb +23 -0
  68. data/lib/openc3/packets/packet_item_limits.rb +2 -2
  69. data/lib/openc3/packets/parsers/state_parser.rb +10 -6
  70. data/lib/openc3/packets/telemetry.rb +1 -45
  71. data/lib/openc3/script/commands.rb +41 -71
  72. data/lib/openc3/script/extract.rb +15 -1
  73. data/lib/openc3/script/{calendar.rb → metadata.rb} +42 -17
  74. data/lib/openc3/script/script.rb +13 -5
  75. data/lib/openc3/script/storage.rb +3 -1
  76. data/lib/openc3/system/system.rb +19 -17
  77. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +4 -4
  78. data/lib/openc3/top_level.rb +3 -3
  79. data/lib/openc3/topics/command_decom_topic.rb +2 -2
  80. data/lib/openc3/topics/command_topic.rb +7 -6
  81. data/lib/openc3/topics/interface_topic.rb +2 -2
  82. data/lib/openc3/topics/router_topic.rb +1 -1
  83. data/lib/openc3/topics/telemetry_topic.rb +2 -1
  84. data/lib/openc3/utilities/authentication.rb +35 -14
  85. data/lib/openc3/utilities/aws_bucket.rb +4 -3
  86. data/lib/openc3/utilities/bucket.rb +4 -2
  87. data/lib/openc3/utilities/bucket_file_cache.rb +3 -8
  88. data/lib/openc3/utilities/bucket_utilities.rb +77 -15
  89. data/lib/openc3/utilities/local_mode.rb +12 -9
  90. data/lib/openc3/utilities/logger.rb +17 -9
  91. data/lib/openc3/utilities/message_log.rb +6 -5
  92. data/lib/openc3/utilities/migration.rb +22 -0
  93. data/lib/openc3/utilities/store_autoload.rb +7 -5
  94. data/lib/openc3/utilities/target_file.rb +9 -7
  95. data/lib/openc3/version.rb +6 -6
  96. data/lib/openc3.rb +2 -1
  97. metadata +14 -3
@@ -22,6 +22,7 @@
22
22
 
23
23
  require 'openc3/version'
24
24
  require 'openc3/models/model'
25
+ require 'openc3/models/plugin_model'
25
26
  require 'openc3/models/microservice_model'
26
27
  require 'openc3/models/settings_model'
27
28
 
@@ -29,6 +30,8 @@ module OpenC3
29
30
  class ScopeModel < Model
30
31
  PRIMARY_KEY = 'openc3_scopes'
31
32
 
33
+ attr_accessor :children
34
+
32
35
  # NOTE: The following three class methods are used by the ModelController
33
36
  # and are reimplemented to enable various Model class methods to work
34
37
  def self.get(name:, scope: nil)
@@ -62,6 +65,7 @@ module OpenC3
62
65
 
63
66
  def initialize(name:, updated_at: nil, scope: nil)
64
67
  super(PRIMARY_KEY, name: name, scope: name, updated_at: updated_at)
68
+ @children = []
65
69
  end
66
70
 
67
71
  def create(update: false, force: false)
@@ -89,15 +93,7 @@ module OpenC3
89
93
  'updated_at' => @updated_at }
90
94
  end
91
95
 
92
- def deploy(gem_path, variables)
93
- seed_database()
94
- ConfigTopic.initialize_stream(@scope)
95
-
96
- # Create UNKNOWN target for display of unknown data
97
- model = TargetModel.new(name: "UNKNOWN", scope: @scope)
98
- model.create
99
-
100
- # OpenC3 Log Microservice
96
+ def deploy_openc3_log_messages_microservice(gem_path, variables, parent)
101
97
  microservice_name = "#{@scope}__OPENC3__LOG"
102
98
  microservice = MicroserviceModel.new(
103
99
  name: microservice_name,
@@ -109,13 +105,16 @@ module OpenC3
109
105
  # ["CYCLE_SIZE", "50_000_000"] # Keep at most ~50MB per log
110
106
  ],
111
107
  topics: ["#{@scope}__openc3_log_messages"],
108
+ parent: parent,
112
109
  scope: @scope
113
110
  )
114
111
  microservice.create
115
112
  microservice.deploy(gem_path, variables)
113
+ @children << microservice_name if parent
116
114
  Logger.info "Configured microservice #{microservice_name}"
115
+ end
117
116
 
118
- # Notification Log Microservice
117
+ def deploy_openc3_notifications_microservice(gem_path, variables, parent)
119
118
  microservice_name = "#{@scope}__NOTIFICATION__LOG"
120
119
  microservice = MicroserviceModel.new(
121
120
  name: microservice_name,
@@ -126,13 +125,16 @@ module OpenC3
126
125
  ["CYCLE_TIME", "3600"], # Keep at most 1 hour per log
127
126
  ],
128
127
  topics: ["#{@scope}__openc3_notifications"],
128
+ parent: parent,
129
129
  scope: @scope
130
130
  )
131
131
  microservice.create
132
132
  microservice.deploy(gem_path, variables)
133
+ @children << microservice_name if parent
133
134
  Logger.info "Configured microservice #{microservice_name}"
135
+ end
134
136
 
135
- # UNKNOWN CommandLog Microservice
137
+ def deploy_unknown_commandlog_microservice(gem_path, variables, parent)
136
138
  Topic.initialize_streams(["#{@scope}__COMMAND__{UNKNOWN}__UNKNOWN"])
137
139
  microservice_name = "#{@scope}__COMMANDLOG__UNKNOWN"
138
140
  microservice = MicroserviceModel.new(
@@ -146,13 +148,16 @@ module OpenC3
146
148
  ],
147
149
  topics: ["#{@scope}__COMMAND__{UNKNOWN}__UNKNOWN"],
148
150
  target_names: [],
151
+ parent: parent,
149
152
  scope: @scope
150
153
  )
151
154
  microservice.create
152
155
  microservice.deploy(gem_path, variables)
156
+ @children << microservice_name if parent
153
157
  Logger.info "Configured microservice #{microservice_name}"
158
+ end
154
159
 
155
- # UNKNOWN PacketLog Microservice
160
+ def deploy_unknown_packetlog_microservice(gem_path, variables, parent)
156
161
  Topic.initialize_streams(["#{@scope}__TELEMETRY__{UNKNOWN}__UNKNOWN"])
157
162
  microservice_name = "#{@scope}__PACKETLOG__UNKNOWN"
158
163
  microservice = MicroserviceModel.new(
@@ -166,14 +171,78 @@ module OpenC3
166
171
  ],
167
172
  topics: ["#{@scope}__TELEMETRY__{UNKNOWN}__UNKNOWN"],
168
173
  target_names: [],
174
+ parent: parent,
169
175
  scope: @scope
170
176
  )
171
177
  microservice.create
172
178
  microservice.deploy(gem_path, variables)
179
+ @children << microservice_name if parent
173
180
  Logger.info "Configured microservice #{microservice_name}"
174
181
  end
175
182
 
183
+ def deploy_periodic_microservice(gem_path, variables, parent)
184
+ microservice_name = "#{@scope}__PERIODIC__#{@scope}"
185
+ microservice = MicroserviceModel.new(
186
+ name: microservice_name,
187
+ cmd: ["ruby", "periodic_microservice.rb", microservice_name],
188
+ work_dir: '/openc3/lib/openc3/microservices',
189
+ parent: parent,
190
+ scope: @scope
191
+ )
192
+ microservice.create
193
+ microservice.deploy(gem_path, variables)
194
+ @children << microservice_name if parent
195
+ Logger.info "Configured microservice #{microservice_name}"
196
+ end
197
+
198
+ def deploy_scopemulti_microservice(gem_path, variables)
199
+ microservice_name = "#{@scope}__SCOPEMULTI__#{@scope}"
200
+ microservice = MicroserviceModel.new(
201
+ name: microservice_name,
202
+ cmd: ["ruby", "multi_microservice.rb", *@children],
203
+ work_dir: '/openc3/lib/openc3/microservices',
204
+ target_names: [],
205
+ scope: @scope
206
+ )
207
+ microservice.create
208
+ microservice.deploy(gem_path, variables)
209
+ Logger.info "Configured microservice #{microservice_name}"
210
+ end
211
+
212
+ def deploy(gem_path, variables)
213
+ seed_database()
214
+ ConfigTopic.initialize_stream(@scope)
215
+
216
+ # Create UNKNOWN target for display of unknown data
217
+ model = TargetModel.new(name: "UNKNOWN", scope: @scope)
218
+ model.create
219
+ # Not deployed - we only want raw packet logging for UNKNOWN
220
+ # TODO: Cleanup support
221
+
222
+ @parent = "#{@scope}__SCOPEMULTI__#{@scope}"
223
+
224
+ # OpenC3 Log Microservice
225
+ deploy_openc3_log_messages_microservice(gem_path, variables, @parent)
226
+
227
+ # Notification Log Microservice
228
+ deploy_openc3_notifications_microservice(gem_path, variables, @parent)
229
+
230
+ # UNKNOWN CommandLog Microservice
231
+ deploy_unknown_commandlog_microservice(gem_path, variables, @parent)
232
+
233
+ # UNKNOWN PacketLog Microservice
234
+ deploy_unknown_packetlog_microservice(gem_path, variables, @parent)
235
+
236
+ # Periodic Microservice
237
+ deploy_periodic_microservice(gem_path, variables, @parent)
238
+
239
+ # Multi Microservice to parent other scope microservices
240
+ deploy_scopemulti_microservice(gem_path, variables)
241
+ end
242
+
176
243
  def undeploy
244
+ model = MicroserviceModel.get_model(name: "#{@scope}__SCOPEMULTI__#{@scope}", scope: @scope)
245
+ model.destroy if model
177
246
  model = MicroserviceModel.get_model(name: "#{@scope}__OPENC3__LOG", scope: @scope)
178
247
  model.destroy if model
179
248
  model = MicroserviceModel.get_model(name: "#{@scope}__NOTIFICATION__LOG", scope: @scope)
@@ -182,11 +251,18 @@ module OpenC3
182
251
  model.destroy if model
183
252
  model = MicroserviceModel.get_model(name: "#{@scope}__PACKETLOG__UNKNOWN", scope: @scope)
184
253
  model.destroy if model
254
+ model = MicroserviceModel.get_model(name: "#{@scope}__PERIODIC__#{@scope}", scope: @scope)
255
+ model.destroy if model
256
+ # Delete the topics we created for the scope
257
+ Topic.del("#{@scope}__COMMAND__{UNKNOWN}__UNKNOWN")
258
+ Topic.del("#{@scope}__TELEMETRY__{UNKNOWN}__UNKNOWN")
259
+ Topic.del("#{@scope}__openc3_targets")
260
+ Topic.del("#{@scope}__CONFIG")
185
261
  end
186
262
 
187
263
  def seed_database
188
264
  setting = SettingsModel.get(name: 'source_url')
189
- SettingsModel.set({ name: 'source_url', data: 'https://github.com/OpenC3/openc3' }, scope: @scope) unless setting
265
+ SettingsModel.set({ name: 'source_url', data: 'https://github.com/OpenC3/cosmos' }, scope: @scope) unless setting
190
266
  end
191
267
  end
192
268
  end
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/models/model'
@@ -0,0 +1,53 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 OpenC3, Inc.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # This file may also be used under the terms of a commercial license
17
+ # if purchased from OpenC3, Inc.
18
+
19
+ require 'openc3/models/model'
20
+
21
+ module OpenC3
22
+ class StashModel < Model
23
+ PRIMARY_KEY = 'openc3__stash'
24
+
25
+ # NOTE: The following three class methods are used by the ModelController
26
+ # and are reimplemented to enable various Model class methods to work
27
+ def self.get(name:, scope:)
28
+ super("#{scope}__#{PRIMARY_KEY}", name: name)
29
+ end
30
+
31
+ def self.names(scope:)
32
+ super("#{scope}__#{PRIMARY_KEY}")
33
+ end
34
+
35
+ def self.all(scope:)
36
+ super("#{scope}__#{PRIMARY_KEY}")
37
+ end
38
+ # END NOTE
39
+
40
+ def initialize(name:, value:, scope:)
41
+ super("#{scope}__#{PRIMARY_KEY}", name: name, scope: scope)
42
+ @value = value
43
+ end
44
+
45
+ # @return [Hash] JSON encoding of this model
46
+ def as_json(*a)
47
+ {
48
+ 'name' => @name,
49
+ 'value' => @value.as_json(*a),
50
+ }
51
+ end
52
+ end
53
+ end