@@ -29,29 +29,24 @@ def test_rmtree_success(self, mock_rmtree):
2929
3030 @patch ("sagemaker.train.local.local_container.shutil.rmtree" )
3131 @patch ("sagemaker.train.local.local_container.subprocess.run" )
32- @patch ("sagemaker.train.local.local_container.os.path.exists" , return_value = False )
33- def test_rmtree_permission_error_docker_fallback (self , mock_exists , mock_run , mock_rmtree ):
34- """PermissionError triggers docker fallback using the training image."""
35- mock_rmtree .side_effect = PermissionError ("Permission denied" )
32+ def test_rmtree_permission_error_docker_chmod_fallback (self , mock_run , mock_rmtree ):
33+ """PermissionError triggers docker chmod then retry."""
34+ mock_rmtree .side_effect = [PermissionError ("Permission denied" ), None ]
3635
3736 _rmtree ("/tmp/test" , IMAGE )
3837
3938 mock_run .assert_called_once_with (
40- [
41- "docker" , "run" , "--rm" ,
42- "-v" , "/tmp/test:/delete" , IMAGE ,
43- "sh" , "-c" , "find /delete -mindepth 1 -delete" ,
44- ],
39+ ["docker" , "run" , "--rm" , "-v" , "/tmp/test:/delete" , IMAGE , "chmod" , "-R" , "777" , "/delete" ],
4540 check = True ,
4641 capture_output = True ,
4742 )
43+ assert mock_rmtree .call_count == 2
4844
4945 @patch ("sagemaker.train.local.local_container.shutil.rmtree" )
5046 @patch ("sagemaker.train.local.local_container.subprocess.run" )
51- @patch ("sagemaker.train.local.local_container.os.path.exists" , return_value = False )
52- def test_rmtree_studio_adds_network (self , mock_exists , mock_run , mock_rmtree ):
47+ def test_rmtree_studio_adds_network (self , mock_run , mock_rmtree ):
5348 """In Studio, docker run includes --network sagemaker."""
54- mock_rmtree .side_effect = PermissionError ("Permission denied" )
49+ mock_rmtree .side_effect = [ PermissionError ("Permission denied" ), None ]
5550
5651 _rmtree ("/tmp/test" , IMAGE , is_studio = True )
5752
@@ -60,27 +55,12 @@ def test_rmtree_studio_adds_network(self, mock_exists, mock_run, mock_rmtree):
6055 "docker" , "run" , "--rm" ,
6156 "--network" , "sagemaker" ,
6257 "-v" , "/tmp/test:/delete" , IMAGE ,
63- "sh " , "-c " , "find /delete -mindepth 1 - delete" ,
58+ "chmod " , "-R " , "777" , "/ delete" ,
6459 ],
6560 check = True ,
6661 capture_output = True ,
6762 )
6863
69- @patch ("sagemaker.train.local.local_container.shutil.rmtree" )
70- @patch ("sagemaker.train.local.local_container.subprocess.run" )
71- @patch ("sagemaker.train.local.local_container.os.path.exists" , return_value = True )
72- def test_rmtree_cleans_up_mount_point (self , mock_exists , mock_run , mock_rmtree ):
73- """After docker cleanup, remaining mount point directory is removed."""
74- mock_rmtree .side_effect = [PermissionError ("Permission denied" ), None ]
75-
76- _rmtree ("/tmp/test" , IMAGE )
77-
78- assert mock_rmtree .call_count == 2
79- mock_rmtree .assert_has_calls ([
80- call ("/tmp/test" ),
81- call ("/tmp/test" , ignore_errors = True ),
82- ])
83-
8464 @patch ("sagemaker.train.local.local_container.shutil.rmtree" )
8565 @patch ("sagemaker.train.local.local_container.subprocess.run" )
8666 def test_rmtree_docker_fallback_fails_raises (self , mock_run , mock_rmtree ):
0 commit comments