@@ -59,6 +59,7 @@ def setUp(self):
59
59
self .context = mock .MagicMock ()
60
60
self .img_repo = mock .MagicMock ()
61
61
self .task_repo = mock .MagicMock ()
62
+ self .stores = mock .MagicMock ()
62
63
self .image_id = UUID1
63
64
64
65
self .gateway = gateway .Gateway ()
@@ -87,7 +88,10 @@ def setUp(self):
87
88
task_input = task_input )
88
89
89
90
self .image .extra_properties = {
90
- 'os_glance_import_task' : self .task .task_id }
91
+ 'os_glance_import_task' : self .task .task_id ,
92
+ 'os_glance_importing_to_stores' : mock .MagicMock (),
93
+ 'os_glance_failed_import' : ""
94
+ }
91
95
self .wrapper = import_flow .ImportActionWrapper (self .img_repo ,
92
96
self .image_id ,
93
97
self .task .task_id )
@@ -105,7 +109,8 @@ def test_image_convert_success(self, mock_os_remove, mock_os_stat):
105
109
image_convert = image_conversion ._ConvertImage (self .context ,
106
110
self .task .task_id ,
107
111
self .task_type ,
108
- self .wrapper )
112
+ self .wrapper ,
113
+ self .stores )
109
114
110
115
self .task_repo .get .return_value = self .task
111
116
image = mock .MagicMock (image_id = self .image_id , virtual_size = None ,
@@ -137,7 +142,8 @@ def _setup_image_convert_info_fail(self, disk_format='qcow2'):
137
142
image_convert = image_conversion ._ConvertImage (self .context ,
138
143
self .task .task_id ,
139
144
self .task_type ,
140
- self .wrapper )
145
+ self .wrapper ,
146
+ self .stores )
141
147
142
148
self .task_repo .get .return_value = self .task
143
149
image = mock .MagicMock (image_id = self .image_id , virtual_size = None ,
@@ -354,22 +360,72 @@ def test_image_convert_same_format_does_nothing(self):
354
360
image = self .img_repo .get .return_value
355
361
self .assertEqual (123 , image .virtual_size )
356
362
357
- @mock .patch .object (os , 'remove' )
358
- def test_image_convert_revert_success (self , mock_os_remove ):
363
+ def _set_image_conversion (self , mock_os_remove , stores = []):
359
364
mock_os_remove .return_value = None
365
+ wrapper = mock .MagicMock ()
360
366
image_convert = image_conversion ._ConvertImage (self .context ,
361
367
self .task .task_id ,
362
368
self .task_type ,
363
- self .wrapper )
364
-
369
+ wrapper ,
370
+ stores )
371
+ action = wrapper .__enter__ .return_value
365
372
self .task_repo .get .return_value = self .task
373
+ return action , image_convert
374
+
375
+ @mock .patch .object (os , 'remove' )
376
+ def test_image_convert_revert_success_multiple_stores (
377
+ self , mock_os_remove ):
378
+ action , image_convert = self ._set_image_conversion (
379
+ mock_os_remove , stores = self .stores )
380
+
381
+ with mock .patch .object (processutils , 'execute' ) as exc_mock :
382
+ exc_mock .return_value = ("" , None )
383
+ with mock .patch .object (os .path , 'exists' ) as os_exists_mock :
384
+ os_exists_mock .return_value = True
385
+ image_convert .revert (result = mock .MagicMock ())
386
+ self .assertEqual (1 , mock_os_remove .call_count )
387
+ action .set_image_attribute .assert_called_once_with (
388
+ status = 'queued' )
389
+ action .remove_importing_stores .assert_called_once_with (
390
+ self .stores )
391
+ action .add_failed_stores .assert_called_once_with (
392
+ self .stores )
393
+
394
+ @mock .patch .object (os , 'remove' )
395
+ def test_image_convert_revert_success_single_store (
396
+ self , mock_os_remove ):
397
+ action , image_convert = self ._set_image_conversion (mock_os_remove )
366
398
367
399
with mock .patch .object (processutils , 'execute' ) as exc_mock :
368
400
exc_mock .return_value = ("" , None )
369
401
with mock .patch .object (os .path , 'exists' ) as os_exists_mock :
370
402
os_exists_mock .return_value = True
371
403
image_convert .revert (result = mock .MagicMock ())
372
404
self .assertEqual (1 , mock_os_remove .call_count )
405
+ self .assertEqual (0 , action .remove_importing_stores .call_count )
406
+ self .assertEqual (0 , action .add_failed_store .call_count )
407
+ action .set_image_attribute .assert_called_once_with (
408
+ status = 'queued' )
409
+
410
+ @mock .patch .object (os , 'remove' )
411
+ def test_image_convert_revert_success_src_file_exists (
412
+ self , mock_os_remove ):
413
+ action , image_convert = self ._set_image_conversion (
414
+ mock_os_remove , stores = self .stores )
415
+ image_convert .src_path = mock .MagicMock ()
416
+
417
+ with mock .patch .object (processutils , 'execute' ) as exc_mock :
418
+ exc_mock .return_value = ("" , None )
419
+ with mock .patch .object (os .path , 'exists' ) as os_exists_mock :
420
+ os_exists_mock .return_value = True
421
+ image_convert .revert (result = mock .MagicMock ())
422
+ action .set_image_attribute .assert_called_once_with (
423
+ status = 'queued' )
424
+ action .remove_importing_stores .assert_called_once_with (
425
+ self .stores )
426
+ action .add_failed_stores .assert_called_once_with (
427
+ self .stores )
428
+ self .assertEqual (2 , mock_os_remove .call_count )
373
429
374
430
def test_image_convert_interpreter_configured (self ):
375
431
# By default, wsgi.python_interpreter is None; if it is
@@ -380,5 +436,6 @@ def test_image_convert_interpreter_configured(self):
380
436
convert = image_conversion ._ConvertImage (self .context ,
381
437
self .task .task_id ,
382
438
self .task_type ,
383
- self .wrapper )
439
+ self .wrapper ,
440
+ self .stores )
384
441
self .assertEqual (fake_interpreter , convert .python )
0 commit comments