Commit 56f62330 authored by Gosia Ksionek's avatar Gosia Ksionek Committed by Imre Farkas

Prepare migrations for the new table

Fix schema file

Fix schema file

Add new settings while creating new record

Fix specs

Fix structure file

Remove obsolete comment

Add changelog entry

Fix specs

Fix rubocop offences
parent e8771823
...@@ -22,6 +22,7 @@ class Namespace < ApplicationRecord ...@@ -22,6 +22,7 @@ class Namespace < ApplicationRecord
has_many :projects, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :projects, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :project_statistics has_many :project_statistics
has_one :namespace_settings, inverse_of: :namespace, class_name: 'NamespaceSetting', autosave: true
has_many :runner_namespaces, inverse_of: :namespace, class_name: 'Ci::RunnerNamespace' has_many :runner_namespaces, inverse_of: :namespace, class_name: 'Ci::RunnerNamespace'
has_many :runners, through: :runner_namespaces, source: :runner, class_name: 'Ci::Runner' has_many :runners, through: :runner_namespaces, source: :runner, class_name: 'Ci::Runner'
......
# frozen_string_literal: true
class NamespaceSetting < ApplicationRecord
belongs_to :namespace, inverse_of: :namespace_settings
self.primary_key = :namespace_id
end
NamespaceSetting.prepend_if_ee('EE::NamespaceSetting')
...@@ -1270,7 +1270,8 @@ class User < ApplicationRecord ...@@ -1270,7 +1270,8 @@ class User < ApplicationRecord
namespace.path = username if username_changed? namespace.path = username if username_changed?
namespace.name = name if name_changed? namespace.name = name if name_changed?
else else
build_namespace(path: username, name: name) namespace = build_namespace(path: username, name: name)
namespace.build_namespace_settings
end end
end end
......
...@@ -28,7 +28,11 @@ module Groups ...@@ -28,7 +28,11 @@ module Groups
@group.build_chat_team(name: response['name'], team_id: response['id']) @group.build_chat_team(name: response['name'], team_id: response['id'])
end end
@group.add_owner(current_user) if @group.save if @group.save
@group.add_owner(current_user)
add_settings_record
end
@group @group
end end
...@@ -79,6 +83,10 @@ module Groups ...@@ -79,6 +83,10 @@ module Groups
params[:visibility_level] = Gitlab::CurrentSettings.current_application_settings.default_group_visibility params[:visibility_level] = Gitlab::CurrentSettings.current_application_settings.default_group_visibility
end end
def add_settings_record
@group.create_namespace_settings
end
end end
end end
......
---
title: Add namespace settings table
merge_request: 36321
author:
type: added
# frozen_string_literal: true
class CreateNamespaceSettings < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
with_lock_retries do
create_table :namespace_settings, id: false do |t|
t.timestamps_with_timezone null: false
t.references :namespace, primary_key: true, default: nil, type: :integer, index: false, foreign_key: { on_delete: :cascade }
end
end
end
def down
drop_table :namespace_settings
end
end
# frozen_string_literal: true
class BackfillNamespaceSettings < ActiveRecord::Migration[5.2]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
MIGRATION = 'BackfillNamespaceSettings'
DELAY_INTERVAL = 2.minutes
BATCH_SIZE = 10_000
disable_ddl_transaction!
class Namespace < ActiveRecord::Base
include EachBatch
self.table_name = 'namespaces'
end
def up
say "Scheduling `#{MIGRATION}` jobs"
queue_background_migration_jobs_by_range_at_intervals(Namespace, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
end
def down
# NOOP
end
end
...@@ -13118,6 +13118,12 @@ CREATE TABLE public.namespace_root_storage_statistics ( ...@@ -13118,6 +13118,12 @@ CREATE TABLE public.namespace_root_storage_statistics (
snippets_size bigint DEFAULT 0 NOT NULL snippets_size bigint DEFAULT 0 NOT NULL
); );
CREATE TABLE public.namespace_settings (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
namespace_id integer NOT NULL
);
CREATE TABLE public.namespace_statistics ( CREATE TABLE public.namespace_statistics (
id integer NOT NULL, id integer NOT NULL,
namespace_id integer NOT NULL, namespace_id integer NOT NULL,
...@@ -17894,6 +17900,9 @@ ALTER TABLE ONLY public.namespace_limits ...@@ -17894,6 +17900,9 @@ ALTER TABLE ONLY public.namespace_limits
ALTER TABLE ONLY public.namespace_root_storage_statistics ALTER TABLE ONLY public.namespace_root_storage_statistics
ADD CONSTRAINT namespace_root_storage_statistics_pkey PRIMARY KEY (namespace_id); ADD CONSTRAINT namespace_root_storage_statistics_pkey PRIMARY KEY (namespace_id);
ALTER TABLE ONLY public.namespace_settings
ADD CONSTRAINT namespace_settings_pkey PRIMARY KEY (namespace_id);
ALTER TABLE ONLY public.namespace_statistics ALTER TABLE ONLY public.namespace_statistics
ADD CONSTRAINT namespace_statistics_pkey PRIMARY KEY (id); ADD CONSTRAINT namespace_statistics_pkey PRIMARY KEY (id);
...@@ -21776,6 +21785,9 @@ ALTER TABLE ONLY public.analytics_cycle_analytics_project_stages ...@@ -21776,6 +21785,9 @@ ALTER TABLE ONLY public.analytics_cycle_analytics_project_stages
ALTER TABLE ONLY public.issue_user_mentions ALTER TABLE ONLY public.issue_user_mentions
ADD CONSTRAINT fk_rails_3861d9fefa FOREIGN KEY (note_id) REFERENCES public.notes(id) ON DELETE CASCADE; ADD CONSTRAINT fk_rails_3861d9fefa FOREIGN KEY (note_id) REFERENCES public.notes(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.namespace_settings
ADD CONSTRAINT fk_rails_3896d4fae5 FOREIGN KEY (namespace_id) REFERENCES public.namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.self_managed_prometheus_alert_events ALTER TABLE ONLY public.self_managed_prometheus_alert_events
ADD CONSTRAINT fk_rails_3936dadc62 FOREIGN KEY (project_id) REFERENCES public.projects(id) ON DELETE CASCADE; ADD CONSTRAINT fk_rails_3936dadc62 FOREIGN KEY (project_id) REFERENCES public.projects(id) ON DELETE CASCADE;
...@@ -23825,6 +23837,8 @@ COPY "schema_migrations" (version) FROM STDIN; ...@@ -23825,6 +23837,8 @@ COPY "schema_migrations" (version) FROM STDIN;
20200702201039 20200702201039
20200703064117 20200703064117
20200703121557 20200703121557
20200703124823
20200703125016
20200703154822 20200703154822
20200704143633 20200704143633
20200704161600 20200704161600
......
# frozen_string_literal: true
module EE
module NamespaceSetting
extend ActiveSupport::Concern
end
end
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
# Backfillnamespace_settings for a range of namespaces
class BackfillNamespaceSettings
def perform(start_id, end_id)
ActiveRecord::Base.connection.execute <<~SQL
INSERT INTO namespace_settings (namespace_id, created_at, updated_at)
SELECT namespaces.id, now(), now()
FROM namespaces
WHERE namespaces.id BETWEEN #{start_id} AND #{end_id}
ON CONFLICT (namespace_id) DO NOTHING;
SQL
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceSettings, schema: 20200703125016 do
let(:namespaces) { table(:namespaces) }
let(:namespace_settings) { table(:namespace_settings) }
let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
subject { described_class.new }
describe '#perform' do
it 'creates settings for all projects in range' do
namespaces.create!(id: 5, name: 'test1', path: 'test1')
namespaces.create!(id: 7, name: 'test2', path: 'test2')
namespaces.create!(id: 8, name: 'test3', path: 'test3')
subject.perform(5, 7)
expect(namespace_settings.all.pluck(:namespace_id)).to contain_exactly(5, 7)
end
end
end
...@@ -24,7 +24,15 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migrat ...@@ -24,7 +24,15 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migrat
confirmed_at: 1.day.ago) confirmed_at: 1.day.ago)
end end
let(:migration_bot) { User.migration_bot } let!(:migration_bot) do
users.create(id: 100,
email: "noreply+gitlab-migration-bot%s@#{Settings.gitlab.host}",
user_type: HasUserType::USER_TYPES[:migration_bot],
name: 'GitLab Migration Bot',
projects_limit: 10,
username: 'bot')
end
let!(:snippet_with_repo) { snippets.create(id: 1, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) } let!(:snippet_with_repo) { snippets.create(id: 1, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) }
let!(:snippet_with_empty_repo) { snippets.create(id: 2, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) } let!(:snippet_with_empty_repo) { snippets.create(id: 2, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) }
let!(:snippet_without_repo) { snippets.create(id: 3, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) } let!(:snippet_without_repo) { snippets.create(id: 3, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) }
......
# frozen_string_literal: true
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20200703125016_backfill_namespace_settings.rb')
RSpec.describe BackfillNamespaceSettings, :sidekiq, schema: 20200703124823 do
let(:namespaces) { table(:namespaces) }
describe '#up' do
before do
stub_const("#{described_class}::BATCH_SIZE", 2)
namespaces.create!(id: 1, name: 'test1', path: 'test1')
namespaces.create!(id: 2, name: 'test2', path: 'test2')
namespaces.create!(id: 3, name: 'test3', path: 'test3')
end
it 'schedules BackfillNamespaceSettings background jobs' do
Sidekiq::Testing.fake! do
Timecop.freeze do
migrate!
expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 1, 2)
expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 3, 3)
expect(BackgroundMigrationWorker.jobs.size).to eq(2)
end
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe NamespaceSetting, type: :model do
it { is_expected.to belong_to(:namespace) }
end
...@@ -17,6 +17,7 @@ RSpec.describe Namespace do ...@@ -17,6 +17,7 @@ RSpec.describe Namespace do
it { is_expected.to have_many :children } it { is_expected.to have_many :children }
it { is_expected.to have_one :root_storage_statistics } it { is_expected.to have_one :root_storage_statistics }
it { is_expected.to have_one :aggregation_schedule } it { is_expected.to have_one :aggregation_schedule }
it { is_expected.to have_one :namespace_settings }
it { is_expected.to have_many :custom_emoji } it { is_expected.to have_many :custom_emoji }
end end
......
...@@ -3711,6 +3711,12 @@ RSpec.describe User do ...@@ -3711,6 +3711,12 @@ RSpec.describe User do
expect(user.namespace).not_to be_nil expect(user.namespace).not_to be_nil
end end
it 'creates the namespace setting' do
user.save!
expect(user.namespace.namespace_settings).to be_persisted
end
end end
context 'for an existing user' do context 'for an existing user' do
......
...@@ -122,6 +122,7 @@ RSpec.describe API::GroupImport do ...@@ -122,6 +122,7 @@ RSpec.describe API::GroupImport do
before do before do
allow_next_instance_of(Group) do |group| allow_next_instance_of(Group) do |group|
allow(group).to receive(:persisted?).and_return(false) allow(group).to receive(:persisted?).and_return(false)
allow(group).to receive(:save).and_return(false)
end end
end end
......
...@@ -129,4 +129,13 @@ RSpec.describe Groups::CreateService, '#execute' do ...@@ -129,4 +129,13 @@ RSpec.describe Groups::CreateService, '#execute' do
expect { subject }.to change { ChatTeam.count }.from(0).to(1) expect { subject }.to change { ChatTeam.count }.from(0).to(1)
end end
end end
describe 'creating a setting record' do
let(:service) { described_class.new(user, group_params) }
it 'create the settings record connected to the group' do
group = subject
expect(group.namespace_settings).to be_persisted
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment