Files
gitlab-ce/scripts/elastic-migration
2025-05-22 09:09:21 +00:00

114 lines
3.3 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
# Generate an Elastic migration file, spec and dictionary record with the current timestamp.
require 'yaml'
require_relative 'lib/migration_creator'
module GitLab
module MigrationTools
class ElasticMigrationCreator < BaseMigrationCreator
protected
def create_options_struct
Struct.new(
:name,
:description,
:group,
:introduced_by_url,
:milestone,
:obsolete,
:marked_obsolete_by_url,
:marked_obsolete_in_milestone
)
end
def collect_input
options.name = read_name.camelize
options.description = read_variable('description', 'Description of what the migration does')
options.group = read_variable('group', 'The group introducing the migration, like: `global search`')
options.introduced_by_url = read_url('URL of the MR introducing the migration')
options.milestone = current_milestone
options.obsolete = false
options.marked_obsolete_by_url = nil
options.marked_obsolete_in_milestone = nil
end
def write
super
write_file(dictionary_file_path, dictionary_contents)
end
def display_success_message
super
$stdout.puts "\e[32mcreated\e[0m #{dictionary_file_path}"
end
def display_additional_info
$stdout.puts "\n=> Please consult the documentation for Advanced Search Migrations: #{documentation_reference}"
end
def file_path
"ee/elastic/migrate/#{file_name}.rb"
end
def spec_file_path
"ee/spec/elastic/migrate/#{file_name}_spec.rb"
end
def dictionary_file_path
"ee/elastic/docs/#{file_name}.yml"
end
def file_contents
<<~RUBY
# frozen_string_literal: true
class #{options.name} < Elastic::Migration
end
RUBY
end
def spec_contents
<<~RUBY
# frozen_string_literal: true
require 'spec_helper'
require File.expand_path('#{file_path}')
# See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#elasticsearch-specs
# for more information on how to write search migration specs for GitLab.
RSpec.describe #{options.name}, feature_category: :#{options.group.parameterize.underscore} do
let(:version) { #{timestamp} }
end
RUBY
end
def dictionary_contents
dictionary_config_hash.to_yaml
end
def dictionary_config_hash
{
'name' => options.name,
'version' => timestamp,
'description' => options.description,
'group' => "group::#{options.group}",
'milestone' => options.milestone.to_s,
'introduced_by_url' => options.introduced_by_url,
'obsolete' => options.obsolete,
'marked_obsolete_by_url' => options.marked_obsolete_by_url,
'marked_obsolete_in_milestone' => options.marked_obsolete_in_milestone
}
end
def documentation_reference
'https://docs.gitlab.com/ee/development/search/advanced_search_migration_styleguide.html'
end
end
end
end
GitLab::MigrationTools::ElasticMigrationCreator.new.execute if $PROGRAM_NAME == __FILE__