From 006720008291a120eae93361abaf074a76701daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cunha?= Date: Tue, 10 Sep 2019 23:26:23 +0100 Subject: Tracks cluster removal when calling ClusterRemoveWorker --- app/workers/cluster_remove_worker.rb | 13 +++++++++++-- spec/workers/cluster_remove_worker_spec.rb | 28 +++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/workers/cluster_remove_worker.rb b/app/workers/cluster_remove_worker.rb index 9a60c8efc32..4e30d541e40 100644 --- a/app/workers/cluster_remove_worker.rb +++ b/app/workers/cluster_remove_worker.rb @@ -23,13 +23,15 @@ class ClusterRemoveWorker def perform(cluster_id, execution_count = 0) @execution_count = execution_count + @cluster = Clusters::Cluster.preload_applications.find_by_id(cluster_id) + # TODO: Log error and notify user that the cluster uninstall failed and # needs to be manually retried. # # https://gitlab.com/gitlab-org/gitlab-ce/issues/66729 - return log_exceeded_execution_limit_error if exceeded_execution_limit? + return exceeded_execution_limit if exceeded_execution_limit? - @cluster = Clusters::Cluster.preload_applications.find_by_id(cluster_id) + @cluster.removing! uninstallable_apps = @cluster.preloaded_applications.select(&:can_uninstall?) @@ -47,6 +49,7 @@ class ClusterRemoveWorker delete_deployed_namespaces delete_gitlab_service_account + @cluster.stop_removing! @cluster.destroy end @@ -72,6 +75,12 @@ class ClusterRemoveWorker @logger ||= Gitlab::Kubernetes::Logger.build end + def exceeded_execution_limit + log_exceeded_execution_limit_error + + @cluster.stop_removing! + end + def log_exceeded_execution_limit_error logger.error({ exception: ExceededExecutionLimitError.name, diff --git a/spec/workers/cluster_remove_worker_spec.rb b/spec/workers/cluster_remove_worker_spec.rb index 9b34e5d0f47..37c1f9f812a 100644 --- a/spec/workers/cluster_remove_worker_spec.rb +++ b/spec/workers/cluster_remove_worker_spec.rb @@ -8,6 +8,14 @@ describe ClusterRemoveWorker do let!(:cluster) { create(:cluster, :project, provider_type: :gcp) } + shared_examples 'removing cluster' do + it 'sets cluster as removing' do + expect_any_instance_of(Clusters::Cluster).to receive(:removing!) + + subject + end + end + context 'when cluster has no applications or roles' do let(:kubeclient_intance_double) do instance_double(Gitlab::Kubernetes::KubeClient, delete_namespace: nil, delete_service_account: nil) @@ -27,6 +35,14 @@ describe ClusterRemoveWorker do end end + it_behaves_like 'removing cluster' + + it 'stops removin cluster' do + expect_any_instance_of(Clusters::Cluster).to receive(:stop_removing!) + + subject + end + it 'deletes namespaces' do expect { subject }.to change { Clusters::KubernetesNamespace.count }.by(-2) end @@ -53,6 +69,8 @@ describe ClusterRemoveWorker do let!(:cert_manager) { create(:clusters_applications_cert_manager, :installed, cluster: cluster) } let!(:jupyter) { create(:clusters_applications_jupyter, :installed, cluster: cluster) } + it_behaves_like 'removing cluster' + it 'only uninstalls apps that are not dependencies for other installed apps' do expect(Clusters::Applications::UninstallService) .not_to receive(:new).with(helm) @@ -91,6 +109,14 @@ describe ClusterRemoveWorker do end context 'when exceeded the execution limit' do + subject { described_class.new.perform(cluster.id, described_class::EXECUTION_LIMIT) } + + it 'stops removing cluster' do + expect_any_instance_of(Clusters::Cluster).to receive(:stop_removing!) + + subject + end + it 'logs the error' do expect_any_instance_of(Gitlab::Kubernetes::Logger).to receive(:error).with( hash_including( @@ -103,7 +129,7 @@ describe ClusterRemoveWorker do ) ) - described_class.new.perform(cluster.id, described_class::EXECUTION_LIMIT) + subject end end end -- cgit v1.2.1