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
@@ -54,12 +54,14 @@ module OpenC3
54
54
  attr_accessor :cmd_unique_id_mode
55
55
  attr_accessor :tlm_unique_id_mode
56
56
  attr_accessor :id
57
+ attr_accessor :cmd_buffer_depth
57
58
  attr_accessor :cmd_log_cycle_time
58
59
  attr_accessor :cmd_log_cycle_size
59
60
  attr_accessor :cmd_log_retain_time
60
61
  attr_accessor :cmd_decom_log_cycle_time
61
62
  attr_accessor :cmd_decom_log_cycle_size
62
63
  attr_accessor :cmd_decom_log_retain_time
64
+ attr_accessor :tlm_buffer_depth
63
65
  attr_accessor :tlm_log_cycle_time
64
66
  attr_accessor :tlm_log_cycle_size
65
67
  attr_accessor :tlm_log_retain_time
@@ -71,6 +73,8 @@ module OpenC3
71
73
  attr_accessor :reduced_day_log_retain_time
72
74
  attr_accessor :cleanup_poll_time
73
75
  attr_accessor :needs_dependencies
76
+ attr_accessor :target_microservices
77
+ attr_accessor :children
74
78
 
75
79
  # NOTE: The following three class methods are used by the ModelController
76
80
  # and are reimplemented to enable various Model class methods to work
@@ -290,12 +294,14 @@ module OpenC3
290
294
  id: nil,
291
295
  updated_at: nil,
292
296
  plugin: nil,
297
+ cmd_buffer_depth: 5,
293
298
  cmd_log_cycle_time: 600,
294
299
  cmd_log_cycle_size: 50_000_000,
295
300
  cmd_log_retain_time: nil,
296
301
  cmd_decom_log_cycle_time: 600,
297
302
  cmd_decom_log_cycle_size: 50_000_000,
298
303
  cmd_decom_log_retain_time: nil,
304
+ tlm_buffer_depth: 60,
299
305
  tlm_log_cycle_time: 600,
300
306
  tlm_log_cycle_size: 50_000_000,
301
307
  tlm_log_retain_time: nil,
@@ -307,20 +313,21 @@ module OpenC3
307
313
  reduced_day_log_retain_time: nil,
308
314
  cleanup_poll_time: 900,
309
315
  needs_dependencies: false,
316
+ target_microservices: {},
310
317
  scope:
311
318
  )
312
319
  super("#{scope}__#{PRIMARY_KEY}", name: name, plugin: plugin, updated_at: updated_at,
313
- cmd_log_cycle_time: cmd_log_cycle_time, cmd_log_cycle_size: cmd_log_cycle_size,
320
+ cmd_buffer_depth: cmd_buffer_depth, cmd_log_cycle_time: cmd_log_cycle_time, cmd_log_cycle_size: cmd_log_cycle_size,
314
321
  cmd_log_retain_time: cmd_log_retain_time,
315
322
  cmd_decom_log_cycle_time: cmd_decom_log_cycle_time, cmd_decom_log_cycle_size: cmd_decom_log_cycle_size,
316
323
  cmd_decom_log_retain_time: cmd_decom_log_retain_time,
317
- tlm_log_cycle_time: tlm_log_cycle_time, tlm_log_cycle_size: tlm_log_cycle_size,
324
+ tlm_buffer_depth: tlm_buffer_depth, tlm_log_cycle_time: tlm_log_cycle_time, tlm_log_cycle_size: tlm_log_cycle_size,
318
325
  tlm_log_retain_time: tlm_log_retain_time,
319
326
  tlm_decom_log_cycle_time: tlm_decom_log_cycle_time, tlm_decom_log_cycle_size: tlm_decom_log_cycle_size,
320
327
  tlm_decom_log_retain_time: tlm_decom_log_retain_time,
321
328
  reduced_minute_log_retain_time: reduced_minute_log_retain_time,
322
329
  reduced_hour_log_retain_time: reduced_hour_log_retain_time, reduced_day_log_retain_time: reduced_day_log_retain_time,
323
- cleanup_poll_time: cleanup_poll_time, needs_dependencies: needs_dependencies,
330
+ cleanup_poll_time: cleanup_poll_time, needs_dependencies: needs_dependencies, target_microservices: target_microservices,
324
331
  scope: scope)
325
332
  @folder_name = folder_name
326
333
  @requires = requires
@@ -331,12 +338,14 @@ module OpenC3
331
338
  @cmd_unique_id_mode = cmd_unique_id_mode
332
339
  @tlm_unique_id_mode = tlm_unique_id_mode
333
340
  @id = id
341
+ @cmd_buffer_depth = cmd_buffer_depth
334
342
  @cmd_log_cycle_time = cmd_log_cycle_time
335
343
  @cmd_log_cycle_size = cmd_log_cycle_size
336
344
  @cmd_log_retain_time = cmd_log_retain_time
337
345
  @cmd_decom_log_cycle_time = cmd_decom_log_cycle_time
338
346
  @cmd_decom_log_cycle_size = cmd_decom_log_cycle_size
339
347
  @cmd_decom_log_retain_time = cmd_decom_log_retain_time
348
+ @tlm_buffer_depth = tlm_buffer_depth
340
349
  @tlm_log_cycle_time = tlm_log_cycle_time
341
350
  @tlm_log_cycle_size = tlm_log_cycle_size
342
351
  @tlm_log_retain_time = tlm_log_retain_time
@@ -348,7 +357,9 @@ module OpenC3
348
357
  @reduced_day_log_retain_time = reduced_day_log_retain_time
349
358
  @cleanup_poll_time = cleanup_poll_time
350
359
  @needs_dependencies = needs_dependencies
360
+ @target_microservices = target_microservices
351
361
  @bucket = Bucket.getClient()
362
+ @children = []
352
363
  end
353
364
 
354
365
  def as_json(*a)
@@ -365,12 +376,14 @@ module OpenC3
365
376
  'id' => @id,
366
377
  'updated_at' => @updated_at,
367
378
  'plugin' => @plugin,
379
+ 'cmd_buffer_depth' => @cmd_buffer_depth,
368
380
  'cmd_log_cycle_time' => @cmd_log_cycle_time,
369
381
  'cmd_log_cycle_size' => @cmd_log_cycle_size,
370
382
  'cmd_log_retain_time' => @cmd_log_retain_time,
371
383
  'cmd_decom_log_cycle_time' => @cmd_decom_log_cycle_time,
372
384
  'cmd_decom_log_cycle_size' => @cmd_decom_log_cycle_size,
373
385
  'cmd_decom_log_retain_time' => @cmd_decom_log_retain_time,
386
+ 'tlm_buffer_depth' => @tlm_buffer_depth,
374
387
  'tlm_log_cycle_time' => @tlm_log_cycle_time,
375
388
  'tlm_log_cycle_size' => @tlm_log_cycle_size,
376
389
  'tlm_log_retain_time' => @tlm_log_retain_time,
@@ -382,16 +395,16 @@ module OpenC3
382
395
  'reduced_day_log_retain_time' => @reduced_day_log_retain_time,
383
396
  'cleanup_poll_time' => @cleanup_poll_time,
384
397
  'needs_dependencies' => @needs_dependencies,
398
+ 'target_microservices' => @target_microservices.as_json(:allow_nan => true)
385
399
  }
386
400
  end
387
401
 
388
- def as_config
389
- "TARGET #{@folder_name} #{@name}\n"
390
- end
391
-
392
402
  # Handles Target specific configuration keywords
393
403
  def handle_config(parser, keyword, parameters)
394
404
  case keyword
405
+ when 'CMD_BUFFER_DEPTH'
406
+ parser.verify_num_parameters(1, 1, "#{keyword} <Number of commands to buffer to ensure logged in order>")
407
+ @cmd_buffer_depth = parameters[0].to_i
395
408
  when 'CMD_LOG_CYCLE_TIME'
396
409
  parser.verify_num_parameters(1, 1, "#{keyword} <Maximum time between files in seconds>")
397
410
  @cmd_log_cycle_time = parameters[0].to_i
@@ -412,6 +425,9 @@ module OpenC3
412
425
  parser.verify_num_parameters(1, 1, "#{keyword} <Retention time for cmd decom log files in seconds - nil = Forever>")
413
426
  @cmd_decom_log_retain_time = ConfigParser.handle_nil(parameters[0])
414
427
  @cmd_decom_log_retain_time = @cmd_decom_log_retain_time.to_i if @cmd_decom_log_retain_time
428
+ when 'TLM_BUFFER_DEPTH'
429
+ parser.verify_num_parameters(1, 1, "#{keyword} <Number of telemetry packets to buffer to ensure logged in order>")
430
+ @tlm_buffer_depth = parameters[0].to_i
415
431
  when 'TLM_LOG_CYCLE_TIME'
416
432
  parser.verify_num_parameters(1, 1, "#{keyword} <Maximum time between files in seconds>")
417
433
  @tlm_log_cycle_time = parameters[0].to_i
@@ -464,6 +480,25 @@ module OpenC3
464
480
  when 'CLEANUP_POLL_TIME'
465
481
  parser.verify_num_parameters(1, 1, "#{keyword} <Cleanup polling period in seconds>")
466
482
  @cleanup_poll_time = parameters[0].to_i
483
+ when 'TARGET_MICROSERVICE'
484
+ parser.verify_num_parameters(1, 1, "#{keyword} <Type: DECOM COMMANDLOG DECOMCMDLOG PACKETLOG DECOMLOG REDUCER CLEANUP>")
485
+ type = parameters[0].to_s.upcase
486
+ unless %w(DECOM COMMANDLOG DECOMCMDLOG PACKETLOG DECOMLOG REDUCER CLEANUP).include?(type)
487
+ raise "Unknown TARGET_MICROSERVICE #{type}"
488
+ end
489
+ @target_microservices[type] ||= []
490
+ @target_microservices[type] << []
491
+ @current_target_microservice = type
492
+ when 'PACKET'
493
+ if @current_target_microservice
494
+ parser.verify_num_parameters(1, 1, "#{keyword} <Packet Name>")
495
+ if @current_target_microservice == 'REDUCER' or @current_target_microservice == 'CLEANUP'
496
+ raise ConfigParser::Error.new(parser, "PACKET cannot be used with target microservice #{@current_target_microservice}")
497
+ end
498
+ @target_microservices[@current_target_microservice][-1] << parameters[0].to_s.upcase
499
+ else
500
+ raise ConfigParser::Error.new(parser, "PACKET cannot be used without a TARGET_MICROSERVICE")
501
+ end
467
502
  else
468
503
  raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Target: #{keyword} #{parameters.join(" ")}")
469
504
  end
@@ -546,9 +581,19 @@ module OpenC3
546
581
  Store.del("#{@scope}__openc3cmd__#{@name}")
547
582
 
548
583
  # Note: these match the names of the services in deploy_microservices
549
- %w(DECOM COMMANDLOG DECOMCMDLOG PACKETLOG DECOMLOG REDUCER CLEANUP).each do |type|
550
- model = MicroserviceModel.get_model(name: "#{@scope}__#{type}__#{@name}", scope: @scope)
551
- model.destroy if model
584
+ %w(MULTI DECOM COMMANDLOG DECOMCMDLOG PACKETLOG DECOMLOG REDUCER CLEANUP).each do |type|
585
+ target_microservices = @target_microservices[type]
586
+ if target_microservices
587
+ max_instances = target_microservices.length + 1
588
+ else
589
+ max_instances = 1
590
+ end
591
+ max_instances.times do |index|
592
+ instance = nil
593
+ instance = index unless index == 0
594
+ model = MicroserviceModel.get_model(name: "#{@scope}__#{type}#{instance}__#{@name}", scope: @scope)
595
+ model.destroy if model
596
+ end
552
597
  end
553
598
 
554
599
  ConfigTopic.write({ kind: 'deleted', type: 'target', name: @name, plugin: @plugin }, scope: @scope)
@@ -683,6 +728,218 @@ module OpenC3
683
728
  return system
684
729
  end
685
730
 
731
+ def deploy_commmandlog_microservice(gem_path, variables, topics, instance = nil, parent = nil)
732
+ microservice_name = "#{@scope}__COMMANDLOG#{instance}__#{@name}"
733
+ microservice = MicroserviceModel.new(
734
+ name: microservice_name,
735
+ folder_name: @folder_name,
736
+ cmd: ["ruby", "log_microservice.rb", microservice_name],
737
+ work_dir: '/openc3/lib/openc3/microservices',
738
+ options: [
739
+ ["RAW_OR_DECOM", "RAW"],
740
+ ["CMD_OR_TLM", "CMD"],
741
+ ["CYCLE_TIME", @cmd_log_cycle_time],
742
+ ["CYCLE_SIZE", @cmd_log_cycle_size],
743
+ ["BUFFER_DEPTH", @cmd_buffer_depth]
744
+ ],
745
+ topics: topics,
746
+ plugin: @plugin,
747
+ parent: parent,
748
+ needs_dependencies: @needs_dependencies,
749
+ scope: @scope
750
+ )
751
+ microservice.create
752
+ microservice.deploy(gem_path, variables)
753
+ @children << microservice_name if parent
754
+ Logger.info "Configured microservice #{microservice_name}"
755
+ end
756
+
757
+ def deploy_decomcmdlog_microservice(gem_path, variables, topics, instance = nil, parent = nil)
758
+ microservice_name = "#{@scope}__DECOMCMDLOG#{instance}__#{@name}"
759
+ microservice = MicroserviceModel.new(
760
+ name: microservice_name,
761
+ folder_name: @folder_name,
762
+ cmd: ["ruby", "log_microservice.rb", microservice_name],
763
+ work_dir: '/openc3/lib/openc3/microservices',
764
+ options: [
765
+ ["RAW_OR_DECOM", "DECOM"],
766
+ ["CMD_OR_TLM", "CMD"],
767
+ ["CYCLE_TIME", @cmd_decom_log_cycle_time],
768
+ ["CYCLE_SIZE", @cmd_decom_log_cycle_size],
769
+ ["BUFFER_DEPTH", @cmd_buffer_depth]
770
+ ],
771
+ topics: topics,
772
+ plugin: @plugin,
773
+ parent: parent,
774
+ needs_dependencies: @needs_dependencies,
775
+ scope: @scope
776
+ )
777
+ microservice.create
778
+ microservice.deploy(gem_path, variables)
779
+ @children << microservice_name if parent
780
+ Logger.info "Configured microservice #{microservice_name}"
781
+ end
782
+
783
+ def deploy_packetlog_microservice(gem_path, variables, topics, instance = nil, parent = nil)
784
+ microservice_name = "#{@scope}__PACKETLOG#{instance}__#{@name}"
785
+ microservice = MicroserviceModel.new(
786
+ name: microservice_name,
787
+ folder_name: @folder_name,
788
+ cmd: ["ruby", "log_microservice.rb", microservice_name],
789
+ work_dir: '/openc3/lib/openc3/microservices',
790
+ options: [
791
+ ["RAW_OR_DECOM", "RAW"],
792
+ ["CMD_OR_TLM", "TLM"],
793
+ ["CYCLE_TIME", @tlm_log_cycle_time],
794
+ ["CYCLE_SIZE", @tlm_log_cycle_size],
795
+ ["BUFFER_DEPTH", @tlm_buffer_depth]
796
+ ],
797
+ topics: topics,
798
+ plugin: @plugin,
799
+ parent: parent,
800
+ needs_dependencies: @needs_dependencies,
801
+ scope: @scope
802
+ )
803
+ microservice.create
804
+ microservice.deploy(gem_path, variables)
805
+ @children << microservice_name if parent
806
+ Logger.info "Configured microservice #{microservice_name}"
807
+ end
808
+
809
+ def deploy_decomlog_microservice(gem_path, variables, topics, instance = nil, parent = nil)
810
+ microservice_name = "#{@scope}__DECOMLOG#{instance}__#{@name}"
811
+ microservice = MicroserviceModel.new(
812
+ name: microservice_name,
813
+ folder_name: @folder_name,
814
+ cmd: ["ruby", "log_microservice.rb", microservice_name],
815
+ work_dir: '/openc3/lib/openc3/microservices',
816
+ options: [
817
+ ["RAW_OR_DECOM", "DECOM"],
818
+ ["CMD_OR_TLM", "TLM"],
819
+ ["CYCLE_TIME", @tlm_decom_log_cycle_time],
820
+ ["CYCLE_SIZE", @tlm_decom_log_cycle_size],
821
+ ["BUFFER_DEPTH", @tlm_buffer_depth]
822
+ ],
823
+ topics: topics,
824
+ plugin: @plugin,
825
+ parent: parent,
826
+ needs_dependencies: @needs_dependencies,
827
+ scope: @scope
828
+ )
829
+ microservice.create
830
+ microservice.deploy(gem_path, variables)
831
+ @children << microservice_name if parent
832
+ Logger.info "Configured microservice #{microservice_name}"
833
+ end
834
+
835
+ def deploy_decom_microservice(gem_path, variables, topics, instance = nil, parent = nil)
836
+ microservice_name = "#{@scope}__DECOM#{instance}__#{@name}"
837
+ microservice = MicroserviceModel.new(
838
+ name: microservice_name,
839
+ folder_name: @folder_name,
840
+ cmd: ["ruby", "decom_microservice.rb", microservice_name],
841
+ work_dir: '/openc3/lib/openc3/microservices',
842
+ topics: topics,
843
+ target_names: [@name],
844
+ plugin: @plugin,
845
+ parent: parent,
846
+ needs_dependencies: @needs_dependencies,
847
+ scope: @scope
848
+ )
849
+ microservice.create
850
+ microservice.deploy(gem_path, variables)
851
+ @children << microservice_name if parent
852
+ Logger.info "Configured microservice #{microservice_name}"
853
+ end
854
+
855
+ def deploy_reducer_microservice(gem_path, variables, topics, instance = nil, parent = nil)
856
+ microservice_name = "#{@scope}__REDUCER#{instance}__#{@name}"
857
+ microservice = MicroserviceModel.new(
858
+ name: microservice_name,
859
+ folder_name: @folder_name,
860
+ cmd: ["ruby", "reducer_microservice.rb", microservice_name],
861
+ work_dir: '/openc3/lib/openc3/microservices',
862
+ topics: topics,
863
+ plugin: @plugin,
864
+ parent: parent,
865
+ needs_dependencies: @needs_dependencies,
866
+ scope: @scope
867
+ )
868
+ microservice.create
869
+ microservice.deploy(gem_path, variables)
870
+ @children << microservice_name if parent
871
+ Logger.info "Configured microservice #{microservice_name}"
872
+ end
873
+
874
+ def deploy_cleanup_microservice(gem_path, variables, instance = nil, parent = nil)
875
+ microservice_name = "#{@scope}__CLEANUP#{instance}__#{@name}"
876
+ microservice = MicroserviceModel.new(
877
+ name: microservice_name,
878
+ cmd: ["ruby", "cleanup_microservice.rb", microservice_name],
879
+ work_dir: '/openc3/lib/openc3/microservices',
880
+ plugin: @plugin,
881
+ parent: parent,
882
+ scope: @scope
883
+ )
884
+ microservice.create
885
+ microservice.deploy(gem_path, variables)
886
+ @children << microservice_name if parent
887
+ Logger.info "Configured microservice #{microservice_name}"
888
+ end
889
+
890
+ def deploy_multi_microservice(gem_path, variables, instance = nil)
891
+ if @children.length > 0
892
+ microservice_name = "#{@scope}__MULTI#{instance}__#{@name}"
893
+ microservice = MicroserviceModel.new(
894
+ name: microservice_name,
895
+ cmd: ["ruby", "multi_microservice.rb", *@children],
896
+ work_dir: '/openc3/lib/openc3/microservices',
897
+ target_names: [@name],
898
+ plugin: @plugin,
899
+ scope: @scope
900
+ )
901
+ microservice.create
902
+ microservice.deploy(gem_path, variables)
903
+ Logger.info "Configured microservice #{microservice_name}"
904
+ end
905
+ end
906
+
907
+ def deploy_target_microservices(type, base_topic_list, topic_prefix)
908
+ target_microservices = @target_microservices[type]
909
+ if target_microservices
910
+ if base_topic_list
911
+ deploy_count = 0
912
+ all_topics = base_topic_list.dup
913
+ target_microservices.sort! {|a, b| a.length <=> b.length}
914
+ target_microservices.each_with_index do |packet_names, index|
915
+ topics = []
916
+ packet_names.each do |packet_name|
917
+ topics << "#{topic_prefix}__#{packet_name}"
918
+ end
919
+ topics = all_topics.dup if topics.length <= 0
920
+ if topics.length > 0
921
+ instance = nil
922
+ instance = deploy_count unless deploy_count == 0
923
+ yield topics, instance, nil
924
+ deploy_count += 1
925
+ topics.each do |topic|
926
+ all_topics.delete(topic)
927
+ end
928
+ end
929
+ end
930
+ if all_topics.length > 0
931
+ instance = nil
932
+ instance = deploy_count unless deploy_count == 0
933
+ yield all_topics, instance, nil
934
+ end
935
+ else
936
+ yield nil, nil, nil
937
+ end
938
+ else
939
+ yield base_topic_list, nil, @parent if not base_topic_list or base_topic_list.length > 0
940
+ end
941
+ end
942
+
686
943
  def deploy_microservices(gem_path, variables, system)
687
944
  command_topic_list = []
688
945
  decom_command_topic_list = []
@@ -715,145 +972,59 @@ module OpenC3
715
972
  Topic.initialize_streams(decom_topic_list)
716
973
  Topic.initialize_streams(reduced_topic_list)
717
974
 
975
+ @parent = nil
976
+ %w(DECOM COMMANDLOG DECOMCMDLOG PACKETLOG DECOMLOG REDUCER CLEANUP).each do |type|
977
+ unless @target_microservices[type]
978
+ @parent = "#{@scope}__MULTI__#{@name}"
979
+ break
980
+ end
981
+ end
982
+
718
983
  unless command_topic_list.empty?
719
984
  # CommandLog Microservice
720
- microservice_name = "#{@scope}__COMMANDLOG__#{@name}"
721
- microservice = MicroserviceModel.new(
722
- name: microservice_name,
723
- folder_name: @folder_name,
724
- cmd: ["ruby", "log_microservice.rb", microservice_name],
725
- work_dir: '/openc3/lib/openc3/microservices',
726
- options: [
727
- ["RAW_OR_DECOM", "RAW"],
728
- ["CMD_OR_TLM", "CMD"],
729
- ["CYCLE_TIME", @cmd_log_cycle_time],
730
- ["CYCLE_SIZE", @cmd_log_cycle_size]
731
- ],
732
- topics: command_topic_list,
733
- plugin: @plugin,
734
- needs_dependencies: @needs_dependencies,
735
- scope: @scope
736
- )
737
- microservice.create
738
- microservice.deploy(gem_path, variables)
739
- Logger.info "Configured microservice #{microservice_name}"
985
+ deploy_target_microservices('COMMANDLOG', command_topic_list, "#{@scope}__COMMAND__{#{@name}}") do |topics, instance, parent|
986
+ deploy_commmandlog_microservice(gem_path, variables, topics, instance, parent)
987
+ end
740
988
 
741
989
  # DecomCmdLog Microservice
742
- microservice_name = "#{@scope}__DECOMCMDLOG__#{@name}"
743
- microservice = MicroserviceModel.new(
744
- name: microservice_name,
745
- folder_name: @folder_name,
746
- cmd: ["ruby", "log_microservice.rb", microservice_name],
747
- work_dir: '/openc3/lib/openc3/microservices',
748
- options: [
749
- ["RAW_OR_DECOM", "DECOM"],
750
- ["CMD_OR_TLM", "CMD"],
751
- ["CYCLE_TIME", @cmd_decom_log_cycle_time],
752
- ["CYCLE_SIZE", @cmd_decom_log_cycle_size]
753
- ],
754
- topics: decom_command_topic_list,
755
- plugin: @plugin,
756
- needs_dependencies: @needs_dependencies,
757
- scope: @scope
758
- )
759
- microservice.create
760
- microservice.deploy(gem_path, variables)
761
- Logger.info "Configured microservice #{microservice_name}"
990
+ deploy_target_microservices('DECOMCMDLOG', decom_command_topic_list, "#{@scope}__DECOMCMD__{#{@name}}") do |topics, instance, parent|
991
+ deploy_decomcmdlog_microservice(gem_path, variables, topics, instance, parent)
992
+ end
762
993
  end
763
994
 
764
995
  unless packet_topic_list.empty?
765
996
  # PacketLog Microservice
766
- microservice_name = "#{@scope}__PACKETLOG__#{@name}"
767
- microservice = MicroserviceModel.new(
768
- name: microservice_name,
769
- folder_name: @folder_name,
770
- cmd: ["ruby", "log_microservice.rb", microservice_name],
771
- work_dir: '/openc3/lib/openc3/microservices',
772
- options: [
773
- ["RAW_OR_DECOM", "RAW"],
774
- ["CMD_OR_TLM", "TLM"],
775
- ["CYCLE_TIME", @tlm_log_cycle_time],
776
- ["CYCLE_SIZE", @tlm_log_cycle_size]
777
- ],
778
- topics: packet_topic_list,
779
- plugin: @plugin,
780
- needs_dependencies: @needs_dependencies,
781
- scope: @scope
782
- )
783
- microservice.create
784
- microservice.deploy(gem_path, variables)
785
- Logger.info "Configured microservice #{microservice_name}"
997
+ deploy_target_microservices('PACKETLOG', packet_topic_list, "#{@scope}__TELEMETRY__{#{@name}}") do |topics, instance, parent|
998
+ deploy_packetlog_microservice(gem_path, variables, topics, instance, parent)
999
+ end
786
1000
 
787
1001
  # DecomLog Microservice
788
- microservice_name = "#{@scope}__DECOMLOG__#{@name}"
789
- microservice = MicroserviceModel.new(
790
- name: microservice_name,
791
- folder_name: @folder_name,
792
- cmd: ["ruby", "log_microservice.rb", microservice_name],
793
- work_dir: '/openc3/lib/openc3/microservices',
794
- options: [
795
- ["RAW_OR_DECOM", "DECOM"],
796
- ["CMD_OR_TLM", "TLM"],
797
- ["CYCLE_TIME", @tlm_decom_log_cycle_time],
798
- ["CYCLE_SIZE", @tlm_decom_log_cycle_size]
799
- ],
800
- topics: decom_topic_list,
801
- plugin: @plugin,
802
- needs_dependencies: @needs_dependencies,
803
- scope: @scope
804
- )
805
- microservice.create
806
- microservice.deploy(gem_path, variables)
807
- Logger.info "Configured microservice #{microservice_name}"
1002
+ deploy_target_microservices('DECOMLOG', decom_topic_list, "#{@scope}__DECOM__{#{@name}}") do |topics, instance, parent|
1003
+ deploy_decomlog_microservice(gem_path, variables, topics, instance, parent)
1004
+ end
808
1005
 
809
1006
  # Decommutation Microservice
810
- microservice_name = "#{@scope}__DECOM__#{@name}"
811
- microservice = MicroserviceModel.new(
812
- name: microservice_name,
813
- folder_name: @folder_name,
814
- cmd: ["ruby", "decom_microservice.rb", microservice_name],
815
- work_dir: '/openc3/lib/openc3/microservices',
816
- topics: packet_topic_list,
817
- target_names: [@name],
818
- plugin: @plugin,
819
- needs_dependencies: @needs_dependencies,
820
- scope: @scope
821
- )
822
- microservice.create
823
- microservice.deploy(gem_path, variables)
824
- Logger.info "Configured microservice #{microservice_name}"
1007
+ deploy_target_microservices('DECOM', packet_topic_list, "#{@scope}__TELEMETRY__{#{@name}}") do |topics, instance, parent|
1008
+ deploy_decom_microservice(gem_path, variables, topics, instance, parent)
1009
+ end
825
1010
 
826
1011
  # Reducer Microservice
827
- microservice_name = "#{@scope}__REDUCER__#{@name}"
828
- microservice = MicroserviceModel.new(
829
- name: microservice_name,
830
- folder_name: @folder_name,
831
- cmd: ["ruby", "reducer_microservice.rb", microservice_name],
832
- work_dir: '/openc3/lib/openc3/microservices',
833
- topics: decom_topic_list,
834
- plugin: @plugin,
835
- needs_dependencies: @needs_dependencies,
836
- scope: @scope
837
- )
838
- microservice.create
839
- microservice.deploy(gem_path, variables)
840
- Logger.info "Configured microservice #{microservice_name}"
1012
+ deploy_target_microservices('REDUCER', decom_topic_list, "#{@scope}__DECOM__{#{@name}}") do |topics, instance, parent|
1013
+ deploy_reducer_microservice(gem_path, variables, topics, instance, parent)
1014
+ end
841
1015
  end
842
1016
 
843
1017
  if @cmd_log_retain_time or @cmd_decom_log_retain_time or @tlm_log_retain_time or @tlm_decom_log_retain_time or
844
1018
  @reduced_minute_log_retain_time or @reduced_hour_log_retain_time or @reduced_day_log_retain_time
845
1019
  # Cleanup Microservice
846
- microservice_name = "#{@scope}__CLEANUP__#{@name}"
847
- microservice = MicroserviceModel.new(
848
- name: microservice_name,
849
- cmd: ["ruby", "cleanup_microservice.rb", microservice_name],
850
- work_dir: '/openc3/lib/openc3/microservices',
851
- plugin: @plugin,
852
- scope: @scope
853
- )
854
- microservice.create
855
- microservice.deploy(gem_path, variables)
856
- Logger.info "Configured microservice #{microservice_name}"
1020
+ deploy_target_microservices('CLEANUP', nil, nil) do |_, instance, parent|
1021
+ deploy_cleanup_microservice(gem_path, variables, instance, parent)
1022
+ end
1023
+ end
1024
+
1025
+ if @parent
1026
+ # Multi Microservice to parent other target microservices
1027
+ deploy_multi_microservice(gem_path, variables)
857
1028
  end
858
1029
  end
859
1030
  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'
@@ -175,17 +175,6 @@ module OpenC3
175
175
  }
176
176
  end
177
177
 
178
- def as_config
179
- result = "TOOL #{@folder_name ? @folder_name : 'nil'} \"#{@name}\"\n"
180
- result << " URL #{@url}\n" if @url
181
- result << " INLINE_URL #{@inline_url}\n" if @inline_url
182
- result << " ICON #{@icon}\n" if @icon
183
- result << " WINDOW #{@window}\n" unless @window == 'INLINE'
184
- result << " CATEGORY #{@category}\n" if @category
185
- result << " SHOWN false\n" unless @shown
186
- result
187
- end
188
-
189
178
  def handle_config(parser, keyword, parameters)
190
179
  case keyword
191
180
  when 'URL'
@@ -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/top_level'
@@ -103,11 +103,6 @@ module OpenC3
103
103
  }
104
104
  end
105
105
 
106
- def as_config
107
- result = "WIDGET \"#{@name}\"\n"
108
- result
109
- end
110
-
111
106
  def handle_config(parser, keyword, parameters)
112
107
  raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Widget: #{keyword} #{parameters.join(" ")}")
113
108
  end