2222import subprocess
2323import tarfile
2424import tempfile
25+ import time
2526from unittest import mock
2627
2728from ironic_lib import utils as ironic_utils
@@ -877,6 +878,7 @@ def test_sync_clock_ntp_server_is_none(self, mock_time_method,
877878 self .assertEqual (0 , mock_execute .call_count )
878879
879880
881+ @mock .patch .object (utils , '_unmount_any_config_drives' , autospec = True )
880882@mock .patch .object (utils , '_booted_from_vmedia' , autospec = True )
881883@mock .patch .object (utils , '_check_vmedia_device' , autospec = True )
882884@mock .patch .object (utils , '_find_vmedia_device_by_labels' , autospec = True )
@@ -887,7 +889,8 @@ class TestCopyConfigFromVmedia(testtools.TestCase):
887889
888890 def test_vmedia_found_not_booted_from_vmedia (
889891 self , mock_execute , mock_mount , mock_copy ,
890- mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ):
892+ mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ,
893+ mock_unmount_config ):
891894 mock_booted_from_vmedia .return_value = False
892895 mock_find_device .return_value = '/dev/fake'
893896 utils .copy_config_from_vmedia ()
@@ -896,10 +899,12 @@ def test_vmedia_found_not_booted_from_vmedia(
896899 mock_copy .assert_not_called ()
897900 mock_check_vmedia .assert_not_called ()
898901 self .assertTrue (mock_booted_from_vmedia .called )
902+ self .assertTrue (mock_unmount_config .called )
899903
900904 def test_no_vmedia (
901905 self , mock_execute , mock_mount , mock_copy ,
902- mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ):
906+ mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ,
907+ mock_unmount_config ):
903908 mock_booted_from_vmedia .return_value = True
904909 mock_find_device .return_value = None
905910 utils .copy_config_from_vmedia ()
@@ -908,10 +913,12 @@ def test_no_vmedia(
908913 mock_copy .assert_not_called ()
909914 mock_check_vmedia .assert_not_called ()
910915 self .assertFalse (mock_booted_from_vmedia .called )
916+ self .assertTrue (mock_unmount_config .called )
911917
912918 def test_no_files (
913919 self , mock_execute , mock_mount , mock_copy ,
914- mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ):
920+ mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ,
921+ mock_unmount_config ):
915922 mock_booted_from_vmedia .return_value = True
916923 temp_path = tempfile .mkdtemp ()
917924 self .addCleanup (lambda : shutil .rmtree (temp_path ))
@@ -925,10 +932,12 @@ def test_no_files(
925932 '/dev/something' )
926933 mock_copy .assert_not_called ()
927934 self .assertTrue (mock_booted_from_vmedia .called )
935+ self .assertTrue (mock_unmount_config .called )
928936
929937 def test_mounted_no_files (
930938 self , mock_execute , mock_mount , mock_copy ,
931- mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ):
939+ mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ,
940+ mock_unmount_config ):
932941
933942 mock_booted_from_vmedia .return_value = True
934943 mock_execute .return_value = '/some/path' , ''
@@ -939,11 +948,13 @@ def test_mounted_no_files(
939948 mock_copy .assert_not_called ()
940949 mock_mount .assert_not_called ()
941950 self .assertTrue (mock_booted_from_vmedia .called )
951+ self .assertTrue (mock_unmount_config .called )
942952
943953 @mock .patch .object (os , 'makedirs' , autospec = True )
944954 def test_copy (
945955 self , mock_makedirs , mock_execute , mock_mount , mock_copy ,
946- mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ):
956+ mock_find_device , mock_check_vmedia , mock_booted_from_vmedia ,
957+ mock_unmount_config ):
947958
948959 mock_booted_from_vmedia .return_value = True
949960 mock_find_device .return_value = '/dev/something'
@@ -982,12 +993,14 @@ def _fake_mount(dev):
982993 mock .call (mock .ANY , '/etc/ironic-python-agent.d/ironic.conf' ),
983994 ], any_order = True )
984995 self .assertTrue (mock_booted_from_vmedia .called )
996+ self .assertTrue (mock_unmount_config .called )
985997
986998 @mock .patch .object (os , 'makedirs' , autospec = True )
987999 def test_copy_mounted (
9881000 self , mock_makedirs , mock_execute , mock_mount ,
9891001 mock_copy , mock_find_device , mock_check_vmedia ,
990- mock_booted_from_vmedia ):
1002+ mock_booted_from_vmedia ,
1003+ mock_unmount_config ):
9911004 mock_booted_from_vmedia .return_value = True
9921005 mock_find_device .return_value = '/dev/something'
9931006 path = tempfile .mkdtemp ()
@@ -1023,6 +1036,7 @@ def test_copy_mounted(
10231036 ], any_order = True )
10241037 mock_mount .assert_not_called ()
10251038 self .assertTrue (mock_booted_from_vmedia .called )
1039+ self .assertTrue (mock_unmount_config .called )
10261040
10271041
10281042@mock .patch .object (requests , 'get' , autospec = True )
@@ -1143,3 +1157,20 @@ def test_early_logging_goes_to_logger(self, mock_log):
11431157 expected_calls = [mock .call ('Early logging: %s' , 'line 1.' ),
11441158 mock .call ('Early logging: %s' , 'line 2 message' )]
11451159 info .assert_has_calls (expected_calls )
1160+
1161+
1162+ class TestUnmountOfConfig (ironic_agent_base .IronicAgentTest ):
1163+
1164+ @mock .patch .object (utils , '_early_log' , autospec = True )
1165+ @mock .patch .object (os .path , 'ismount' , autospec = True )
1166+ @mock .patch .object (utils , 'execute' , autospec = True )
1167+ @mock .patch .object (time , 'sleep' , autospec = True )
1168+ def test__unmount_any_config_drives (self , mock_sleep , mock_exec ,
1169+ mock_ismount , mock_log ,):
1170+ mock_ismount .side_effect = iter ([True , True , False ])
1171+ utils ._unmount_any_config_drives ()
1172+ self .assertEqual (2 , mock_sleep .call_count )
1173+ self .assertEqual (2 , mock_log .call_count )
1174+ mock_exec .assert_has_calls ([
1175+ mock .call ('umount' , '/mnt/config' ),
1176+ mock .call ('umount' , '/mnt/config' )])
0 commit comments