diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 18:10:23 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 18:10:23 +0300 |
commit | 6a85a7c312b542034fa0880aa00b1308b1fd5a2e (patch) | |
tree | 0d134855a8807b8302122d7bbbd5b0b6cca567e6 /lib/bulk_imports | |
parent | 76e4e8f1b0629f8af2c627ae34901df77073e3c9 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/bulk_imports')
4 files changed, 138 insertions, 0 deletions
diff --git a/lib/bulk_imports/common/extractors/json_extractor.rb b/lib/bulk_imports/common/extractors/json_extractor.rb new file mode 100644 index 00000000000..45a48cedce8 --- /dev/null +++ b/lib/bulk_imports/common/extractors/json_extractor.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module BulkImports + module Common + module Extractors + class JsonExtractor + def initialize(relation:) + @relation = relation + @tmpdir = Dir.mktmpdir + end + + def extract(context) + download_service(context).execute + decompression_service.execute + + attributes = ndjson_reader.consume_attributes(relation) + + BulkImports::Pipeline::ExtractedData.new(data: attributes) + end + + def remove_tmpdir + FileUtils.remove_entry(tmpdir) if Dir.exist?(tmpdir) + end + + private + + attr_reader :relation, :tmpdir + + def filename + "#{relation}.json.gz" + end + + def download_service(context) + @download_service ||= BulkImports::FileDownloadService.new( + configuration: context.configuration, + relative_url: context.entity.relation_download_url_path(relation), + tmpdir: tmpdir, + filename: filename + ) + end + + def decompression_service + @decompression_service ||= BulkImports::FileDecompressionService.new(tmpdir: tmpdir, filename: filename) + end + + def ndjson_reader + @ndjson_reader ||= Gitlab::ImportExport::Json::NdjsonReader.new(tmpdir) + end + end + end + end +end diff --git a/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb b/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb new file mode 100644 index 00000000000..4fd394718d9 --- /dev/null +++ b/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module BulkImports + module Groups + module Pipelines + class GroupAttributesPipeline + include Pipeline + + ndjson_pipeline! + + relation_name 'self' + + extractor ::BulkImports::Common::Extractors::JsonExtractor, relation: relation + + transformer ::BulkImports::Common::Transformers::ProhibitedAttributesTransformer + + def transform(_context, data) + return unless data + + data.symbolize_keys.slice(:membership_lock) + end + + def load(_context, data) + return unless data + + ::Groups::UpdateService.new(portable, current_user, data).execute + end + + def after_run(_context) + extractor.remove_tmpdir + end + end + end + end +end diff --git a/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb b/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb new file mode 100644 index 00000000000..e67bd8d70a3 --- /dev/null +++ b/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module BulkImports + module Groups + module Pipelines + class NamespaceSettingsPipeline + include Pipeline + + ndjson_pipeline! + + relation_name 'namespace_settings' + + extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation + + transformer ::BulkImports::Common::Transformers::ProhibitedAttributesTransformer + + def transform(_context, data) + return unless data + + data.first.symbolize_keys.slice(*allowed_attributes) + end + + def load(_context, data) + return unless data + + ::Groups::UpdateService.new(portable, current_user, data).execute + end + + def after_run(_context) + extractor.remove_tmpdir + end + + private + + def allowed_attributes + Gitlab::ImportExport::Config.new( + config: Gitlab::ImportExport.group_config_file + ).to_h.dig(:included_attributes, :namespace_settings) + end + end + end + end +end diff --git a/lib/bulk_imports/groups/stage.rb b/lib/bulk_imports/groups/stage.rb index 97a423b6ea9..ffb23875200 100644 --- a/lib/bulk_imports/groups/stage.rb +++ b/lib/bulk_imports/groups/stage.rb @@ -11,10 +11,18 @@ module BulkImports pipeline: BulkImports::Groups::Pipelines::GroupPipeline, stage: 0 }, + group_attributes: { + pipeline: BulkImports::Groups::Pipelines::GroupAttributesPipeline, + stage: 1 + }, subgroups: { pipeline: BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline, stage: 1 }, + namespace_settings: { + pipeline: BulkImports::Groups::Pipelines::NamespaceSettingsPipeline, + stage: 1 + }, members: { pipeline: BulkImports::Common::Pipelines::MembersPipeline, stage: 1 |