2020-07-20 05:09:22 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module API
|
|
|
|
# Kubernetes Internal API
|
|
|
|
module Internal
|
2020-10-14 20:08:42 -04:00
|
|
|
class Kubernetes < ::API::Base
|
2020-11-02 10:08:52 -05:00
|
|
|
feature_category :kubernetes_management
|
|
|
|
|
2020-08-21 08:10:22 -04:00
|
|
|
before do
|
2020-09-07 17:08:26 -04:00
|
|
|
check_feature_enabled
|
2020-08-21 08:10:22 -04:00
|
|
|
authenticate_gitlab_kas_request!
|
|
|
|
end
|
|
|
|
|
2020-07-20 05:09:22 -04:00
|
|
|
helpers do
|
2020-08-21 08:10:22 -04:00
|
|
|
def authenticate_gitlab_kas_request!
|
2021-03-31 08:08:55 -04:00
|
|
|
render_api_error!('KAS JWT authentication invalid', 401) unless Gitlab::Kas.verify_api_request(headers)
|
2020-08-21 08:10:22 -04:00
|
|
|
end
|
|
|
|
|
2020-08-11 23:10:17 -04:00
|
|
|
def agent_token
|
|
|
|
@agent_token ||= cluster_agent_token_from_authorization_token
|
|
|
|
end
|
|
|
|
|
|
|
|
def agent
|
|
|
|
@agent ||= agent_token.agent
|
|
|
|
end
|
|
|
|
|
2020-07-20 05:09:22 -04:00
|
|
|
def repo_type
|
|
|
|
Gitlab::GlRepository::PROJECT
|
|
|
|
end
|
|
|
|
|
2020-08-11 23:10:17 -04:00
|
|
|
def gitaly_info(project)
|
|
|
|
shard = repo_type.repository_for(project).shard
|
|
|
|
{
|
|
|
|
address: Gitlab::GitalyClient.address(shard),
|
|
|
|
token: Gitlab::GitalyClient.token(shard),
|
|
|
|
features: Feature::Gitaly.server_feature_flags
|
|
|
|
}
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
|
|
|
|
2020-08-11 23:10:17 -04:00
|
|
|
def gitaly_repository(project)
|
|
|
|
{
|
|
|
|
storage_name: project.repository_storage,
|
|
|
|
relative_path: project.disk_path + '.git',
|
|
|
|
gl_repository: repo_type.identifier_for_container(project),
|
|
|
|
gl_project_path: repo_type.repository_for(project).full_path
|
|
|
|
}
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_feature_enabled
|
2020-09-14 14:09:48 -04:00
|
|
|
not_found! unless Feature.enabled?(:kubernetes_agent_internal_api, default_enabled: true, type: :ops)
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
2020-08-11 23:10:17 -04:00
|
|
|
|
|
|
|
def check_agent_token
|
2021-03-31 08:08:55 -04:00
|
|
|
unauthorized! unless agent_token
|
2021-02-04 22:09:09 -05:00
|
|
|
|
|
|
|
forbidden! unless Gitlab::Kas.included_in_gitlab_com_rollout?(agent.project)
|
2021-03-22 20:09:09 -04:00
|
|
|
|
|
|
|
agent_token.track_usage
|
2020-08-11 23:10:17 -04:00
|
|
|
end
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
namespace 'internal' do
|
|
|
|
namespace 'kubernetes' do
|
2020-08-11 23:10:17 -04:00
|
|
|
before do
|
|
|
|
check_agent_token
|
|
|
|
end
|
|
|
|
|
2020-07-20 05:09:22 -04:00
|
|
|
desc 'Gets agent info' do
|
|
|
|
detail 'Retrieves agent info for the given token'
|
|
|
|
end
|
|
|
|
route_setting :authentication, cluster_agent_token_allowed: true
|
|
|
|
get '/agent_info' do
|
2020-08-11 23:10:17 -04:00
|
|
|
project = agent.project
|
2020-07-20 05:09:22 -04:00
|
|
|
|
2020-08-11 23:10:17 -04:00
|
|
|
status 200
|
|
|
|
{
|
|
|
|
project_id: project.id,
|
|
|
|
agent_id: agent.id,
|
|
|
|
agent_name: agent.name,
|
|
|
|
gitaly_info: gitaly_info(project),
|
|
|
|
gitaly_repository: gitaly_repository(project)
|
|
|
|
}
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Gets project info' do
|
|
|
|
detail 'Retrieves project info (if authorized)'
|
|
|
|
end
|
|
|
|
route_setting :authentication, cluster_agent_token_allowed: true
|
|
|
|
get '/project_info' do
|
2020-08-11 23:10:17 -04:00
|
|
|
project = find_project(params[:id])
|
2020-07-20 05:09:22 -04:00
|
|
|
|
2020-11-27 07:09:14 -05:00
|
|
|
unless Guest.can?(:download_code, project) || agent.has_access_to?(project)
|
2020-08-11 23:10:17 -04:00
|
|
|
not_found!
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
2020-08-11 23:10:17 -04:00
|
|
|
|
|
|
|
status 200
|
|
|
|
{
|
|
|
|
project_id: project.id,
|
|
|
|
gitaly_info: gitaly_info(project),
|
|
|
|
gitaly_repository: gitaly_repository(project)
|
|
|
|
}
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
2020-09-07 17:08:26 -04:00
|
|
|
end
|
2020-09-02 17:10:43 -04:00
|
|
|
|
2020-09-07 17:08:26 -04:00
|
|
|
namespace 'kubernetes/usage_metrics' do
|
2020-09-02 17:10:43 -04:00
|
|
|
desc 'POST usage metrics' do
|
|
|
|
detail 'Updates usage metrics for agent'
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :gitops_sync_count, type: Integer, desc: 'The count to increment the gitops_sync metric by'
|
|
|
|
end
|
2020-09-07 17:08:26 -04:00
|
|
|
post '/' do
|
2020-09-02 17:10:43 -04:00
|
|
|
gitops_sync_count = params[:gitops_sync_count]
|
|
|
|
|
|
|
|
if gitops_sync_count < 0
|
|
|
|
bad_request!('gitops_sync_count must be greater than or equal to zero')
|
|
|
|
else
|
|
|
|
Gitlab::UsageDataCounters::KubernetesAgentCounter.increment_gitops_sync(gitops_sync_count)
|
|
|
|
|
|
|
|
no_content!
|
|
|
|
end
|
|
|
|
end
|
2020-07-20 05:09:22 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-12-09 19:09:50 -05:00
|
|
|
|
|
|
|
API::Internal::Kubernetes.prepend_if_ee('EE::API::Internal::Kubernetes')
|