diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-19 03:06:07 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-19 03:06:07 +0000 |
commit | 7f3bff1556594dcdc1beca40d083ba7263965e21 (patch) | |
tree | ab18d957d9bc7b2888c6e9fa9b281a7c1cb8927b /spec/services/clusters | |
parent | 8d0aed5e4a6ae59232cfa5ca168fa1b87073520d (diff) | |
download | gitlab-ce-7f3bff1556594dcdc1beca40d083ba7263965e21.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services/clusters')
4 files changed, 250 insertions, 1 deletions
diff --git a/spec/services/clusters/cleanup/app_service_spec.rb b/spec/services/clusters/cleanup/app_service_spec.rb new file mode 100644 index 00000000000..cc27f409086 --- /dev/null +++ b/spec/services/clusters/cleanup/app_service_spec.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Clusters::Cleanup::AppService do + describe '#execute' do + let!(:cluster) { create(:cluster, :project, :cleanup_uninstalling_applications, provider_type: :gcp) } + let(:service) { described_class.new(cluster) } + let(:logger) { service.send(:logger) } + let(:log_meta) do + { + service: described_class.name, + cluster_id: cluster.id, + execution_count: 0 + } + end + + subject { service.execute } + + shared_examples 'does not reschedule itself' do + it 'does not reschedule itself' do + expect(Clusters::Cleanup::AppWorker).not_to receive(:perform_in) + end + end + + context 'when cluster has no applications available or transitioning applications' do + it_behaves_like 'does not reschedule itself' + + it 'transitions cluster to cleanup_removing_project_namespaces' do + expect { subject } + .to change { cluster.reload.cleanup_status_name } + .from(:cleanup_uninstalling_applications) + .to(:cleanup_removing_project_namespaces) + end + + it 'schedules Clusters::Cleanup::ProjectNamespaceWorker' do + expect(Clusters::Cleanup::ProjectNamespaceWorker).to receive(:perform_async).with(cluster.id) + subject + end + + it 'logs all events' do + expect(logger).to receive(:info) + .with(log_meta.merge(event: :schedule_remove_project_namespaces)) + + subject + end + end + + context 'when cluster has uninstallable applications' do + shared_examples 'reschedules itself' do + it 'reschedules itself' do + expect(Clusters::Cleanup::AppWorker) + .to receive(:perform_in) + .with(1.minute, cluster.id, 1) + + subject + end + end + + context 'has applications with dependencies' do + let!(:helm) { create(:clusters_applications_helm, :installed, cluster: cluster) } + let!(:ingress) { create(:clusters_applications_ingress, :installed, cluster: cluster) } + let!(:cert_manager) { create(:clusters_applications_cert_manager, :installed, cluster: cluster) } + let!(:jupyter) { create(:clusters_applications_jupyter, :installed, cluster: cluster) } + + it_behaves_like 'reschedules itself' + + it 'only uninstalls apps that are not dependencies for other installed apps' do + expect(Clusters::Applications::UninstallWorker) + .not_to receive(:perform_async).with(helm.name, helm.id) + + expect(Clusters::Applications::UninstallWorker) + .not_to receive(:perform_async).with(ingress.name, ingress.id) + + expect(Clusters::Applications::UninstallWorker) + .to receive(:perform_async).with(cert_manager.name, cert_manager.id) + .and_call_original + + expect(Clusters::Applications::UninstallWorker) + .to receive(:perform_async).with(jupyter.name, jupyter.id) + .and_call_original + + subject + end + + it 'logs application uninstalls and next execution' do + expect(logger).to receive(:info) + .with(log_meta.merge(event: :uninstalling_app, application: kind_of(String))).exactly(2).times + expect(logger).to receive(:info) + .with(log_meta.merge(event: :scheduling_execution, next_execution: 1)) + + subject + end + + context 'cluster is not cleanup_uninstalling_applications' do + let!(:cluster) { create(:cluster, :project, provider_type: :gcp) } + + it_behaves_like 'does not reschedule itself' + end + end + + context 'when applications are still uninstalling/scheduled/depending on others' do + let!(:helm) { create(:clusters_applications_helm, :installed, cluster: cluster) } + let!(:ingress) { create(:clusters_applications_ingress, :scheduled, cluster: cluster) } + let!(:runner) { create(:clusters_applications_runner, :uninstalling, cluster: cluster) } + + it_behaves_like 'reschedules itself' + + it 'does not call the uninstallation service' do + expect(Clusters::Applications::UninstallWorker).not_to receive(:new) + + subject + end + end + end + end +end diff --git a/spec/services/clusters/cleanup/project_namespace_service_spec.rb b/spec/services/clusters/cleanup/project_namespace_service_spec.rb new file mode 100644 index 00000000000..22e29cc57d1 --- /dev/null +++ b/spec/services/clusters/cleanup/project_namespace_service_spec.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Clusters::Cleanup::ProjectNamespaceService do + describe '#execute' do + subject { service.execute } + + let!(:service) { described_class.new(cluster) } + let!(:cluster) { create(:cluster, :with_environments, :cleanup_removing_project_namespaces) } + let!(:logger) { service.send(:logger) } + let(:log_meta) do + { + service: described_class.name, + cluster_id: cluster.id, + execution_count: 0 + } + end + let(:kubeclient_instance_double) do + instance_double(Gitlab::Kubernetes::KubeClient, delete_namespace: nil, delete_service_account: nil) + end + + before do + allow_any_instance_of(Clusters::Cluster).to receive(:kubeclient).and_return(kubeclient_instance_double) + end + + context 'when cluster has namespaces to be deleted' do + it 'deletes namespaces from cluster' do + expect(kubeclient_instance_double).to receive(:delete_namespace) + .with cluster.kubernetes_namespaces[0].namespace + expect(kubeclient_instance_double).to receive(:delete_namespace) + .with(cluster.kubernetes_namespaces[1].namespace) + + subject + end + + it 'deletes namespaces from database' do + expect { subject }.to change { cluster.kubernetes_namespaces.exists? }.from(true).to(false) + end + + it 'schedules ::ServiceAccountWorker' do + expect(Clusters::Cleanup::ServiceAccountWorker).to receive(:perform_async).with(cluster.id) + subject + end + + it 'logs all events' do + expect(logger).to receive(:info) + .with( + log_meta.merge( + event: :deleting_project_namespace, + namespace: cluster.kubernetes_namespaces[0].namespace)) + expect(logger).to receive(:info) + .with( + log_meta.merge( + event: :deleting_project_namespace, + namespace: cluster.kubernetes_namespaces[1].namespace)) + + subject + end + end + + context 'when cluster has no namespaces' do + let!(:cluster) { create(:cluster, :cleanup_removing_project_namespaces) } + + it 'schedules Clusters::Cleanup::ServiceAccountWorker' do + expect(Clusters::Cleanup::ServiceAccountWorker).to receive(:perform_async).with(cluster.id) + + subject + end + + it 'transitions to cleanup_removing_service_account' do + expect { subject } + .to change { cluster.reload.cleanup_status_name } + .from(:cleanup_removing_project_namespaces) + .to(:cleanup_removing_service_account) + end + + it 'does not try to delete namespaces' do + expect(kubeclient_instance_double).not_to receive(:delete_namespace) + + subject + end + end + end +end diff --git a/spec/services/clusters/cleanup/service_account_service_spec.rb b/spec/services/clusters/cleanup/service_account_service_spec.rb new file mode 100644 index 00000000000..ecaf0da9fa3 --- /dev/null +++ b/spec/services/clusters/cleanup/service_account_service_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Clusters::Cleanup::ServiceAccountService do + describe '#execute' do + subject { service.execute } + + let!(:service) { described_class.new(cluster) } + let!(:cluster) { create(:cluster, :cleanup_removing_service_account) } + let!(:logger) { service.send(:logger) } + let(:log_meta) do + { + service: described_class.name, + cluster_id: cluster.id, + execution_count: 0 + } + end + let(:kubeclient_instance_double) do + instance_double(Gitlab::Kubernetes::KubeClient, delete_namespace: nil, delete_service_account: nil) + end + + before do + allow_any_instance_of(Clusters::Cluster).to receive(:kubeclient).and_return(kubeclient_instance_double) + end + + it 'deletes gitlab service account' do + expect(kubeclient_instance_double).to receive(:delete_service_account) + .with( + ::Clusters::Kubernetes::GITLAB_SERVICE_ACCOUNT_NAME, + ::Clusters::Kubernetes::GITLAB_SERVICE_ACCOUNT_NAMESPACE) + + subject + end + + it 'logs all events' do + expect(logger).to receive(:info).with(log_meta.merge(event: :deleting_gitlab_service_account)) + expect(logger).to receive(:info).with(log_meta.merge(event: :destroying_cluster)) + + subject + end + + it 'deletes cluster' do + expect { subject }.to change { Clusters::Cluster.where(id: cluster.id).exists? }.from(true).to(false) + end + end +end diff --git a/spec/services/clusters/destroy_service_spec.rb b/spec/services/clusters/destroy_service_spec.rb index c0fcc971500..43ebf8f499e 100644 --- a/spec/services/clusters/destroy_service_spec.rb +++ b/spec/services/clusters/destroy_service_spec.rb @@ -45,7 +45,7 @@ describe Clusters::DestroyService do expect(Clusters::Cluster.where(id: cluster.id).exists?).not_to be_falsey end - it 'transition cluster#cleanup_status from cleanup_not_started to uninstalling_applications' do + it 'transition cluster#cleanup_status from cleanup_not_started to cleanup_uninstalling_applications' do expect { subject }.to change { cluster.cleanup_status_name } .from(:cleanup_not_started) .to(:cleanup_uninstalling_applications) |