@@ -549,6 +549,119 @@ def test_delete_not_found(scaleway_runner, fake_scaleway_group, caplog):
549549 assert result == 1
550550
551551
552+ def test_delete_with_block_storage_volume (
553+ scaleway_runner , fake_scaleway_group , caplog , monkeypatch
554+ ):
555+ """Test instance deletion with block storage (sbs_volume) using Block API."""
556+ backend = fake_scaleway_group .backend
557+ scaleway_runner .instance_id = "test-server-id"
558+ scaleway_runner .save ()
559+
560+ # Mock server with block storage volume
561+ mock_volume = MagicMock ()
562+ mock_volume .id = "test-block-volume-id"
563+ mock_server = MagicMock ()
564+ mock_server .id = "test-server-id"
565+ mock_server .state = ServerState .RUNNING
566+ mock_server .volumes = {"0" : mock_volume }
567+
568+ # Mock Instance API client
569+ mock_client = MagicMock ()
570+ mock_client .get_server .return_value = MagicMock (server = mock_server )
571+ mock_client .delete_server .return_value = None
572+ mock_client .delete_volume .return_value = None
573+ mock_client .server_action .return_value = None
574+
575+ # Mock Block Storage API client
576+ mock_block_client = MagicMock ()
577+ mock_block_client .delete_volume .return_value = None
578+
579+ # Patch both clients
580+ monkeypatch .setattr (ScalewayBackend , "client" , property (lambda self : mock_client ))
581+ monkeypatch .setattr (
582+ ScalewayBackend , "block_client" , property (lambda self : mock_block_client )
583+ )
584+
585+ # Mock wait_for_server_state
586+ def mock_wait (self , server_id , target_state , timeout = 300 ):
587+ return mock_server
588+
589+ monkeypatch .setattr (ScalewayBackend , "wait_for_server_state" , mock_wait )
590+
591+ result = backend .delete (scaleway_runner )
592+
593+ # Verify Block Storage API was called first
594+ mock_block_client .delete_volume .assert_called_once_with (
595+ zone = backend .config .zone ,
596+ volume_id = "test-block-volume-id" ,
597+ )
598+ # Verify Instance API delete_volume was NOT called
599+ mock_client .delete_volume .assert_not_called ()
600+ # Verify successful deletion was logged
601+ assert (
602+ "Block storage volume test-block-volume-id deleted successfully" in caplog .text
603+ )
604+ assert result == 1
605+
606+
607+ def test_delete_with_volume_fallback_to_instance_api (
608+ scaleway_runner , fake_scaleway_group , caplog , monkeypatch
609+ ):
610+ """Test volume deletion fallback from Block API to Instance API for l_ssd volumes."""
611+ backend = fake_scaleway_group .backend
612+ scaleway_runner .instance_id = "test-server-id"
613+ scaleway_runner .save ()
614+
615+ # Mock server with l_ssd volume
616+ mock_volume = MagicMock ()
617+ mock_volume .id = "test-lssd-volume-id"
618+ mock_server = MagicMock ()
619+ mock_server .id = "test-server-id"
620+ mock_server .state = ServerState .RUNNING
621+ mock_server .volumes = {"0" : mock_volume }
622+
623+ # Mock Instance API client
624+ mock_client = MagicMock ()
625+ mock_client .get_server .return_value = MagicMock (server = mock_server )
626+ mock_client .delete_server .return_value = None
627+ mock_client .delete_volume .return_value = None
628+ mock_client .server_action .return_value = None
629+
630+ # Mock Block Storage API client to return 404 (volume not found in Block API)
631+ mock_block_client = MagicMock ()
632+ mock_block_client .delete_volume .side_effect = Exception (
633+ "404 not_found: Volume not found in Block API"
634+ )
635+
636+ # Patch both clients
637+ monkeypatch .setattr (ScalewayBackend , "client" , property (lambda self : mock_client ))
638+ monkeypatch .setattr (
639+ ScalewayBackend , "block_client" , property (lambda self : mock_block_client )
640+ )
641+
642+ # Mock wait_for_server_state
643+ def mock_wait (self , server_id , target_state , timeout = 300 ):
644+ return mock_server
645+
646+ monkeypatch .setattr (ScalewayBackend , "wait_for_server_state" , mock_wait )
647+
648+ result = backend .delete (scaleway_runner )
649+
650+ # Verify Block Storage API was called first
651+ mock_block_client .delete_volume .assert_called_once_with (
652+ zone = backend .config .zone ,
653+ volume_id = "test-lssd-volume-id" ,
654+ )
655+ # Verify Instance API was called as fallback
656+ mock_client .delete_volume .assert_called_once_with (
657+ zone = backend .config .zone ,
658+ volume_id = "test-lssd-volume-id" ,
659+ )
660+ # Verify successful deletion through Instance API was logged
661+ assert "Instance volume test-lssd-volume-id deleted successfully" in caplog .text
662+ assert result == 1
663+
664+
552665def test_list_with_auto_create (fake_scaleway_group , monkeypatch ):
553666 """Test list() creates runners for servers not in database."""
554667 backend = fake_scaleway_group .backend
0 commit comments