83 lines
2.3 KiB
Ruby
83 lines
2.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
#
|
||
|
# rubocop:disable Style/Documentation
|
||
|
|
||
|
module Gitlab
|
||
|
module BackgroundMigration
|
||
|
class PopulateClusterKubernetesNamespaceTable
|
||
|
include Gitlab::Database::MigrationHelpers
|
||
|
|
||
|
BATCH_SIZE = 1_000
|
||
|
|
||
|
module Migratable
|
||
|
class KubernetesNamespace < ActiveRecord::Base
|
||
|
self.table_name = 'clusters_kubernetes_namespaces'
|
||
|
end
|
||
|
|
||
|
class ClusterProject < ActiveRecord::Base
|
||
|
include EachBatch
|
||
|
|
||
|
self.table_name = 'cluster_projects'
|
||
|
|
||
|
belongs_to :project
|
||
|
|
||
|
def self.with_no_kubernetes_namespace
|
||
|
where.not(id: Migratable::KubernetesNamespace.select(:cluster_project_id))
|
||
|
end
|
||
|
|
||
|
def namespace
|
||
|
slug = "#{project.path}-#{project.id}".downcase
|
||
|
slug.gsub(/[^-a-z0-9]/, '-').gsub(/^-+/, '')
|
||
|
end
|
||
|
|
||
|
def service_account
|
||
|
"#{namespace}-service-account"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Project < ActiveRecord::Base
|
||
|
self.table_name = 'projects'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def perform
|
||
|
cluster_projects_with_no_kubernetes_namespace.each_batch(of: BATCH_SIZE) do |cluster_projects_batch, index|
|
||
|
sql_values = sql_values_for(cluster_projects_batch)
|
||
|
|
||
|
insert_into_cluster_kubernetes_namespace(sql_values)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def cluster_projects_with_no_kubernetes_namespace
|
||
|
Migratable::ClusterProject.with_no_kubernetes_namespace
|
||
|
end
|
||
|
|
||
|
def sql_values_for(cluster_projects)
|
||
|
cluster_projects.map do |cluster_project|
|
||
|
values_for_cluster_project(cluster_project)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def values_for_cluster_project(cluster_project)
|
||
|
{
|
||
|
cluster_project_id: cluster_project.id,
|
||
|
cluster_id: cluster_project.cluster_id,
|
||
|
project_id: cluster_project.project_id,
|
||
|
namespace: cluster_project.namespace,
|
||
|
service_account_name: cluster_project.service_account,
|
||
|
created_at: 'NOW()',
|
||
|
updated_at: 'NOW()'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def insert_into_cluster_kubernetes_namespace(rows)
|
||
|
Gitlab::Database.bulk_insert(Migratable::KubernetesNamespace.table_name,
|
||
|
rows,
|
||
|
disable_quote: [:created_at, :updated_at])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|