@ -40,7 +40,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
super ( TestWebDownloadTask , self ) . setUp ( )
self . config ( node_staging_uri = ' /tmp/staging ' )
self . task _repo = mock . MagicMock ( )
self . image _repo = mock . MagicMock ( )
self . image_id = mock . MagicMock ( )
self . uri = mock . MagicMock ( )
self . task_factory = domain . TaskFactory ( )
@ -60,11 +60,16 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
task_time_to_live = task_ttl ,
task_input = task_input )
self . task_id = self . task . task_id
self . action_wrapper = api_image_import . ImportActionWrapper (
self . image_repo , self . image_id , self . task_id )
self . image_repo . get . return_value = mock . MagicMock (
extra_properties = { ' os_glance_import_task ' : self . task_id } )
@mock.patch.object ( filesystem . Store , ' add ' )
def test_web_download ( self , mock_add ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
' get_image_data_iter ' ) as mock_iter :
mock_add . return_value = [ " path " , 4 ]
@ -76,8 +81,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
@mock.patch.object ( filesystem . Store , ' add ' )
def test_web_download_with_content_length ( self , mock_add ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
' get_image_data_iter ' ) as mock_iter :
mock_iter . return_value . headers = { ' content-length ' : ' 4 ' }
@ -89,8 +93,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
@mock.patch.object ( filesystem . Store , ' add ' )
def test_web_download_with_invalid_content_length ( self , mock_add ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
' get_image_data_iter ' ) as mock_iter :
mock_iter . return_value . headers = { ' content-length ' : " not_valid " }
@ -102,8 +105,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
@mock.patch.object ( filesystem . Store , ' add ' )
def test_web_download_fails_when_data_size_different ( self , mock_add ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
' get_image_data_iter ' ) as mock_iter :
mock_iter . return_value . headers = { ' content-length ' : ' 4 ' }
@ -116,8 +118,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
self . config ( node_staging_uri = None )
self . assertRaises ( glance . common . exception . BadTaskConfiguration ,
web_download . _WebDownload , self . task . task_id ,
self . task_type , self . task_repo , self . image_id ,
self . uri )
self . task_type , self . uri , self . action_wrapper )
@mock.patch.object ( cfg . ConfigOpts , " set_override " )
def test_web_download_node_store_initialization_failed ( self ,
@ -126,14 +127,12 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
mock_load_store . return_value = None
self . assertRaises ( glance . common . exception . BadTaskConfiguration ,
web_download . _WebDownload , self . task . task_id ,
self . task_type , self . task_repo , self . image_id ,
self . uri )
self . task_type , self . uri , self . action_wrapper )
mock_override . assert_called ( )
def test_web_download_failed ( self ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
" get_image_data_iter " ) as mock_iter :
mock_iter . side_effect = glance . common . exception . NotFound
@ -182,8 +181,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
def test_web_download_revert_with_failure ( self , mock_store_api ,
mock_add ) :
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
with mock . patch . object ( script_utils ,
' get_image_data_iter ' ) as mock_iter :
mock_iter . return_value . headers = { ' content-length ' : ' 4 ' }
@ -195,6 +193,9 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
web_download_task . revert ( None )
mock_store_api . delete_from_backend . assert_called_once_with (
" /path/to_downloaded_data " )
# NOTE(danms): Since we told revert that we were not at fault,
# we should not have updated the image.
self . image_repo . save . assert_not_called ( )
@mock.patch ( " glance.async_.flows._internal_plugins.web_download.store_api " )
def test_web_download_revert_without_failure_multi_store ( self ,
@ -205,8 +206,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
}
self . config ( enabled_backends = enabled_backends )
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
web_download_task . _path = " /path/to_downloaded_data "
web_download_task . revert ( " /path/to_downloaded_data " )
mock_store_api . delete . assert_called_once_with (
@ -215,21 +215,26 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
@mock.patch ( " glance.async_.flows._internal_plugins.web_download.store_api " )
def test_web_download_revert_with_failure_without_path ( self ,
mock_store_api ) :
image = self . image_repo . get . return_value
image . status = ' importing '
result = failure . Failure . from_exception (
glance . common . exception . ImportTaskError ( ) )
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
web_download_task . revert ( result )
mock_store_api . delete_from_backend . assert_not_called ( )
# NOTE(danms): Since we told revert that we were the problem,
# we should have updated the image status
self . image_repo . save . assert_called_once_with ( image , ' importing ' )
self . assertEqual ( ' queued ' , image . status )
@mock.patch ( " glance.async_.flows._internal_plugins.web_download.store_api " )
def test_web_download_revert_with_failure_with_path ( self , mock_store_api ) :
result = failure . Failure . from_exception (
glance . common . exception . ImportTaskError ( ) )
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
web_download_task . _path = " /path/to_downloaded_data "
web_download_task . revert ( result )
mock_store_api . delete_from_backend . assert_called_once_with (
@ -241,8 +246,7 @@ class TestWebDownloadTask(test_utils.BaseTestCase):
glance . common . exception . ImportTaskError ( ) )
mock_store_api . delete_from_backend . side_effect = Exception
web_download_task = web_download . _WebDownload (
self . task . task_id , self . task_type , self . task_repo ,
self . image_id , self . uri )
self . task . task_id , self . task_type , self . uri , self . action_wrapper )
web_download_task . _path = " /path/to_downloaded_data "
# this will verify that revert does not break because of failure
# while deleting data in staging area