From caa688973ed9a861eb28b352018ebbff7ff08b03 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 6 Jan 2025 17:01:42 +0100 Subject: [PATCH 01/16] add modul --- docs/module.rst | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/module.rst diff --git a/docs/module.rst b/docs/module.rst new file mode 100644 index 000000000..553f82423 --- /dev/null +++ b/docs/module.rst @@ -0,0 +1,6 @@ +guide +===== + +.. toctree:: + :maxdepth: 4 + From af7604df21d5d9bf4a7d2c1936263990dec2d346 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 6 Jan 2025 17:03:09 +0100 Subject: [PATCH 02/16] rm module --- docs/module.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/module.rst b/docs/module.rst index 553f82423..e69de29bb 100644 --- a/docs/module.rst +++ b/docs/module.rst @@ -1,6 +0,0 @@ -guide -===== - -.. toctree:: - :maxdepth: 4 - From 5e6138ca4b6e23aae46e9e4488048db4d4d73023 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 15 Jan 2025 15:23:56 +0100 Subject: [PATCH 03/16] feat(tem): add blocklisted flag (#830) From e8541fd99fe7fa84b1690963d827cf8582de4d9c Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 09:38:19 +0200 Subject: [PATCH 04/16] tests: add regression tests vpc and mute instance --- scaleway-async/tests/test_test_v1.py | 2 +- scaleway/tests/test_instance.py | 10 +- scaleway/tests/test_test_v1.py | 5 +- scaleway/tests/test_test_v1_marshalling.py | 4 + scaleway/tests/test_vpc.py | 110 +++++++++++++++++++++ 5 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 scaleway/tests/test_vpc.py diff --git a/scaleway-async/tests/test_test_v1.py b/scaleway-async/tests/test_test_v1.py index 7e7fdaeaf..0bbd1189e 100644 --- a/scaleway-async/tests/test_test_v1.py +++ b/scaleway-async/tests/test_test_v1.py @@ -7,7 +7,7 @@ from scaleway_async import Client, WaitForOptions from scaleway_async.test.v1 import EyeColors, Human, HumanStatus, TestV1API - +@unittest.skip("API test is not deployed") class TestTestV1(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self) -> None: client = Client.from_config_file_and_env() diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 6059a4115..d4cd95210 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -23,7 +23,7 @@ commercial_type = "DEV1-S" zone = "fr-par-1" - +@unittest.skip("Skipping this test temporarily") class TestE2EServerCreation(unittest.TestCase): def setUp(self) -> None: self.zone = zone @@ -38,10 +38,10 @@ def tearDown(self) -> None: self.instanceAPI.detach_server_volume( server_id=self._server.id, volume_id=volume.id ) - logger.info("✅ Volume {volume.id} has been detach") + logger.info(f"✅ Volume {volume.id} has been detach") self.blockAPI.delete_volume(volume_id=volume.id) - logger.info("✅ Volume {volume.id} has been deleted") + logger.info(f"✅ Volume {volume.id} has been deleted") if self._server: self.instanceAPI.delete_server(zone=self.zone, server_id=self._server.id) @@ -60,7 +60,7 @@ def wait_test_instance_server(self, server_id): time.sleep(interval) - self.fail("Server did not reach 'running' state in time.") + self.fail(f"Server did not reach 'running' state in time.") def create_test_instance_server(self) -> Server: volume = { @@ -91,7 +91,7 @@ def create_test_from_empty_volume(self, number) -> List[Volume]: volume = self.blockAPI.create_volume( from_empty=CreateVolumeRequestFromEmpty(size=10), ) - logger.info("✅ Created server: {volume.id}") + logger.info(f"✅ Created server: {volume.id}") self.blockAPI.wait_for_volume(volume_id=volume.id, zone=self.zone) diff --git a/scaleway/tests/test_test_v1.py b/scaleway/tests/test_test_v1.py index cc87f70c8..2c31aed58 100644 --- a/scaleway/tests/test_test_v1.py +++ b/scaleway/tests/test_test_v1.py @@ -19,6 +19,7 @@ def setUp(self) -> None: client.secret_key = res.secret_key client.default_project_id = "00000000-0000-0000-0000-000000000000" + def test_create_human(self) -> None: name = utils.random_name() @@ -42,10 +43,12 @@ def test_list_humans(self) -> None: humans = self.api.list_humans() self.assertTrue(isinstance(humans.humans, list)) + def test_list_humans_all(self) -> None: humans = self.api.list_humans_all() self.assertTrue(isinstance(humans, list)) + def test_get_human(self) -> None: name = utils.random_name() @@ -120,7 +123,7 @@ def test_delete_human(self) -> None: except Exception as e: self.assertNotIsInstance(e, TimeoutError) pass - + def test_run_human(self) -> None: name = utils.random_name() diff --git a/scaleway/tests/test_test_v1_marshalling.py b/scaleway/tests/test_test_v1_marshalling.py index bf7571442..cd0506468 100644 --- a/scaleway/tests/test_test_v1_marshalling.py +++ b/scaleway/tests/test_test_v1_marshalling.py @@ -105,11 +105,13 @@ def _assert_raw_and_unmarshalled_human( raw["updated_at"], ) + @unittest.skip("API test is not deployed") def test_unmarshal_Human(self) -> None: data = _mock_human_raw() human = unmarshal_Human(data) self._assert_raw_and_unmarshalled_human(data, human) + @unittest.skip("API test is not deployed") def test_unmarshal_ListHumansResponse(self) -> None: humans = [_mock_human_raw() for _ in range(10)] data = { @@ -164,6 +166,8 @@ def _assert_create_human_request_and_raw( self.assertEqual(request.name, raw["name"]) self.assertEqual(request.shoe_size, raw["shoe_size"]) + + @unittest.skip("API test is not deployed") def test_marshal_CreateHumanRequest(self) -> None: request = _mock_create_human_request() raw = marshal_CreateHumanRequest(request, utils.random_profile_defaults()) diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py new file mode 100644 index 000000000..f2c8450d0 --- /dev/null +++ b/scaleway/tests/test_vpc.py @@ -0,0 +1,110 @@ +import logging +import sys +import unittest +from scaleway.vpc.v2 import VpcV2API +from scaleway_core.api import ScalewayException +from scaleway_core.client import Client +from scaleway_core.utils import random_name + +logger = logging.getLogger() +logger.level = logging.DEBUG +stream_handler = logging.StreamHandler(sys.stdout) +logger.addHandler(stream_handler) + +region = "fr-par" +tags = ["sdk-python", "regression-test"] + +class TestScalewayVPCV2(unittest.TestCase): + @classmethod + def setUpClass(self): + self.client = Client.from_config_file_and_env() + self.vpcAPI = VpcV2API(self.client) + self.project_id = self.client.default_project_id + self.region = region + self._vpc= None + self._pns_to_cleanup = [] + + self._vpc = self.vpcAPI.create_vpc( + enable_routing=True, + region=self.region, + project_id=self.project_id, + name=random_name("vpc-test-sdk-python") + ) + logger.info(f"✅ VPC {self._vpc.id} has been created") + + @classmethod + def tearDownClass(self): + for pn in self._pns_to_cleanup: + self.vpcAPI.delete_private_network(private_network_id=pn.id) + logger.info(f"🧹 Deleted Private Network {pn.id}") + + if self._vpc is not None: + self.vpcAPI.delete_vpc(vpc_id=self._vpc.id, region=self.region) + logger.info(f"🧹 Deleted VPC {self._vpc.id}") + + def test_delete_vpc(self): + vpc = self.vpcAPI.create_vpc( + enable_routing=True, + region=self.region, + project_id=self.project_id, + name=random_name("vpc-test-sdk-python") + ) + logger.info(f"✅ VPC {vpc.id} has been created") + self.assertIsNotNone(vpc.id) + self.assertEqual(vpc.region, self.region) + + self.vpcAPI.delete_vpc(vpc_id=vpc.id) + logger.info(f"🗑️ VPC {vpc.id} deletion requested") + + with self.assertRaises(ScalewayException): + self.vpcAPI.get_vpc(vpc_id=vpc.id) + logger.info(f"✅ VPC {vpc.id} has been deleted successfully") + + def test_list_vpcs(self): + vpcs = self.vpcAPI.list_vp_cs(region=self.region).vpcs + logger.info(f"🔎 Listed {len(vpcs)} VPC(s) in region: {self.region}") + self.assertIsInstance(vpcs, list) + + def test_create_private_network(self): + for i in range(5): + pn = self.vpcAPI.create_private_network( + vpc_id=self._vpc.id, + default_route_propagation_enabled=True, + project_id=self.project_id, + name=random_name(f"pn-{i}") + ) + self._pns_to_cleanup.append(pn) + logger.info(f"✅ PN {i+1}/5: {pn.id} created in VPC {self._vpc.id}") + self.assertEqual(pn.vpc_id, self._vpc.id) + + def test_list_private_network(self): + networks = self.vpcAPI.list_private_networks(region=self.region) + logger.info(f"🔎 Listed {networks.total_count} private network(s) in region: {self.region}") + self.assertIsInstance(networks.private_networks, list) + + def test_get_vpc(self): + vpc = self.vpcAPI.get_vpc(vpc_id=self._vpc.id, region=self.region) + logger.info(f"📥 Retrieved VPC {vpc.id}") + self.assertIsNotNone(vpc) + self.assertEqual(self._vpc.id, vpc.id) + + def test_update_vpc(self): + vpc = self.vpcAPI.update_vpc(vpc_id=self._vpc.id, tags=tags) + logger.info(f"🛠️ Updated VPC {vpc.id} with tags: {tags}") + self.assertEqual(vpc.tags, tags) + self.assertEqual(self._vpc.id, vpc.id) + + def test_list_vpc_all(self): + vpcs = self.vpcAPI.list_vp_cs_all() + logger.info(f"📥 Retrieved total of {len(vpcs)} VPC(s) across all regions") + self.assertIsInstance(vpcs, list) + + + + + + + + + + \ No newline at end of file From c75cd1b2f6f606488076ac214df543ce4665e933 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 09:39:31 +0200 Subject: [PATCH 05/16] chore: activate tests in workflow --- .github/workflows/checks.yml | 62 +++++++++++----------- scaleway-async/tests/test_test_v1.py | 1 + scaleway/tests/test_instance.py | 1 + scaleway/tests/test_test_v1.py | 5 +- scaleway/tests/test_test_v1_marshalling.py | 1 - scaleway/tests/test_vpc.py | 27 ++++------ 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 21218dbcf..4318b893a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -88,34 +88,34 @@ jobs: - name: Check linting run: poetry run ruff check . --ignore E721 --ignore F541 - # tests: - # runs-on: ubuntu-latest - # strategy: - # matrix: - # lib: - # - scaleway-core - # - scaleway - # - scaleway-async - # defaults: - # run: - # working-directory: ${{ matrix.lib }} - # steps: - # - uses: actions/checkout@v4 - # - name: Set up Python - # uses: actions/setup-python@v5 - # with: - # python-version: "3.10" - # - name: Install poetry - # run: | - # pip install poetry - # poetry --version - # - name: Install dependencies and library - # run: poetry install - # - name: Run tests - # run: poetry run python -m unittest discover -s tests -v - # env: - # SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY }} - # SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} - # SCW_DEFAULT_PROJECT_ID: ${{ secrets.SCW_DEFAULT_PROJECT_ID }} - # SCW_DEFAULT_REGION: ${{ secrets.SCW_DEFAULT_REGION }} - # SCW_DEFAULT_ZONE: ${{ secrets.SCW_DEFAULT_ZONE }} + tests: + runs-on: ubuntu-latest + strategy: + matrix: + lib: + - scaleway-core + - scaleway + - scaleway-async + defaults: + run: + working-directory: ${{ matrix.lib }} + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + - name: Install poetry + run: | + pip install poetry + poetry --version + - name: Install dependencies and library + run: poetry install + - name: Run tests + run: poetry run python -m unittest discover -s tests -v + env: + SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY }} + SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} + SCW_DEFAULT_PROJECT_ID: ${{ secrets.SCW_DEFAULT_PROJECT_ID }} + SCW_DEFAULT_REGION: ${{ secrets.SCW_DEFAULT_REGION }} + SCW_DEFAULT_ZONE: ${{ secrets.SCW_DEFAULT_ZONE }} diff --git a/scaleway-async/tests/test_test_v1.py b/scaleway-async/tests/test_test_v1.py index 0bbd1189e..8b1b8a939 100644 --- a/scaleway-async/tests/test_test_v1.py +++ b/scaleway-async/tests/test_test_v1.py @@ -7,6 +7,7 @@ from scaleway_async import Client, WaitForOptions from scaleway_async.test.v1 import EyeColors, Human, HumanStatus, TestV1API + @unittest.skip("API test is not deployed") class TestTestV1(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self) -> None: diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index d4cd95210..c9cdfb054 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -23,6 +23,7 @@ commercial_type = "DEV1-S" zone = "fr-par-1" + @unittest.skip("Skipping this test temporarily") class TestE2EServerCreation(unittest.TestCase): def setUp(self) -> None: diff --git a/scaleway/tests/test_test_v1.py b/scaleway/tests/test_test_v1.py index 2c31aed58..cc87f70c8 100644 --- a/scaleway/tests/test_test_v1.py +++ b/scaleway/tests/test_test_v1.py @@ -19,7 +19,6 @@ def setUp(self) -> None: client.secret_key = res.secret_key client.default_project_id = "00000000-0000-0000-0000-000000000000" - def test_create_human(self) -> None: name = utils.random_name() @@ -43,12 +42,10 @@ def test_list_humans(self) -> None: humans = self.api.list_humans() self.assertTrue(isinstance(humans.humans, list)) - def test_list_humans_all(self) -> None: humans = self.api.list_humans_all() self.assertTrue(isinstance(humans, list)) - def test_get_human(self) -> None: name = utils.random_name() @@ -123,7 +120,7 @@ def test_delete_human(self) -> None: except Exception as e: self.assertNotIsInstance(e, TimeoutError) pass - + def test_run_human(self) -> None: name = utils.random_name() diff --git a/scaleway/tests/test_test_v1_marshalling.py b/scaleway/tests/test_test_v1_marshalling.py index cd0506468..93f7c53fe 100644 --- a/scaleway/tests/test_test_v1_marshalling.py +++ b/scaleway/tests/test_test_v1_marshalling.py @@ -166,7 +166,6 @@ def _assert_create_human_request_and_raw( self.assertEqual(request.name, raw["name"]) self.assertEqual(request.shoe_size, raw["shoe_size"]) - @unittest.skip("API test is not deployed") def test_marshal_CreateHumanRequest(self) -> None: request = _mock_create_human_request() diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index f2c8450d0..063ab57af 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -14,6 +14,7 @@ region = "fr-par" tags = ["sdk-python", "regression-test"] + class TestScalewayVPCV2(unittest.TestCase): @classmethod def setUpClass(self): @@ -21,14 +22,14 @@ def setUpClass(self): self.vpcAPI = VpcV2API(self.client) self.project_id = self.client.default_project_id self.region = region - self._vpc= None + self._vpc = None self._pns_to_cleanup = [] self._vpc = self.vpcAPI.create_vpc( enable_routing=True, region=self.region, project_id=self.project_id, - name=random_name("vpc-test-sdk-python") + name=random_name("vpc-test-sdk-python"), ) logger.info(f"✅ VPC {self._vpc.id} has been created") @@ -47,7 +48,7 @@ def test_delete_vpc(self): enable_routing=True, region=self.region, project_id=self.project_id, - name=random_name("vpc-test-sdk-python") + name=random_name("vpc-test-sdk-python"), ) logger.info(f"✅ VPC {vpc.id} has been created") self.assertIsNotNone(vpc.id) @@ -71,15 +72,17 @@ def test_create_private_network(self): vpc_id=self._vpc.id, default_route_propagation_enabled=True, project_id=self.project_id, - name=random_name(f"pn-{i}") + name=random_name(f"pn-{i}"), ) self._pns_to_cleanup.append(pn) - logger.info(f"✅ PN {i+1}/5: {pn.id} created in VPC {self._vpc.id}") + logger.info(f"✅ PN {i + 1}/5: {pn.id} created in VPC {self._vpc.id}") self.assertEqual(pn.vpc_id, self._vpc.id) def test_list_private_network(self): networks = self.vpcAPI.list_private_networks(region=self.region) - logger.info(f"🔎 Listed {networks.total_count} private network(s) in region: {self.region}") + logger.info( + f"🔎 Listed {networks.total_count} private network(s) in region: {self.region}" + ) self.assertIsInstance(networks.private_networks, list) def test_get_vpc(self): @@ -93,18 +96,8 @@ def test_update_vpc(self): logger.info(f"🛠️ Updated VPC {vpc.id} with tags: {tags}") self.assertEqual(vpc.tags, tags) self.assertEqual(self._vpc.id, vpc.id) - + def test_list_vpc_all(self): vpcs = self.vpcAPI.list_vp_cs_all() logger.info(f"📥 Retrieved total of {len(vpcs)} VPC(s) across all regions") self.assertIsInstance(vpcs, list) - - - - - - - - - - \ No newline at end of file From d702461f9dadf201c889cf8c069e62e83d24d1fe Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 09:51:59 +0200 Subject: [PATCH 06/16] tests: fix client setup --- scaleway/tests/test_total_count_legacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaleway/tests/test_total_count_legacy.py b/scaleway/tests/test_total_count_legacy.py index c49f025f3..e3de6cac0 100644 --- a/scaleway/tests/test_total_count_legacy.py +++ b/scaleway/tests/test_total_count_legacy.py @@ -12,7 +12,7 @@ class TestTotalCountLegacy(unittest.TestCase): def setUp(self) -> None: - self.client = Client() + self.client = Client.from_config_file_and_env() self.instance_api = InstanceV1API(self.client, bypass_validation=True) def test_list_servers_type(self): From a2714f24089646b04c8a858694e86f43994e6418 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 12:10:24 +0200 Subject: [PATCH 07/16] tests: remove logs --- scaleway/tests/test_instance.py | 18 ------------------ scaleway/tests/test_vpc.py | 26 +++++--------------------- 2 files changed, 5 insertions(+), 39 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index c9cdfb054..8abc50781 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -1,5 +1,3 @@ -import logging -import sys from typing import List import unittest import uuid @@ -11,10 +9,6 @@ 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]}" max_retry = 10 @@ -39,14 +33,11 @@ def tearDown(self) -> None: self.instanceAPI.detach_server_volume( server_id=self._server.id, volume_id=volume.id ) - logger.info(f"✅ Volume {volume.id} has been detach") self.blockAPI.delete_volume(volume_id=volume.id) - logger.info(f"✅ 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 @@ -56,7 +47,6 @@ def wait_test_instance_server(self, 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 time.sleep(interval) @@ -77,7 +67,6 @@ def create_test_instance_server(self) -> Server: dynamic_ip_required=True, volumes=volume, ) - logger.info(f"✅ Created server: {server.id}") self._server = server.server @@ -92,7 +81,6 @@ def create_test_from_empty_volume(self, number) -> List[Volume]: volume = self.blockAPI.create_volume( from_empty=CreateVolumeRequestFromEmpty(size=10), ) - logger.info(f"✅ Created server: {volume.id}") self.blockAPI.wait_for_volume(volume_id=volume.id, zone=self.zone) @@ -111,7 +99,6 @@ def test_attach_aditionnal_volume(self): 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 @@ -119,14 +106,9 @@ def test_attach_aditionnal_volume(self): 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 ) 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}" - ) diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index 063ab57af..7cf49e792 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -1,16 +1,9 @@ -import logging -import sys import unittest from scaleway.vpc.v2 import VpcV2API from scaleway_core.api import ScalewayException from scaleway_core.client import Client from scaleway_core.utils import random_name -logger = logging.getLogger() -logger.level = logging.DEBUG -stream_handler = logging.StreamHandler(sys.stdout) -logger.addHandler(stream_handler) - region = "fr-par" tags = ["sdk-python", "regression-test"] @@ -31,17 +24,14 @@ def setUpClass(self): project_id=self.project_id, name=random_name("vpc-test-sdk-python"), ) - logger.info(f"✅ VPC {self._vpc.id} has been created") @classmethod def tearDownClass(self): for pn in self._pns_to_cleanup: self.vpcAPI.delete_private_network(private_network_id=pn.id) - logger.info(f"🧹 Deleted Private Network {pn.id}") if self._vpc is not None: self.vpcAPI.delete_vpc(vpc_id=self._vpc.id, region=self.region) - logger.info(f"🧹 Deleted VPC {self._vpc.id}") def test_delete_vpc(self): vpc = self.vpcAPI.create_vpc( @@ -50,20 +40,17 @@ def test_delete_vpc(self): project_id=self.project_id, name=random_name("vpc-test-sdk-python"), ) - logger.info(f"✅ VPC {vpc.id} has been created") + self.assertIsNotNone(vpc.id) self.assertEqual(vpc.region, self.region) self.vpcAPI.delete_vpc(vpc_id=vpc.id) - logger.info(f"🗑️ VPC {vpc.id} deletion requested") with self.assertRaises(ScalewayException): self.vpcAPI.get_vpc(vpc_id=vpc.id) - logger.info(f"✅ VPC {vpc.id} has been deleted successfully") def test_list_vpcs(self): vpcs = self.vpcAPI.list_vp_cs(region=self.region).vpcs - logger.info(f"🔎 Listed {len(vpcs)} VPC(s) in region: {self.region}") self.assertIsInstance(vpcs, list) def test_create_private_network(self): @@ -75,29 +62,26 @@ def test_create_private_network(self): name=random_name(f"pn-{i}"), ) self._pns_to_cleanup.append(pn) - logger.info(f"✅ PN {i + 1}/5: {pn.id} created in VPC {self._vpc.id}") + self.assertEqual(pn.vpc_id, self._vpc.id) def test_list_private_network(self): networks = self.vpcAPI.list_private_networks(region=self.region) - logger.info( - f"🔎 Listed {networks.total_count} private network(s) in region: {self.region}" - ) self.assertIsInstance(networks.private_networks, list) def test_get_vpc(self): vpc = self.vpcAPI.get_vpc(vpc_id=self._vpc.id, region=self.region) - logger.info(f"📥 Retrieved VPC {vpc.id}") + self.assertIsNotNone(vpc) self.assertEqual(self._vpc.id, vpc.id) def test_update_vpc(self): vpc = self.vpcAPI.update_vpc(vpc_id=self._vpc.id, tags=tags) - logger.info(f"🛠️ Updated VPC {vpc.id} with tags: {tags}") + self.assertEqual(vpc.tags, tags) self.assertEqual(self._vpc.id, vpc.id) def test_list_vpc_all(self): vpcs = self.vpcAPI.list_vp_cs_all() - logger.info(f"📥 Retrieved total of {len(vpcs)} VPC(s) across all regions") + self.assertIsInstance(vpcs, list) From f59686631a425ad44946821a4410e0f246d49954 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 12:54:58 +0200 Subject: [PATCH 08/16] tests(vpc): check len methods list --- scaleway/tests/test_instance.py | 2 +- scaleway/tests/test_vpc.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 8abc50781..6781c141f 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -51,7 +51,7 @@ def wait_test_instance_server(self, server_id): time.sleep(interval) - self.fail(f"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 = { diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index 7cf49e792..4ef1c5ce8 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -6,6 +6,7 @@ region = "fr-par" tags = ["sdk-python", "regression-test"] +created_pn_count = 5 class TestScalewayVPCV2(unittest.TestCase): @@ -54,12 +55,12 @@ def test_list_vpcs(self): self.assertIsInstance(vpcs, list) def test_create_private_network(self): - for i in range(5): + for i in range(created_pn_count): pn = self.vpcAPI.create_private_network( vpc_id=self._vpc.id, default_route_propagation_enabled=True, project_id=self.project_id, - name=random_name(f"pn-{i}"), + name=random_name(f"sdk-python-pn-{i}"), ) self._pns_to_cleanup.append(pn) @@ -68,6 +69,7 @@ def test_create_private_network(self): def test_list_private_network(self): networks = self.vpcAPI.list_private_networks(region=self.region) self.assertIsInstance(networks.private_networks, list) + self.assertGreaterEqual(networks.total_count, created_pn_count) def test_get_vpc(self): vpc = self.vpcAPI.get_vpc(vpc_id=self._vpc.id, region=self.region) @@ -85,3 +87,4 @@ def test_list_vpc_all(self): vpcs = self.vpcAPI.list_vp_cs_all() self.assertIsInstance(vpcs, list) + self.assertGreaterEqual(len(vpcs), created_pn_count) From ce4379e31d0aa689bcf2b98535e18b7945210040 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 13:05:19 +0200 Subject: [PATCH 09/16] chore: update python version checks.yml --- .github/workflows/checks.yml | 5 +++-- scaleway/tests/test_vpc.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4318b893a..e5d09fe11 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -15,6 +15,7 @@ jobs: - scaleway-core - scaleway - scaleway-async + python-version: ['3.11', '3.12', '3.13'] defaults: run: working-directory: ${{ matrix.lib }} @@ -23,7 +24,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} - name: Install poetry run: | pip install poetry @@ -104,7 +105,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: - name: Install poetry run: | pip install poetry diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index 4ef1c5ce8..a740399c2 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -73,13 +73,13 @@ def test_list_private_network(self): def test_get_vpc(self): vpc = self.vpcAPI.get_vpc(vpc_id=self._vpc.id, region=self.region) - + self.assertIsNotNone(vpc) self.assertEqual(self._vpc.id, vpc.id) def test_update_vpc(self): vpc = self.vpcAPI.update_vpc(vpc_id=self._vpc.id, tags=tags) - + self.assertEqual(vpc.tags, tags) self.assertEqual(self._vpc.id, vpc.id) From cac0bcd4397ab5e0f4ee7fad07235e2480defce1 Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Wed, 25 Jun 2025 13:24:30 +0200 Subject: [PATCH 10/16] 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 63eb66d25df658ea84f2c9ba996f0dd55c7e52a1 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 15:01:40 +0200 Subject: [PATCH 11/16] test(vpc): add assert and remove redundant initialization --- scaleway/tests/test_vpc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index a740399c2..a931dd786 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -7,6 +7,7 @@ region = "fr-par" tags = ["sdk-python", "regression-test"] created_pn_count = 5 +created_vpc_count = 1 class TestScalewayVPCV2(unittest.TestCase): @@ -16,7 +17,6 @@ def setUpClass(self): self.vpcAPI = VpcV2API(self.client) self.project_id = self.client.default_project_id self.region = region - self._vpc = None self._pns_to_cleanup = [] self._vpc = self.vpcAPI.create_vpc( @@ -51,8 +51,9 @@ def test_delete_vpc(self): self.vpcAPI.get_vpc(vpc_id=vpc.id) def test_list_vpcs(self): - vpcs = self.vpcAPI.list_vp_cs(region=self.region).vpcs - self.assertIsInstance(vpcs, list) + vpcs = self.vpcAPI.list_vp_cs(region=self.region) + self.assertIsInstance(vpcs.vpcs, list) + self.assertGreaterEqual(vpcs.total_count, created_vpc_count) def test_create_private_network(self): for i in range(created_pn_count): From c3d41bdda465409d164e745363faf4e89fcbf6a0 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 15:05:16 +0200 Subject: [PATCH 12/16] chore: add python 3.10 --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index e5d09fe11..9729729ec 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -15,7 +15,7 @@ jobs: - scaleway-core - scaleway - scaleway-async - python-version: ['3.11', '3.12', '3.13'] + python-version: ['3.10' ,'3.11', '3.12', '3.13'] defaults: run: working-directory: ${{ matrix.lib }} From 8ce47b1fca218d00d1cc2e70491d26d430ea28c5 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 15:53:45 +0200 Subject: [PATCH 13/16] chore: add secrets to env --- .github/workflows/checks.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 9729729ec..d76cc64c6 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -50,7 +50,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} - name: Install poetry run: | pip install poetry @@ -76,7 +76,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} - name: Install poetry run: | pip install poetry @@ -105,7 +105,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: + python-version: ${{ matrix.python-version }} - name: Install poetry run: | pip install poetry @@ -113,10 +113,11 @@ jobs: - name: Install dependencies and library run: poetry install - name: Run tests - run: poetry run python -m unittest discover -s tests -v env: SCW_ACCESS_KEY: ${{ secrets.SCW_ACCESS_KEY }} SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} SCW_DEFAULT_PROJECT_ID: ${{ secrets.SCW_DEFAULT_PROJECT_ID }} + SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_DEFAULT_ORGANIZATION_ID }} SCW_DEFAULT_REGION: ${{ secrets.SCW_DEFAULT_REGION }} - SCW_DEFAULT_ZONE: ${{ secrets.SCW_DEFAULT_ZONE }} + run: poetry run python -m unittest discover -s tests -v + From 05390bbf862288c931cbea2119fb0d0d0fab946e Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 16:20:43 +0200 Subject: [PATCH 14/16] tests(vpc): change init Client method --- scaleway/tests/test_vpc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaleway/tests/test_vpc.py b/scaleway/tests/test_vpc.py index a931dd786..9ccbe2423 100644 --- a/scaleway/tests/test_vpc.py +++ b/scaleway/tests/test_vpc.py @@ -13,7 +13,7 @@ class TestScalewayVPCV2(unittest.TestCase): @classmethod def setUpClass(self): - self.client = Client.from_config_file_and_env() + self.client = Client.from_env() self.vpcAPI = VpcV2API(self.client) self.project_id = self.client.default_project_id self.region = region From 880b885f4475887b95f98ecb724958593ff45895 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 16:21:04 +0200 Subject: [PATCH 15/16] tests(vpc): change init Client method --- scaleway/tests/test_total_count_legacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaleway/tests/test_total_count_legacy.py b/scaleway/tests/test_total_count_legacy.py index e3de6cac0..3b22ceec1 100644 --- a/scaleway/tests/test_total_count_legacy.py +++ b/scaleway/tests/test_total_count_legacy.py @@ -12,7 +12,7 @@ class TestTotalCountLegacy(unittest.TestCase): def setUp(self) -> None: - self.client = Client.from_config_file_and_env() + self.client = Client.from_env() self.instance_api = InstanceV1API(self.client, bypass_validation=True) def test_list_servers_type(self): From 69277f6f351fd0cae226c8097688d686cf9621bd Mon Sep 17 00:00:00 2001 From: Laure-di Date: Wed, 25 Jun 2025 16:27:57 +0200 Subject: [PATCH 16/16] tests(vpc): change init Client method --- .github/workflows/checks.yml | 1 + scaleway/tests/test_instance.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index d76cc64c6..f19850497 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -119,5 +119,6 @@ jobs: SCW_DEFAULT_PROJECT_ID: ${{ secrets.SCW_DEFAULT_PROJECT_ID }} SCW_DEFAULT_ORGANIZATION_ID: ${{ secrets.SCW_DEFAULT_ORGANIZATION_ID }} SCW_DEFAULT_REGION: ${{ secrets.SCW_DEFAULT_REGION }} + SCW_DEFAULT_ZONE: ${{ secrets.SCW_DEFAULT_ZONE }} run: poetry run python -m unittest discover -s tests -v diff --git a/scaleway/tests/test_instance.py b/scaleway/tests/test_instance.py index 6781c141f..b6762d088 100644 --- a/scaleway/tests/test_instance.py +++ b/scaleway/tests/test_instance.py @@ -22,7 +22,7 @@ class TestE2EServerCreation(unittest.TestCase): def setUp(self) -> None: self.zone = zone - self.client = Client.from_config_file_and_env() + self.client = Client.from_env() self.instanceAPI = InstanceV1API(self.client, bypass_validation=True) self.blockAPI = BlockV1Alpha1API(self.client, bypass_validation=True) self._server = None