openc3 5.20.0 → 6.0.1

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