Skip to content

Commit 3435128

Browse files
Laure-diGnoale
andauthored
test: add e2e instance test (scaleway#1037)
Co-authored-by: Guillaume Noale <g.noale@gmail.com>
1 parent 6db6603 commit 3435128

File tree

4 files changed

+135
-0
lines changed

4 files changed

+135
-0
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ lint:
5050
test:
5151
for lib in $(LIBRARIES); do \
5252
cd ${WORKDIR}/$$lib && \
53+
poetry install && \
5354
poetry run python -m unittest discover -s tests -v; \
5455
done
5556

scaleway/tests/test_instance.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
import logging
2+
import sys
3+
from typing import List
4+
import unittest
5+
import uuid
6+
import time
7+
8+
from scaleway_core.client import Client
9+
from scaleway.instance.v1.api import InstanceV1API
10+
from scaleway.block.v1alpha1 import BlockV1Alpha1API
11+
from scaleway.instance.v1.types import Server, VolumeServerTemplate
12+
from scaleway.block.v1alpha1.types import Volume, CreateVolumeRequestFromEmpty
13+
14+
logger = logging.getLogger()
15+
logger.level = logging.DEBUG
16+
stream_handler = logging.StreamHandler(sys.stdout)
17+
logger.addHandler(stream_handler)
18+
19+
server_name = f"test-sdk-python-{uuid.uuid4().hex[:6]}"
20+
max_retry = 10
21+
interval = 0.1
22+
volume_size = 10
23+
commercial_type = "DEV1-S"
24+
zone = "fr-par-1"
25+
26+
27+
class TestE2EServerCreation(unittest.TestCase):
28+
def setUp(self) -> None:
29+
self.zone = zone
30+
self.client = Client.from_config_file_and_env()
31+
self.instanceAPI = InstanceV1API(self.client, bypass_validation=True)
32+
self.blockAPI = BlockV1Alpha1API(self.client, bypass_validation=True)
33+
self._server = None
34+
self._volumes = []
35+
36+
def tearDown(self) -> None:
37+
for volume in self._volumes:
38+
self.instanceAPI.detach_server_volume(
39+
server_id=self._server.id, volume_id=volume.id
40+
)
41+
logger.info("✅ Volume {volume.id} has been detach")
42+
43+
self.blockAPI.delete_volume(volume_id=volume.id)
44+
logger.info("✅ Volume {volume.id} has been deleted")
45+
46+
if self._server:
47+
self.instanceAPI.delete_server(zone=self.zone, server_id=self._server.id)
48+
logger.info(f"🗑️ Deleted server: {self._server.id}")
49+
50+
def wait_test_instance_server(self, server_id):
51+
interval = interval
52+
53+
for i in range(1, max_retry):
54+
interval *= i
55+
s = self.instanceAPI.get_server(zone=self.zone, server_id=server_id)
56+
57+
if s.state == "running":
58+
logger.info(f"✅ Server {server_id} is running.")
59+
break
60+
61+
time.sleep(interval)
62+
63+
self.fail("Server did not reach 'running' state in time.")
64+
65+
def create_test_instance_server(self) -> Server:
66+
volume = {
67+
"0": VolumeServerTemplate(
68+
volume_type="sbs_volume", name="my-volume", size=volume_size
69+
)
70+
}
71+
72+
server = self.instanceAPI._create_server(
73+
commercial_type=commercial_type,
74+
zone=self.zone,
75+
name=server_name,
76+
dynamic_ip_required=True,
77+
volumes=volume,
78+
)
79+
logger.info(f"✅ Created server: {server.id}")
80+
81+
self._server = server.server
82+
83+
self.wait_test_instance_server(server_id=server.server.id)
84+
85+
return server.server
86+
87+
def create_test_from_empty_volume(self, number) -> List[Volume]:
88+
volumes: List[Volume] = {}
89+
90+
for i in range(number):
91+
volume = self.blockAPI.create_volume(
92+
from_empty=CreateVolumeRequestFromEmpty(size=10),
93+
)
94+
logger.info("✅ Created server: {volume.id}")
95+
96+
self.blockAPI.wait_for_volume(volume_id=volume.id, zone=self.zone)
97+
98+
self._volumes.append(volume) # Ensure cleanup in tearDown
99+
volumes.append(volume)
100+
101+
return volumes
102+
103+
def test_attach_aditionnal_volume(self):
104+
server = self.create_test_instance_server()
105+
additional_volumes = self.create_test_from_empty_volume(1)
106+
additional_volume = additional_volumes.values()[0]
107+
108+
self.assertIsNotNone(server.id)
109+
self.assertEqual(server.zone, self.zone)
110+
111+
self.assertIsNotNone(additional_volume.id)
112+
self.assertEqual(additional_volume.size, 10)
113+
logger.info(f"✅ Volume created with ID: {additional_volume.id}")
114+
115+
self.instanceAPI.attach_server_volume(
116+
server_id=server.id, volume_id=additional_volume.id
117+
)
118+
119+
self.blockAPI.wait_for_volume(volume_id=additional_volume.id, zone=self.zone)
120+
121+
logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}")
122+
123+
updated_server = self.instanceAPI.get_server(
124+
zone=self.zone, server_id=server.id
125+
)
126+
attached_volumes = updated_server.volumes or {}
127+
attached_volume_ids = [v.volume.id for v in attached_volumes.values()]
128+
self.assertIn(additional_volume.id, attached_volume_ids)
129+
logger.info(
130+
f"✅ Volume {additional_volume.id} is attached to server {server.id}"
131+
)

scaleway/tests/test_test_v1.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from scaleway.test.v1 import EyeColors, Human, HumanStatus, TestV1API
99

1010

11+
@unittest.skip("API test is not deployed")
1112
class TestTestV1(unittest.TestCase):
1213
def setUp(self) -> None:
1314
client = Client.from_config_file_and_env()

scaleway/tests/test_test_v1_marshalling.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def _mock_human() -> Human:
6969
)
7070

7171

72+
@unittest.skip("API test is not deployed")
7273
class TestTestV1UnmarshallingHuman(unittest.TestCase):
7374
def _assert_raw_and_unmarshalled_human(
7475
self,
@@ -145,6 +146,7 @@ def _mock_create_human_request() -> CreateHumanRequest:
145146
)
146147

147148

149+
@unittest.skip("API test is not deployed")
148150
class TestTestV1MarshallingCreateHumanRequest(unittest.TestCase):
149151
def _assert_create_human_request_and_raw(
150152
self,

0 commit comments

Comments
 (0)