2018-11-20 20:47:30 +05:30
# frozen_string_literal: true
2019-09-04 21:01:54 +05:30
class KubernetesService < Service
default_value_for :category , 'deployment'
2017-08-17 22:00:37 +05:30
# Namespace defaults to the project path, but can be overridden in case that
# is an invalid or inappropriate name
prop_accessor :namespace
# Access to kubernetes is directly through the API
prop_accessor :api_url
# Bearer authentication
# TODO: user/password auth, client certificates
prop_accessor :token
# Provide a custom CA bundle for self-signed deployments
prop_accessor :ca_pem
with_options presence : true , if : :activated? do
2018-11-08 19:23:39 +05:30
validates :api_url , public_url : true
2017-08-17 22:00:37 +05:30
validates :token
end
2018-03-17 18:26:18 +05:30
before_validation :enforce_namespace_to_lower_case
2019-09-04 21:01:54 +05:30
attr_accessor :skip_deprecation_validation
validate :deprecation_validation , unless : :skip_deprecation_validation
2017-08-17 22:00:37 +05:30
validates :namespace ,
allow_blank : true ,
length : 1 .. 63 ,
if : :activated? ,
format : {
with : Gitlab :: Regex . kubernetes_namespace_regex ,
message : Gitlab :: Regex . kubernetes_namespace_regex_message
}
2019-09-04 21:01:54 +05:30
def self . supported_events
%w( )
end
def can_test?
false
end
2017-08-17 22:00:37 +05:30
def initialize_properties
self . properties = { } if properties . nil?
end
def title
'Kubernetes'
end
def description
2019-02-15 15:39:39 +05:30
'Kubernetes / OpenShift integration'
2017-08-17 22:00:37 +05:30
end
def self . to_param
'kubernetes'
end
def fields
[
{ type : 'text' ,
name : 'api_url' ,
title : 'API URL' ,
placeholder : 'Kubernetes API URL, like https://kube.example.com/' } ,
{ type : 'textarea' ,
name : 'ca_pem' ,
2017-09-10 17:25:29 +05:30
title : 'CA Certificate' ,
2017-08-17 22:00:37 +05:30
placeholder : 'Certificate Authority bundle (PEM format)' } ,
2017-09-10 17:25:29 +05:30
{ type : 'text' ,
name : 'namespace' ,
title : 'Project namespace (optional/unique)' ,
placeholder : namespace_placeholder } ,
{ type : 'text' ,
name : 'token' ,
title : 'Token' ,
placeholder : 'Service token' }
2017-08-17 22:00:37 +05:30
]
end
2018-03-17 18:26:18 +05:30
def deprecated?
2019-09-04 21:01:54 +05:30
true
end
def editable?
false
2018-03-17 18:26:18 +05:30
end
def deprecation_message
2019-09-04 21:01:54 +05:30
content = if project
2019-09-30 21:07:59 +05:30
_ ( " Kubernetes service integration has been disabled. Fields on this page are not used by GitLab, you can configure your Kubernetes clusters using the new <a href= \" %{url} \" />Kubernetes Clusters</a> page " ) % {
2019-09-04 21:01:54 +05:30
url : Gitlab :: Routing . url_helpers . project_clusters_path ( project )
}
else
2019-09-30 21:07:59 +05:30
_ ( " The instance-level Kubernetes service integration is disabled. Your data has been migrated to an <a href= \" %{url} \" />instance-level cluster</a>. " ) % {
2019-09-04 21:01:54 +05:30
url : Gitlab :: Routing . url_helpers . admin_clusters_path
}
end
2018-03-17 18:26:18 +05:30
content . html_safe
end
2017-08-17 22:00:37 +05:30
TEMPLATE_PLACEHOLDER = 'Kubernetes namespace' . freeze
private
def namespace_placeholder
default_namespace || TEMPLATE_PLACEHOLDER
end
def default_namespace
2018-03-17 18:26:18 +05:30
return unless project
slug = " #{ project . path } - #{ project . id } " . downcase
slug . gsub ( / [^-a-z0-9] / , '-' ) . gsub ( / ^-+ / , '' )
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
def enforce_namespace_to_lower_case
self . namespace = self . namespace & . downcase
end
def deprecation_validation
2018-11-08 19:23:39 +05:30
return if active_changed? ( from : true , to : false ) || ( new_record? && ! active? )
2018-03-17 18:26:18 +05:30
if deprecated?
errors [ :base ] << deprecation_message
end
end
2017-08-17 22:00:37 +05:30
end