Skip to content

Commit d903aed

Browse files
committed
from unittest to pytest
1 parent 0bf03a2 commit d903aed

File tree

2 files changed

+105
-32
lines changed

2 files changed

+105
-32
lines changed
Lines changed: 92 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,119 @@
11
import uuid
2+
import time
3+
from typing import Generator
24

35
import pytest
46

5-
from scaleway.block.v1 import BlockV1API
6-
from scaleway.instance.v1 import InstanceV1API, VolumeServerTemplate, VolumeVolumeType, BootType
77
from scaleway_core.client import Client
8+
from scaleway.instance.v1.api import InstanceV1API
9+
from scaleway.instance.v1.types import VolumeVolumeType, BootType, Server, VolumeServerTemplate
10+
from scaleway.block.v1alpha1 import BlockV1Alpha1API, Volume
11+
from scaleway.block.v1alpha1.types import Volume, CreateVolumeRequestFromEmpty
812
from vcr_config import scw_vcr
913

1014
server_name = f"test-sdk-python-{uuid.uuid4().hex[:6]}"
1115
max_retry = 10
1216
interval = 0.01
13-
volume_size = 10000000000
17+
volume_size = 10_000_000_000
1418
commercial_type = "DEV1-S"
1519
zone = "fr-par-1"
16-
image_id = "c00ae53c-1e29-4087-a384-47f3c5c1cd84"
1720

18-
@pytest.fixture(scope="module")
21+
22+
@pytest.fixture
1923
@scw_vcr.use_cassette
20-
def instance_api():
24+
def apis() -> Generator[tuple[InstanceV1API, BlockV1Alpha1API, str, Server | None, list[Volume]], None, None]:
2125
client = Client.from_config_file_and_env()
22-
api = InstanceV1API(client)
23-
return api, client.default_project_id, zone
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)
2445

25-
@pytest.fixture(scope="module")
2646
@scw_vcr.use_cassette
27-
def block_api():
28-
client = Client.from_config_file_and_env()
29-
api = BlockV1API(client)
30-
return api, client.default_project_id, zone
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.")
3156

3257
@scw_vcr.use_cassette
33-
def test_instance_create(instance_api):
34-
api, project_id, zone = instance_api
58+
def create_test_instance_server(instanceAPI: InstanceV1API, zone: str) -> Server:
3559
volumes = {
3660
"0": VolumeServerTemplate(
3761
volume_type=VolumeVolumeType.L_SSD,
3862
size=volume_size,
3963
boot=False,
4064
)
4165
}
42-
instance = api.create_instance(project_id=project_id, zone=zone, name=server_name, dynamic_ip_required=False, volume=volumes, protected=False, boot_type=BootType.LOCAL, image=image_id)
43-
assert instance.name == server_name
44-
assert instance.project_id == project_id
45-
assert instance.zone == zone
46-
assert instance.id is not None
66+
server = instanceAPI._create_server(
67+
commercial_type=commercial_type,
68+
zone=zone,
69+
name=server_name,
70+
dynamic_ip_required=False,
71+
volumes=volumes,
72+
protected=False,
73+
boot_type=BootType.LOCAL,
74+
image="c00ae53c-1e29-4087-a384-47f3c5c1cd84",
75+
)
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
89+
90+
@scw_vcr.use_cassette
91+
def test_attach_additional_volume(apis):
92+
instanceAPI, blockAPI, zone, created_server, created_volumes = apis
93+
94+
server = create_test_instance_server(instanceAPI, zone)
95+
96+
additional_volumes = create_test_from_empty_volume(blockAPI, 1, zone)
97+
created_volumes.extend(additional_volumes)
98+
99+
additional_volume = additional_volumes[0]
100+
101+
assert server.id is not None
102+
assert server.zone == zone
103+
104+
assert additional_volume.id is not None
105+
assert additional_volume.size == 1_000_000_000
106+
107+
instanceAPI.attach_server_volume(
108+
server_id=server.id,
109+
volume_id=additional_volume.id,
110+
volume_type=VolumeVolumeType.SBS_VOLUME,
111+
)
112+
113+
blockAPI.wait_for_volume(volume_id=additional_volume.id, zone=zone)
114+
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()]
47118

119+
assert additional_volume.id in attached_volume_ids

scaleway/scaleway/vpc/v2/tests/test_vpc_sdk.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Generator
1+
from collections.abc import Generator
22

33
import pytest
44

@@ -13,17 +13,18 @@
1313
created_pn_count = 5
1414
created_vpc_count = 1
1515

16+
# mypy: ignore-errors
1617

1718
@pytest.fixture(scope="module")
18-
@scw_vcr.use_cassette # type: ignore[misc]
19-
def vpc_api() -> tuple[VpcV2API, str | None, str]:
19+
@scw_vcr.use_cassette
20+
def vpc_api() -> tuple[VpcV2API, str | None, str | None]:
2021
client = Client.from_config_file_and_env()
2122
api = VpcV2API(client)
2223
return api, client.default_project_id, region
2324

2425

2526
@pytest.fixture(scope="module")
26-
@scw_vcr.use_cassette # type: ignore[misc]
27+
@scw_vcr.use_cassette
2728
def vpc(vpc_api: tuple[VpcV2API, str, str]) -> Generator[VPC, None, None]:
2829
api, project_id, region = vpc_api
2930
vpc = api.create_vpc(
@@ -37,7 +38,7 @@ def vpc(vpc_api: tuple[VpcV2API, str, str]) -> Generator[VPC, None, None]:
3738

3839

3940
@pytest.fixture
40-
@scw_vcr.use_cassette # type: ignore[misc]
41+
@scw_vcr.use_cassette
4142
def private_networks_to_cleanup(vpc_api: tuple[VpcV2API, str, str]) -> Generator[list[PrivateNetwork], None, None]:
4243
api, _, _ = vpc_api
4344
items: list[PrivateNetwork] = []
@@ -46,7 +47,7 @@ def private_networks_to_cleanup(vpc_api: tuple[VpcV2API, str, str]) -> Generator
4647
api.delete_private_network(private_network_id=pn.id)
4748

4849

49-
@scw_vcr.use_cassette # type: ignore[misc]
50+
@scw_vcr.use_cassette
5051
def test_vpc_delete(vpc_api: tuple[VpcV2API, str, str]) -> None:
5152
api, project_id, region = vpc_api
5253
vpc: VPC = api.create_vpc(
@@ -65,15 +66,15 @@ def test_vpc_delete(vpc_api: tuple[VpcV2API, str, str]) -> None:
6566
api.get_vpc(vpc_id=vpc.id)
6667

6768

68-
@scw_vcr.use_cassette # type: ignore[misc]
69+
@scw_vcr.use_cassette
6970
def test_vpc_list(vpc_api: tuple[VpcV2API, str, str]) -> None:
7071
api, _, region = vpc_api
7172
vpcs: ListVPCsResponse = api.list_vp_cs(region=region)
7273
assert isinstance(vpcs.vpcs, list)
7374
assert vpcs.total_count >= created_vpc_count
7475

7576

76-
@scw_vcr.use_cassette # type: ignore[misc]
77+
@scw_vcr.use_cassette
7778
def test_private_network_create(vpc_api: tuple[VpcV2API, str, str], vpc: VPC , private_networks_to_cleanup: list[PrivateNetwork]) -> None:
7879
api, project_id, _ = vpc_api
7980
for i in range(created_pn_count):
@@ -87,31 +88,31 @@ def test_private_network_create(vpc_api: tuple[VpcV2API, str, str], vpc: VPC , p
8788
assert pn.vpc_id == vpc.id
8889

8990

90-
@scw_vcr.use_cassette # type: ignore[misc]
91+
@scw_vcr.use_cassette
9192
def test_private_network_list(vpc_api: tuple[VpcV2API, str, str]) -> None:
9293
api, _, region = vpc_api
9394
networks: ListPrivateNetworksResponse = api.list_private_networks(region=region)
9495
assert isinstance(networks.private_networks, list)
9596
assert networks.total_count >= created_pn_count
9697

9798

98-
@scw_vcr.use_cassette # type: ignore[misc]
99+
@scw_vcr.use_cassette
99100
def test_vpc_get(vpc_api: tuple[VpcV2API, str, str], vpc: VPC) -> None:
100101
api, _, region = vpc_api
101102
fetched_vpc: VPC = api.get_vpc(vpc_id=vpc.id, region=region)
102103
assert fetched_vpc is not None
103104
assert fetched_vpc.id == vpc.id
104105

105106

106-
@scw_vcr.use_cassette # type: ignore[misc]
107+
@scw_vcr.use_cassette
107108
def test_vpc_update(vpc_api: tuple[VpcV2API, str, str], vpc: VPC) -> None:
108109
api, _, _ = vpc_api
109110
updated = api.update_vpc(vpc_id=vpc.id, tags=tags)
110111
assert updated.tags == tags
111112
assert updated.id == vpc.id
112113

113114

114-
@scw_vcr.use_cassette # type: ignore[misc]
115+
@scw_vcr.use_cassette
115116
def test_vpc_list_all(vpc_api: tuple[VpcV2API, str, str]) -> None:
116117
api, _, _ = vpc_api
117118
vpcs = api.list_vp_cs_all()

0 commit comments

Comments
 (0)