33module Api
44 module V2
55 class BulkSnapshotsController < V2 ::BaseController
6- SNAPSHOT_MODES = %w[ full include_ram quiesce ] . freeze
6+ include :: Api :: V2 :: BulkHostsExtension
77
8- before_action :validate_hosts , :validate_snapshot , :validate_mode , only : :create
8+ SNAPSHOT_MODES = ForemanSnapshotManagement ::Extensions ::BulkHostsManager ::SNAPSHOT_MODES
9+
10+ before_action :validate_snapshot , :validate_mode , :find_snapshotable_hosts , only : :create
911
1012 api :POST , '/snapshots/bulk/create_snapshot' , N_ ( 'Create snapshots for multiple hosts' )
11- param :host_ids , Array , of : Integer , desc : N_ ( 'Array of host IDs to create snapshots for' ) , required : true
13+
14+ param :organization_id , :number , required : true , desc : N_ ( 'ID of the organization' )
15+
16+ param :included , Hash , required : true , action_aware : true do
17+ param :search , String , required : false ,
18+ desc : N_ ( 'Search string for hosts to perform an action on' )
19+ param :ids , Array , required : false ,
20+ desc : N_ ( 'List of host ids to perform an action on' )
21+ end
22+
23+ param :excluded , Hash , required : true , action_aware : true do
24+ param :ids , Array , required : false ,
25+ desc : N_ ( 'List of host ids to exclude and not run an action on' )
26+ end
1227
1328 param :snapshot , Hash , desc : N_ ( 'Snapshot parameters' ) , required : true do
1429 param :name , String , desc : N_ ( 'Name of the snapshot' ) , required : true
@@ -21,17 +36,21 @@ class BulkSnapshotsController < V2::BaseController
2136 required : false
2237
2338 def create
24- include_ram , quiesce = resolve_mode ( params [ :mode ] )
25-
26- results = @hosts . map do | host |
27- process_host ( host , @snapshot_name , @snapshot_description , include_ram , quiesce )
28- end
39+ results = :: BulkHostsManager . new ( hosts : @hosts ) . create_snapshots (
40+ name : @snapshot_name ,
41+ description : @snapshot_description ,
42+ mode : params [ :mode ]
43+ )
2944
3045 render_results ( results )
3146 end
3247
3348 private
3449
50+ def find_snapshotable_hosts
51+ find_bulk_hosts ( :create_snapshots , params )
52+ end
53+
3554 def validate_mode
3655 mode = params [ :mode ]
3756 return true if mode . blank? || SNAPSHOT_MODES . include? ( mode )
@@ -46,44 +65,6 @@ def validate_mode
4665 false
4766 end
4867
49- def validate_hosts
50- host_ids = params [ :host_ids ]
51-
52- if host_ids . blank?
53- render (
54- json : { error : _ ( 'host_ids parameter is required and cannot be empty' ) } ,
55- status : :unprocessable_entity
56- )
57- return false
58- end
59-
60- unless host_ids . is_a? ( Array )
61- render (
62- json : { error : _ ( 'host_ids must be an array' ) } ,
63- status : :unprocessable_entity
64- )
65- return false
66- end
67-
68- @requested_host_ids = host_ids . map ( &:to_i )
69- resource_base = Host . authorized ( "#{ action_permission } _snapshots" . to_sym , Host ) . friendly
70- @hosts = resource_base . where ( id : @requested_host_ids )
71-
72- found_ids = @hosts . pluck ( :id )
73- missing_ids = @requested_host_ids - found_ids
74-
75- return true if missing_ids . empty?
76-
77- render (
78- json : {
79- error : _ ( 'Some host_ids are invalid' ) ,
80- invalid_ids : missing_ids ,
81- } ,
82- status : :unprocessable_entity
83- )
84- false
85- end
86-
8768 def validate_snapshot
8869 snap = params [ :snapshot ] || { }
8970 @snapshot_name = snap [ :name ] . to_s . strip
@@ -101,13 +82,7 @@ def validate_snapshot
10182 def render_results ( results )
10283 failed_hosts = results . select { |r | r [ :status ] == 'failed' }
10384 failed_count = failed_hosts . length
104-
105- status =
106- if failed_count . zero?
107- :ok
108- else
109- :unprocessable_entity
110- end
85+ status = failed_count . zero? ? :ok : :unprocessable_entity
11186
11287 render (
11388 json : {
@@ -121,66 +96,6 @@ def render_results(results)
12196 )
12297 end
12398
124- def resolve_mode ( mode )
125- case mode
126- when 'include_ram'
127- [ true , false ]
128- when 'quiesce'
129- [ false , true ]
130- else
131- [ false , false ]
132- end
133- end
134-
135- def process_host ( host , name , description , include_ram , quiesce )
136- snapshot = ForemanSnapshotManagement ::Snapshot . new (
137- name : name ,
138- description : description ,
139- include_ram : include_ram ,
140- quiesce : quiesce ,
141- host : host
142- )
143-
144- if snapshot . create
145- {
146- host_id : host . id ,
147- host_name : host . name ,
148- status : 'success' ,
149- }
150- else
151- errors = snapshot . errors . full_messages
152- errors << quiesce_error_message if quiesce
153-
154- {
155- host_id : host . id ,
156- host_name : host . name ,
157- status : 'failed' ,
158- errors : errors ,
159- }
160- end
161- rescue StandardError => e
162- Foreman ::Logging . exception (
163- "Failed to create snapshot for host #{ host . name } (ID: #{ host . id } )" ,
164- e
165- )
166- {
167- host_id : host . id ,
168- host_name : host . name ,
169- status : 'failed' ,
170- errors : [ _ ( 'Snapshot creation failed: %s' ) % e . message ] ,
171- }
172- end
173-
174- def quiesce_error_message
175- _ (
176- 'Unable to create VMWare Snapshot with Quiesce. Check Power and VMWare Tools status.'
177- )
178- end
179-
180- def action_permission
181- :create
182- end
183-
18499 def resource_class
185100 ::ForemanSnapshotManagement ::Snapshot
186101 end
0 commit comments