openc3 5.20.0 → 6.0.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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/bin/openc3cli +12 -120
  3. data/data/config/command_modifiers.yaml +13 -1
  4. data/data/config/interface_modifiers.yaml +21 -4
  5. data/data/config/item_modifiers.yaml +1 -1
  6. data/data/config/microservice.yaml +15 -2
  7. data/data/config/param_item_modifiers.yaml +1 -1
  8. data/data/config/parameter_modifiers.yaml +1 -1
  9. data/data/config/table_manager.yaml +2 -2
  10. data/data/config/target.yaml +11 -0
  11. data/data/config/telemetry_modifiers.yaml +17 -1
  12. data/data/config/tool.yaml +12 -0
  13. data/data/config/widgets.yaml +13 -17
  14. data/lib/openc3/accessors/form_accessor.rb +4 -3
  15. data/lib/openc3/accessors/html_accessor.rb +3 -3
  16. data/lib/openc3/accessors/http_accessor.rb +13 -13
  17. data/lib/openc3/accessors/xml_accessor.rb +16 -4
  18. data/lib/openc3/api/target_api.rb +0 -30
  19. data/lib/openc3/config/config_parser.rb +6 -3
  20. data/lib/openc3/core_ext/array.rb +0 -16
  21. data/lib/openc3/core_ext.rb +0 -1
  22. data/lib/openc3/interfaces/file_interface.rb +198 -0
  23. data/lib/openc3/interfaces/http_client_interface.rb +71 -39
  24. data/lib/openc3/interfaces/http_server_interface.rb +0 -7
  25. data/lib/openc3/interfaces/interface.rb +2 -0
  26. data/lib/openc3/interfaces/mqtt_interface.rb +32 -15
  27. data/lib/openc3/interfaces/mqtt_stream_interface.rb +19 -4
  28. data/lib/openc3/interfaces/protocols/crc_protocol.rb +7 -0
  29. data/lib/openc3/interfaces/serial_interface.rb +1 -0
  30. data/lib/openc3/interfaces.rb +2 -4
  31. data/lib/openc3/microservices/multi_microservice.rb +3 -3
  32. data/lib/openc3/migrations/20241208080000_no_critical_cmd.rb +31 -0
  33. data/lib/openc3/migrations/20241208080001_no_trigger_group.rb +46 -0
  34. data/lib/openc3/models/interface_model.rb +9 -3
  35. data/lib/openc3/models/microservice_model.rb +8 -1
  36. data/lib/openc3/models/plugin_model.rb +6 -1
  37. data/lib/openc3/models/python_package_model.rb +6 -1
  38. data/lib/openc3/models/reaction_model.rb +14 -10
  39. data/lib/openc3/models/scope_model.rb +60 -42
  40. data/lib/openc3/models/target_model.rb +17 -1
  41. data/lib/openc3/models/timeline_model.rb +17 -5
  42. data/lib/openc3/models/tool_model.rb +15 -3
  43. data/lib/openc3/models/trigger_group_model.rb +6 -3
  44. data/lib/openc3/operators/microservice_operator.rb +8 -0
  45. data/lib/openc3/packets/commands.rb +17 -6
  46. data/lib/openc3/packets/limits.rb +0 -12
  47. data/lib/openc3/packets/packet.rb +1 -1
  48. data/lib/openc3/packets/packet_item.rb +30 -36
  49. data/lib/openc3/packets/structure_item.rb +2 -2
  50. data/lib/openc3/script/script.rb +0 -10
  51. data/lib/openc3/script/web_socket_api.rb +2 -2
  52. data/lib/openc3/streams/mqtt_stream.rb +41 -33
  53. data/lib/openc3/streams/serial_stream.rb +27 -27
  54. data/lib/openc3/streams/stream.rb +17 -17
  55. data/lib/openc3/streams/tcpip_client_stream.rb +1 -1
  56. data/lib/openc3/streams/tcpip_socket_stream.rb +19 -19
  57. data/lib/openc3/system/system.rb +1 -1
  58. data/lib/openc3/system.rb +2 -3
  59. data/lib/openc3/tools/table_manager/table.rb +2 -2
  60. data/lib/openc3/tools/table_manager/table_parser.rb +1 -1
  61. data/lib/openc3/top_level.rb +0 -5
  62. data/lib/openc3/topics/command_decom_topic.rb +0 -7
  63. data/lib/openc3/utilities/bucket_utilities.rb +1 -1
  64. data/lib/openc3/utilities/cli_generator.rb +0 -1
  65. data/lib/openc3/version.rb +6 -6
  66. data/templates/plugin/README.md +1 -1
  67. data/templates/target/targets/TARGET/lib/target.rb +1 -1
  68. data/templates/tool_angular/package.json +8 -8
  69. data/templates/tool_angular/src/app/app.component.html +4 -13
  70. data/templates/tool_angular/src/app/app.component.scss +5 -13
  71. data/templates/tool_angular/src/app/app.component.ts +5 -4
  72. data/templates/tool_angular/src/app/custom-overlay-container.ts +2 -2
  73. data/templates/tool_angular/src/app/openc3-api.d.ts +1 -1
  74. data/templates/tool_angular/src/main.single-spa.ts +1 -1
  75. data/templates/tool_react/package.json +1 -0
  76. data/templates/tool_react/src/root.component.js +1 -1
  77. data/templates/tool_svelte/package.json +11 -9
  78. data/templates/tool_svelte/rollup.config.js +2 -0
  79. data/templates/tool_svelte/src/App.svelte +2 -2
  80. data/templates/tool_vue/eslint.config.mjs +68 -0
  81. data/templates/tool_vue/jsconfig.json +1 -1
  82. data/templates/tool_vue/package.json +26 -43
  83. data/templates/tool_vue/src/App.vue +3 -5
  84. data/templates/tool_vue/src/main.js +12 -23
  85. data/templates/tool_vue/src/router.js +19 -18
  86. data/templates/tool_vue/src/tools/tool_name/tool_name.vue +2 -2
  87. data/templates/tool_vue/vite.config.js +52 -0
  88. data/templates/widget/package.json +19 -26
  89. data/templates/widget/src/Widget.vue +13 -15
  90. data/templates/widget/vite.config.js +26 -0
  91. metadata +10 -41
  92. data/lib/openc3/core_ext/hash.rb +0 -40
  93. data/lib/openc3/core_ext/httpclient.rb +0 -11
  94. data/lib/openc3/interfaces/linc_interface.rb +0 -480
  95. data/lib/openc3/interfaces/protocols/override_protocol.rb +0 -4
  96. data/lib/openc3/microservices/critical_cmd_microservice.rb +0 -74
  97. data/lib/openc3/microservices/reaction_microservice.rb +0 -607
  98. data/lib/openc3/microservices/timeline_microservice.rb +0 -398
  99. data/lib/openc3/microservices/trigger_group_microservice.rb +0 -698
  100. data/lib/openc3/migrations/20230615000000_autonomic.rb +0 -86
  101. data/lib/openc3/migrations/20240915000000_activity_uuid.rb +0 -28
  102. data/lib/openc3/migrations/20241016000000_scope_critical_cmd.rb +0 -24
  103. data/lib/openc3/system/system_config.rb +0 -413
  104. data/templates/tool_svelte/src/services/api.js +0 -92
  105. data/templates/tool_svelte/src/services/axios.js +0 -85
  106. data/templates/tool_svelte/src/services/cable.js +0 -65
  107. data/templates/tool_svelte/src/services/config-parser.js +0 -198
  108. data/templates/tool_svelte/src/services/openc3-api.js +0 -606
  109. data/templates/tool_vue/.eslintrc.js +0 -43
  110. data/templates/tool_vue/babel.config.json +0 -11
  111. data/templates/tool_vue/vue.config.js +0 -38
  112. data/templates/widget/.eslintrc.js +0 -43
  113. data/templates/widget/babel.config.json +0 -11
  114. data/templates/widget/vue.config.js +0 -28
  115. /data/templates/tool_vue/{.prettierrc.js → .prettierrc.cjs} +0 -0
  116. /data/templates/widget/{.prettierrc.js → .prettierrc.cjs} +0 -0
@@ -16,14 +16,20 @@
16
16
  # This file may also be used under the terms of a commercial license
17
17
  # if purchased from OpenC3, Inc.
18
18
 
19
+ # You can quickly setup an unauthenticated MQTT server in Docker with
20
+ # docker run -it -p 1883:1883 eclipse-mosquitto:2.0.15 mosquitto -c /mosquitto-no-auth.conf
21
+ # You can also test against encrypted and authenticated servers at https://test.mosquitto.org/
22
+
19
23
  require 'openc3/interfaces/stream_interface'
20
24
  require 'openc3/streams/mqtt_stream'
25
+ require 'openc3/config/config_parser'
21
26
 
22
27
  module OpenC3
23
28
  class MqttStreamInterface < StreamInterface
24
29
  # @param hostname [String] MQTT server to connect to
25
30
  # @param port [Integer] MQTT port
26
- # @param ssl [Boolean] Use SSL true/false
31
+ # @param write_topic [String] MQTT publish topic
32
+ # @param read_topic [String] MQTT receive topic
27
33
  def initialize(hostname, port = 1883, ssl = false, write_topic = nil, read_topic = nil, protocol_type = nil, *protocol_args)
28
34
  super(protocol_type, protocol_args)
29
35
  @hostname = hostname
@@ -31,6 +37,7 @@ module OpenC3
31
37
  @ssl = ConfigParser.handle_true_false(ssl)
32
38
  @write_topic = ConfigParser.handle_nil(write_topic)
33
39
  @read_topic = ConfigParser.handle_nil(read_topic)
40
+ @ack_timeout = 5.0
34
41
  @username = nil
35
42
  @password = nil
36
43
  @cert = nil
@@ -47,7 +54,7 @@ module OpenC3
47
54
 
48
55
  # Creates a new {SerialStream} using the parameters passed in the constructor
49
56
  def connect
50
- @stream = MqttStream.new(@hostname, @port, @ssl, @write_topic, @read_topic)
57
+ @stream = MqttStream.new(@hostname, @port, @ssl, @write_topic, @read_topic, @ack_timeout)
51
58
  @stream.username = @username if @username
52
59
  @stream.password = @password if @password
53
60
  @stream.cert = @cert if @cert
@@ -66,14 +73,22 @@ module OpenC3
66
73
  def set_option(option_name, option_values)
67
74
  super(option_name, option_values)
68
75
  case option_name.upcase
76
+ when 'ACK_TIMEOUT'
77
+ @ack_timeout = Float(option_values[0])
69
78
  when 'USERNAME'
70
79
  @username = option_values[0]
71
80
  when 'PASSWORD'
72
81
  @password = option_values[0]
73
82
  when 'CERT'
74
- @cert = option_values[0]
83
+ # CERT must be given as a file
84
+ @cert = Tempfile.new('cert')
85
+ @cert.write(option_values[0])
86
+ @cert.close
75
87
  when 'KEY'
76
- @key = option_values[0]
88
+ # KEY must be given as a file
89
+ @key = Tempfile.new('key')
90
+ @key.write(option_values[0])
91
+ @key.close
77
92
  when 'CA_FILE'
78
93
  # CA_FILE must be given as a file
79
94
  @ca_file = Tempfile.new('ca_file')
@@ -121,6 +121,13 @@ module OpenC3
121
121
 
122
122
  @bit_size = bit_size.to_i
123
123
  case @bit_size
124
+ when 8
125
+ @pack = (@endianness == :BIG_ENDIAN) ? 'n' : 'v'
126
+ if args.empty?
127
+ @crc = Crc8.new
128
+ else
129
+ @crc = Crc8.new(*args)
130
+ end
124
131
  when 16
125
132
  @pack = (@endianness == :BIG_ENDIAN) ? 'n' : 'v'
126
133
  if args.empty?
@@ -98,6 +98,7 @@ module OpenC3
98
98
 
99
99
  # Supported Options
100
100
  # FLOW_CONTROL - Flow control method NONE or RTSCTS. Defaults to NONE
101
+ # DATA_BITS - Number of data bits 5, 6, 7, or 8. Defaults to 8
101
102
  def set_option(option_name, option_values)
102
103
  super(option_name, option_values)
103
104
  case option_name.upcase
@@ -14,7 +14,7 @@
14
14
  # GNU Affero General Public License for more details.
15
15
 
16
16
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
17
+ # All changes Copyright 2024, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
20
  # This file may also be used under the terms of a commercial license
@@ -25,15 +25,13 @@ module OpenC3
25
25
  autoload(:HttpClientInterface, 'openc3/interfaces/http_client_interface.rb')
26
26
  autoload(:HttpServerInterface, 'openc3/interfaces/http_server_interface.rb')
27
27
  autoload(:MqttInterface, 'openc3/interfaces/mqtt_interface.rb')
28
+ autoload(:MqttStreamInterface, 'openc3/interfaces/mqtt_stream_interface.rb')
28
29
  autoload(:StreamInterface, 'openc3/interfaces/stream_interface.rb')
29
30
  autoload(:SerialInterface, 'openc3/interfaces/serial_interface.rb')
30
31
  autoload(:SimulatedTargetInterface, 'openc3/interfaces/simulated_target_interface.rb')
31
32
  autoload(:TcpipClientInterface, 'openc3/interfaces/tcpip_client_interface.rb')
32
33
  autoload(:TcpipServerInterface, 'openc3/interfaces/tcpip_server_interface.rb')
33
34
  autoload(:UdpInterface, 'openc3/interfaces/udp_interface.rb')
34
- autoload(:LincInterface, 'openc3/interfaces/linc_interface.rb')
35
- autoload(:LincHandshakeCommand, 'openc3/interfaces/linc_interface.rb')
36
- autoload(:LincHandshake, 'openc3/interfaces/linc_interface.rb')
37
35
 
38
36
  autoload(:Protocol, 'openc3/interfaces/protocols/protocol.rb')
39
37
  autoload(:BurstProtocol, 'openc3/interfaces/protocols/burst_protocol.rb')
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 OpenC3 Inc.
3
+ # Copyright 2024 OpenC3 Inc.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -36,8 +36,8 @@ module OpenC3
36
36
  end
37
37
  end
38
38
  raise "Could not determine class filename from '#{cmd_line}'" unless filename
39
- OpenC3.set_working_dir(@work_dir) do
40
- require_relative filename
39
+ OpenC3.set_working_dir(microservice_model.work_dir) do
40
+ require File.join(microservice_model.work_dir, filename)
41
41
  end
42
42
  klass = filename.filename_to_class_name.to_class
43
43
  klass.run(microservice_model.name)
@@ -0,0 +1,31 @@
1
+ require 'openc3/utilities/migration'
2
+ require 'openc3/models/scope_model'
3
+ require 'openc3/models/microservice_model'
4
+
5
+ module OpenC3
6
+ class NoCriticalCmd < Migration
7
+ begin
8
+ require 'openc3-enterprise/models/cmd_authority_model'
9
+ require 'openc3-enterprise/models/critical_cmd_model'
10
+ BASE = false
11
+ rescue LoadError
12
+ BASE = true
13
+ end
14
+
15
+ def self.run
16
+ ScopeModel.get_all_models(scope: nil).each do |scope, scope_model|
17
+ model = MicroserviceModel.get_model(name: "#{scope}__CRITICALCMD__#{scope}", scope: scope)
18
+ if BASE # Only remove the critical command model if we're not enterprise
19
+ model.destroy if model
20
+ else
21
+ model.work_dir = '/openc3-enterprise/lib/openc3-enterprise/microservices'
22
+ model.update
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ unless ENV['OPENC3_NO_MIGRATE']
30
+ OpenC3::NoCriticalCmd.run
31
+ end
@@ -0,0 +1,46 @@
1
+ require 'openc3/utilities/migration'
2
+ require 'openc3/models/scope_model'
3
+ require 'openc3/models/microservice_model'
4
+
5
+ module OpenC3
6
+ class NoTriggerGroups < Migration
7
+ begin
8
+ require 'openc3-enterprise/models/cmd_authority_model'
9
+ require 'openc3-enterprise/models/critical_cmd_model'
10
+ BASE = false
11
+ rescue LoadError
12
+ BASE = true
13
+ end
14
+
15
+ def self.run
16
+ MicroserviceModel.get_all_models(scope: 'DEFAULT').each do |microservice_name, microservice_model|
17
+ if microservice_name =~ /__TRIGGER_GROUP__/
18
+ if BASE
19
+ # Only remove the trigger group microservice if we're not enterprise
20
+ microservice_model.destroy
21
+ else
22
+ # Need to update working dir for Enterprise
23
+ microservice_model.work_dir = '/openc3-enterprise/lib/openc3-enterprise/microservices'
24
+ microservice_model.update
25
+ end
26
+ end
27
+
28
+ if microservice_name =~ /__OPENC3__REACTION/
29
+ # Need to update working dir for Enterprise
30
+ microservice_model.work_dir = '/openc3-enterprise/lib/openc3-enterprise/microservices'
31
+ microservice_model.update
32
+ end
33
+
34
+ if microservice_name =~ /__TIMELINE__/
35
+ # Need to update working dir for Enterprise
36
+ microservice_model.work_dir = '/openc3-enterprise/lib/openc3-enterprise/microservices'
37
+ microservice_model.update
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ unless ENV['OPENC3_NO_MIGRATE']
45
+ OpenC3::NoTriggerGroups.run
46
+ end
@@ -50,6 +50,7 @@ module OpenC3
50
50
  attr_accessor :work_dir
51
51
  attr_accessor :ports
52
52
  attr_accessor :prefix
53
+ attr_accessor :shard
53
54
 
54
55
  # NOTE: The following three class methods are used by the ModelController
55
56
  # and are reimplemented to enable various Model class methods to work
@@ -121,6 +122,7 @@ module OpenC3
121
122
  env: {},
122
123
  container: nil,
123
124
  prefix: nil,
125
+ shard: 0,
124
126
  scope:
125
127
  )
126
128
  if self.class._get_type == 'INTERFACE'
@@ -158,6 +160,7 @@ module OpenC3
158
160
  @env = env
159
161
  @container = container
160
162
  @prefix = prefix
163
+ @shard = shard.to_i # to_i to handle nil
161
164
  @secrets = secrets
162
165
  end
163
166
 
@@ -222,6 +225,7 @@ module OpenC3
222
225
  'env' => @env,
223
226
  'container' => @container,
224
227
  'prefix' => @prefix,
228
+ 'shard' => @shard,
225
229
  'updated_at' => @updated_at
226
230
  }
227
231
  end
@@ -297,9 +301,7 @@ module OpenC3
297
301
  # Option Name, Secret Name
298
302
  @secret_options << [parameters[3], parameters[1]]
299
303
  end
300
- if ConfigParser.handle_nil(parameters[4])
301
- @secrets[-1] << parameters[4]
302
- end
304
+ @secrets[-1] << ConfigParser.handle_nil(parameters[4])
303
305
 
304
306
  when 'ENV'
305
307
  parser.verify_num_parameters(2, 2, "#{keyword} <Key> <Value>")
@@ -341,6 +343,9 @@ module OpenC3
341
343
  parser.verify_num_parameters(1, 1, "#{keyword} <Route Prefix>")
342
344
  @prefix = parameters[0]
343
345
 
346
+ when 'SHARD'
347
+ parser.verify_num_parameters(1, 1, "#{keyword} <Shard Number Starting from 0>")
348
+ @shard = Integer(parameters[0])
344
349
  else
345
350
  raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Interface/Router: #{keyword} #{parameters.join(" ")}")
346
351
 
@@ -365,6 +370,7 @@ module OpenC3
365
370
  needs_dependencies: @needs_dependencies,
366
371
  secrets: @secrets,
367
372
  prefix: @prefix,
373
+ shard: @shard,
368
374
  scope: @scope
369
375
  )
370
376
  unless validate_only
@@ -44,6 +44,7 @@ module OpenC3
44
44
  attr_accessor :prefix
45
45
  attr_accessor :disable_erb
46
46
  attr_accessor :ignore_changes
47
+ attr_accessor :shard
47
48
 
48
49
  # NOTE: The following three class methods are used by the ModelController
49
50
  # and are reimplemented to enable various Model class methods to work
@@ -105,6 +106,7 @@ module OpenC3
105
106
  prefix: nil,
106
107
  disable_erb: nil,
107
108
  ignore_changes: nil,
109
+ shard: 0,
108
110
  scope:
109
111
  )
110
112
  parts = name.split("__")
@@ -131,6 +133,7 @@ module OpenC3
131
133
  @prefix = prefix
132
134
  @disable_erb = disable_erb
133
135
  @ignore_changes = ignore_changes
136
+ @shard = shard.to_i # to_i to handle nil
134
137
  @bucket = Bucket.getClient()
135
138
  end
136
139
 
@@ -153,7 +156,8 @@ module OpenC3
153
156
  'secrets' => @secrets.as_json(*a),
154
157
  'prefix' => @prefix,
155
158
  'disable_erb' => @disable_erb,
156
- 'ignore_changes' => @ignore_changes
159
+ 'ignore_changes' => @ignore_changes,
160
+ 'shard' => @shard,
157
161
  }
158
162
  end
159
163
 
@@ -215,6 +219,9 @@ module OpenC3
215
219
  if parameters
216
220
  @disable_erb.concat(parameters)
217
221
  end
222
+ when 'SHARD'
223
+ parser.verify_num_parameters(1, 1, "#{keyword} <Shard Number Starting from 0>")
224
+ @shard = Integer(parameters[0])
218
225
  else
219
226
  raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Microservice: #{keyword} #{parameters.join(" ")}")
220
227
  end
@@ -200,7 +200,12 @@ module OpenC3
200
200
  end
201
201
  unless validate_only
202
202
  Logger.info "Installing python packages from requirements.txt with pypi_url=#{pypi_url}"
203
- puts `/openc3/bin/pipinstall --no-warn-script-location -i #{pypi_url} -r #{File.join(gem_path, 'requirements.txt')}`
203
+ if ENV['PIP_ENABLE_TRUSTED_HOST'].nil?
204
+ pip_args = "--no-warn-script-location -i #{pypi_url} -r #{File.join(gem_path, 'requirements.txt')}"
205
+ else
206
+ pip_args = "--no-warn-script-location -i #{pypi_url} --trusted-host #{URI.parse(pypi_url).host} -r #{File.join(gem_path, 'requirements.txt')}"
207
+ end
208
+ puts `/openc3/bin/pipinstall #{pip_args}`
204
209
  end
205
210
  needs_dependencies = true
206
211
  end
@@ -92,7 +92,12 @@ module OpenC3
92
92
  end
93
93
  end
94
94
  Logger.info "Installing python package: #{name_or_path}"
95
- result = OpenC3::ProcessManager.instance.spawn(["/openc3/bin/pipinstall", "--no-warn-script-location", "-i", pypi_url, package_file_path], "package_install", package_filename, Time.now + 3600.0, scope: scope)
95
+ if ENV['PIP_ENABLE_TRUSTED_HOST'].nil?
96
+ pip_args = ["--no-warn-script-location", "-i", pypi_url, package_file_path]
97
+ else
98
+ pip_args = ["--no-warn-script-location", "-i", pypi_url, "--trusted-host", URI.parse(pypi_url).host, package_file_path]
99
+ end
100
+ result = OpenC3::ProcessManager.instance.spawn(["/openc3/bin/pipinstall"] + pip_args, "package_install", package_filename, Time.now + 3600.0, scope: scope)
96
101
  return result.name
97
102
  end
98
103
 
@@ -14,7 +14,7 @@
14
14
  # GNU Affero General Public License for more details.
15
15
 
16
16
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
17
+ # All changes Copyright 2024, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
20
  # This file may also be used under the terms of a commercial license
@@ -81,8 +81,8 @@ module OpenC3
81
81
  model.undeploy()
82
82
  end
83
83
 
84
- attr_reader :name, :scope, :snooze, :triggers, :actions, :enabled, :triggerLevel, :snoozed_until
85
- attr_accessor :username
84
+ attr_reader :name, :scope, :snooze, :triggers, :actions, :enabled, :trigger_level, :snoozed_until
85
+ attr_accessor :username, :shard
86
86
 
87
87
  def initialize(
88
88
  name:,
@@ -90,27 +90,29 @@ module OpenC3
90
90
  snooze:,
91
91
  actions:,
92
92
  triggers:,
93
- triggerLevel:,
93
+ trigger_level:,
94
94
  enabled: true,
95
95
  snoozed_until: nil,
96
96
  username: nil,
97
+ shard: 0,
97
98
  updated_at: nil
98
99
  )
99
100
  super("#{scope}#{PRIMARY_KEY}", name: name, scope: scope)
100
101
  @microservice_name = "#{scope}__OPENC3__REACTION"
101
102
  @enabled = enabled
102
103
  @snoozed_until = snoozed_until
103
- @triggerLevel = validate_level(triggerLevel)
104
+ @trigger_level = validate_level(trigger_level)
104
105
  @snooze = validate_snooze(snooze)
105
106
  @actions = validate_actions(actions)
106
107
  @triggers = validate_triggers(triggers)
107
108
  @username = username
109
+ @shard = shard.to_i # to_i to handle nil
108
110
  @updated_at = updated_at
109
111
  end
110
112
 
111
113
  # Modifiers for the reaction_controller update action
112
- def triggerLevel=(triggerLevel)
113
- @triggerLevel = validate_level(triggerLevel)
114
+ def trigger_level=(trigger_level)
115
+ @trigger_level = validate_level(trigger_level)
114
116
  end
115
117
  def snooze=(snooze)
116
118
  @snooze = validate_snooze(snooze)
@@ -127,7 +129,7 @@ module OpenC3
127
129
  when 'EDGE', 'LEVEL'
128
130
  return level
129
131
  else
130
- raise ReactionInputError.new "invalid triggerLevel, must be EDGE or LEVEL: #{level}"
132
+ raise ReactionInputError.new "invalid trigger level, must be EDGE or LEVEL: #{level}"
131
133
  end
132
134
  end
133
135
 
@@ -257,12 +259,13 @@ module OpenC3
257
259
  'name' => @name,
258
260
  'scope' => @scope,
259
261
  'enabled' => @enabled,
260
- 'triggerLevel' => @triggerLevel,
262
+ 'trigger_level' => @trigger_level,
261
263
  'snooze' => @snooze,
262
264
  'snoozed_until' => @snoozed_until,
263
265
  'triggers' => @triggers,
264
266
  'actions' => @actions,
265
267
  'username' => @username,
268
+ 'shard' => @shard,
266
269
  'updated_at' => @updated_at
267
270
  }
268
271
  end
@@ -290,11 +293,12 @@ module OpenC3
290
293
  name: @microservice_name,
291
294
  folder_name: nil,
292
295
  cmd: ['ruby', 'reaction_microservice.rb', @microservice_name],
293
- work_dir: '/openc3/lib/openc3/microservices',
296
+ work_dir: '/openc3-enterprise/lib/openc3-enterprise/microservices',
294
297
  options: [],
295
298
  topics: topics,
296
299
  target_names: [],
297
300
  plugin: nil,
301
+ shard: @shard,
298
302
  scope: @scope
299
303
  )
300
304
  microservice.create