debian-mirror-gitlab/lib/api/project_clusters.rb

181 lines
7.1 KiB
Ruby
Raw Normal View History

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