diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb index 87c19eeed3e..992e42d9348 100644 --- a/app/controllers/projects/runners_controller.rb +++ b/app/controllers/projects/runners_controller.rb @@ -53,7 +53,7 @@ class Projects::RunnersController < Projects::ApplicationController end def toggle_group_runners - project.toggle!(:group_runners_enabled) + project.toggle_settings!(:group_runners_enabled) redirect_to project_settings_ci_cd_path(@project) end diff --git a/app/models/project.rb b/app/models/project.rb index dadd0755848..3daedc2b47d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -249,6 +249,7 @@ class Project < ActiveRecord::Base delegate :members, to: :team, prefix: true delegate :add_user, :add_users, to: :team delegate :add_guest, :add_reporter, :add_developer, :add_master, :add_role, to: :team + delegate :group_runners_enabled, :group_runners_enabled=, :group_runners_enabled?, to: :settings # Validations validates :creator, presence: true, on: :create @@ -1893,6 +1894,10 @@ class Project < ActiveRecord::Base [] end + def toggle_settings!(settings_attribute) + settings.toggle!(settings_attribute) + end + private def storage diff --git a/db/migrate/20170925142221_add_group_runners_enabled_to_projects.rb b/db/migrate/20170925142221_add_group_runners_enabled_to_projects.rb deleted file mode 100644 index 8df7be39ee1..00000000000 --- a/db/migrate/20170925142221_add_group_runners_enabled_to_projects.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddGroupRunnersEnabledToProjects < ActiveRecord::Migration - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :projects, :group_runners_enabled, :boolean, default: true - add_concurrent_index :projects, :group_runners_enabled - end - - def down - remove_column :projects, :group_runners_enabled - end -end diff --git a/db/migrate/20171030155459_create_project_settings.rb b/db/migrate/20171030155459_create_project_settings.rb index eeb449505b8..ebbe4c64fbd 100644 --- a/db/migrate/20171030155459_create_project_settings.rb +++ b/db/migrate/20171030155459_create_project_settings.rb @@ -7,6 +7,8 @@ class CreateProjectSettings < ActiveRecord::Migration def change create_table :project_settings do |t| t.references :project, index: true, foreign_key: { on_delete: :cascade } + + t.boolean :group_runners_enabled, default: true, index: true end end end diff --git a/db/schema.rb b/db/schema.rb index b199342dc15..9bb5c9d3c97 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1506,8 +1506,10 @@ ActiveRecord::Schema.define(version: 20180418053107) do create_table "project_settings", force: :cascade do |t| t.integer "project_id" + t.boolean "group_runners_enabled", default: true end + add_index "project_settings", ["group_runners_enabled"], name: "index_project_settings_on_group_runners_enabled", using: :btree add_index "project_settings", ["project_id"], name: "index_project_settings_on_project_id", using: :btree create_table "project_statistics", force: :cascade do |t| @@ -1581,7 +1583,6 @@ ActiveRecord::Schema.define(version: 20180418053107) do add_index "projects", ["created_at"], name: "index_projects_on_created_at", using: :btree add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree add_index "projects", ["description"], name: "index_projects_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} - add_index "projects", ["group_runners_enabled"], name: "index_projects_on_group_runners_enabled", using: :btree add_index "projects", ["id"], name: "index_projects_on_id_partial_for_visibility", unique: true, where: "(visibility_level = ANY (ARRAY[10, 20]))", using: :btree add_index "projects", ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree add_index "projects", ["last_repository_check_failed"], name: "index_projects_on_last_repository_check_failed", using: :btree diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 1761b6e2a3b..ad33d09f78a 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -15,14 +15,18 @@ FactoryBot.define do namespace creator { group ? create(:user) : namespace&.owner } - # Nest Project Feature attributes transient do + # Nest Project Feature attributes wiki_access_level ProjectFeature::ENABLED builds_access_level ProjectFeature::ENABLED snippets_access_level ProjectFeature::ENABLED issues_access_level ProjectFeature::ENABLED merge_requests_access_level ProjectFeature::ENABLED repository_access_level ProjectFeature::ENABLED + + # we can't assign the delegated `#settings` attributes directly, as the + # `#settings` relation needs to be created first + group_runners_enabled nil end after(:create) do |project, evaluator| @@ -47,6 +51,9 @@ FactoryBot.define do end project.group&.refresh_members_authorized_projects + + # assign the delegated `#settings` attributes after create + project.reload.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? end trait :public do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e0f442a334c..ed28cd50e4d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -3640,4 +3640,16 @@ describe Project do it { is_expected.not_to be_valid } end end + + describe '#toggle_settings!' do + it 'toggles the value on #settings' do + project = create :project, group_runners_enabled: false + + expect(project.group_runners_enabled).to be false + + project.toggle_settings!(:group_runners_enabled) + + expect(project.group_runners_enabled).to be true + end + end end