From e2381531b16892f436c80000bffe99680f38b2f0 Mon Sep 17 00:00:00 2001 From: Niklas van Schrick Date: Tue, 3 Mar 2026 21:38:10 +0100 Subject: [PATCH 1/2] Set primary runtime when assigning single runtime to project --- .../namespaces/projects/assign_runtimes_service.rb | 2 ++ .../projects/assign_runtimes_service_spec.rb | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/services/namespaces/projects/assign_runtimes_service.rb b/app/services/namespaces/projects/assign_runtimes_service.rb index 918a424a..57697e90 100644 --- a/app/services/namespaces/projects/assign_runtimes_service.rb +++ b/app/services/namespaces/projects/assign_runtimes_service.rb @@ -24,6 +24,8 @@ def execute end namespace_project.runtimes = runtimes + namespace_project.primary_runtime = runtimes.first if runtimes.size == 1 + unless namespace_project.save t.rollback_and_return! ServiceResponse.error( message: 'Failed to assign runtimes to project', diff --git a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb index ece92755..0dba8f7b 100644 --- a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb +++ b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb @@ -57,9 +57,17 @@ target_type: 'NamespaceProject' ) end + + it { expect { service_response }.to change { project.reload.primary_runtime }.to(runtimes.first) } + + context 'when adding multiple runtimes' do + let(:runtimes) { 2.times.map { create(:runtime, namespace: project.namespace) } } + + it { expect { service_response }.not_to change { project.reload.primary_runtime } } + end end - context 'when removing a project' do + context 'when removing a runtime' do let(:runtime) { create(:runtime, namespace: project.namespace) } let!(:namespace_project_runtime_assignment) do create(:namespace_project_runtime_assignment, namespace_project: project, runtime: runtime) @@ -90,7 +98,7 @@ end end - context 'when adding and removing a project' do + context 'when adding and removing a runtime' do let(:runtime) { create(:runtime, namespace: project.namespace) } let!(:namespace_project_runtime_assignment) do create(:namespace_project_runtime_assignment, namespace_project: project, runtime: runtime) From 1d88d7dbf4f70356ff6a431abc4a543b3cbd5fe3 Mon Sep 17 00:00:00 2001 From: Niklas van Schrick Date: Tue, 3 Mar 2026 21:38:42 +0100 Subject: [PATCH 2/2] Queue runtime compatibility job on primary runtime change --- .../namespaces/projects/update_service.rb | 9 ++++-- .../projects/assign_runtimes_service_spec.rb | 30 +++++++++++++++++++ .../projects/update_service_spec.rb | 22 ++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/app/services/namespaces/projects/update_service.rb b/app/services/namespaces/projects/update_service.rb index a68a4728..0e65afb8 100644 --- a/app/services/namespaces/projects/update_service.rb +++ b/app/services/namespaces/projects/update_service.rb @@ -21,8 +21,13 @@ def execute params[:primary_runtime_id] = params.delete(:primary_runtime)&.id if params.key?(:primary_runtime) transactional do |t| - success = namespace_project.update(params) - unless success + namespace_project.assign_attributes(params) + + if namespace_project.primary_runtime_changed? + UpdateRuntimeCompatibilityJob.perform_later({ namespace_project_id: namespace_project.id }) + end + + unless namespace_project.save t.rollback_and_return! ServiceResponse.error( message: 'Failed to update namespace project', error_code: :invalid_namespace_project, diff --git a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb index 0dba8f7b..0ec0b78d 100644 --- a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb +++ b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb @@ -58,6 +58,16 @@ ) end + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end + it { expect { service_response }.to change { project.reload.primary_runtime }.to(runtimes.first) } context 'when adding multiple runtimes' do @@ -96,6 +106,16 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end end context 'when adding and removing a runtime' do @@ -127,6 +147,16 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end end end end diff --git a/spec/services/namespaces/projects/update_service_spec.rb b/spec/services/namespaces/projects/update_service_spec.rb index 119ffa4f..5d25904e 100644 --- a/spec/services/namespaces/projects/update_service_spec.rb +++ b/spec/services/namespaces/projects/update_service_spec.rb @@ -70,5 +70,27 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: namespace_project.id } + ) + end + + context 'without changing the primary runtime' do + let(:params) { { name: namespace_project_name } } + + it 'does not queue job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).not_to have_received(:perform_later) + end + end end end