diff options
-rw-r--r-- | db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb | 23 | ||||
-rw-r--r-- | spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb | 189 |
2 files changed, 201 insertions, 11 deletions
diff --git a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb b/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb index dde69058523..e1e02c2852a 100644 --- a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb +++ b/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb @@ -46,18 +46,16 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati # with Platforms::Kubernetes due to delegate Kubernetes specific logic. # We only target unmanaged KubernetesService records. scope :unmanaged_kubernetes_service, -> do - joins( - 'INNER JOIN projects ON projects.id = services.project_id' \ - 'INNER JOIN cluster_projects ON projects.id = cluster_projects.project_id' \ - 'INNER JOIN clusters ON cluster_projects.cluster_id = clusters.id' \ + joins('INNER JOIN projects ON projects.id = services.project_id ' \ + 'INNER JOIN cluster_projects ON projects.id = cluster_projects.project_id ' \ + 'INNER JOIN clusters ON cluster_projects.cluster_id = clusters.id ' \ 'INNER JOIN cluster_platforms_kubernetes ON cluster_platforms_kubernetes.cluster_id = clusters.id') - .where( - "services.category = 'deployment' AND services.type = 'KubernetesService'" \ - "AND (" \ - " cluster_projects.project_id IS NULL" \ - " OR" \ - " services.properties NOT LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%')" \ - ")") + .where("services.category = 'deployment' AND services.type = 'KubernetesService' " \ + "AND ( " \ + " cluster_projects.project_id IS NULL " \ + " OR " \ + " services.properties NOT LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%') " \ + ") ") end end @@ -95,6 +93,9 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati encrypted_password_iv: nil, # KubernetesService doesn't have token: kubernetes_service.token # encrypted_token and encrypted_token_iv } ) + + # Disable the service, so that new cluster archetecture is going to be used + kubernetes_service.updated(active: false) end end diff --git a/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb b/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb new file mode 100644 index 00000000000..5621f2689fa --- /dev/null +++ b/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb @@ -0,0 +1,189 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb') + +describe MigrateKubernetesServiceToNewClustersArchitectures, :migration do + context 'when user configured kubernetes from CI/CD > Clusters' do + let(:project) { create(:project) } + let(:user) { create(:user) } + + # Platforms::Kubernetes (New archtecture) + let!(:cluster) do + create(:cluster, + projects: [project], + user: user, + provider_type: :gcp, + platform_type: :kubernetes, + provider_gcp: provider_gcp, + platform_kubernetes: platform_kubernetes) + end + + let(:provider_gcp) { create(:cluster_provider_gcp, :created) } + let(:platform_kubernetes) { create(:cluster_platform_kubernetes, :configured) } + + # KubernetesService (Automatically synchronized when Platforms::Kubernetes created) + let!(:kubernetes_service) { create(:kubernetes_service, project: project) } + + context 'when user is using the cluster' do + it 'migrates' do + expect{ migrate! }.not_to change { Clusters::Cluster.count } + expect(cluster).to be_active + expect(kubernetes_service).not_to be_active + end + end + + context 'when user disabled cluster' do + before do + disable_cluster! + end + + context 'when user configured kubernetes from Integration > Kubernetes' do + before do + kubernetes_service.update( + active: true, + api_url: 'http://new.kube.com', + ca_pem: nil, + token: 'z' * 40).reload + end + + context 'when user is using the kubernetes service' do + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).to be_active + expect(c.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(kubernetes_service.token) + end + + expect(kubernetes_service).not_to be_active + end + end + + context 'when user stopped using the kubernetes service' do + before do + kubernetes_service.update(active: false) + end + + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).not_to be_active + expect(c.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(kubernetes_service.token) + end + + expect(kubernetes_service).not_to be_active + end + end + end + end + + context 'when user deleted cluster' do + before do + destory_cluster! + end + + context 'when user configured kubernetes from Integration > Kubernetes' do + let!(:new_kubernetes_service) do + project.create_kubernetes_service( + active: true, + api_url: 'http://123.123.123.123', + ca_pem: nil, + token: 'a' * 40) + end + + context 'when user is using the kubernetes service' do + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).to be_active + expect(c.platform_kubernetes.api_url).to eq(new_kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(new_kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(new_kubernetes_service.token) + end + + expect(new_kubernetes_service).not_to be_active + end + end + + context 'when user stopped using the kubernetes service' do + before do + new_kubernetes_service.update(active: false) + end + + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).not_to be_active + expect(c.platform_kubernetes.api_url).to eq(new_kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(new_kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(new_kubernetes_service.token) + end + + expect(new_kubernetes_service).not_to be_active + end + end + end + end + end + + context 'when user configured kubernetes from Integration > Kubernetes' do + let(:project) { create(:project) } + let!(:kubernetes_service) { create(:kubernetes_service, project: project) } + + context 'when user is using the kubernetes service' do + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).to be_active + expect(c.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(kubernetes_service.token) + end + + expect(kubernetes_service).not_to be_active + end + end + + context 'when user stopped using the kubernetes service' do + before do + kubernetes_service.update(active: false) + end + + it 'migrates' do + expect{ migrate! }.to change { Clusters::Cluster.count }.by(1) + + Clusters::Cluster.last.tap do |c| + expect(c).not_to be_active + expect(c.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) + expect(c.platform_kubernetes.ca_pem).to eq(kubernetes_service.ca_pem) + expect(c.platform_kubernetes.token).to eq(kubernetes_service.token) + end + + expect(kubernetes_service).not_to be_active + end + end + end + + context 'when nothing is configured' do + it 'migrates' do + expect{ migrate! }.not_to change { Clusters::Cluster.count } + end + end + + def disable_cluster! + cluster.update!(enabled: false) + kubernetes_service.update!(active: false) + end + + def destory_cluster! + cluster.destroy! + kubernetes_service.destroy! + end +end |