Commit 70e5d0ad authored by Mayra Cabrera's avatar Mayra Cabrera

Removes factories on Cluster background migration

'Populate cluster kubernetes namespace' was using factories for their
specs. According to our documentation (see spec/migrations/readme.md),
we should use table helper to create a temproary ActiveRecord::Base
derived model for a table.
parent 227ce776
......@@ -2,92 +2,88 @@
require 'spec_helper'
# rubocop:disable RSpec/FactoriesInMigrationSpecs
describe Gitlab::BackgroundMigration::PopulateClusterKubernetesNamespaceTable, :migration, schema: 20181022173835 do
include MigrationHelpers::ClusterHelpers
let(:migration) { described_class.new }
let(:clusters) { create_list(:cluster, 10, :project, :provided_by_gcp) }
let(:clusters_table) { table(:clusters) }
let(:cluster_projects_table) { table(:cluster_projects) }
let(:cluster_kubernetes_namespaces_table) { table(:clusters_kubernetes_namespaces) }
let(:projects_table) { table(:projects) }
let(:namespaces_table) { table(:namespaces) }
let(:provider_gcp_table) { table(:cluster_providers_gcp) }
let(:platform_kubernetes_table) { table(:cluster_platforms_kubernetes) }
before do
clusters
create_cluster_project_list(10)
end
shared_examples 'consistent kubernetes namespace attributes' do
it 'should populate namespace and service account information' do
subject
migration.perform
clusters_with_namespace.each do |cluster|
project = cluster.project
cluster_project = cluster.cluster_projects.first
cluster_project = cluster_projects_table.find_by(cluster_id: cluster.id)
project = projects_table.find(cluster_project.project_id)
kubernetes_namespace = cluster_kubernetes_namespaces_table.find_by(cluster_id: cluster.id)
namespace = "#{project.path}-#{project.id}"
kubernetes_namespace = cluster.reload.kubernetes_namespace
expect(kubernetes_namespace).to be_present
expect(kubernetes_namespace.cluster_project).to eq(cluster_project)
expect(kubernetes_namespace.project).to eq(cluster_project.project)
expect(kubernetes_namespace.cluster).to eq(cluster_project.cluster)
expect(kubernetes_namespace.cluster_project_id).to eq(cluster_project.id)
expect(kubernetes_namespace.project_id).to eq(cluster_project.project_id)
expect(kubernetes_namespace.cluster_id).to eq(cluster_project.cluster_id)
expect(kubernetes_namespace.namespace).to eq(namespace)
expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account")
end
end
end
subject { migration.perform }
context 'when no Clusters::Project has a Clusters::KubernetesNamespace' do
let(:cluster_projects) { Clusters::Project.all }
let(:cluster_projects) { cluster_projects_table.all }
it 'should create a Clusters::KubernetesNamespace per Clusters::Project' do
expect do
subject
end.to change(Clusters::KubernetesNamespace, :count).by(cluster_projects.count)
migration.perform
end.to change(Clusters::KubernetesNamespace, :count).by(cluster_projects_table.count)
end
it_behaves_like 'consistent kubernetes namespace attributes' do
let(:clusters_with_namespace) { clusters }
let(:clusters_with_namespace) { clusters_table.all }
end
end
context 'when every Clusters::Project has Clusters::KubernetesNamespace' do
before do
clusters.each do |cluster|
create(:cluster_kubernetes_namespace,
cluster_project: cluster.cluster_projects.first,
cluster: cluster,
project: cluster.project)
end
create_kubernetes_namespace(clusters_table.all)
end
it 'should not create any Clusters::KubernetesNamespace' do
expect do
subject
migration.perform
end.not_to change(Clusters::KubernetesNamespace, :count)
end
end
context 'when only some Clusters::Project have Clusters::KubernetesNamespace related' do
let(:with_kubernetes_namespace) { clusters.first(6) }
let(:with_no_kubernetes_namespace) { clusters.last(4) }
let(:with_kubernetes_namespace) { clusters_table.first(6) }
let(:with_no_kubernetes_namespace) { clusters_table.last(4) }
before do
with_kubernetes_namespace.each do |cluster|
create(:cluster_kubernetes_namespace,
cluster_project: cluster.cluster_projects.first,
cluster: cluster,
project: cluster.project)
end
create_kubernetes_namespace(with_kubernetes_namespace)
end
it 'creates limited number of Clusters::KubernetesNamespace' do
expect do
subject
migration.perform
end.to change(Clusters::KubernetesNamespace, :count).by(with_no_kubernetes_namespace.count)
end
it 'should not modify clusters with Clusters::KubernetesNamespace' do
subject
migration.perform
with_kubernetes_namespace.each do |cluster|
expect(cluster.kubernetes_namespaces.count).to eq(1)
kubernetes_namespace = cluster_kubernetes_namespaces_table.where(cluster_id: cluster.id)
expect(kubernetes_namespace.count).to eq(1)
end
end
......@@ -96,4 +92,3 @@ describe Gitlab::BackgroundMigration::PopulateClusterKubernetesNamespaceTable, :
end
end
end
# rubocop:enable RSpec/FactoriesInMigrationSpecs
# frozen_string_literal: true
module MigrationHelpers
module ClusterHelpers
# Creates a list of cluster projects.
def create_cluster_project_list(quantity)
group = namespaces_table.create(name: 'gitlab-org', path: 'gitlab-org')
quantity.times do |id|
create_cluster_project(group, id)
end
end
# Creates dependencies for a cluster project:
# - Group
# - Project
# - Cluster
# - Project - cluster relationship
# - GCP provider
# - Platform Kubernetes
def create_cluster_project(group, id)
project = projects_table.create!(
name: "project-#{id}",
path: "project-#{id}",
namespace_id: group.id
)
cluster = clusters_table.create(
name: 'test-cluster',
cluster_type: 3,
provider_type: :gcp,
platform_type: :kubernetes
)
cluster_projects_table.create(project_id: project.id, cluster_id: cluster.id)
provider_gcp_table.create!(
gcp_project_id: "test-gcp-project-#{id}",
endpoint: '111.111.111.111',
cluster_id: cluster.id,
status: 3,
num_nodes: 1,
zone: 'us-central1-a'
)
platform_kubernetes_table.create(
cluster_id: cluster.id,
api_url: 'https://kubernetes.example.com',
encrypted_token: 'a' * 40,
encrypted_token_iv: 'a' * 40
)
end
# Creates a Kubernetes namespace for a list of clusters
def create_kubernetes_namespace(clusters)
clusters.each do |cluster|
cluster_project = cluster_projects_table.find_by(cluster_id: cluster.id)
project = projects_table.find(cluster_project.project_id)
namespace = "#{project.path}-#{project.id}"
cluster_kubernetes_namespaces_table.create(
cluster_project_id: cluster_project.id,
cluster_id: cluster.id,
project_id: cluster_project.project_id,
namespace: namespace,
service_account_name: "#{namespace}-service-account"
)
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