openc3 5.1.1 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
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