Skip to content

Commit 02160bf

Browse files
Merge pull request #1079 from code0-tech/#1052-send-module-configurations
flow stream will provide module definitions for actions
2 parents 7d42efe + 47e13e9 commit 02160bf

5 files changed

Lines changed: 123 additions & 10 deletions

File tree

app/grpc/flow_handler.rb

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def self.update_runtime(runtime)
1212
:namespace_project,
1313
module_configurations: { module_configuration_definition: :runtime_module }
1414
)
15+
runtime_modules = runtime.runtime_modules.includes(:module_configuration_definitions)
1516

1617
flows = []
1718
assignments.each do |assignment|
@@ -29,7 +30,7 @@ def self.update_runtime(runtime)
2930
runtime.id
3031
)
3132

32-
grouped_module_configurations(assignments).each do |module_configuration|
33+
grouped_module_configurations(assignments, runtime_modules).each do |module_configuration|
3334
send_update(
3435
Tucana::Sagittarius::FlowResponse.new(
3536
module_configurations: module_configuration
@@ -48,14 +49,18 @@ def self.update_started(runtime_id)
4849
update_runtime(runtime)
4950
end
5051

51-
def self.grouped_module_configurations(assignments)
52+
def self.grouped_module_configurations(assignments, runtime_modules)
5253
grouped_entries = assignments.flat_map do |assignment|
53-
assignment.module_configurations.map do |configuration|
54-
[
55-
configuration.module_configuration_definition.runtime_module.identifier,
56-
assignment,
57-
configuration
58-
]
54+
saved_configurations = assignment.module_configurations.index_by(&:module_configuration_definition_id)
55+
56+
runtime_modules.flat_map do |runtime_module|
57+
runtime_module.module_configuration_definitions.map do |definition|
58+
[
59+
runtime_module.identifier,
60+
assignment,
61+
saved_configurations[definition.id] || definition
62+
]
63+
end
5964
end
6065
end.group_by(&:first)
6166

@@ -81,8 +86,20 @@ def self.grouped_project_configurations(entries)
8186

8287
def self.grpc_module_configurations(entries)
8388
entries.map(&:last)
84-
.sort_by { |configuration| configuration.module_configuration_definition.identifier }
85-
.map(&:to_grpc)
89+
.sort_by { |configuration| module_configuration_identifier(configuration) }
90+
.map { |configuration| module_configuration_to_grpc(configuration) }
91+
end
92+
93+
def self.module_configuration_identifier(configuration)
94+
return configuration.identifier if configuration.is_a?(ModuleConfigurationDefinition)
95+
96+
configuration.module_configuration_definition.identifier
97+
end
98+
99+
def self.module_configuration_to_grpc(configuration)
100+
return configuration.to_default_grpc if configuration.is_a?(ModuleConfigurationDefinition)
101+
102+
configuration.to_grpc
86103
end
87104

88105
def self.encoders = { update: ->(grpc_object) { Tucana::Sagittarius::FlowResponse.encode(grpc_object) } }

app/models/module_configuration_definition.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,11 @@ class ModuleConfigurationDefinition < ApplicationRecord
2020
validates :type, presence: true, length: { maximum: 8192 }
2121
validates :optional, inclusion: { in: [true, false] }
2222
validates :hidden, inclusion: { in: [true, false] }
23+
24+
def to_default_grpc
25+
Tucana::Shared::ModuleConfiguration.new(
26+
identifier: identifier,
27+
value: Tucana::Shared::Value.from_ruby(default_value)
28+
)
29+
end
2330
end

spec/grpc/flow_handler_spec.rb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe FlowHandler do
6+
describe '.grouped_module_configurations' do
7+
let(:runtime) { create(:runtime) }
8+
let(:project) { create(:namespace_project) }
9+
let(:assignment) do
10+
create(:namespace_project_runtime_assignment,
11+
namespace_project: project,
12+
runtime: runtime,
13+
compatible: true)
14+
end
15+
let(:runtime_module) { create(:runtime_module, runtime: runtime, identifier: 'example-action') }
16+
let!(:saved_definition) do
17+
create(:module_configuration_definition,
18+
runtime_module: runtime_module,
19+
identifier: 'EXAMPLE_CONFIG',
20+
default_value: 'default')
21+
end
22+
let(:default_definition) do
23+
create(:module_configuration_definition,
24+
runtime_module: runtime_module,
25+
identifier: 'SECOND_CONFIG',
26+
default_value: 'second-default')
27+
end
28+
29+
before do
30+
create(:module_configuration,
31+
namespace_project_runtime_assignment: assignment,
32+
module_configuration_definition: saved_definition,
33+
value: 'saved')
34+
end
35+
36+
it 'uses saved values and falls back to definition defaults for missing project values' do
37+
default_definition
38+
39+
module_configurations = described_class.grouped_module_configurations([assignment], [runtime_module])
40+
41+
expect(module_configurations.length).to eq(1)
42+
expect(module_configurations.first.module_identifier).to eq('example-action')
43+
44+
project_configurations = module_configurations.first.module_configurations.sole
45+
expect(project_configurations.project_id).to eq(project.id)
46+
expect(
47+
project_configurations.module_configurations.map do |configuration|
48+
[configuration.identifier, configuration.value.to_ruby(true)]
49+
end
50+
).to eq(
51+
[
52+
%w[EXAMPLE_CONFIG saved],
53+
%w[SECOND_CONFIG second-default]
54+
]
55+
)
56+
end
57+
end
58+
end

spec/models/module_configuration_definition_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,15 @@
2929
it { is_expected.to allow_values(true, false).for(:optional) }
3030
it { is_expected.to allow_values(true, false).for(:hidden) }
3131
end
32+
33+
describe '#to_default_grpc' do
34+
it 'serializes the identifier and default value as a module configuration' do
35+
configuration_definition.update!(identifier: 'apiKey', default_value: 'default-secret')
36+
37+
grpc_configuration = configuration_definition.to_default_grpc
38+
39+
expect(grpc_configuration.identifier).to eq('apiKey')
40+
expect(grpc_configuration.value.to_ruby(true)).to eq('default-secret')
41+
end
42+
end
3243
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe Runtimes::Grpc::Modules::UpdateService do
6+
describe '#execute' do
7+
let(:runtime) { create(:runtime) }
8+
9+
before do
10+
allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later)
11+
end
12+
13+
it 'schedules runtime compatibility updates' do
14+
response = described_class.new(runtime, []).execute
15+
16+
expect(response).to be_success
17+
expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with({ runtime_id: runtime.id })
18+
end
19+
end
20+
end

0 commit comments

Comments
 (0)