@@ -118,6 +118,130 @@ module Docker
118118 end
119119 end
120120 end
121+
122+ context 'when root user is allowed' do
123+ before do
124+ TestConfig . override ( allow_docker_root_user : true )
125+ end
126+
127+ context 'and the process does not set a user' do
128+ let ( :app ) { AppModel . make ( :docker , { droplet : } ) }
129+ let ( :process ) { ProcessModel . make ( :docker , { app : } ) }
130+
131+ context 'and the droplet docker execution metadata sets the root user' do
132+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"root"}' }
133+ let ( :droplet ) do
134+ DropletModel . make ( :docker , {
135+ state : DropletModel ::STAGED_STATE ,
136+ docker_receipt_image : 'the-image' ,
137+ execution_metadata : droplet_execution_metadata
138+ } )
139+ end
140+
141+ it 'creates a diego DesiredLRPBuilder' do
142+ expect do
143+ lifecycle_protocol . desired_lrp_builder ( config , process )
144+ end . not_to raise_error
145+ end
146+ end
147+
148+ context 'and the droplet docker execution metadata sets the 0 user' do
149+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"0"}' }
150+ let ( :droplet ) do
151+ DropletModel . make ( :docker , {
152+ state : DropletModel ::STAGED_STATE ,
153+ docker_receipt_image : 'the-image' ,
154+ execution_metadata : droplet_execution_metadata
155+ } )
156+ end
157+
158+ it 'creates a diego TaskActionBuilder' do
159+ expect do
160+ lifecycle_protocol . desired_lrp_builder ( config , process )
161+ end . not_to raise_error
162+ end
163+ end
164+
165+ context 'and the droplet docker execution metadata does not set a user' do
166+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"]}' }
167+ let ( :droplet ) do
168+ DropletModel . make ( :docker , {
169+ state : DropletModel ::STAGED_STATE ,
170+ docker_receipt_image : 'the-image' ,
171+ execution_metadata : droplet_execution_metadata
172+ } )
173+ end
174+
175+ it 'creates a diego TaskActionBuilder' do
176+ expect do
177+ lifecycle_protocol . desired_lrp_builder ( config , process )
178+ end . not_to raise_error
179+ end
180+ end
181+ end
182+ end
183+
184+ context 'when root user IS NOT allowed' do
185+ before do
186+ TestConfig . override ( allow_docker_root_user : false )
187+ end
188+
189+ context 'and the process does not set a user' do
190+ let ( :app ) { AppModel . make ( :docker , { droplet : } ) }
191+ let ( :process ) { ProcessModel . make ( :docker , { app : } ) }
192+
193+ context 'and the droplet docker execution metadata sets the root user' do
194+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"root"}' }
195+ let ( :droplet ) do
196+ DropletModel . make ( :docker , {
197+ state : DropletModel ::STAGED_STATE ,
198+ docker_receipt_image : 'the-image' ,
199+ execution_metadata : droplet_execution_metadata
200+ } )
201+ end
202+
203+ it 'raises an error' do
204+ expect do
205+ lifecycle_protocol . desired_lrp_builder ( config , process )
206+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run process as root user, which is not permitted' )
207+ end
208+ end
209+
210+ context 'and the droplet docker execution metadata sets the 0 user' do
211+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"0"}' }
212+ let ( :droplet ) do
213+ DropletModel . make ( :docker , {
214+ state : DropletModel ::STAGED_STATE ,
215+ docker_receipt_image : 'the-image' ,
216+ execution_metadata : droplet_execution_metadata
217+ } )
218+ end
219+
220+ it 'raises an error' do
221+ expect do
222+ lifecycle_protocol . desired_lrp_builder ( config , process )
223+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run process as root user, which is not permitted' )
224+ end
225+ end
226+
227+ context 'and the droplet docker execution metadata does not set a user' do
228+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"]}' }
229+ let ( :droplet ) do
230+ DropletModel . make ( :docker , {
231+ state : DropletModel ::STAGED_STATE ,
232+ docker_receipt_image : 'the-image' ,
233+ execution_metadata : droplet_execution_metadata
234+ } )
235+ end
236+
237+ it 'raises an error' do
238+ expect do
239+ lifecycle_protocol . desired_lrp_builder ( config , process )
240+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run process as root user, which is not permitted' )
241+ end
242+ end
243+ end
244+ end
121245 end
122246
123247 describe '#task_action_builder' do
@@ -138,6 +262,131 @@ module Docker
138262 )
139263 lifecycle_protocol . task_action_builder ( config , task )
140264 end
265+
266+ context 'when root user is allowed' do
267+ before do
268+ TestConfig . override ( allow_docker_root_user : true )
269+ end
270+
271+ context 'and the task does not set a user' do
272+ let ( :app ) { AppModel . make ( :docker , { droplet : } ) }
273+ let ( :task ) { TaskModel . make ( :docker , { droplet :, app : } ) }
274+
275+ context 'and the droplet docker execution metadata sets the root user' do
276+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"root"}' }
277+ let ( :droplet ) do
278+ DropletModel . make ( :docker , {
279+ state : DropletModel ::STAGED_STATE ,
280+ docker_receipt_image : 'the-image' ,
281+ execution_metadata : droplet_execution_metadata
282+ } )
283+ end
284+
285+ it 'creates a diego TaskActionBuilder' do
286+ expect do
287+ lifecycle_protocol . task_action_builder ( config , task )
288+ end . not_to raise_error
289+ end
290+ end
291+
292+ context 'and the droplet docker execution metadata sets the 0 user' do
293+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"0"}' }
294+ let ( :droplet ) do
295+ DropletModel . make ( :docker , {
296+ state : DropletModel ::STAGED_STATE ,
297+ docker_receipt_image : 'the-image' ,
298+ execution_metadata : droplet_execution_metadata
299+ } )
300+ end
301+
302+ it 'creates a diego TaskActionBuilder' do
303+ expect do
304+ lifecycle_protocol . task_action_builder ( config , task )
305+ end . not_to raise_error
306+ end
307+ end
308+
309+ context 'and the droplet docker execution metadata does not set a user' do
310+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"]}' }
311+ let ( :droplet ) do
312+ DropletModel . make ( :docker , {
313+ state : DropletModel ::STAGED_STATE ,
314+ docker_receipt_image : 'the-image' ,
315+ execution_metadata : droplet_execution_metadata
316+ } )
317+ end
318+
319+ it 'creates a diego TaskActionBuilder' do
320+ expect do
321+ lifecycle_protocol . task_action_builder ( config , task )
322+ end . not_to raise_error
323+ end
324+ end
325+ end
326+ end
327+
328+ context 'when root user IS NOT allowed' do
329+ before do
330+ TestConfig . override ( allow_docker_root_user : false )
331+ end
332+
333+ context 'and the task does not set a user' do
334+ let ( :app ) { AppModel . make ( :docker , { droplet : } ) }
335+ let ( :task ) { TaskModel . make ( :docker , { droplet :, app : } ) }
336+
337+ context 'and the droplet docker execution metadata sets the root user' do
338+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"root"}' }
339+ let ( :droplet ) do
340+ DropletModel . make ( :docker , {
341+ state : DropletModel ::STAGED_STATE ,
342+ docker_receipt_image : 'the-image' ,
343+ execution_metadata : droplet_execution_metadata
344+ } )
345+ end
346+
347+ it 'raises an error' do
348+ expect do
349+ lifecycle_protocol . task_action_builder ( config , task )
350+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run task as root user, which is not permitted' )
351+ end
352+ end
353+
354+ context 'and the droplet docker execution metadata sets the 0 user' do
355+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"],"user":"0"}' }
356+ let ( :droplet ) do
357+ DropletModel . make ( :docker , {
358+ state : DropletModel ::STAGED_STATE ,
359+ docker_receipt_image : 'the-image' ,
360+ execution_metadata : droplet_execution_metadata
361+ } )
362+ end
363+
364+ it 'raises an error' do
365+ expect do
366+ lifecycle_protocol . desired_lrp_builder ( config , task )
367+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run task as root user, which is not permitted' )
368+ end
369+ end
370+
371+ context 'and the droplet docker execution metadata does not set a user' do
372+ let ( :droplet_execution_metadata ) { '{"entrypoint":["/image-entrypoint.sh"]}' }
373+ let ( :droplet ) do
374+ DropletModel . make ( :docker , {
375+ state : DropletModel ::STAGED_STATE ,
376+ docker_receipt_image : 'the-image' ,
377+ execution_metadata : droplet_execution_metadata
378+ } )
379+ end
380+
381+ it 'raises an error' do
382+ expect do
383+ lifecycle_protocol . desired_lrp_builder ( config , process )
384+ end . to raise_error ( ::CloudController ::Errors ::ApiError , 'Attempting to run task as root user, which is not permitted' )
385+ end
386+ end
387+ end
388+ end
389+
141390 end
142391 end
143392 end
0 commit comments