Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDylan Griffith <dyl.griffith@gmail.com>2018-02-12 06:22:15 +0300
committerDylan Griffith <dyl.griffith@gmail.com>2018-02-15 09:01:11 +0300
commitc1828eaed56159998d1eaafdaa135f1b3480549b (patch)
tree8cd903c910454bfdbc2bfdb1b1e9709eaa5583f1 /app
parent5ca692b0b04b4f349fb5a08b9dcc7d87c774934e (diff)
Persist external IP of ingress controller created for GKE (#42643)
Diffstat (limited to 'app')
-rw-r--r--app/models/clusters/applications/ingress.rb7
-rw-r--r--app/models/clusters/concerns/application_core.rb4
-rw-r--r--app/serializers/cluster_application_entity.rb1
-rw-r--r--app/services/clusters/applications/check_ingress_ip_address_service.rb37
-rw-r--r--app/services/clusters/applications/check_installation_progress_service.rb1
-rw-r--r--app/workers/all_queues.yml1
-rw-r--r--app/workers/cluster_wait_for_ingress_ip_address_worker.rb14
7 files changed, 65 insertions, 0 deletions
diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb
index aa5cf97756f..5e9086aecca 100644
--- a/app/models/clusters/applications/ingress.rb
+++ b/app/models/clusters/applications/ingress.rb
@@ -13,6 +13,8 @@ module Clusters
nginx: 1
}
+ IP_ADDRESS_FETCH_RETRIES = 3
+
def chart
'stable/nginx-ingress'
end
@@ -24,6 +26,11 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(name, chart: chart, chart_values_file: chart_values_file)
end
+
+ def post_install
+ ClusterWaitForIngressIpAddressWorker.perform_in(
+ ClusterWaitForIngressIpAddressWorker::INTERVAL, name, id, IP_ADDRESS_FETCH_RETRIES)
+ end
end
end
end
diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb
index a98fa85a5ff..b047fbce214 100644
--- a/app/models/clusters/concerns/application_core.rb
+++ b/app/models/clusters/concerns/application_core.rb
@@ -23,6 +23,10 @@ module Clusters
def name
self.class.application_name
end
+
+ def post_install
+ # Override for any extra work that needs to be done after install
+ end
end
end
end
diff --git a/app/serializers/cluster_application_entity.rb b/app/serializers/cluster_application_entity.rb
index 3f9a275ad08..b22a0b666ef 100644
--- a/app/serializers/cluster_application_entity.rb
+++ b/app/serializers/cluster_application_entity.rb
@@ -2,4 +2,5 @@ class ClusterApplicationEntity < Grape::Entity
expose :name
expose :status_name, as: :status
expose :status_reason
+ expose :external_ip, if: -> (e, _) { e.respond_to?(:external_ip) }
end
diff --git a/app/services/clusters/applications/check_ingress_ip_address_service.rb b/app/services/clusters/applications/check_ingress_ip_address_service.rb
new file mode 100644
index 00000000000..cf132676aa6
--- /dev/null
+++ b/app/services/clusters/applications/check_ingress_ip_address_service.rb
@@ -0,0 +1,37 @@
+module Clusters
+ module Applications
+ class CheckIngressIpAddressService < BaseHelmService
+ def execute(retries_remaining)
+ return if app.external_ip
+
+ service = get_service
+
+ if service.status.loadBalancer.ingress
+ resolve_external_ip(service)
+ else
+ retry_if_necessary(retries_remaining)
+ end
+
+ rescue KubeException
+ retry_if_necessary(retries_remaining)
+ end
+
+ private
+
+ def resolve_external_ip(service)
+ app.update!( external_ip: service.status.loadBalancer.ingress[0].ip)
+ end
+
+ def get_service
+ kubeclient.get_service('ingress-nginx-ingress-controller', Gitlab::Kubernetes::Helm::NAMESPACE)
+ end
+
+ def retry_if_necessary(retries_remaining)
+ if retries_remaining > 0
+ ClusterWaitForIngressIpAddressWorker.perform_in(
+ ClusterWaitForIngressIpAddressWorker::INTERVAL, app.name, app.id, retries_remaining - 1)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/applications/check_installation_progress_service.rb b/app/services/clusters/applications/check_installation_progress_service.rb
index bde090eaeec..7dcddc1c3f7 100644
--- a/app/services/clusters/applications/check_installation_progress_service.rb
+++ b/app/services/clusters/applications/check_installation_progress_service.rb
@@ -20,6 +20,7 @@ module Clusters
def on_success
app.make_installed!
+ app.post_install
ensure
remove_installation_pod
end
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index f2c20114534..35ffa5d5fda 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -23,6 +23,7 @@
- gcp_cluster:cluster_wait_for_app_installation
- gcp_cluster:wait_for_cluster_creation
- gcp_cluster:check_gcp_project_billing
+- gcp_cluster:cluster_wait_for_ingress_ip_address
- github_import_advance_stage
- github_importer:github_import_import_diff_note
diff --git a/app/workers/cluster_wait_for_ingress_ip_address_worker.rb b/app/workers/cluster_wait_for_ingress_ip_address_worker.rb
new file mode 100644
index 00000000000..829417484cf
--- /dev/null
+++ b/app/workers/cluster_wait_for_ingress_ip_address_worker.rb
@@ -0,0 +1,14 @@
+class ClusterWaitForIngressIpAddressWorker
+ include ApplicationWorker
+ include ClusterQueue
+ include ClusterApplications
+
+ INTERVAL = 10.seconds
+ TIMEOUT = 20.minutes
+
+ def perform(app_name, app_id, retries_remaining)
+ find_application(app_name, app_id) do |app|
+ Clusters::Applications::CheckIngressIpAddressService.new(app).execute(retries_remaining)
+ end
+ end
+end