11import uuid
2- import time
32from typing import Generator
43
54import pytest
65
6+ from scaleway .instance .v1 .custom_api import InstanceUtilsV1API
7+ from scaleway_async .instance .v1 import AttachServerVolumeRequestVolumeType
78from scaleway_core .client import Client
8- from scaleway .instance .v1 .api import InstanceV1API
99from scaleway .instance .v1 .types import VolumeVolumeType , BootType , Server , VolumeServerTemplate
10- from scaleway .block .v1alpha1 import BlockV1Alpha1API , Volume
10+ from scaleway .block .v1alpha1 import BlockV1Alpha1API
1111from scaleway .block .v1alpha1 .types import Volume , CreateVolumeRequestFromEmpty
1212from vcr_config import scw_vcr
1313
1818commercial_type = "DEV1-S"
1919zone = "fr-par-1"
2020
21-
22- @pytest .fixture
21+ @pytest .fixture (scope = "module" )
2322@scw_vcr .use_cassette
24- def apis () -> Generator [ tuple [InstanceV1API , BlockV1Alpha1API , str , Server | None , list [ Volume ]], None , None ]:
23+ def instance_block_api () -> tuple [InstanceUtilsV1API , BlockV1Alpha1API ]:
2524 client = Client .from_config_file_and_env ()
26- instanceAPI = InstanceV1API (client , bypass_validation = True )
27- blockAPI = BlockV1Alpha1API (client , bypass_validation = True )
28-
29- created_server : Server | None = None
30- created_volumes : list [Volume ] = []
31-
32- yield instanceAPI , blockAPI , zone , created_server , created_volumes
33-
34- for volume in created_volumes :
35- if created_server :
36- instanceAPI .detach_server_volume (
37- server_id = created_server .id , volume_id = volume .id
38- )
39- blockAPI .wait_for_volume (volume_id = volume .id , zone = zone )
40- wait_test_instance_server (instanceAPI , created_server .id , zone )
41- blockAPI .delete_volume (volume_id = volume .id )
42-
43- if created_server :
44- instanceAPI .delete_server (zone = zone , server_id = created_server .id )
45-
46- @scw_vcr .use_cassette
47- def wait_test_instance_server (instanceAPI : InstanceV1API , server_id : str , zone : str ) -> Server :
48- delay = interval
49- for i in range (1 , max_retry ):
50- delay *= i
51- s = instanceAPI .get_server (zone = zone , server_id = server_id )
52- if s .server .state in ("running" , "stopped" ):
53- return s .server
54- time .sleep (delay )
55- pytest .fail ("Server did not reach 'running' or 'stopped' state in time." )
25+ instance_api = InstanceUtilsV1API (client )
26+ block_api = BlockV1Alpha1API (client )
27+ return instance_api , block_api
5628
29+ @pytest .fixture (scope = "module" )
5730@scw_vcr .use_cassette
58- def create_test_instance_server (instanceAPI : InstanceV1API , zone : str ) -> Server :
31+ def instance_volume (instance_block_api : tuple [InstanceUtilsV1API , BlockV1Alpha1API ]) -> Generator [
32+ tuple [Server | None , list [Volume ]], None , None ]:
33+ instance_api , block_api = instance_block_api
34+ volumes_list : list [Volume ] = []
5935 volumes = {
6036 "0" : VolumeServerTemplate (
6137 volume_type = VolumeVolumeType .L_SSD ,
6238 size = volume_size ,
6339 boot = False ,
6440 )
6541 }
66- server = instanceAPI ._create_server (
42+ instance = instance_api ._create_server (
6743 commercial_type = commercial_type ,
6844 zone = zone ,
6945 name = server_name ,
@@ -73,47 +49,60 @@ def create_test_instance_server(instanceAPI: InstanceV1API, zone: str) -> Server
7349 boot_type = BootType .LOCAL ,
7450 image = "c00ae53c-1e29-4087-a384-47f3c5c1cd84" ,
7551 )
76- wait_test_instance_server (instanceAPI , server .server .id , zone )
77- return server .server
78-
79- @scw_vcr .use_cassette
80- def create_test_from_empty_volume (blockAPI : BlockV1Alpha1API , number : int , zone : str ) -> list [Volume ]:
81- volumes : list [Volume ] = []
82- for _ in range (number ):
83- volume = blockAPI .create_volume (
84- from_empty = CreateVolumeRequestFromEmpty (size = 1_000_000_000 ),
85- )
86- blockAPI .wait_for_volume (volume_id = volume .id , zone = zone )
87- volumes .append (volume )
88- return volumes
52+ instance_api .wait_test_instance_server (instance .server .id , zone = zone )
53+ yield instance .server , volumes_list
54+ for volume in volumes_list :
55+ instance_api .detach_server_volume (server_id = instance .server .id , volume_id = volume .id , zone = zone )
56+ block_api .wait_for_volume (volume_id = volume .id , zone = zone )
57+ block_api .delete_volume (volume_id = volume .id , zone = zone )
58+ instance_api .delete_server (server_id = instance .server .id , zone = zone )
8959
9060@scw_vcr .use_cassette
91- def test_attach_additional_volume (apis ):
92- instanceAPI , blockAPI , zone , created_server , created_volumes = apis
61+ def test_attach_additionnal_volume (instance_block_api : tuple [InstanceUtilsV1API , BlockV1Alpha1API ], instance_volume : tuple [Server , list [Volume ]]) -> None :
62+ instance_api , block_api = instance_block_api
63+ server , volumes_list = instance_volume
64+ additional_volume = block_api .create_volume (
65+ from_empty = CreateVolumeRequestFromEmpty (size = volume_size ),
66+ )
67+ updated_volume = block_api .wait_for_volume (volume_id = additional_volume .id , zone = zone )
68+ volumes_list .append (updated_volume )
69+ assert updated_volume .size == volume_size
70+ assert updated_volume .id is not None
9371
94- server = create_test_instance_server (instanceAPI , zone )
72+ instance_api .attach_server_volume (server_id = server .id , volume_id = additional_volume .id , zone = zone , volume_type = AttachServerVolumeRequestVolumeType .SBS_VOLUME )
73+ instance_api .wait_test_instance_server (server_id = server .id , zone = zone )
74+ block_api .wait_for_volume (volume_id = additional_volume .id , zone = zone )
9575
96- additional_volumes = create_test_from_empty_volume (blockAPI , 1 , zone )
97- created_volumes .extend (additional_volumes )
76+ server_details = instance_api .get_server (server_id = server .id , zone = zone ).server
77+ attached_volume_ids = [v .id for v in server_details .volumes .values ()]
78+ assert additional_volume .id in attached_volume_ids
9879
99- additional_volume = additional_volumes [0 ]
80+ @scw_vcr .use_cassette
81+ def test_list_server (instance_block_api : tuple [InstanceUtilsV1API , BlockV1Alpha1API ]) -> None :
82+ instance_api , block_api = instance_block_api
83+ servers = instance_api .list_servers (zone = zone )
84+ assert len (servers .servers ) == 1
85+ assert servers .servers [0 ].name == server_name
10086
101- assert server .id is not None
102- assert server .zone == zone
87+ @scw_vcr .use_cassette
88+ def test_create_new_server (instance_block_api : tuple [InstanceUtilsV1API , BlockV1Alpha1API ]) -> None :
89+ instance_api , block_api = instance_block_api
90+ server = instance_api ._create_server (
91+ commercial_type = commercial_type ,
92+ zone = zone ,
93+ name = server_name ,
94+ dynamic_ip_required = False ,
95+ volumes = {},
96+ protected = False ,
97+ boot_type = BootType .LOCAL ,
98+ )
99+ assert server .server .id is not None
100+ assert server .server .name == server_name
103101
104- assert additional_volume . id is not None
105- assert additional_volume . size == 1_000_000_000
102+ servers = instance_api . list_servers ( zone = zone )
103+ assert len ( servers . servers ) == 2
106104
107- instanceAPI .attach_server_volume (
108- server_id = server .id ,
109- volume_id = additional_volume .id ,
110- volume_type = VolumeVolumeType .SBS_VOLUME ,
111- )
105+ instance_api .delete_server (server_id = server .server .id , zone = zone )
112106
113- blockAPI .wait_for_volume (volume_id = additional_volume .id , zone = zone )
114107
115- updated_server = instanceAPI .get_server (zone = zone , server_id = server .id )
116- attached_volumes = updated_server .server .volumes or {}
117- attached_volume_ids = [v .id for v in attached_volumes .values ()]
118108
119- assert additional_volume .id in attached_volume_ids
0 commit comments