-
Notifications
You must be signed in to change notification settings - Fork 363
/
Copy pathapp_delete.rb
113 lines (91 loc) · 3.12 KB
/
app_delete.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
101
102
103
104
105
106
107
108
109
110
111
112
113
require 'jobs/runtime/blobstore_delete'
require 'jobs/v3/buildpack_cache_delete'
require 'actions/package_delete'
require 'actions/task_delete'
require 'actions/build_delete'
require 'actions/droplet_delete'
require 'actions/deployment_delete'
require 'actions/label_delete'
require 'actions/annotation_delete'
require 'actions/revision_delete'
require 'actions/process_delete'
require 'actions/sidecar_delete'
require 'actions/route_mapping_delete'
require 'actions/staging_cancel'
require 'actions/mixins/bindings_delete'
module VCAP::CloudController
class AppDelete
include V3::BindingsDeleteMixin
class AsyncBindingDeletionsTriggered < StandardError; end
class SubResourceError < StandardError
def initialize(errors)
@errors = errors
end
def underlying_errors
@errors
end
end
def initialize(user_audit_info)
@user_audit_info = user_audit_info
end
def delete(apps, record_event: true)
apps.each do |app|
logger.info("Deleting app: #{app.guid}")
delete_non_transactional_subresources(app)
app.db.transaction do
app.lock!
app.update(droplet_guid: nil)
delete_subresources(app)
record_audit_event(app) if record_event
app.destroy
end
logger.info("Deleted app: #{app.guid}")
end
end
def delete_without_event(apps)
delete(apps, record_event: false)
end
private
def record_audit_event(app)
Repositories::AppEventRepository.new.record_app_delete_request(
app,
app.space,
@user_audit_info
)
end
def delete_subresources(app)
PackageDelete.new(@user_audit_info).delete(app.packages)
TaskDelete.new(@user_audit_info).delete_for_app(app.guid)
BuildDelete.new(StagingCancel.new(stagers)).delete_for_app(app.guid)
DropletDelete.new(@user_audit_info).delete(app.droplets)
DeploymentDelete.delete_for_app(app.guid)
RevisionDelete.delete_for_app(app.guid)
SidecarDelete.delete_for_app(app.guid)
RouteMappingDelete.new(@user_audit_info).delete(route_mappings_to_delete(app))
ProcessDelete.new(@user_audit_info).delete(app.processes)
delete_buildpack_cache(app)
end
def delete_non_transactional_subresources(app)
errors = delete_bindings(app.service_bindings, user_audit_info: @user_audit_info)
raise SubResourceError.new(errors) if errors.any?
end
def stagers
CloudController::DependencyLocator.instance.stagers
end
def route_mappings_to_delete(app)
RouteMappingModel.where(app_guid: app.guid)
end
def delete_buildpack_cache(app)
delete_job = Jobs::V3::BuildpackCacheDelete.new(app.guid)
Jobs::Enqueuer.new(delete_job, queue: Jobs::Queues.generic).enqueue
end
def logger
@logger ||= Steno.logger('cc.action.app_delete')
end
def unbinding_operation_in_progress!(binding)
raise AsyncBindingDeletionsTriggered.new(
"An operation for the service binding between app #{binding.app.name} and service instance #{binding.service_instance.name} is in progress."
)
end
end
end