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

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

242 lines
11 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2016-09-13 17:45:13 +05:30
module API
# Environments RESTfull API endpoints
2021-01-03 14:25:43 +05:30
class Environments < ::API::Base
2017-08-17 22:00:37 +05:30
include PaginationParams
2023-01-13 00:05:48 +05:30
environments_tags = %w[environments]
2016-09-13 17:45:13 +05:30
before { authenticate! }
2021-01-29 00:20:46 +05:30
feature_category :continuous_delivery
2022-07-16 23:28:13 +05:30
urgency :low
2021-01-29 00:20:46 +05:30
2023-03-17 16:20:25 +05:30
MIN_SEARCH_LENGTH = 3
2016-09-13 17:45:13 +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 owned by the authenticated user'
2016-09-13 17:45:13 +05:30
end
2019-02-15 15:39:39 +05:30
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
2023-01-13 00:05:48 +05:30
desc 'List environments' do
detail 'Get all environments for a given project. This feature was introduced in GitLab 8.11.'
2016-09-13 17:45:13 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
is_array true
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags environments_tags
2016-09-13 17:45:13 +05:30
end
params do
2017-08-17 22:00:37 +05:30
use :pagination
2023-01-13 00:05:48 +05:30
optional :name, type: String, desc: 'Return the environment with this name. Mutually exclusive with search'
2023-03-17 16:20:25 +05:30
optional :search, type: String, desc: "Return list of environments matching the search criteria. Mutually exclusive with name. Must be at least #{MIN_SEARCH_LENGTH} characters."
2023-01-13 00:05:48 +05:30
optional :states,
type: String,
values: Environment.valid_states.map(&:to_s),
desc: 'List all environments that match a specific state. Accepted values: `available`, `stopping`, or `stopped`. If no state value given, returns all environments'
2019-09-30 21:07:59 +05:30
mutually_exclusive :name, :search, message: 'cannot be used together'
2016-09-13 17:45:13 +05:30
end
get ':id/environments' do
authorize! :read_environment, user_project
2023-03-17 16:20:25 +05:30
if Feature.enabled?(:environment_search_api_min_chars, user_project) && params[:search].present? && params[:search].length < MIN_SEARCH_LENGTH
bad_request!("Search query is less than #{MIN_SEARCH_LENGTH} characters")
end
2022-07-23 23:45:48 +05:30
environments = ::Environments::EnvironmentsFinder.new(user_project, current_user, declared_params(include_missing: false)).execute
2019-09-30 21:07:59 +05:30
present paginate(environments), with: Entities::Environment, current_user: current_user
2016-09-13 17:45:13 +05:30
end
2023-01-13 00:05:48 +05:30
desc 'Create a new environment' do
detail 'Creates a new environment with the given name and `external_url`. It returns `201` if the environment was successfully created, `400` for wrong parameters. This feature was introduced in GitLab 8.11.'
2016-09-13 17:45:13 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags environments_tags
2016-09-13 17:45:13 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :name, type: String, desc: 'The name of the environment'
optional :external_url, type: String, desc: 'Place to link to for this environment'
2022-11-25 23:54:43 +05:30
optional :slug, absence: { message: "is automatically generated and cannot be changed" }, documentation: { hidden: true }
2023-01-13 00:05:48 +05:30
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other`'
2016-09-13 17:45:13 +05:30
end
post ':id/environments' do
authorize! :create_environment, user_project
2017-08-17 22:00:37 +05:30
environment = user_project.environments.create(declared_params)
2016-09-13 17:45:13 +05:30
if environment.persisted?
2019-03-13 22:55:13 +05:30
present environment, with: Entities::Environment, current_user: current_user
2016-09-13 17:45:13 +05:30
else
render_validation_error!(environment)
end
end
2023-01-13 00:05:48 +05:30
desc 'Update an existing environment' do
detail 'Updates an existing environment name and/or `external_url`. It returns `200` if the environment was successfully updated. In case of an error, a status code `400` is returned. This feature was introduced in GitLab 8.11.'
2016-09-13 17:45:13 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags environments_tags
2016-09-13 17:45:13 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :environment_id, type: Integer, desc: 'The ID of the environment'
2021-11-11 11:23:49 +05:30
# TODO: disallow renaming via the API https://gitlab.com/gitlab-org/gitlab/-/issues/338897
optional :name, type: String, desc: 'DEPRECATED: Renaming environment can lead to errors, this will be removed in 15.0'
2016-09-13 17:45:13 +05:30
optional :external_url, type: String, desc: 'The new URL on which this deployment is viewable'
2022-11-25 23:54:43 +05:30
optional :slug, absence: { message: "is automatically generated and cannot be changed" }, documentation: { hidden: true }
2023-01-13 00:05:48 +05:30
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other`'
2016-09-13 17:45:13 +05:30
end
put ':id/environments/:environment_id' do
authorize! :update_environment, user_project
environment = user_project.environments.find(params[:environment_id])
2017-08-17 22:00:37 +05:30
2022-07-16 23:28:13 +05:30
update_params = declared_params(include_missing: false).extract!(:name, :external_url, :tier)
2016-09-13 17:45:13 +05:30
if environment.update(update_params)
2019-03-13 22:55:13 +05:30
present environment, with: Entities::Environment, current_user: current_user
2016-09-13 17:45:13 +05:30
else
render_validation_error!(environment)
end
end
2023-01-13 00:05:48 +05:30
desc 'Delete multiple stopped review apps' do
detail 'It schedules for deletion multiple environments that have already been stopped and are in the review app folder. The actual deletion is performed after 1 week from the time of execution. By default, it only deletes environments 30 days or older. You can change this default using the `before` parameter.'
2021-10-27 15:23:28 +05:30
success Entities::EnvironmentBasic
2023-01-13 00:05:48 +05:30
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' },
{ code: 409, message: 'Conflict' }
]
tags environments_tags
2021-04-17 20:07:23 +05:30
end
params do
2023-01-13 00:05:48 +05:30
optional :before, type: Time, desc: "The date before which environments can be deleted. Defaults to 30 days ago. Expected in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`)", default: -> { 30.days.ago }
optional :limit, type: Integer, desc: "Maximum number of environments to delete. Defaults to 100", default: 100, values: 1..1000
optional :dry_run, type: Boolean, desc: "Defaults to true for safety reasons. It performs a dry run where no actual deletion will be performed. Set to false to actually delete the environment", default: true
2021-04-17 20:07:23 +05:30
end
delete ":id/environments/review_apps" do
authorize! :read_environment, user_project
result = ::Environments::ScheduleToDeleteReviewAppsService.new(user_project, current_user, params).execute
response = {
2021-10-27 15:23:28 +05:30
scheduled_entries: Entities::EnvironmentBasic.represent(result.scheduled_entries),
unprocessable_entries: Entities::EnvironmentBasic.represent(result.unprocessable_entries)
2021-04-17 20:07:23 +05:30
}
if result.success?
status result.status
present response, current_user: current_user
else
render_api_error!(response.merge!(message: result.error_message), result.status)
end
end
2023-01-13 00:05:48 +05:30
desc 'Delete an environment' do
detail 'It returns 204 if the environment was successfully deleted, and 404 if the environment does not exist. This feature was introduced in GitLab 8.11.'
2016-09-13 17:45:13 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags %w[environments]
2016-09-13 17:45:13 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :environment_id, type: Integer, desc: 'The ID of the environment'
2016-09-13 17:45:13 +05:30
end
delete ':id/environments/:environment_id' do
2020-04-22 19:07:51 +05:30
authorize! :read_environment, user_project
2016-09-13 17:45:13 +05:30
environment = user_project.environments.find(params[:environment_id])
2020-04-22 19:07:51 +05:30
authorize! :destroy_environment, environment
2016-09-13 17:45:13 +05:30
2018-03-17 18:26:18 +05:30
destroy_conditionally!(environment)
2017-08-17 22:00:37 +05:30
end
2023-01-13 00:05:48 +05:30
desc 'Stop an environment' do
detail 'It returns 200 if the environment was successfully stopped, and 404 if the environment does not exist.'
2017-08-17 22:00:37 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags %w[environments]
2017-08-17 22:00:37 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :environment_id, type: Integer, desc: 'The ID of the environment'
optional :force, type: Boolean, default: false, desc: 'Force environment to stop without executing `on_stop` actions'
2017-08-17 22:00:37 +05:30
end
post ':id/environments/:environment_id/stop' do
2018-11-18 11:00:15 +05:30
authorize! :read_environment, user_project
2017-08-17 22:00:37 +05:30
environment = user_project.environments.find(params[:environment_id])
2022-07-23 23:45:48 +05:30
::Environments::StopService.new(user_project, current_user, declared_params(include_missing: false))
.execute(environment)
2017-08-17 22:00:37 +05:30
status 200
2019-03-13 22:55:13 +05:30
present environment, with: Entities::Environment, current_user: current_user
2016-09-13 17:45:13 +05:30
end
2019-07-31 22:56:46 +05:30
2023-03-17 16:20:25 +05:30
desc 'Stop stale environments' do
detail 'It returns `200` if stale environment check was scheduled successfully'
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' }
]
tags %w[environments]
end
params do
requires :before,
type: DateTime,
desc: 'Stop all environments that were last modified or deployed to before this date.'
end
post ':id/environments/stop_stale' do
authorize! :stop_environment, user_project
bad_request!('Invalid Date') if params[:before] < 10.years.ago || params[:before] > 1.week.ago
service_response = ::Environments::StopStaleService.new(user_project, current_user, params.slice(:before)).execute
if service_response.error?
status 400
else
status 200
end
present message: service_response.message
end
2023-01-13 00:05:48 +05:30
desc 'Get a specific environment' do
2019-07-31 22:56:46 +05:30
success Entities::Environment
2023-01-13 00:05:48 +05:30
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags %w[environments]
2019-07-31 22:56:46 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :environment_id, type: Integer, desc: 'The ID of the environment'
2019-07-31 22:56:46 +05:30
end
get ':id/environments/:environment_id' do
authorize! :read_environment, user_project
environment = user_project.environments.find(params[:environment_id])
present environment, with: Entities::Environment, current_user: current_user,
except: [:project, { last_deployment: [:environment] }],
last_deployment: true
end
2016-09-13 17:45:13 +05:30
end
end
end