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
@@ -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