forked from cloudfoundry/cloud_controller_ng
-
Notifications
You must be signed in to change notification settings - Fork 0
/
buildpacks_controller.rb
100 lines (79 loc) · 3.04 KB
/
buildpacks_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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
module VCAP::CloudController
class BuildpacksController < RestController::ModelController
def self.dependencies
[:buildpack_blobstore, :upload_handler]
end
define_attributes do
attribute :name, String
attribute :stack, String, default: nil
attribute :position, Integer, default: 0
attribute :enabled, Message::Boolean, default: true
attribute :locked, Message::Boolean, default: false
end
query_parameters :name, :stack
def self.translate_validation_exception(e, attributes)
buildpack_errors = e.errors.on([:name, :stack])
if buildpack_errors && buildpack_errors.include?(:unique)
CloudController::Errors::ApiError.new_from_details('BuildpackNameStackTaken', attributes['name'], attributes['stack'])
else
CloudController::Errors::ApiError.new_from_details('BuildpackInvalid', e.errors.full_messages)
end
end
def create
json_msg = self.class::CreateMessage.decode(body)
@request_attrs = json_msg.extract(stringify_keys: true)
logger.debug 'cc.create', model: self.class.model_class_name, attributes: redact_attributes(:create, request_attrs)
before_create
position = request_attrs['position']
buildpack = nil
model.db.transaction do
buildpack = model.create_from_hash(request_attrs.except('position'))
validate_access(:create, buildpack, request_attrs)
Locking[name: 'buildpacks'].lock!
buildpack.move_to(position)
end
after_create(buildpack)
[
HTTP::CREATED,
{ 'Location' => "#{self.class.path}/#{buildpack.guid}" },
object_renderer.render_json(self.class, buildpack, @opts)
]
end
def update(guid)
json_msg = self.class::UpdateMessage.decode(body)
@request_attrs = json_msg.extract(stringify_keys: true)
logger.debug 'cc.update', guid: guid, attributes: redact_attributes(:update, request_attrs)
raise InvalidRequest unless request_attrs
buildpack = find_guid(guid)
validate_access(:update, buildpack, request_attrs)
before_update(buildpack)
new_position = request_attrs['position']
model.db.transaction do
buildpack.lock!
buildpack.update_from_hash(request_attrs.except('position'))
end
model.db.transaction do
Locking[name: 'buildpacks'].lock!
buildpack.move_to(new_position) if new_position.present?
end
after_update(buildpack)
[HTTP::CREATED, object_renderer.render_json(self.class, buildpack, @opts)]
end
def delete(guid)
find_guid_and_validate_access(:delete, guid)
job = Jobs::Runtime::BuildpackDelete.new(guid: guid, timeout: @config.get(:staging, :timeout_in_seconds))
enqueue_deletion_job(job)
end
def self.not_found_exception_name(_model_class)
'NotFound'
end
private
attr_reader :buildpack_blobstore
def inject_dependencies(dependencies)
super
@buildpack_blobstore = dependencies[:buildpack_blobstore]
end
define_messages
define_routes
end
end