@@ -606,3 +606,152 @@ def test_list(scaleway_runner, scaleway_group):
606606 scaleway_group .backend .delete (runner )
607607 with pytest .raises (NotFoundError ):
608608 scaleway_group .backend .get (runner .instance_id )
609+
610+
611+ def test_create_with_default_sbs_volume (scaleway_runner , fake_scaleway_group , monkeypatch ):
612+ """Test instance creation with default sbs_volume configuration."""
613+ # Mock image with root_volume
614+ mock_image = MagicMock ()
615+ mock_image .id = "test-image-id"
616+ mock_root_volume = MagicMock ()
617+ mock_root_volume .id = "snapshot-id"
618+ mock_image .root_volume = mock_root_volume
619+
620+ # Patch get_image at class level
621+ def mock_get_image (self , image_name ):
622+ return mock_image
623+
624+ monkeypatch .setattr (ScalewayBackend , "get_image" , mock_get_image )
625+
626+ backend = fake_scaleway_group .backend
627+ runner = backend .create (scaleway_runner )
628+
629+ # Verify volumes parameter was passed to _create_server
630+ mock_client = backend .client
631+ create_call = mock_client ._create_server .call_args
632+ volumes = create_call .kwargs .get ("volumes" )
633+
634+ assert volumes is not None
635+ assert "0" in volumes
636+ assert volumes ["0" ].volume_type == "sbs_volume"
637+ assert volumes ["0" ].size == 20_000_000_000 # 20GB default
638+ assert volumes ["0" ].base_snapshot == "snapshot-id"
639+
640+
641+ def test_create_with_l_ssd_volume (scaleway_runner , fake_scaleway_group , monkeypatch ):
642+ """Test instance creation with l_ssd volume type."""
643+ # Mock image
644+ mock_image = MagicMock ()
645+ mock_image .id = "test-image-id"
646+
647+ # Patch get_image at class level
648+ def mock_get_image (self , image_name ):
649+ return mock_image
650+
651+ monkeypatch .setattr (ScalewayBackend , "get_image" , mock_get_image )
652+
653+ # Configure l_ssd
654+ fake_scaleway_group .backend .instance_config .volume_type = "l_ssd"
655+ fake_scaleway_group .backend .instance_config .volume_size_gb = 80
656+
657+ backend = fake_scaleway_group .backend
658+ runner = backend .create (scaleway_runner )
659+
660+ # Verify volumes parameter
661+ mock_client = backend .client
662+ create_call = mock_client ._create_server .call_args
663+ volumes = create_call .kwargs .get ("volumes" )
664+
665+ assert volumes is not None
666+ assert "0" in volumes
667+ assert volumes ["0" ].volume_type == "l_ssd"
668+ assert volumes ["0" ].size == 80_000_000_000 # 80GB
669+ # For l_ssd, no base_snapshot should be set
670+ assert not hasattr (volumes ["0" ], "base_snapshot" ) or volumes ["0" ].base_snapshot is None
671+
672+
673+ def test_create_with_custom_volume_size (scaleway_runner , fake_scaleway_group , monkeypatch ):
674+ """Test instance creation with custom volume size."""
675+ mock_image = MagicMock ()
676+ mock_image .id = "test-image-id"
677+ mock_root_volume = MagicMock ()
678+ mock_root_volume .id = "snapshot-id"
679+ mock_image .root_volume = mock_root_volume
680+
681+ # Patch get_image at class level
682+ def mock_get_image (self , image_name ):
683+ return mock_image
684+
685+ monkeypatch .setattr (ScalewayBackend , "get_image" , mock_get_image )
686+
687+ # Set custom size
688+ fake_scaleway_group .backend .instance_config .volume_size_gb = 100
689+ backend = fake_scaleway_group .backend
690+
691+ runner = backend .create (scaleway_runner )
692+
693+ mock_client = backend .client
694+ create_call = mock_client ._create_server .call_args
695+ volumes = create_call .kwargs .get ("volumes" )
696+
697+ assert volumes ["0" ].size == 100_000_000_000 # 100GB
698+
699+
700+ def test_create_with_no_root_volume_fallback (scaleway_runner , fake_scaleway_group , monkeypatch , caplog ):
701+ """Test fallback when image has no root_volume."""
702+ mock_image = MagicMock ()
703+ mock_image .id = "test-image-id"
704+ mock_image .root_volume = None # No root volume
705+
706+ # Patch get_image at class level
707+ def mock_get_image (self , image_name ):
708+ return mock_image
709+
710+ monkeypatch .setattr (ScalewayBackend , "get_image" , mock_get_image )
711+
712+ backend = fake_scaleway_group .backend
713+ runner = backend .create (scaleway_runner )
714+
715+ # Verify warning was logged
716+ assert "has no root_volume, using default volume from image" in caplog .text
717+
718+ # Verify volumes=None was passed
719+ mock_client = backend .client
720+ create_call = mock_client ._create_server .call_args
721+ volumes = create_call .kwargs .get ("volumes" )
722+ assert volumes is None
723+
724+
725+ def test_create_with_user_provided_volumes (scaleway_runner , fake_scaleway_group , monkeypatch ):
726+ """Test instance creation with user-provided volumes configuration."""
727+ from scaleway .instance .v1 import VolumeServerTemplate
728+
729+ # Mock image
730+ mock_image = MagicMock ()
731+ mock_image .id = "test-image-id"
732+
733+ # Patch get_image at class level
734+ def mock_get_image (self , image_name ):
735+ return mock_image
736+
737+ monkeypatch .setattr (ScalewayBackend , "get_image" , mock_get_image )
738+
739+ # Set user-provided volumes
740+ custom_volumes = {
741+ "0" : VolumeServerTemplate (
742+ volume_type = "sbs_volume" ,
743+ size = 50_000_000_000 ,
744+ base_snapshot = "custom-snapshot-id" ,
745+ )
746+ }
747+ fake_scaleway_group .backend .instance_config .volumes = custom_volumes
748+
749+ backend = fake_scaleway_group .backend
750+ runner = backend .create (scaleway_runner )
751+
752+ # Verify user-provided volumes were used
753+ mock_client = backend .client
754+ create_call = mock_client ._create_server .call_args
755+ volumes = create_call .kwargs .get ("volumes" )
756+
757+ assert volumes == custom_volumes
0 commit comments