Schedule Ingress IP address fetch from K8s after clusters page load (#42643)

This commit is contained in:
Dylan Griffith 2018-02-20 13:49:35 +11:00
parent ba4114d25f
commit 3d3d09fa9d
5 changed files with 53 additions and 0 deletions

View file

@ -4,6 +4,7 @@ class Projects::ClustersController < Projects::ApplicationController
before_action :authorize_create_cluster!, only: [:new]
before_action :authorize_update_cluster!, only: [:update]
before_action :authorize_admin_cluster!, only: [:destroy]
before_action :sync_application_details, only: [:status]
STATUS_POLLING_INTERVAL = 10_000
@ -114,4 +115,8 @@ class Projects::ClustersController < Projects::ApplicationController
def authorize_admin_cluster!
access_denied! unless can?(current_user, :admin_cluster, cluster)
end
def sync_application_details
@cluster.applications.each(&:sync_details)
end
end

View file

@ -36,6 +36,14 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(name, chart: chart, chart_values_file: chart_values_file)
end
def sync_details
return unless installed?
return if external_ip
ClusterWaitForIngressIpAddressWorker.perform_in(
ClusterWaitForIngressIpAddressWorker::INTERVAL, name, id, IP_ADDRESS_FETCH_RETRIES)
end
end
end
end

View file

@ -23,6 +23,11 @@ module Clusters
def name
self.class.application_name
end
def sync_details
# Override if you need extra data synchronized
# from K8s after installation
end
end
end
end

View file

@ -91,6 +91,12 @@ describe Projects::ClustersController do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('cluster_status')
end
it 'invokes sync_details on each application' do
expect_any_instance_of(Clusters::Applications::Ingress).to receive(:sync_details)
go
end
end
describe 'security' do

View file

@ -22,4 +22,33 @@ describe Clusters::Applications::Ingress do
.with(ClusterWaitForIngressIpAddressWorker::INTERVAL, 'ingress', application.id, 3)
end
end
describe '#sync_details' do
let(:application) { create(:clusters_applications_ingress, :installed) }
before do
application.sync_details
end
it 'schedules a ClusterWaitForIngressIpAddressWorker' do
expect(ClusterWaitForIngressIpAddressWorker).to have_received(:perform_in)
.with(ClusterWaitForIngressIpAddressWorker::INTERVAL, 'ingress', application.id, 3)
end
context 'when the application is not installed' do
let(:application) { create(:clusters_applications_ingress, :installing) }
it 'does not schedule a ClusterWaitForIngressIpAddressWorker' do
expect(ClusterWaitForIngressIpAddressWorker).not_to have_received(:perform_in)
end
end
context 'when there is already an external_ip' do
let(:application) { create(:clusters_applications_ingress, :installed, external_ip: '111.222.222.111') }
it 'does not schedule a ClusterWaitForIngressIpAddressWorker' do
expect(ClusterWaitForIngressIpAddressWorker).not_to have_received(:perform_in)
end
end
end
end