Commit c46417c5 authored by Alessio Caiazza's avatar Alessio Caiazza

Rename App to Applications

parent 880cf60b
module Clusters
module Concerns
end
end
module Clusters
module Applications
class BaseHelmService
attr_accessor :app
def initialize(app)
@app = app
end
protected
def cluster
app.cluster
end
def kubeclient
cluster.kubeclient
end
def helm_api
@helm_api ||= Gitlab::Kubernetes::Helm.new(kubeclient)
end
end
end
end
module Clusters
module Applications
class CheckInstallationProgressService < BaseHelmService
def execute
return unless app.installing?
FetchInstallationStatusService.new(app).execute do |phase, log|
case phase
when 'Succeeded'
if app.make_installed
FinalizeInstallationService.new(app).execute
else
app.make_errored!("Failed to update app record; #{app.errors}")
end
when 'Failed'
app.make_errored!(log || 'Installation silently failed')
FinalizeInstallationService.new(app).execute
else
if Time.now.utc - app.updated_at.to_time.utc > ClusterWaitForAppInstallationWorker::TIMEOUT
app.make_errored!('App installation timeouted')
else
ClusterWaitForAppInstallationWorker.perform_in(
ClusterWaitForAppInstallationWorker::EAGER_INTERVAL, app.name, app.id)
end
end
end
end
end
end
end
module Clusters
module Applications
class FetchInstallationStatusService < BaseHelmService
def execute
return unless app.installing?
phase = helm_api.installation_status(app)
log = helm_api.installation_log(app) if phase == 'Failed'
yield(phase, log) if block_given?
rescue KubeException => ke
app.make_errored!("Kubernetes error: #{ke.message}") unless app.errored?
end
end
end
end
module Clusters
module Applications
class FinalizeInstallationService < BaseHelmService
def execute
helm_api.delete_installation_pod!(app)
app.make_errored!('Installation aborted') if aborted?
end
private
def aborted?
app.installing? || app.scheduled?
end
end
end
end
module Clusters
module Applications
class InstallService < BaseHelmService
def execute
return unless app.scheduled?
begin
helm_api.install(app)
if app.make_installing
ClusterWaitForAppInstallationWorker.perform_in(
ClusterWaitForAppInstallationWorker::INITIAL_INTERVAL, app.name, app.id)
else
app.make_errored!("Failed to update app record; #{app.errors}")
end
rescue KubeException => ke
app.make_errored!("Kubernetes error: #{ke.message}")
rescue StandardError
app.make_errored!("Can't start installation process")
end
end
end
end
end
module Clusters
class BaseHelmService
attr_accessor :app
def initialize(app)
@app = app
end
protected
def cluster
app.cluster
end
def kubeclient
cluster.kubeclient
end
def helm_api
@helm_api ||= Gitlab::Kubernetes::Helm.new(kubeclient)
end
end
end
module Clusters
class CheckAppInstallationProgressService < BaseHelmService
def execute
return unless app.installing?
FetchAppInstallationStatusService.new(app).execute do |phase, log|
case phase
when 'Succeeded'
if app.make_installed
FinalizeAppInstallationService.new(app).execute
else
app.make_errored!("Failed to update app record; #{app.errors}")
end
when 'Failed'
app.make_errored!(log || 'Installation silently failed')
FinalizeAppInstallationService.new(app).execute
else
if Time.now.utc - app.updated_at.to_time.utc > ClusterWaitForAppInstallationWorker::TIMEOUT
app.make_errored!('App installation timeouted')
else
ClusterWaitForAppInstallationWorker.perform_in(
ClusterWaitForAppInstallationWorker::EAGER_INTERVAL, app.name, app.id)
end
end
end
end
end
end
module Clusters
class FetchAppInstallationStatusService < BaseHelmService
def execute
return unless app.installing?
phase = helm_api.installation_status(app)
log = helm_api.installation_log(app) if phase == 'Failed'
yield(phase, log) if block_given?
rescue KubeException => ke
app.make_errored!("Kubernetes error: #{ke.message}") unless app.errored?
end
end
end
module Clusters
class FinalizeAppInstallationService < BaseHelmService
def execute
helm_api.delete_installation_pod!(app)
app.make_errored!('Installation aborted') if aborted?
end
private
def aborted?
app.installing? || app.scheduled?
end
end
end
module Clusters
class InstallAppService < BaseHelmService
def execute
return unless app.scheduled?
begin
helm_api.install(app)
if app.make_installing
ClusterWaitForAppInstallationWorker.perform_in(
ClusterWaitForAppInstallationWorker::INITIAL_INTERVAL, app.name, app.id)
else
app.make_errored!("Failed to update app record; #{app.errors}")
end
rescue KubeException => ke
app.make_errored!("Kubernetes error: #{ke.message}")
rescue StandardError
app.make_errored!("Can't start installation process")
end
end
end
end
class ClusterInstallAppWorker
include Sidekiq::Worker
include ClusterQueue
include ClusterApp
include ClusterApplications
def perform(app_name, app_id)
find_app(app_name, app_id) do |app|
Clusters::InstallAppService.new(app).execute
find_application(app_name, app_id) do |app|
Clusters::Applications::InstallService.new(app).execute
end
end
end
class ClusterWaitForAppInstallationWorker
include Sidekiq::Worker
include ClusterQueue
include ClusterApp
include ClusterApplications
INITIAL_INTERVAL = 30.seconds
EAGER_INTERVAL = 10.seconds
TIMEOUT = 20.minutes
def perform(app_name, app_id)
find_app(app_name, app_id) do |app|
Clusters::CheckAppInstallationProgressService.new(app).execute
find_application(app_name, app_id) do |app|
Clusters::Applications::CheckInstallationProgressService.new(app).execute
end
end
end
module ClusterApp
extend ActiveSupport::Concern
included do
def find_app(app_name, id)
Clusters::Cluster::APPLICATIONS[app_name].find(id).try do |app|
yield(app) if block_given?
end
end
end
end
module ClusterApplications
extend ActiveSupport::Concern
included do
def find_application(app_name, id, &blk)
Clusters::Cluster::APPLICATIONS[app_name].find(id).try(&blk)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment