11require 'spec_helper'
2- require 'cloud_controller/diego/process_guid'
32
43module VCAP ::CloudController
54 RSpec . describe Runners do
@@ -12,293 +11,25 @@ module VCAP::CloudController
1211 }
1312 } )
1413 end
15- let ( :package_hash ) { 'fake-package-hash' }
16- let ( :buildpack ) { instance_double ( AutoDetectionBuildpack , custom? : false ) }
17- let ( :docker_image ) { nil }
1814
19- describe '#runner_for_app' do
20- subject ( :runner ) do
21- runners . runner_for_process ( process )
22- end
15+ describe '#runner_for_process' do
16+ subject ( :runner ) { runners . runner_for_process ( process ) }
2317
2418 context 'when the app is configured to run on Diego' do
2519 let ( :process ) { ProcessModelFactory . make ( diego : true ) }
2620
27- it 'finds a diego backend' do
28- expect ( runners ) . to receive ( :diego_runner ) . with ( process ) . and_call_original
21+ it 'returns a Diego runner' do
2922 expect ( runner ) . to be_a ( Diego ::Runner )
3023 end
3124
3225 context 'when the app has a docker image' do
3326 let ( :process ) { ProcessModelFactory . make ( :docker , docker_image : 'foobar' ) }
3427
3528 it 'finds a diego backend' do
36- expect ( runners ) . to receive ( :diego_runner ) . with ( process ) . and_call_original
3729 expect ( runner ) . to be_a ( Diego ::Runner )
3830 end
3931 end
4032 end
4133 end
42-
43- describe '#diego_apps' do
44- let! ( :diego_process1 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
45- let! ( :diego_process2 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
46- let! ( :diego_process3 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
47- let! ( :diego_process4 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
48- let! ( :diego_process5 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
49-
50- it 'returns apps that have the desired data' do
51- last_process = ProcessModelFactory . make ( diego : true , state : 'STARTED' , version : 'app-version-6' )
52-
53- apps = runners . diego_processes ( 100 , 0 )
54-
55- expect ( apps . count ) . to eq ( 6 )
56-
57- expect ( apps . last . to_json ) . to match_object ( last_process . to_json )
58- end
59-
60- it 'respects the batch_size' do
61- app_counts = [ 3 , 5 ] . map do |batch_size |
62- runners . diego_processes ( batch_size , 0 ) . count
63- end
64-
65- expect ( app_counts ) . to eq ( [ 3 , 5 ] )
66- end
67-
68- it 'returns non-intersecting apps across subsequent batches' do
69- first_batch = runners . diego_processes ( 3 , 0 )
70- expect ( first_batch . count ) . to eq ( 3 )
71-
72- second_batch = runners . diego_processes ( 3 , first_batch . last . id )
73- expect ( second_batch . count ) . to eq ( 2 )
74-
75- expect ( second_batch & first_batch ) . to eq ( [ ] )
76- end
77-
78- it 'does not return unstaged apps' do
79- unstaged_process = ProcessModelFactory . make ( diego : true , state : 'STARTED' )
80- unstaged_process . desired_droplet . app . update ( droplet_guid : nil )
81- unstaged_process . desired_droplet . destroy
82-
83- batch = runners . diego_processes ( 100 , 0 )
84-
85- expect ( batch ) . not_to include ( unstaged_process )
86- end
87-
88- it "does not return apps which aren't expected to be started" do
89- stopped_process = ProcessModelFactory . make ( diego : true , state : 'STOPPED' )
90-
91- batch = runners . diego_processes ( 100 , 0 )
92-
93- expect ( batch ) . not_to include ( stopped_process )
94- end
95- end
96-
97- describe '#diego_apps_from_process_guids' do
98- let! ( :diego_process1 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
99- let! ( :diego_process2 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
100- let! ( :diego_process3 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
101- let! ( :diego_process4 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
102- let! ( :diego_process5 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
103-
104- it 'does not return unstaged apps' do
105- unstaged_process = ProcessModelFactory . make ( diego : true , state : 'STARTED' )
106- unstaged_process . desired_droplet . app . update ( droplet_guid : nil )
107- unstaged_process . desired_droplet . destroy
108-
109- batch = runners . processes_from_diego_process_guids ( Diego ::ProcessGuid . from_process ( unstaged_process ) )
110-
111- expect ( batch ) . not_to include ( unstaged_process )
112- end
113-
114- it 'does not return apps that are stopped' do
115- stopped_process = ProcessModelFactory . make ( diego : true , state : 'STOPPED' )
116-
117- batch = runners . processes_from_diego_process_guids ( Diego ::ProcessGuid . from_process ( stopped_process ) )
118-
119- expect ( batch ) . not_to include ( stopped_process )
120- end
121-
122- it 'accepts a process guid or an array of process guids' do
123- process = ProcessModel . where ( diego : true ) . order ( :id ) . first
124- process_guid = Diego ::ProcessGuid . from_process ( process )
125-
126- expect ( runners . processes_from_diego_process_guids ( process_guid ) ) . to eq ( [ process ] )
127- expect ( runners . processes_from_diego_process_guids ( [ process_guid ] ) ) . to eq ( [ process ] )
128- end
129-
130- it 'returns diego apps for each requested process guid' do
131- diego_apps = ProcessModel . where ( diego : true ) . all
132- diego_guids = diego_apps . map { |process | Diego ::ProcessGuid . from_process ( process ) }
133-
134- expect ( runners . processes_from_diego_process_guids ( diego_guids ) ) . to match_array ( diego_apps )
135- end
136-
137- context 'when the process guid is not found' do
138- it 'does not return an app' do
139- process = ProcessModel . where ( diego : true ) . order ( :id ) . first
140- process_guid = Diego ::ProcessGuid . from_process ( process )
141-
142- expect do
143- process . set_new_version
144- process . save
145- end . to change {
146- runners . processes_from_diego_process_guids ( process_guid )
147- } . from ( [ process ] ) . to ( [ ] )
148- end
149- end
150- end
151-
152- describe '#diego_apps_cache_data' do
153- let! ( :diego_process1 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
154- let! ( :diego_process2 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
155- let! ( :diego_process3 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
156- let! ( :diego_process4 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
157- let! ( :diego_process5 ) { ProcessModelFactory . make ( diego : true , state : 'STARTED' ) }
158-
159- it 'respects the batch_size' do
160- data_count = [ 3 , 5 ] . map do |batch_size |
161- runners . diego_apps_cache_data ( batch_size , 0 ) . count
162- end
163-
164- expect ( data_count ) . to eq ( [ 3 , 5 ] )
165- end
166-
167- it 'returns data for non-intersecting apps across subsequent batches' do
168- first_batch = runners . diego_apps_cache_data ( 3 , 0 )
169- expect ( first_batch . count ) . to eq ( 3 )
170-
171- last_id = first_batch . last [ 0 ]
172- second_batch = runners . diego_apps_cache_data ( 3 , last_id )
173- expect ( second_batch . count ) . to eq ( 2 )
174- end
175-
176- it 'does not return unstaged apps' do
177- unstaged_process = ProcessModelFactory . make ( diego : true , state : 'STARTED' )
178- unstaged_process . desired_droplet . app . update ( droplet_guid : nil )
179- unstaged_process . desired_droplet . destroy
180-
181- batch = runners . diego_apps_cache_data ( 100 , 0 )
182- app_ids = batch . pluck ( 0 )
183-
184- expect ( app_ids ) . not_to include ( unstaged_process . id )
185- end
186-
187- it 'does not return apps that are stopped' do
188- stopped_process = ProcessModelFactory . make ( diego : true , state : 'STOPPED' )
189-
190- batch = runners . diego_apps_cache_data ( 100 , 0 )
191- app_ids = batch . pluck ( 0 )
192-
193- expect ( app_ids ) . not_to include ( stopped_process . id )
194- end
195-
196- it 'acquires the data in one select' do
197- expect do
198- runners . diego_apps_cache_data ( 100 , 0 )
199- end . to have_queried_db_times ( /SELECT.*FROM.*processes.*/ , 1 )
200- end
201-
202- context 'with Docker app' do
203- before do
204- FeatureFlag . create ( name : 'diego_docker' , enabled : true )
205- end
206-
207- let! ( :docker_process ) do
208- ProcessModelFactory . make ( :docker , docker_image : 'some-image' , state : 'STARTED' )
209- end
210-
211- context 'when docker is enabled' do
212- before do
213- FeatureFlag . find ( name : 'diego_docker' ) . update ( enabled : true )
214- end
215-
216- it 'returns docker apps' do
217- batch = runners . diego_apps_cache_data ( 100 , 0 )
218- app_ids = batch . pluck ( 0 )
219-
220- expect ( app_ids ) . to include ( docker_process . id )
221- end
222- end
223-
224- context 'when docker is disabled' do
225- before do
226- FeatureFlag . find ( name : 'diego_docker' ) . update ( enabled : false )
227- end
228-
229- it 'does not return docker apps' do
230- batch = runners . diego_apps_cache_data ( 100 , 0 )
231- app_ids = batch . pluck ( 0 )
232-
233- expect ( app_ids ) . not_to include ( docker_process . id )
234- end
235- end
236- end
237- end
238-
239- describe '#latest' do
240- context 'when the input hash includes a key app_guid' do
241- let ( :input ) do
242- [ {
243- app_guid : 'app_guid_1' ,
244- id : 1
245- } ]
246- end
247-
248- it 'is added to the hash' do
249- output_hash = runners . latest ( input )
250- expect ( output_hash [ 'app_guid_1' ] ) . to eq ( input [ 0 ] )
251- end
252-
253- context 'when the input hash has multiple values' do
254- let ( :input ) do
255- [
256- {
257- app_guid : 'app_guid_1' ,
258- id : 1
259- } ,
260- {
261- app_guid : 'app_guid_2' ,
262- id : 2
263- }
264- ]
265- end
266-
267- it 'adds all items to the hash' do
268- output_hash = runners . latest ( input )
269-
270- expect ( output_hash . length ) . to eq ( input . length )
271- expect ( output_hash [ 'app_guid_1' ] ) . to eq ( input [ 0 ] )
272- expect ( output_hash [ 'app_guid_2' ] ) . to eq ( input [ 1 ] )
273- end
274- end
275-
276- context 'when multiple items have the same app_guid key' do
277- context 'when the created_at times are the same' do
278- let ( :time ) { Time . now }
279-
280- let ( :input ) do
281- [
282- {
283- app_guid : 'app_guid_1' ,
284- id : 1 ,
285- created_at : time
286- } ,
287- {
288- app_guid : 'app_guid_1' ,
289- id : 2 ,
290- created_at : time
291- }
292- ]
293- end
294-
295- it "takes the last entry based off of the 'id'" do
296- output_hash = runners . latest ( input )
297- expect ( output_hash [ 'app_guid_1' ] ) . to eq ( input [ 1 ] )
298- end
299- end
300- end
301- end
302- end
30334 end
30435end
0 commit comments