2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
module API
2021-01-03 14:25:43 +05:30
class ProjectClusters < :: API :: Base
2019-02-15 15:39:39 +05:30
include PaginationParams
2022-05-07 20:08:51 +05:30
before do
authenticate!
ensure_feature_enabled!
end
2019-02-15 15:39:39 +05:30
2023-06-20 00:43:36 +05:30
feature_category :deployment_management
2022-07-16 23:28:13 +05:30
urgency :low
2021-01-29 00:20:46 +05:30
2019-02-15 15:39:39 +05:30
params do
2023-01-13 00:05:48 +05:30
requires :id , types : [ String , Integer ] , desc : 'The ID or URL-encoded path of the project'
2019-02-15 15:39:39 +05:30
end
resource :projects , requirements : API :: NAMESPACE_OR_PROJECT_REQUIREMENTS do
2023-01-13 00:05:48 +05:30
desc 'List project clusters' do
detail 'This feature was introduced in GitLab 11.7. Returns a list of project clusters.'
2019-02-15 15:39:39 +05:30
success Entities :: Cluster
2023-01-13 00:05:48 +05:30
failure [
{ code : 403 , message : 'Forbidden' }
]
is_array true
tags %w[ clusters ]
2019-02-15 15:39:39 +05:30
end
params do
use :pagination
end
get ':id/clusters' do
authorize! :read_cluster , user_project
present paginate ( clusters_for_current_user ) , with : Entities :: Cluster
end
2023-01-13 00:05:48 +05:30
desc 'Get a single project cluster' do
detail 'This feature was introduced in GitLab 11.7. Gets a single project cluster.'
2019-02-15 15:39:39 +05:30
success Entities :: ClusterProject
2023-01-13 00:05:48 +05:30
failure [
{ code : 403 , message : 'Forbidden' } ,
{ code : 404 , message : 'Not found' }
]
tags %w[ clusters ]
2019-02-15 15:39:39 +05:30
end
params do
requires :cluster_id , type : Integer , desc : 'The cluster ID'
end
get ':id/clusters/:cluster_id' do
authorize! :read_cluster , cluster
present cluster , with : Entities :: ClusterProject
end
2023-01-13 00:05:48 +05:30
desc 'Add existing cluster to project' do
detail 'This feature was introduced in GitLab 11.7. Adds an existing Kubernetes cluster to the project.'
2019-02-15 15:39:39 +05:30
success Entities :: ClusterProject
2023-01-13 00:05:48 +05:30
failure [
{ code : 400 , message : 'Validation error' } ,
{ code : 403 , message : 'Forbidden' } ,
{ code : 404 , message : 'Not found' }
]
tags %w[ clusters ]
2019-02-15 15:39:39 +05:30
end
params do
requires :name , type : String , desc : 'Cluster name'
optional :enabled , type : Boolean , default : true , desc : 'Determines if cluster is active or not, defaults to true'
2019-07-07 11:18:12 +05:30
optional :domain , type : String , desc : 'Cluster base domain'
2020-07-28 23:09:34 +05:30
optional :environment_scope , default : '*' , type : String , desc : 'The associated environment to the cluster'
2021-01-03 14:25:43 +05:30
optional :namespace_per_environment , default : true , type : Boolean , desc : 'Deploy each environment to a separate Kubernetes namespace'
2020-04-22 19:07:51 +05:30
optional :management_project_id , type : Integer , desc : 'The ID of the management project'
2019-07-31 22:56:46 +05:30
optional :managed , type : Boolean , default : true , desc : 'Determines if GitLab will manage namespaces and service accounts for this cluster, defaults to true'
2019-02-15 15:39:39 +05:30
requires :platform_kubernetes_attributes , type : Hash , desc : %q( Platform Kubernetes data ) do
requires :api_url , type : String , allow_blank : false , desc : 'URL to access the Kubernetes API'
requires :token , type : String , desc : 'Token to authenticate against Kubernetes'
optional :ca_cert , type : String , desc : 'TLS certificate (needed if API is using a self-signed TLS certificate)'
optional :namespace , type : String , desc : 'Unique namespace related to Project'
2020-03-13 15:44:24 +05:30
optional :authorization_type , type : String , values : :: Clusters :: Platforms :: Kubernetes . authorization_types . keys , default : 'rbac' , desc : 'Cluster authorization type, defaults to RBAC'
2019-02-15 15:39:39 +05:30
end
end
post ':id/clusters/user' do
2019-09-30 21:07:59 +05:30
authorize! :add_cluster , user_project
2019-02-15 15:39:39 +05:30
user_cluster = :: Clusters :: CreateService
. new ( current_user , create_cluster_user_params )
. execute
if user_cluster . persisted?
present user_cluster , with : Entities :: ClusterProject
else
render_validation_error! ( user_cluster )
end
end
2023-01-13 00:05:48 +05:30
desc 'Edit project cluster' do
detail 'This feature was introduced in GitLab 11.7. Updates an existing project cluster.'
2019-02-15 15:39:39 +05:30
success Entities :: ClusterProject
2023-01-13 00:05:48 +05:30
failure [
{ code : 400 , message : 'Validation error' } ,
{ code : 403 , message : 'Forbidden' } ,
{ code : 404 , message : 'Not found' }
]
tags %w[ clusters ]
2019-02-15 15:39:39 +05:30
end
params do
requires :cluster_id , type : Integer , desc : 'The cluster ID'
optional :name , type : String , desc : 'Cluster name'
2019-07-07 11:18:12 +05:30
optional :domain , type : String , desc : 'Cluster base domain'
2020-07-28 23:09:34 +05:30
optional :environment_scope , type : String , desc : 'The associated environment to the cluster'
2021-01-03 14:25:43 +05:30
optional :namespace_per_environment , default : true , type : Boolean , desc : 'Deploy each environment to a separate Kubernetes namespace'
2019-12-26 22:10:19 +05:30
optional :management_project_id , type : Integer , desc : 'The ID of the management project'
2021-02-22 17:27:13 +05:30
optional :enabled , type : Boolean , desc : 'Determines if cluster is active or not'
optional :managed , type : Boolean , desc : 'Determines if GitLab will manage namespaces and service accounts for this cluster'
2019-02-15 15:39:39 +05:30
optional :platform_kubernetes_attributes , type : Hash , desc : %q( Platform Kubernetes data ) do
optional :api_url , type : String , desc : 'URL to access the Kubernetes API'
optional :token , type : String , desc : 'Token to authenticate against Kubernetes'
optional :ca_cert , type : String , desc : 'TLS certificate (needed if API is using a self-signed TLS certificate)'
optional :namespace , type : String , desc : 'Unique namespace related to Project'
end
end
put ':id/clusters/:cluster_id' do
authorize! :update_cluster , cluster
2020-03-13 15:44:24 +05:30
update_service = :: Clusters :: UpdateService . new ( current_user , update_cluster_params )
2019-02-15 15:39:39 +05:30
if update_service . execute ( cluster )
present cluster , with : Entities :: ClusterProject
else
render_validation_error! ( cluster )
end
end
2023-01-13 00:05:48 +05:30
desc 'Delete project cluster' do
detail 'This feature was introduced in GitLab 11.7. Deletes an existing project cluster. Does not remove existing resources within the connected Kubernetes cluster.'
2019-02-15 15:39:39 +05:30
success Entities :: ClusterProject
2023-01-13 00:05:48 +05:30
failure [
{ code : 403 , message : 'Forbidden' } ,
{ code : 404 , message : 'Not found' }
]
tags %w[ clusters ]
2019-02-15 15:39:39 +05:30
end
params do
requires :cluster_id , type : Integer , desc : 'The Cluster ID'
end
delete ':id/clusters/:cluster_id' do
authorize! :admin_cluster , cluster
destroy_conditionally! ( cluster )
end
end
helpers do
def clusters_for_current_user
@clusters_for_current_user || = ClustersFinder . new ( user_project , current_user , :all ) . execute
end
def cluster
@cluster || = clusters_for_current_user . find ( params [ :cluster_id ] )
end
def create_cluster_user_params
declared_params . merge ( {
provider_type : :user ,
platform_type : :kubernetes ,
clusterable : user_project
} )
end
def update_cluster_params
declared_params ( include_missing : false ) . without ( :cluster_id )
end
2022-05-07 20:08:51 +05:30
def ensure_feature_enabled!
2022-07-16 23:28:13 +05:30
namespace = user_project . namespace
not_found! unless namespace . certificate_based_clusters_enabled?
2022-05-07 20:08:51 +05:30
end
2019-02-15 15:39:39 +05:30
end
end
end