2017-10-13 13:21:23 -04:00
|
|
|
module Clusters
|
|
|
|
module Platforms
|
|
|
|
class Kubernetes < ActiveRecord::Base
|
2017-10-29 14:48:45 -04:00
|
|
|
include Gitlab::CurrentSettings
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
self.table_name = 'cluster_platforms_kubernetes'
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-10-23 04:36:35 -04:00
|
|
|
belongs_to :cluster, inverse_of: :platform_kubernetes, class_name: 'Clusters::Cluster'
|
2017-10-13 13:21:23 -04:00
|
|
|
|
|
|
|
attr_encrypted :password,
|
|
|
|
mode: :per_attribute_iv,
|
|
|
|
key: Gitlab::Application.secrets.db_key_base,
|
|
|
|
algorithm: 'aes-256-cbc'
|
|
|
|
|
|
|
|
attr_encrypted :token,
|
|
|
|
mode: :per_attribute_iv,
|
|
|
|
key: Gitlab::Application.secrets.db_key_base,
|
|
|
|
algorithm: 'aes-256-cbc'
|
|
|
|
|
2017-10-29 14:48:45 -04:00
|
|
|
before_validation :enforce_namespace_to_lower_case
|
|
|
|
|
2017-10-13 13:21:23 -04:00
|
|
|
validates :namespace,
|
|
|
|
allow_blank: true,
|
|
|
|
length: 1..63,
|
|
|
|
format: {
|
|
|
|
with: Gitlab::Regex.kubernetes_namespace_regex,
|
|
|
|
message: Gitlab::Regex.kubernetes_namespace_regex_message
|
|
|
|
}
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
# We expect to be `active?` only when enabled and cluster is created (the api_url is assigned)
|
2017-11-01 08:56:27 -04:00
|
|
|
with_options presence: true, if: :enabled? do
|
2017-11-01 07:57:05 -04:00
|
|
|
validates :api_url, url: true, presence: true
|
|
|
|
validates :token, presence: true
|
|
|
|
end
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
# TODO: Glue code till we migrate Kubernetes Integration into Platforms::Kubernetes
|
|
|
|
after_save :update_kubernetes_integration!
|
|
|
|
after_destroy :destroy_kubernetes_integration!
|
2017-10-29 14:48:45 -04:00
|
|
|
|
|
|
|
alias_attribute :ca_pem, :ca_cert
|
|
|
|
|
|
|
|
delegate :project, to: :cluster, allow_nil: true
|
|
|
|
delegate :enabled?, to: :cluster, allow_nil: true
|
|
|
|
|
|
|
|
class << self
|
|
|
|
def namespace_for_project(project)
|
|
|
|
"#{project.path}-#{project.id}"
|
|
|
|
end
|
|
|
|
end
|
2017-10-13 13:21:23 -04:00
|
|
|
|
|
|
|
def actual_namespace
|
|
|
|
if namespace.present?
|
|
|
|
namespace
|
|
|
|
else
|
|
|
|
default_namespace
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-29 14:48:45 -04:00
|
|
|
def default_namespace
|
|
|
|
self.class.namespace_for_project(project) if project
|
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
private
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
def enforce_namespace_to_lower_case
|
|
|
|
self.namespace = self.namespace&.downcase
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
# TODO: glue code till we migrate Kubernetes Service into Platforms::Kubernetes class
|
|
|
|
def manages_kubernetes_service?
|
|
|
|
return true unless kubernetes_service&.active?
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
kubernetes_service.api_url == api_url
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
def destroy_kubernetes_integration!
|
|
|
|
return unless manages_kubernetes_service?
|
2017-10-13 13:21:23 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
kubernetes_service.destroy!
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
def update_kubernetes_integration!
|
|
|
|
return raise 'Kubernetes service already configured' unless manages_kubernetes_service?
|
2017-10-23 04:36:35 -04:00
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
ensure_kubernetes_service.update!(
|
2017-11-01 08:56:27 -04:00
|
|
|
active: enabled?,
|
2017-11-01 07:57:05 -04:00
|
|
|
api_url: api_url,
|
|
|
|
namespace: namespace,
|
|
|
|
token: token,
|
|
|
|
ca_pem: ca_cert,
|
2017-10-13 13:21:23 -04:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
def kubernetes_service
|
|
|
|
@kubernetes_service ||= project.kubernetes_service || project.build_kubernetes_service
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
|
2017-11-01 07:57:05 -04:00
|
|
|
def ensure_kubernetes_service
|
|
|
|
@kubernetes_service ||= kubernetes_service || project.build_kubernetes_service
|
2017-10-13 13:21:23 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|