From a39c1ca73d243de77cc6786352172cb1a0030118 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Thu, 19 Jun 2025 17:00:11 +0200 Subject: [PATCH 01/11] test: add instance test add modul rm module --- docs/module.rst | 0 scaleway/tests/test_instance.py | 122 ++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 docs/module.rst create mode 100644 scaleway/tests/test_instance.py diff --git a/docs/module.rst b/docs/module.rst new file mode 100644 index 000000000..e69de29bb diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py new file mode 100644 index 000000000..9f749118a --- /dev/null +++ b/scaleway/tests/test_instance.py @@ -0,0 +1,122 @@ +import logging +import sys +from typing import Dict +import unittest +import uuid +import time + +from scaleway_core.client import Client +from scaleway.instance.v1.api import InstanceV1API +from scaleway.block.v1alpha1 import BlockV1Alpha1API +from scaleway.instance.v1.types import Server, VolumeServerTemplate +from scaleway.block.v1alpha1.types import Volume, CreateVolumeRequestFromEmpty + +logger = logging.getLogger() +logger.level = logging.DEBUG +stream_handler = logging.StreamHandler(sys.stdout) +logger.addHandler(stream_handler) + +server_name = f"test-sdk-python-{uuid.uuid4().hex[:6]}" +timeout = 10 +volume_size = 10 +commercial_type = "DEV1-S" +class TestE2EServerCreation(unittest.TestCase): + def setUp(self) -> None: + self.zone = "fr-par-1" + self.client = Client.from_config_file_and_env() + self.instanceAPI = InstanceV1API(self.client, bypass_validation=True) + self.blockAPI = BlockV1Alpha1API(self.client, bypass_validation=True) + self._server = None + self._volumes = [] + + def tearDown(self) -> None: + for volume in self._volumes: + try: + self.instanceAPI.detach_server_volume(server_id=self._server.id, volume_id=volume.id) + logger.info("✅ Volume {volume.id} has been detach") + except Exception as e: + logger.warning(f"Failed to detach volume {volume.id}: {e}") + + + try: + + self.blockAPI.delete_volume(volume_id=volume.id) + logger.info("✅ Volume {volume.id} has been deleted") + except Exception as e: + logger.warning(f"Failed to delete volume {volume.id}: {e}") + + if self._server: + try: + self.api.delete_server(zone=self.zone, server_id=self._server.id) + logger.info(f"🗑️ Deleted server: {self._server.id}") + except Exception as e: + logger.warning(f"Failed to delete server {self._server.id}: {e}") + + def wait_test_instance_server(self, server_id): + for _ in range(10): + s = self.api.get_server(zone=self.zone, server_id=server.id) + if s.state == "running": + logger.info(f"✅ Server {server_id} is running.") + break + time.sleep(timeout) + else: + self.fail("Server did not reach 'running' state in time.") + + def create_test_instance_server(self) -> Server: + volume = { "0": VolumeServerTemplate(volume_type= "sbs_volume", + name="my-volume", + size=volume_size + )} + server = self.instanceAPI._create_server( + commercial_type=commercial_type, + zone=self.zone, + name=server_name, + dynamic_ip_required=True, + volumes=volume + ) + logger.info(f"✅ Created server: {server.id}") + self._server = server.server + self.wait_test_instance_server(server_id=server.server.id) + return server.server + + def create_test_from_empty_volume(self, number) -> Dict[str, Volume]: + volumes: Dict[str, Volume] = {} + for i in range(number): + volume = self.blockAPI.create_volume( + project_id="19e2fd0b-3d53-4f8f-9338-629df9c1b1db", + from_empty=CreateVolumeRequestFromEmpty(size=10) + ) + logger.info("✅ Created server: {volume.id}") + self._volumes.append(volume) # Ensure cleanup in tearDown + volumes[str(i)] = volume + + return volumes + + + + def test_attach_aditionnal_volume(self): + server = self.create_test_instance_server() + additional_volumes = self.create_test_from_empty_volume(1) + additional_volume = list(additional_volumes.values())[0] + + + self.assertIsNotNone(server.id) + self.assertEqual(server.zone, self.zone) + + self.assertIsNotNone(additional_volume.id) + self.assertEqual(additional_volume.size, 10) + logger.info(f"✅ Volume created with ID: {additional_volume.id}") + + self.instanceAPI.attach_server_volume( + server_id=server.id, + volume_id=additional_volume.id + ) + logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}") + + time.sleep(5) + + updated_server = self.instanceAPI.get_server(zone=self.zone, server_id=server.id) + attached_volumes = updated_server.volumes or {} + attached_volume_ids = [v.volume.id for v in attached_volumes.values()] + self.assertIn(additional_volume.id, attached_volume_ids) + logger.info(f"✅ Volume {additional_volume.id} is attached to server {server.id}") From 7a77ca08e9f2df1be5cfa5bbfca40c36ef970d13 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 11:34:34 +0200 Subject: [PATCH 02/11] last update --- scaleway/tests/test_instance.py | 47 +++++++++++++++++---------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 9f749118a..0007cce4e 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -9,7 +9,7 @@ from scaleway.instance.v1.api import InstanceV1API from scaleway.block.v1alpha1 import BlockV1Alpha1API from scaleway.instance.v1.types import Server, VolumeServerTemplate -from scaleway.block.v1alpha1.types import Volume, CreateVolumeRequestFromEmpty +from scaleway.block.v1alpha1.types import Volume, CreateVolumeRequestFromEmpty logger = logging.getLogger() logger.level = logging.DEBUG @@ -20,6 +20,8 @@ timeout = 10 volume_size = 10 commercial_type = "DEV1-S" + + class TestE2EServerCreation(unittest.TestCase): def setUp(self) -> None: self.zone = "fr-par-1" @@ -32,29 +34,27 @@ def setUp(self) -> None: def tearDown(self) -> None: for volume in self._volumes: try: - self.instanceAPI.detach_server_volume(server_id=self._server.id, volume_id=volume.id) + self.instanceAPI.detach_server_volume( + server_id=self._server.id, volume_id=volume.id + ) logger.info("✅ Volume {volume.id} has been detach") except Exception as e: logger.warning(f"Failed to detach volume {volume.id}: {e}") - - try: - self.blockAPI.delete_volume(volume_id=volume.id) logger.info("✅ Volume {volume.id} has been deleted") except Exception as e: logger.warning(f"Failed to delete volume {volume.id}: {e}") - if self._server: try: self.api.delete_server(zone=self.zone, server_id=self._server.id) logger.info(f"🗑️ Deleted server: {self._server.id}") except Exception as e: logger.warning(f"Failed to delete server {self._server.id}: {e}") - + def wait_test_instance_server(self, server_id): for _ in range(10): - s = self.api.get_server(zone=self.zone, server_id=server.id) + s = self.api.get_server(zone=self.zone, server_id=server_id) if s.state == "running": logger.info(f"✅ Server {server_id} is running.") break @@ -63,16 +63,17 @@ def wait_test_instance_server(self, server_id): self.fail("Server did not reach 'running' state in time.") def create_test_instance_server(self) -> Server: - volume = { "0": VolumeServerTemplate(volume_type= "sbs_volume", - name="my-volume", - size=volume_size - )} + volume = { + "0": VolumeServerTemplate( + volume_type="sbs_volume", name="my-volume", size=volume_size + ) + } server = self.instanceAPI._create_server( commercial_type=commercial_type, zone=self.zone, name=server_name, dynamic_ip_required=True, - volumes=volume + volumes=volume, ) logger.info(f"✅ Created server: {server.id}") self._server = server.server @@ -83,23 +84,20 @@ def create_test_from_empty_volume(self, number) -> Dict[str, Volume]: volumes: Dict[str, Volume] = {} for i in range(number): volume = self.blockAPI.create_volume( - project_id="19e2fd0b-3d53-4f8f-9338-629df9c1b1db", - from_empty=CreateVolumeRequestFromEmpty(size=10) + project_id="19e2fd0b-3d53-4f8f-9338-629df9c1b1db", + from_empty=CreateVolumeRequestFromEmpty(size=10), ) logger.info("✅ Created server: {volume.id}") self._volumes.append(volume) # Ensure cleanup in tearDown volumes[str(i)] = volume - - return volumes - + return volumes def test_attach_aditionnal_volume(self): server = self.create_test_instance_server() additional_volumes = self.create_test_from_empty_volume(1) additional_volume = list(additional_volumes.values())[0] - self.assertIsNotNone(server.id) self.assertEqual(server.zone, self.zone) @@ -108,15 +106,18 @@ def test_attach_aditionnal_volume(self): logger.info(f"✅ Volume created with ID: {additional_volume.id}") self.instanceAPI.attach_server_volume( - server_id=server.id, - volume_id=additional_volume.id + server_id=server.id, volume_id=additional_volume.id ) logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}") time.sleep(5) - updated_server = self.instanceAPI.get_server(zone=self.zone, server_id=server.id) + updated_server = self.instanceAPI.get_server( + zone=self.zone, server_id=server.id + ) attached_volumes = updated_server.volumes or {} attached_volume_ids = [v.volume.id for v in attached_volumes.values()] self.assertIn(additional_volume.id, attached_volume_ids) - logger.info(f"✅ Volume {additional_volume.id} is attached to server {server.id}") + logger.info( + f"✅ Volume {additional_volume.id} is attached to server {server.id}" + ) From a5e389bcc8965f2e267d1e09fabe0dd94240ac81 Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Fri, 20 Jun 2025 11:44:00 +0200 Subject: [PATCH 03/11] Delete docs/module.rst --- docs/module.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/module.rst diff --git a/docs/module.rst b/docs/module.rst deleted file mode 100644 index e69de29bb..000000000 From 7b3c226113cf9a6038bb3929e751c44be41e0ba9 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 12:02:12 +0200 Subject: [PATCH 04/11] tests: skip api-test --- scaleway/tests/test_test_v1.py | 2 +- scaleway/tests/test_test_v1_marshalling.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/scaleway/tests/test_test_v1.py b/scaleway/tests/test_test_v1.py index cf5fc8ef4..ddcf5dd92 100644 --- a/scaleway/tests/test_test_v1.py +++ b/scaleway/tests/test_test_v1.py @@ -7,7 +7,7 @@ from scaleway import Client, WaitForOptions from scaleway.test.v1 import EyeColors, Human, HumanStatus, TestV1API - +@unittest.skip("API test is not deploy") class TestTestV1(unittest.TestCase): def setUp(self) -> None: client = Client.from_config_file_and_env() diff --git a/scaleway/tests/test_test_v1_marshalling.py b/scaleway/tests/test_test_v1_marshalling.py index 8b8abf82d..738c886fa 100644 --- a/scaleway/tests/test_test_v1_marshalling.py +++ b/scaleway/tests/test_test_v1_marshalling.py @@ -20,7 +20,6 @@ system_random = random.SystemRandom() - def _mock_human_raw() -> Dict[str, Any]: altitude_in_meter = system_random.randint(0, 100) created_at = utils.random_date_string( @@ -67,8 +66,7 @@ def _mock_human() -> Human: name=utils.random_name(), project_id=str(uuid.uuid4()), ) - - +@unittest.skip("API test is not deploy") class TestTestV1UnmarshallingHuman(unittest.TestCase): def _assert_raw_and_unmarshalled_human( self, @@ -126,7 +124,6 @@ def test_unmarshal_ListHumansResponse(self) -> None: humans[i], list_humans_response.humans[i] ) - def _mock_create_human_request() -> CreateHumanRequest: human = _mock_human() @@ -144,7 +141,7 @@ def _mock_create_human_request() -> CreateHumanRequest: organization_id=human.organization_id, ) - +@unittest.skip("API test is not deploy") class TestTestV1MarshallingCreateHumanRequest(unittest.TestCase): def _assert_create_human_request_and_raw( self, From b998fe3b07c1490d76d7fafba36aa08eae0f00d5 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 14:49:08 +0200 Subject: [PATCH 05/11] fix: remove try except from teardown, make const --- scaleway/tests/test_instance.py | 50 ++++++++++------------ scaleway/tests/test_test_v1.py | 3 +- scaleway/tests/test_test_v1_marshalling.py | 9 +++- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 0007cce4e..bf885d540 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -1,6 +1,6 @@ import logging import sys -from typing import Dict +from typing import List import unittest import uuid import time @@ -17,14 +17,17 @@ logger.addHandler(stream_handler) server_name = f"test-sdk-python-{uuid.uuid4().hex[:6]}" -timeout = 10 +max_retry = 10 +interval = 10 volume_size = 10 commercial_type = "DEV1-S" +zone = "fr-par-1" +timeout_attach = 10 class TestE2EServerCreation(unittest.TestCase): def setUp(self) -> None: - self.zone = "fr-par-1" + self.zone = zone self.client = Client.from_config_file_and_env() self.instanceAPI = InstanceV1API(self.client, bypass_validation=True) self.blockAPI = BlockV1Alpha1API(self.client, bypass_validation=True) @@ -33,32 +36,24 @@ def setUp(self) -> None: def tearDown(self) -> None: for volume in self._volumes: - try: - self.instanceAPI.detach_server_volume( - server_id=self._server.id, volume_id=volume.id - ) - logger.info("✅ Volume {volume.id} has been detach") - except Exception as e: - logger.warning(f"Failed to detach volume {volume.id}: {e}") - try: - self.blockAPI.delete_volume(volume_id=volume.id) - logger.info("✅ Volume {volume.id} has been deleted") - except Exception as e: - logger.warning(f"Failed to delete volume {volume.id}: {e}") + self.instanceAPI.detach_server_volume( + server_id=self._server.id, volume_id=volume.id + ) + logger.info("✅ Volume {volume.id} has been detach") + + self.blockAPI.delete_volume(volume_id=volume.id) + logger.info("✅ Volume {volume.id} has been deleted") if self._server: - try: - self.api.delete_server(zone=self.zone, server_id=self._server.id) - logger.info(f"🗑️ Deleted server: {self._server.id}") - except Exception as e: - logger.warning(f"Failed to delete server {self._server.id}: {e}") + self.api.delete_server(zone=self.zone, server_id=self._server.id) + logger.info(f"🗑️ Deleted server: {self._server.id}") def wait_test_instance_server(self, server_id): - for _ in range(10): + for i in range(1, max_retry): + interval *= i s = self.api.get_server(zone=self.zone, server_id=server_id) if s.state == "running": - logger.info(f"✅ Server {server_id} is running.") break - time.sleep(timeout) + time.sleep(interval) else: self.fail("Server did not reach 'running' state in time.") @@ -80,16 +75,15 @@ def create_test_instance_server(self) -> Server: self.wait_test_instance_server(server_id=server.server.id) return server.server - def create_test_from_empty_volume(self, number) -> Dict[str, Volume]: - volumes: Dict[str, Volume] = {} + def create_test_from_empty_volume(self, number) -> List[Volume]: + volumes: List[Volume] = {} for i in range(number): volume = self.blockAPI.create_volume( - project_id="19e2fd0b-3d53-4f8f-9338-629df9c1b1db", from_empty=CreateVolumeRequestFromEmpty(size=10), ) logger.info("✅ Created server: {volume.id}") self._volumes.append(volume) # Ensure cleanup in tearDown - volumes[str(i)] = volume + volumes.append(volume) return volumes @@ -110,7 +104,7 @@ def test_attach_aditionnal_volume(self): ) logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}") - time.sleep(5) + time.sleep(timeout_attach) updated_server = self.instanceAPI.get_server( zone=self.zone, server_id=server.id diff --git a/scaleway/tests/test_test_v1.py b/scaleway/tests/test_test_v1.py index ddcf5dd92..cc87f70c8 100644 --- a/scaleway/tests/test_test_v1.py +++ b/scaleway/tests/test_test_v1.py @@ -7,7 +7,8 @@ from scaleway import Client, WaitForOptions from scaleway.test.v1 import EyeColors, Human, HumanStatus, TestV1API -@unittest.skip("API test is not deploy") + +@unittest.skip("API test is not deployed") class TestTestV1(unittest.TestCase): def setUp(self) -> None: client = Client.from_config_file_and_env() diff --git a/scaleway/tests/test_test_v1_marshalling.py b/scaleway/tests/test_test_v1_marshalling.py index 738c886fa..bf7571442 100644 --- a/scaleway/tests/test_test_v1_marshalling.py +++ b/scaleway/tests/test_test_v1_marshalling.py @@ -20,6 +20,7 @@ system_random = random.SystemRandom() + def _mock_human_raw() -> Dict[str, Any]: altitude_in_meter = system_random.randint(0, 100) created_at = utils.random_date_string( @@ -66,7 +67,9 @@ def _mock_human() -> Human: name=utils.random_name(), project_id=str(uuid.uuid4()), ) -@unittest.skip("API test is not deploy") + + +@unittest.skip("API test is not deployed") class TestTestV1UnmarshallingHuman(unittest.TestCase): def _assert_raw_and_unmarshalled_human( self, @@ -124,6 +127,7 @@ def test_unmarshal_ListHumansResponse(self) -> None: humans[i], list_humans_response.humans[i] ) + def _mock_create_human_request() -> CreateHumanRequest: human = _mock_human() @@ -141,7 +145,8 @@ def _mock_create_human_request() -> CreateHumanRequest: organization_id=human.organization_id, ) -@unittest.skip("API test is not deploy") + +@unittest.skip("API test is not deployed") class TestTestV1MarshallingCreateHumanRequest(unittest.TestCase): def _assert_create_human_request_and_raw( self, From 9ba8427d4538ca9dc8d91a5fc83e5f04b619e6b2 Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Fri, 20 Jun 2025 14:58:49 +0200 Subject: [PATCH 06/11] Update scaleway/tests/test_instance.py Co-authored-by: Guillaume Noale --- scaleway/tests/test_instance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index bf885d540..128e957f3 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -18,7 +18,7 @@ server_name = f"test-sdk-python-{uuid.uuid4().hex[:6]}" max_retry = 10 -interval = 10 +interval = 0.1 volume_size = 10 commercial_type = "DEV1-S" zone = "fr-par-1" From e7f28fd3cea96c25a3c22f041285b237b78ce7b3 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 14:49:08 +0200 Subject: [PATCH 07/11] fix: remove try except from teardown, make const --- scaleway/tests/test_instance.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 128e957f3..e8d4008b5 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -48,10 +48,12 @@ def tearDown(self) -> None: logger.info(f"🗑️ Deleted server: {self._server.id}") def wait_test_instance_server(self, server_id): + interval = interval for i in range(1, max_retry): interval *= i s = self.api.get_server(zone=self.zone, server_id=server_id) if s.state == "running": + logger.info(f"✅ Server {server_id} is running.") break time.sleep(interval) else: From 74b9c219f36b36d3c3928204b4854d184175c0b2 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 15:29:49 +0200 Subject: [PATCH 08/11] fix: add waiter additionnal volume --- scaleway/tests/test_instance.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index e8d4008b5..303c9cbd1 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -44,14 +44,14 @@ def tearDown(self) -> None: self.blockAPI.delete_volume(volume_id=volume.id) logger.info("✅ Volume {volume.id} has been deleted") if self._server: - self.api.delete_server(zone=self.zone, server_id=self._server.id) + self.instanceAPI.delete_server(zone=self.zone, server_id=self._server.id) logger.info(f"🗑️ Deleted server: {self._server.id}") def wait_test_instance_server(self, server_id): interval = interval for i in range(1, max_retry): interval *= i - s = self.api.get_server(zone=self.zone, server_id=server_id) + s = self.instanceAPI.get_server(zone=self.zone, server_id=server_id) if s.state == "running": logger.info(f"✅ Server {server_id} is running.") break @@ -84,6 +84,7 @@ def create_test_from_empty_volume(self, number) -> List[Volume]: from_empty=CreateVolumeRequestFromEmpty(size=10), ) logger.info("✅ Created server: {volume.id}") + self.blockAPI.wait_for_volume(volume_id=volume.id, zone=self.zone) self._volumes.append(volume) # Ensure cleanup in tearDown volumes.append(volume) @@ -92,7 +93,7 @@ def create_test_from_empty_volume(self, number) -> List[Volume]: def test_attach_aditionnal_volume(self): server = self.create_test_instance_server() additional_volumes = self.create_test_from_empty_volume(1) - additional_volume = list(additional_volumes.values())[0] + additional_volume = additional_volumes.values()[0] self.assertIsNotNone(server.id) self.assertEqual(server.zone, self.zone) @@ -104,9 +105,10 @@ def test_attach_aditionnal_volume(self): self.instanceAPI.attach_server_volume( server_id=server.id, volume_id=additional_volume.id ) - logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}") - time.sleep(timeout_attach) + self.blockAPI.wait_for_volume(volume_id=additional_volume.id, zone=self.zone) + + logger.info(f"🔗 Attached volume {additional_volume.id} to server {server.id}") updated_server = self.instanceAPI.get_server( zone=self.zone, server_id=server.id From fb485ab1d2fb42912372f6f40ae34ffd260aed57 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 15:48:38 +0200 Subject: [PATCH 09/11] remove unnecessary else --- scaleway/tests/test_instance.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 303c9cbd1..35c7c8cf1 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -56,8 +56,7 @@ def wait_test_instance_server(self, server_id): logger.info(f"✅ Server {server_id} is running.") break time.sleep(interval) - else: - self.fail("Server did not reach 'running' state in time.") + self.fail("Server did not reach 'running' state in time.") def create_test_instance_server(self) -> Server: volume = { From 8b1641a2fbf63399010016ad66abe2865a24197f Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 16:09:19 +0200 Subject: [PATCH 10/11] Improve code readability --- scaleway/tests/test_instance.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 35c7c8cf1..6059a4115 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -22,7 +22,6 @@ volume_size = 10 commercial_type = "DEV1-S" zone = "fr-par-1" -timeout_attach = 10 class TestE2EServerCreation(unittest.TestCase): @@ -43,19 +42,24 @@ def tearDown(self) -> None: self.blockAPI.delete_volume(volume_id=volume.id) logger.info("✅ Volume {volume.id} has been deleted") + if self._server: self.instanceAPI.delete_server(zone=self.zone, server_id=self._server.id) logger.info(f"🗑️ Deleted server: {self._server.id}") def wait_test_instance_server(self, server_id): interval = interval + for i in range(1, max_retry): interval *= i s = self.instanceAPI.get_server(zone=self.zone, server_id=server_id) + if s.state == "running": logger.info(f"✅ Server {server_id} is running.") break + time.sleep(interval) + self.fail("Server did not reach 'running' state in time.") def create_test_instance_server(self) -> Server: @@ -64,6 +68,7 @@ def create_test_instance_server(self) -> Server: volume_type="sbs_volume", name="my-volume", size=volume_size ) } + server = self.instanceAPI._create_server( commercial_type=commercial_type, zone=self.zone, @@ -72,18 +77,24 @@ def create_test_instance_server(self) -> Server: volumes=volume, ) logger.info(f"✅ Created server: {server.id}") + self._server = server.server + self.wait_test_instance_server(server_id=server.server.id) + return server.server def create_test_from_empty_volume(self, number) -> List[Volume]: volumes: List[Volume] = {} + for i in range(number): volume = self.blockAPI.create_volume( from_empty=CreateVolumeRequestFromEmpty(size=10), ) logger.info("✅ Created server: {volume.id}") + self.blockAPI.wait_for_volume(volume_id=volume.id, zone=self.zone) + self._volumes.append(volume) # Ensure cleanup in tearDown volumes.append(volume) From 48f41065594591e992bd416825254d1f4b617f55 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 20 Jun 2025 16:55:50 +0200 Subject: [PATCH 11/11] chore: fix make test --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 6305d12f4..da8da6bfa 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ lint: test: for lib in $(LIBRARIES); do \ cd ${WORKDIR}/$$lib && \ + poetry install && \ poetry run python -m unittest discover -s tests -v; \ done