2017-10-13 13:21:23 -04:00
|
|
|
module Clusters
|
|
|
|
class Cluster < ActiveRecord::Base
|
|
|
|
include Presentable
|
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
self.table_name = 'clusters'
|
|
|
|
|
2017-11-02 10:10:46 -04:00
|
|
|
APPLICATIONS = {
|
|
|
|
Clusters::Applications::Helm::NAME => Clusters::Applications::Helm
|
2017-11-02 12:08:56 -04:00
|
|
|
}.freeze
|
2017-11-02 10:10:46 -04:00
|
|
|
|
2017-10-13 13:21:23 -04:00
|
|
|
belongs_to :user
|
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
has_many :cluster_projects, class_name: 'Clusters::Project'
|
|
|
|
has_many :projects, through: :cluster_projects, class_name: '::Project'
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
# we force autosave to happen when we save `Cluster` model
|
|
|
|
has_one :provider_gcp, class_name: 'Clusters::Providers::Gcp', autosave: true
|
|
|
|
|
|
|
|
# We have to ":destroy" it today to ensure that we clean also the Kubernetes Integration
|
|
|
|
has_one :platform_kubernetes, class_name: 'Clusters::Platforms::Kubernetes', autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-02 10:10:46 -04:00
|
|
|
has_one :application_helm, class_name: 'Clusters::Applications::Helm'
|
|
|
|
|
2017-10-31 04:47:48 -04:00
|
|
|
accepts_nested_attributes_for :provider_gcp, update_only: true
|
2017-10-30 08:55:18 -04:00
|
|
|
accepts_nested_attributes_for :platform_kubernetes, update_only: true
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
validates :name, cluster_name: true
|
2017-10-13 13:21:23 -04:00
|
|
|
validate :restrict_modification, on: :update
|
|
|
|
|
2017-11-03 04:22:11 -04:00
|
|
|
delegate :status, to: :provider, allow_nil: true
|
2017-10-13 13:21:23 -04:00
|
|
|
delegate :status_reason, to: :provider, allow_nil: true
|
2017-10-23 04:36:35 -04:00
|
|
|
delegate :on_creation?, to: :provider, allow_nil: true
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-10-29 14:48:45 -04:00
|
|
|
enum platform_type: {
|
|
|
|
kubernetes: 1
|
|
|
|
}
|
|
|
|
|
|
|
|
enum provider_type: {
|
|
|
|
user: 0,
|
|
|
|
gcp: 1
|
|
|
|
}
|
|
|
|
|
|
|
|
scope :enabled, -> { where(enabled: true) }
|
|
|
|
scope :disabled, -> { where(enabled: false) }
|
|
|
|
|
2017-11-02 10:10:46 -04:00
|
|
|
def status_name
|
|
|
|
if provider
|
|
|
|
provider.status_name
|
|
|
|
else
|
|
|
|
:created
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-11-02 12:57:50 -04:00
|
|
|
def applications
|
|
|
|
[
|
|
|
|
application_helm || build_application_helm
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
2017-10-13 13:21:23 -04:00
|
|
|
def provider
|
2017-10-23 04:36:35 -04:00
|
|
|
return provider_gcp if gcp?
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def platform
|
2017-10-23 04:36:35 -04:00
|
|
|
return platform_kubernetes if kubernetes?
|
|
|
|
end
|
|
|
|
|
2017-10-13 13:21:23 -04:00
|
|
|
def first_project
|
|
|
|
return @first_project if defined?(@first_project)
|
|
|
|
|
|
|
|
@first_project = projects.first
|
|
|
|
end
|
2017-10-29 14:48:45 -04:00
|
|
|
alias_method :project, :first_project
|
2017-10-23 04:36:35 -04:00
|
|
|
|
2017-11-02 10:10:46 -04:00
|
|
|
def kubeclient
|
|
|
|
platform_kubernetes.kubeclient if kubernetes?
|
|
|
|
end
|
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
private
|
|
|
|
|
|
|
|
def restrict_modification
|
|
|
|
if provider&.on_creation?
|
|
|
|
errors.add(:base, "cannot modify during creation")
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
end
|