-
Notifications
You must be signed in to change notification settings - Fork 355
/
builds_controller.rb
73 lines (59 loc) · 2.68 KB
/
builds_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
require 'messages/build_create_message'
require 'messages/builds_list_message'
require 'fetchers/build_list_fetcher'
require 'presenters/v3/build_presenter'
require 'actions/build_create'
class BuildsController < ApplicationController
def index
message = BuildsListMessage.from_params(query_params)
invalid_param!(message.errors.full_messages) unless message.valid?
build_list_fetcher = BuildListFetcher.new(message: message)
dataset = if can_read_globally?
build_list_fetcher.fetch_all
else
build_list_fetcher.fetch_for_spaces(space_guids: readable_space_guids)
end
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
presenter: Presenters::V3::BuildPresenter,
dataset: dataset,
path: '/v3/builds',
message: message
)
end
def create
message = BuildCreateMessage.new(params[:body])
unprocessable!(message.errors.full_messages) unless message.valid?
package = PackageModel.where(guid: message.package_guid).
eager(:app, :space, space: :organization, app: :buildpack_lifecycle_data).all.first
unprocessable_package! unless package && can_read?(package.space.guid, package.space.organization.guid) && can_write?(package.space.guid)
FeatureFlag.raise_unless_enabled!(:diego_docker) if package.type == PackageModel::DOCKER_TYPE
lifecycle = LifecycleProvider.provide(package, message)
unprocessable!(lifecycle.errors.full_messages) unless lifecycle.valid?
build = BuildCreate.new.create_and_stage(package: package, lifecycle: lifecycle)
render status: :created, json: Presenters::V3::BuildPresenter.new(build)
rescue BuildCreate::InvalidPackage => e
invalid_request!(e.message)
rescue BuildCreate::SpaceQuotaExceeded => e
unprocessable!("space's memory limit exceeded: #{e.message}")
rescue BuildCreate::OrgQuotaExceeded => e
unprocessable!("organization's memory limit exceeded: #{e.message}")
rescue BuildCreate::DiskLimitExceeded
unprocessable!('disk limit exceeded')
rescue BuildCreate::StagingInProgress
raise CloudController::Errors::ApiError.new_from_details('StagingInProgress')
rescue BuildCreate::BuildError => e
unprocessable!(e.message)
end
def show
build = BuildModel.find(guid: params[:guid])
build_not_found! unless build && can_read?(build.package.space.guid, build.package.space.organization.guid)
render status: :ok, json: Presenters::V3::BuildPresenter.new(build)
end
private
def build_not_found!
resource_not_found!(:build)
end
def unprocessable_package!
unprocessable!('Unable to use package. Ensure that the package exists and you have access to it.')
end
end