diff --git a/scaleway-async/poetry.lock b/scaleway-async/poetry.lock index d9eb2cc0b..52c2b7e34 100644 --- a/scaleway-async/poetry.lock +++ b/scaleway-async/poetry.lock @@ -1,171 +1,182 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "idna" -version = "3.6" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -201,73 +212,75 @@ six = ">=1.5" [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -282,29 +295,29 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.8.1" +version = "0.8.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, - {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, - {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, - {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, - {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, - {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, - {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, + {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, + {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, + {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, + {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, + {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, + {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, + {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, ] [[package]] @@ -312,7 +325,7 @@ name = "scaleway-core" version = "2.0.0" description = "Scaleway SDK for Python" optional = false -python-versions = "^3.8" +python-versions = ">=3.10" files = [] develop = true @@ -327,46 +340,76 @@ url = "../scaleway-core" [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -377,5 +420,5 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "d991069426a40c40b9c5f76b3df686fde71b552a4874342ba9ae3c989970100f" +python-versions = ">=3.10" +content-hash = "6f3ba5275f7b3eb4c3d480a0b7fe7e95fd6a816d9c1d0cfd96a6d4c61a0d09e0" diff --git a/scaleway-async/pyproject.toml b/scaleway-async/pyproject.toml index 3a71e2072..a8dbafaee 100644 --- a/scaleway-async/pyproject.toml +++ b/scaleway-async/pyproject.toml @@ -23,12 +23,12 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.8" +python = ">=3.10" scaleway-core = "*" [tool.poetry.group.dev.dependencies] scaleway-core = { path = "../scaleway-core", develop = true } -ruff = ">=0.5.0,<0.8.2" +ruff = ">=0.5.0,<0.8.5" mypy = "^1.5.1" [build-system] diff --git a/scaleway-async/scaleway_async/applesilicon/v1alpha1/__init__.py b/scaleway-async/scaleway_async/applesilicon/v1alpha1/__init__.py index 55d659e89..6078c5b74 100644 --- a/scaleway-async/scaleway_async/applesilicon/v1alpha1/__init__.py +++ b/scaleway-async/scaleway_async/applesilicon/v1alpha1/__init__.py @@ -2,7 +2,12 @@ # If you have any remark or suggestion do not hesitate to open an issue. from .types import ConnectivityDiagnosticActionType from .types import ConnectivityDiagnosticDiagnosticStatus +from .types import ListServerPrivateNetworksRequestOrderBy from .types import ListServersRequestOrderBy +from .types import ServerPrivateNetworkServerStatus +from .content import SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES +from .types import ServerPrivateNetworkStatus +from .content import SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES from .types import ServerStatus from .content import SERVER_TRANSIENT_STATUSES from .types import ServerTypeStock @@ -13,6 +18,7 @@ from .types import ServerTypeMemory from .types import ServerTypeNetwork from .types import ConnectivityDiagnosticServerHealth +from .types import ServerPrivateNetwork from .types import ServerType from .types import Server from .types import ConnectivityDiagnostic @@ -24,21 +30,34 @@ from .types import GetServerTypeRequest from .types import ListOSRequest from .types import ListOSResponse +from .types import ListServerPrivateNetworksResponse from .types import ListServerTypesRequest from .types import ListServerTypesResponse from .types import ListServersRequest from .types import ListServersResponse +from .types import PrivateNetworkApiAddServerPrivateNetworkRequest +from .types import PrivateNetworkApiDeleteServerPrivateNetworkRequest +from .types import PrivateNetworkApiGetServerPrivateNetworkRequest +from .types import PrivateNetworkApiListServerPrivateNetworksRequest +from .types import PrivateNetworkApiSetServerPrivateNetworksRequest from .types import RebootServerRequest from .types import ReinstallServerRequest +from .types import SetServerPrivateNetworksResponse from .types import StartConnectivityDiagnosticRequest from .types import StartConnectivityDiagnosticResponse from .types import UpdateServerRequest from .api import ApplesiliconV1Alpha1API +from .api import ApplesiliconV1Alpha1PrivateNetworkAPI __all__ = [ "ConnectivityDiagnosticActionType", "ConnectivityDiagnosticDiagnosticStatus", + "ListServerPrivateNetworksRequestOrderBy", "ListServersRequestOrderBy", + "ServerPrivateNetworkServerStatus", + "SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES", + "ServerPrivateNetworkStatus", + "SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES", "ServerStatus", "SERVER_TRANSIENT_STATUSES", "ServerTypeStock", @@ -49,6 +68,7 @@ "ServerTypeMemory", "ServerTypeNetwork", "ConnectivityDiagnosticServerHealth", + "ServerPrivateNetwork", "ServerType", "Server", "ConnectivityDiagnostic", @@ -60,14 +80,22 @@ "GetServerTypeRequest", "ListOSRequest", "ListOSResponse", + "ListServerPrivateNetworksResponse", "ListServerTypesRequest", "ListServerTypesResponse", "ListServersRequest", "ListServersResponse", + "PrivateNetworkApiAddServerPrivateNetworkRequest", + "PrivateNetworkApiDeleteServerPrivateNetworkRequest", + "PrivateNetworkApiGetServerPrivateNetworkRequest", + "PrivateNetworkApiListServerPrivateNetworksRequest", + "PrivateNetworkApiSetServerPrivateNetworksRequest", "RebootServerRequest", "ReinstallServerRequest", + "SetServerPrivateNetworksResponse", "StartConnectivityDiagnosticRequest", "StartConnectivityDiagnosticResponse", "UpdateServerRequest", "ApplesiliconV1Alpha1API", + "ApplesiliconV1Alpha1PrivateNetworkAPI", ] diff --git a/scaleway-async/scaleway_async/applesilicon/v1alpha1/api.py b/scaleway-async/scaleway_async/applesilicon/v1alpha1/api.py index a05f9b8b3..3299afcc4 100644 --- a/scaleway-async/scaleway_async/applesilicon/v1alpha1/api.py +++ b/scaleway-async/scaleway_async/applesilicon/v1alpha1/api.py @@ -1,7 +1,7 @@ # This file was automatically generated. DO NOT EDIT. # If you have any remark or suggestion do not hesitate to open an issue. -from typing import Awaitable, List, Optional, Union +from typing import Awaitable, Dict, List, Optional, Union from scaleway_core.api import API from scaleway_core.bridge import ( @@ -15,33 +15,45 @@ wait_for_resource_async, ) from .types import ( + ListServerPrivateNetworksRequestOrderBy, ListServersRequestOrderBy, ConnectivityDiagnostic, CreateServerRequest, ListOSResponse, + ListServerPrivateNetworksResponse, ListServerTypesResponse, ListServersResponse, OS, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, ReinstallServerRequest, Server, + ServerPrivateNetwork, ServerType, + SetServerPrivateNetworksResponse, StartConnectivityDiagnosticRequest, StartConnectivityDiagnosticResponse, UpdateServerRequest, ) from .content import ( + SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES, SERVER_TRANSIENT_STATUSES, ) from .marshalling import ( unmarshal_OS, + unmarshal_ServerPrivateNetwork, unmarshal_ServerType, unmarshal_Server, unmarshal_ConnectivityDiagnostic, unmarshal_ListOSResponse, + unmarshal_ListServerPrivateNetworksResponse, unmarshal_ListServerTypesResponse, unmarshal_ListServersResponse, + unmarshal_SetServerPrivateNetworksResponse, unmarshal_StartConnectivityDiagnosticResponse, marshal_CreateServerRequest, + marshal_PrivateNetworkApiAddServerPrivateNetworkRequest, + marshal_PrivateNetworkApiSetServerPrivateNetworksRequest, marshal_ReinstallServerRequest, marshal_StartConnectivityDiagnosticRequest, marshal_UpdateServerRequest, @@ -116,6 +128,7 @@ async def create_server( self, *, type_: str, + enable_vpc: bool, zone: Optional[Zone] = None, name: Optional[str] = None, project_id: Optional[str] = None, @@ -125,6 +138,7 @@ async def create_server( Create a server. Create a new server in the targeted zone, specifying its configuration including name and type. :param type_: Create a server of the given type. + :param enable_vpc: Activate the Private Network feature for this server. This feature is configured through the Apple Silicon - Private Networks API. :param zone: Zone to target. If none is passed will use default zone from the config. :param name: Create a server with this given name. :param project_id: Create a server in the given project ID. @@ -136,6 +150,7 @@ async def create_server( result = await api.create_server( type="example", + enable_vpc=False, ) """ @@ -147,6 +162,7 @@ async def create_server( body=marshal_CreateServerRequest( CreateServerRequest( type_=type_, + enable_vpc=enable_vpc, zone=zone, name=name or random_name(prefix="as"), project_id=project_id, @@ -432,6 +448,7 @@ async def update_server( zone: Optional[Zone] = None, name: Optional[str] = None, schedule_deletion: Optional[bool] = None, + enable_vpc: Optional[bool] = None, ) -> Server: """ Update a server. @@ -440,6 +457,7 @@ async def update_server( :param zone: Zone to target. If none is passed will use default zone from the config. :param name: Updated name for your server. :param schedule_deletion: Specify whether the server should be flagged for automatic deletion. + :param enable_vpc: Activate or deactivate Private Network support for this server. :return: :class:`Server ` Usage: @@ -462,6 +480,7 @@ async def update_server( zone=zone, name=name, schedule_deletion=schedule_deletion, + enable_vpc=enable_vpc, ), self.client, ), @@ -640,3 +659,317 @@ async def get_connectivity_diagnostic( self._throw_on_error(res) return unmarshal_ConnectivityDiagnostic(res.json()) + + +class ApplesiliconV1Alpha1PrivateNetworkAPI(API): + """ + Apple silicon - Private Networks API. + """ + + async def get_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> ServerPrivateNetwork: + """ + :param server_id: + :param private_network_id: + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = await api.get_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "GET", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + async def wait_for_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + options: Optional[ + WaitForOptions[ServerPrivateNetwork, Union[bool, Awaitable[bool]]] + ] = None, + ) -> ServerPrivateNetwork: + """ + :param server_id: + :param private_network_id: + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = await api.get_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = ( + lambda res: res.status + not in SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES + ) + + return await wait_for_resource_async( + fetcher=self.get_server_private_network, + options=options, + args={ + "server_id": server_id, + "private_network_id": private_network_id, + "zone": zone, + }, + ) + + async def add_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ServerPrivateNetwork: + """ + Add a server to a Private Network. + Add an Apple silicon server to a Private Network. + :param server_id: ID of the server. + :param private_network_id: ID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_ids: IPAM IDs of IPs to attach to the server. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = await api.add_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "POST", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + PrivateNetworkApiAddServerPrivateNetworkRequest( + server_id=server_id, + private_network_id=private_network_id, + zone=zone, + ipam_ip_ids=ipam_ip_ids, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + async def set_server_private_networks( + self, + *, + server_id: str, + per_private_network_ipam_ip_ids: Dict[str, List[str]], + zone: Optional[Zone] = None, + ) -> SetServerPrivateNetworksResponse: + """ + Set multiple Private Networks on a server. + Configure multiple Private Networks on an Apple silicon server. + :param server_id: ID of the server. + :param per_private_network_ipam_ip_ids: Object where the keys are the IDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Apple silicon server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetServerPrivateNetworksResponse ` + + Usage: + :: + + result = await api.set_server_private_networks( + server_id="example", + per_private_network_ipam_ip_ids={}, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "PUT", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + PrivateNetworkApiSetServerPrivateNetworksRequest( + server_id=server_id, + per_private_network_ipam_ip_ids=per_private_network_ipam_ip_ids, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetServerPrivateNetworksResponse(res.json()) + + async def list_server_private_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ListServerPrivateNetworksResponse: + """ + List the Private Networks of a server. + List the Private Networks of an Apple silicon server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server ID. + :param private_network_id: Filter Private Networks by Private Network ID. + :param organization_id: Filter Private Networks by Organization ID. + :param project_id: Filter Private Networks by Project ID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP IDs. + :return: :class:`ListServerPrivateNetworksResponse ` + + Usage: + :: + + result = await api.list_server_private_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/apple-silicon/v1alpha1/zones/{param_zone}/server-private-networks", + params={ + "ipam_ip_ids": ipam_ip_ids, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_id": private_network_id, + "project_id": project_id or self.client.default_project_id, + "server_id": server_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListServerPrivateNetworksResponse(res.json()) + + async def list_server_private_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> List[ServerPrivateNetwork]: + """ + List the Private Networks of a server. + List the Private Networks of an Apple silicon server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server ID. + :param private_network_id: Filter Private Networks by Private Network ID. + :param organization_id: Filter Private Networks by Organization ID. + :param project_id: Filter Private Networks by Project ID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP IDs. + :return: :class:`List[ServerPrivateNetwork] ` + + Usage: + :: + + result = await api.list_server_private_networks_all() + """ + + return await fetch_all_pages_async( + type=ListServerPrivateNetworksResponse, + key="server_private_networks", + fetcher=self.list_server_private_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "server_id": server_id, + "private_network_id": private_network_id, + "organization_id": organization_id, + "project_id": project_id, + "ipam_ip_ids": ipam_ip_ids, + }, + ) + + async def delete_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a Private Network. + :param server_id: ID of the server. + :param private_network_id: ID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = await api.delete_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "DELETE", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway-async/scaleway_async/applesilicon/v1alpha1/content.py b/scaleway-async/scaleway_async/applesilicon/v1alpha1/content.py index 6d8396fa6..d8118f9fb 100644 --- a/scaleway-async/scaleway_async/applesilicon/v1alpha1/content.py +++ b/scaleway-async/scaleway_async/applesilicon/v1alpha1/content.py @@ -3,9 +3,26 @@ from typing import List from .types import ( + ServerPrivateNetworkServerStatus, + ServerPrivateNetworkStatus, ServerStatus, ) +SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES: List[ + ServerPrivateNetworkServerStatus +] = [ + ServerPrivateNetworkServerStatus.ATTACHING, + ServerPrivateNetworkServerStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkServerStatus `. +""" +SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES: List[ServerPrivateNetworkStatus] = [ + ServerPrivateNetworkStatus.VPC_UPDATING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkStatus `. +""" SERVER_TRANSIENT_STATUSES: List[ServerStatus] = [ ServerStatus.STARTING, ServerStatus.REBOOTING, diff --git a/scaleway-async/scaleway_async/applesilicon/v1alpha1/marshalling.py b/scaleway-async/scaleway_async/applesilicon/v1alpha1/marshalling.py index 2d7ac679c..edbb4774b 100644 --- a/scaleway-async/scaleway_async/applesilicon/v1alpha1/marshalling.py +++ b/scaleway-async/scaleway_async/applesilicon/v1alpha1/marshalling.py @@ -8,6 +8,7 @@ from .types import ( ConnectivityDiagnosticActionType, OS, + ServerPrivateNetwork, ServerTypeCPU, ServerTypeDisk, ServerTypeGPU, @@ -18,10 +19,14 @@ ConnectivityDiagnosticServerHealth, ConnectivityDiagnostic, ListOSResponse, + ListServerPrivateNetworksResponse, ListServerTypesResponse, ListServersResponse, + SetServerPrivateNetworksResponse, StartConnectivityDiagnosticResponse, CreateServerRequest, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, ReinstallServerRequest, StartConnectivityDiagnosticRequest, UpdateServerRequest, @@ -75,6 +80,59 @@ def unmarshal_OS(data: Any) -> OS: return OS(**args) +def unmarshal_ServerPrivateNetwork(data: Any) -> ServerPrivateNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ServerPrivateNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("server_id", None) + if field is not None: + args["server_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("ipam_ip_ids", None) + if field is not None: + args["ipam_ip_ids"] = field + + field = data.get("vlan", None) + if field is not None: + args["vlan"] = field + else: + args["vlan"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return ServerPrivateNetwork(**args) + + def unmarshal_ServerTypeCPU(data: Any) -> ServerTypeCPU: if not isinstance(data, dict): raise TypeError( @@ -291,6 +349,10 @@ def unmarshal_Server(data: Any) -> Server: if field is not None: args["delivered"] = field + field = data.get("vpc_status", None) + if field is not None: + args["vpc_status"] = field + field = data.get("os", None) if field is not None: args["os"] = unmarshal_OS(field) @@ -421,6 +483,31 @@ def unmarshal_ListOSResponse(data: Any) -> ListOSResponse: return ListOSResponse(**args) +def unmarshal_ListServerPrivateNetworksResponse( + data: Any, +) -> ListServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListServerPrivateNetworksResponse(**args) + + def unmarshal_ListServerTypesResponse(data: Any) -> ListServerTypesResponse: if not isinstance(data, dict): raise TypeError( @@ -459,6 +546,27 @@ def unmarshal_ListServersResponse(data: Any) -> ListServersResponse: return ListServersResponse(**args) +def unmarshal_SetServerPrivateNetworksResponse( + data: Any, +) -> SetServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + return SetServerPrivateNetworksResponse(**args) + + def unmarshal_StartConnectivityDiagnosticResponse( data: Any, ) -> StartConnectivityDiagnosticResponse: @@ -485,6 +593,9 @@ def marshal_CreateServerRequest( if request.type_ is not None: output["type"] = request.type_ + if request.enable_vpc is not None: + output["enable_vpc"] = request.enable_vpc + if request.name is not None: output["name"] = request.name @@ -497,6 +608,35 @@ def marshal_CreateServerRequest( return output +def marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + request: PrivateNetworkApiAddServerPrivateNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.ipam_ip_ids is not None: + output["ipam_ip_ids"] = request.ipam_ip_ids + + return output + + +def marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + request: PrivateNetworkApiSetServerPrivateNetworksRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.per_private_network_ipam_ip_ids is not None: + output["per_private_network_ipam_ip_ids"] = { + key: value for key, value in request.per_private_network_ipam_ip_ids.items() + } + + return output + + def marshal_ReinstallServerRequest( request: ReinstallServerRequest, defaults: ProfileDefaults, @@ -533,4 +673,7 @@ def marshal_UpdateServerRequest( if request.schedule_deletion is not None: output["schedule_deletion"] = request.schedule_deletion + if request.enable_vpc is not None: + output["enable_vpc"] = request.enable_vpc + return output diff --git a/scaleway-async/scaleway_async/applesilicon/v1alpha1/types.py b/scaleway-async/scaleway_async/applesilicon/v1alpha1/types.py index 08fce83e0..02fc9fc26 100644 --- a/scaleway-async/scaleway_async/applesilicon/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/applesilicon/v1alpha1/types.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from datetime import datetime from enum import Enum -from typing import List, Optional +from typing import Dict, List, Optional from scaleway_core.bridge import ( Zone, @@ -33,6 +33,16 @@ def __str__(self) -> str: return str(self.value) +class ListServerPrivateNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + + def __str__(self) -> str: + return str(self.value) + + class ListServersRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" CREATED_AT_DESC = "created_at_desc" @@ -41,6 +51,28 @@ def __str__(self) -> str: return str(self.value) +class ServerPrivateNetworkServerStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + ATTACHING = "attaching" + ATTACHED = "attached" + ERROR = "error" + DETACHING = "detaching" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ServerPrivateNetworkStatus(str, Enum, metaclass=StrEnumMeta): + VPC_UNKNOWN_STATUS = "vpc_unknown_status" + VPC_ENABLED = "vpc_enabled" + VPC_UPDATING = "vpc_updating" + VPC_DISABLED = "vpc_disabled" + + def __str__(self) -> str: + return str(self.value) + + class ServerStatus(str, Enum, metaclass=StrEnumMeta): UNKNOWN_STATUS = "unknown_status" STARTING = "starting" @@ -164,6 +196,54 @@ class ConnectivityDiagnosticServerHealth: last_checkin_date: Optional[datetime] +@dataclass +class ServerPrivateNetwork: + id: str + """ + ID of the Server-to-Private Network mapping. + """ + + project_id: str + """ + Private Network Project ID. + """ + + server_id: str + """ + Apple silicon server ID. + """ + + private_network_id: str + """ + Private Network ID. + """ + + status: ServerPrivateNetworkServerStatus + """ + Configuration status of the Private Network. + """ + + ipam_ip_ids: List[str] + """ + IPAM IP IDs of the server, if it has any. + """ + + vlan: Optional[int] + """ + ID of the VLAN associated with the Private Network. + """ + + created_at: Optional[datetime] + """ + Private Network creation date. + """ + + updated_at: Optional[datetime] + """ + Date the Private Network was last modified. + """ + + @dataclass class ServerType: name: str @@ -284,6 +364,11 @@ class Server: Set to true once the server has completed its provisioning steps and is ready to use. Some OS configurations might require a reinstallation of the server before delivery depending on the available stock. A reinstallation after the initial delivery will not change this flag and can be tracked using the server status. """ + vpc_status: ServerPrivateNetworkStatus + """ + Activation status of optional Private Network feature support for this server. + """ + os: Optional[OS] """ Initially installed OS, this does not necessarily reflect the current OS version. @@ -327,6 +412,11 @@ class CreateServerRequest: Create a server of the given type. """ + enable_vpc: bool + """ + Activate the Private Network feature for this server. This feature is configured through the Apple Silicon - Private Networks API. + """ + zone: Optional[Zone] """ Zone to target. If none is passed will use default zone from the config. @@ -451,6 +541,13 @@ class ListOSResponse: """ +@dataclass +class ListServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + total_count: int + + @dataclass class ListServerTypesRequest: zone: Optional[Zone] @@ -513,6 +610,125 @@ class ListServersResponse: """ +@dataclass +class PrivateNetworkApiAddServerPrivateNetworkRequest: + server_id: str + """ + ID of the server. + """ + + private_network_id: str + """ + ID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_ids: Optional[List[str]] + """ + IPAM IDs of IPs to attach to the server. + """ + + +@dataclass +class PrivateNetworkApiDeleteServerPrivateNetworkRequest: + server_id: str + """ + ID of the server. + """ + + private_network_id: str + """ + ID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiGetServerPrivateNetworkRequest: + server_id: str + + private_network_id: str + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiListServerPrivateNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] + """ + Sort order for the returned Private Networks. + """ + + page: Optional[int] + """ + Page number for the returned Private Networks. + """ + + page_size: Optional[int] + """ + Maximum number of Private Networks per page. + """ + + server_id: Optional[str] + """ + Filter Private Networks by server ID. + """ + + private_network_id: Optional[str] + """ + Filter Private Networks by Private Network ID. + """ + + organization_id: Optional[str] + """ + Filter Private Networks by Organization ID. + """ + + project_id: Optional[str] + """ + Filter Private Networks by Project ID. + """ + + ipam_ip_ids: Optional[List[str]] + """ + Filter Private Networks by IPAM IP IDs. + """ + + +@dataclass +class PrivateNetworkApiSetServerPrivateNetworksRequest: + server_id: str + """ + ID of the server. + """ + + per_private_network_ipam_ip_ids: Dict[str, List[str]] + """ + Object where the keys are the IDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Apple silicon server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + @dataclass class RebootServerRequest: server_id: str @@ -544,6 +760,11 @@ class ReinstallServerRequest: """ +@dataclass +class SetServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + @dataclass class StartConnectivityDiagnosticRequest: server_id: str @@ -580,3 +801,8 @@ class UpdateServerRequest: """ Specify whether the server should be flagged for automatic deletion. """ + + enable_vpc: Optional[bool] + """ + Activate or deactivate Private Network support for this server. + """ diff --git a/scaleway-async/scaleway_async/edge_services/v1alpha1/types.py b/scaleway-async/scaleway_async/edge_services/v1alpha1/types.py index bb8a3736f..1df8f4c27 100644 --- a/scaleway-async/scaleway_async/edge_services/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/edge_services/v1alpha1/types.py @@ -765,12 +765,12 @@ class GetBillingResponse: current_plan_cache_usage: int """ - Total amount of data egressed from the cache in gigabytes from the beginning of the month, included in the active subscription plan. + Total amount of data egressed from the cache in gigabytes from the beginning of the month, for the active subscription plan. """ extra_cache_usage: int """ - Total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the active subscription plan. + Total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the subscription plans. """ current_plan: Optional[PlanDetails] @@ -785,12 +785,12 @@ class GetBillingResponse: extra_pipelines_cost: Optional[Money] """ - Cost to date (this month) of pipelines not included in the subscription plan. + Cost to date (this month) of pipelines not included in the subscription plans. """ extra_cache_cost: Optional[Money] """ - Cost to date (this month) of the data egressed from the cache that is not included in the active subscription plan. + Cost to date (this month) of the data egressed from the cache that is not included in the subscription plans. """ total_cost: Optional[Money] diff --git a/scaleway-async/scaleway_async/interlink/__init__.py b/scaleway-async/scaleway_async/interlink/__init__.py new file mode 100644 index 000000000..8b74a5ed7 --- /dev/null +++ b/scaleway-async/scaleway_async/interlink/__init__.py @@ -0,0 +1,2 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. diff --git a/scaleway-async/scaleway_async/interlink/v1beta1/__init__.py b/scaleway-async/scaleway_async/interlink/v1beta1/__init__.py new file mode 100644 index 000000000..479a0815b --- /dev/null +++ b/scaleway-async/scaleway_async/interlink/v1beta1/__init__.py @@ -0,0 +1,75 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import BgpStatus +from .types import LinkStatus +from .types import ListLinksRequestOrderBy +from .types import ListPartnersRequestOrderBy +from .types import ListPopsRequestOrderBy +from .types import ListRoutingPoliciesRequestOrderBy +from .types import Link +from .types import Partner +from .types import Pop +from .types import RoutingPolicy +from .types import AttachRoutingPolicyRequest +from .types import AttachVpcRequest +from .types import CreateLinkRequest +from .types import CreateRoutingPolicyRequest +from .types import DeleteLinkRequest +from .types import DeleteRoutingPolicyRequest +from .types import DetachRoutingPolicyRequest +from .types import DetachVpcRequest +from .types import DisableRoutePropagationRequest +from .types import EnableRoutePropagationRequest +from .types import GetLinkRequest +from .types import GetPartnerRequest +from .types import GetPopRequest +from .types import GetRoutingPolicyRequest +from .types import ListLinksRequest +from .types import ListLinksResponse +from .types import ListPartnersRequest +from .types import ListPartnersResponse +from .types import ListPopsRequest +from .types import ListPopsResponse +from .types import ListRoutingPoliciesRequest +from .types import ListRoutingPoliciesResponse +from .types import UpdateLinkRequest +from .types import UpdateRoutingPolicyRequest +from .api import InterlinkV1Beta1API + +__all__ = [ + "BgpStatus", + "LinkStatus", + "ListLinksRequestOrderBy", + "ListPartnersRequestOrderBy", + "ListPopsRequestOrderBy", + "ListRoutingPoliciesRequestOrderBy", + "Link", + "Partner", + "Pop", + "RoutingPolicy", + "AttachRoutingPolicyRequest", + "AttachVpcRequest", + "CreateLinkRequest", + "CreateRoutingPolicyRequest", + "DeleteLinkRequest", + "DeleteRoutingPolicyRequest", + "DetachRoutingPolicyRequest", + "DetachVpcRequest", + "DisableRoutePropagationRequest", + "EnableRoutePropagationRequest", + "GetLinkRequest", + "GetPartnerRequest", + "GetPopRequest", + "GetRoutingPolicyRequest", + "ListLinksRequest", + "ListLinksResponse", + "ListPartnersRequest", + "ListPartnersResponse", + "ListPopsRequest", + "ListPopsResponse", + "ListRoutingPoliciesRequest", + "ListRoutingPoliciesResponse", + "UpdateLinkRequest", + "UpdateRoutingPolicyRequest", + "InterlinkV1Beta1API", +] diff --git a/scaleway-async/scaleway_async/interlink/v1beta1/api.py b/scaleway-async/scaleway_async/interlink/v1beta1/api.py new file mode 100644 index 000000000..b52e77948 --- /dev/null +++ b/scaleway-async/scaleway_async/interlink/v1beta1/api.py @@ -0,0 +1,1147 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import List, Optional + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Region, +) +from scaleway_core.utils import ( + validate_path_param, + fetch_all_pages_async, +) +from .types import ( + BgpStatus, + LinkStatus, + ListLinksRequestOrderBy, + ListPartnersRequestOrderBy, + ListPopsRequestOrderBy, + ListRoutingPoliciesRequestOrderBy, + AttachRoutingPolicyRequest, + AttachVpcRequest, + CreateLinkRequest, + CreateRoutingPolicyRequest, + Link, + ListLinksResponse, + ListPartnersResponse, + ListPopsResponse, + ListRoutingPoliciesResponse, + Partner, + Pop, + RoutingPolicy, + UpdateLinkRequest, + UpdateRoutingPolicyRequest, +) +from .marshalling import ( + unmarshal_Link, + unmarshal_Partner, + unmarshal_Pop, + unmarshal_RoutingPolicy, + unmarshal_ListLinksResponse, + unmarshal_ListPartnersResponse, + unmarshal_ListPopsResponse, + unmarshal_ListRoutingPoliciesResponse, + marshal_AttachRoutingPolicyRequest, + marshal_AttachVpcRequest, + marshal_CreateLinkRequest, + marshal_CreateRoutingPolicyRequest, + marshal_UpdateLinkRequest, + marshal_UpdateRoutingPolicyRequest, +) + + +class InterlinkV1Beta1API(API): + """ + This API allows you to manage your Scaleway InterLink, to connect your on-premises infrastructure with your Scaleway VPC. + """ + + async def list_partners( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPartnersRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + pop_ids: Optional[List[str]] = None, + ) -> ListPartnersResponse: + """ + List available partners. + List all available partners. By default, the partners returned in the list are ordered by name in ascending order, though this can be modified via the `order_by` field. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of partners to return per page. + :param pop_ids: Filter for partners present (offering a port) in one of these PoPs. + :return: :class:`ListPartnersResponse ` + + Usage: + :: + + result = await api.list_partners() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/partners", + params={ + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "pop_ids": pop_ids, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPartnersResponse(res.json()) + + async def list_partners_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPartnersRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + pop_ids: Optional[List[str]] = None, + ) -> List[Partner]: + """ + List available partners. + List all available partners. By default, the partners returned in the list are ordered by name in ascending order, though this can be modified via the `order_by` field. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of partners to return per page. + :param pop_ids: Filter for partners present (offering a port) in one of these PoPs. + :return: :class:`List[Partner] ` + + Usage: + :: + + result = await api.list_partners_all() + """ + + return await fetch_all_pages_async( + type=ListPartnersResponse, + key="partners", + fetcher=self.list_partners, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "pop_ids": pop_ids, + }, + ) + + async def get_partner( + self, + *, + partner_id: str, + region: Optional[Region] = None, + ) -> Partner: + """ + Get a partner. + Get a partner for the given partner IP. The response object includes information such as the partner's name, email address and portal URL. + :param partner_id: ID of partner to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Partner ` + + Usage: + :: + + result = await api.get_partner( + partner_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_partner_id = validate_path_param("partner_id", partner_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/partners/{param_partner_id}", + ) + + self._throw_on_error(res) + return unmarshal_Partner(res.json()) + + async def list_pops( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPopsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + name: Optional[str] = None, + hosting_provider_name: Optional[str] = None, + partner_id: Optional[str] = None, + link_bandwidth_mbps: Optional[int] = None, + ) -> ListPopsResponse: + """ + List PoPs. + List all available PoPs (locations) for a given region. By default, the results are returned in ascending alphabetical order by name. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of PoPs to return per page. + :param name: PoP name to filter for. + :param hosting_provider_name: Hosting provider name to filter for. + :param partner_id: Filter for PoPs hosting an available shared port from this partner. + :param link_bandwidth_mbps: Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + :return: :class:`ListPopsResponse ` + + Usage: + :: + + result = await api.list_pops() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/pops", + params={ + "hosting_provider_name": hosting_provider_name, + "link_bandwidth_mbps": link_bandwidth_mbps, + "name": name, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "partner_id": partner_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPopsResponse(res.json()) + + async def list_pops_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPopsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + name: Optional[str] = None, + hosting_provider_name: Optional[str] = None, + partner_id: Optional[str] = None, + link_bandwidth_mbps: Optional[int] = None, + ) -> List[Pop]: + """ + List PoPs. + List all available PoPs (locations) for a given region. By default, the results are returned in ascending alphabetical order by name. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of PoPs to return per page. + :param name: PoP name to filter for. + :param hosting_provider_name: Hosting provider name to filter for. + :param partner_id: Filter for PoPs hosting an available shared port from this partner. + :param link_bandwidth_mbps: Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + :return: :class:`List[Pop] ` + + Usage: + :: + + result = await api.list_pops_all() + """ + + return await fetch_all_pages_async( + type=ListPopsResponse, + key="pops", + fetcher=self.list_pops, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "name": name, + "hosting_provider_name": hosting_provider_name, + "partner_id": partner_id, + "link_bandwidth_mbps": link_bandwidth_mbps, + }, + ) + + async def get_pop( + self, + *, + pop_id: str, + region: Optional[Region] = None, + ) -> Pop: + """ + Get a PoP. + Get a PoP for the given PoP ID. The response object includes the PoP's name and information about its physical location. + :param pop_id: ID of PoP to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Pop ` + + Usage: + :: + + result = await api.get_pop( + pop_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_pop_id = validate_path_param("pop_id", pop_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/pops/{param_pop_id}", + ) + + self._throw_on_error(res) + return unmarshal_Pop(res.json()) + + async def list_links( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListLinksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + status: Optional[LinkStatus] = None, + bgp_v4_status: Optional[BgpStatus] = None, + bgp_v6_status: Optional[BgpStatus] = None, + pop_id: Optional[str] = None, + bandwidth_mbps: Optional[int] = None, + partner_id: Optional[str] = None, + vpc_id: Optional[str] = None, + routing_policy_id: Optional[str] = None, + pairing_key: Optional[str] = None, + ) -> ListLinksResponse: + """ + List links. + List all your links (InterLink connections). A number of filters are available, including Project ID, name, tags and status. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of links to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Link name to filter for. + :param tags: Tags to filter for. + :param status: Link status to filter for. + :param bgp_v4_status: BGP IPv4 status to filter for. + :param bgp_v6_status: BGP IPv6 status to filter for. + :param pop_id: Filter for links attached to this PoP (via ports). + :param bandwidth_mbps: Filter for link bandwidth (in Mbps). + :param partner_id: Filter for links hosted by this partner. + :param vpc_id: Filter for links attached to this VPC. + :param routing_policy_id: Filter for links using this routing policy. + :param pairing_key: Filter for the link with this pairing_key. + :return: :class:`ListLinksResponse ` + + Usage: + :: + + result = await api.list_links() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/links", + params={ + "bandwidth_mbps": bandwidth_mbps, + "bgp_v4_status": bgp_v4_status, + "bgp_v6_status": bgp_v6_status, + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "pairing_key": pairing_key, + "partner_id": partner_id, + "pop_id": pop_id, + "project_id": project_id or self.client.default_project_id, + "routing_policy_id": routing_policy_id, + "status": status, + "tags": tags, + "vpc_id": vpc_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListLinksResponse(res.json()) + + async def list_links_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListLinksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + status: Optional[LinkStatus] = None, + bgp_v4_status: Optional[BgpStatus] = None, + bgp_v6_status: Optional[BgpStatus] = None, + pop_id: Optional[str] = None, + bandwidth_mbps: Optional[int] = None, + partner_id: Optional[str] = None, + vpc_id: Optional[str] = None, + routing_policy_id: Optional[str] = None, + pairing_key: Optional[str] = None, + ) -> List[Link]: + """ + List links. + List all your links (InterLink connections). A number of filters are available, including Project ID, name, tags and status. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of links to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Link name to filter for. + :param tags: Tags to filter for. + :param status: Link status to filter for. + :param bgp_v4_status: BGP IPv4 status to filter for. + :param bgp_v6_status: BGP IPv6 status to filter for. + :param pop_id: Filter for links attached to this PoP (via ports). + :param bandwidth_mbps: Filter for link bandwidth (in Mbps). + :param partner_id: Filter for links hosted by this partner. + :param vpc_id: Filter for links attached to this VPC. + :param routing_policy_id: Filter for links using this routing policy. + :param pairing_key: Filter for the link with this pairing_key. + :return: :class:`List[Link] ` + + Usage: + :: + + result = await api.list_links_all() + """ + + return await fetch_all_pages_async( + type=ListLinksResponse, + key="links", + fetcher=self.list_links, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "project_id": project_id, + "organization_id": organization_id, + "name": name, + "tags": tags, + "status": status, + "bgp_v4_status": bgp_v4_status, + "bgp_v6_status": bgp_v6_status, + "pop_id": pop_id, + "bandwidth_mbps": bandwidth_mbps, + "partner_id": partner_id, + "vpc_id": vpc_id, + "routing_policy_id": routing_policy_id, + "pairing_key": pairing_key, + }, + ) + + async def get_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Get a link. + Get a link (InterLink connection) for the given link ID. The response object includes information about the link's various configuration details. + :param link_id: ID of the link to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.get_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def create_link( + self, + *, + name: str, + pop_id: str, + bandwidth_mbps: int, + region: Optional[Region] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + dedicated: Optional[bool] = None, + port_id: Optional[str] = None, + partner_id: Optional[str] = None, + ) -> Link: + """ + Create a link. + Create a link (InterLink connection) in a given PoP, specifying its various configuration details. For the moment only hosted links (faciliated by partners) are available, though in the future dedicated and shared links will also be possible. + :param name: Name of the link. + :param pop_id: PoP (location) where the link will be created. + :param bandwidth_mbps: Desired bandwidth for the link. Must be compatible with available link bandwidths and remaining bandwidth capacity of the port. + :param region: Region to target. If none is passed will use default region from the config. + :param project_id: ID of the Project to create the link in. + :param tags: List of tags to apply to the link. + :param dedicated: If true, a dedicated link (1 link per port, dedicated to one customer) will be crated. It is not necessary to specify a `port_id` or `partner_id`. A new port will created and assigned to the link. Note that Scaleway has not yet enabled the creation of dedicated links, this field is reserved for future use. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :param port_id: If set, a shared link (N links per port, one of which is this customer's port) will be created. As the customer, specify the ID of the port you already have for this link. Note that shared links are not currently available. Note that Scaleway has not yet enabled the creation of shared links, this field is reserved for future use. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :param partner_id: If set, a hosted link (N links per port on a partner port) will be created. Specify the ID of the chosen partner, who already has a shareable port with available bandwidth. Note that this is currently the only type of link offered by Scaleway, and therefore this field must be set when creating a link. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :return: :class:`Link ` + + Usage: + :: + + result = await api.create_link( + name="example", + pop_id="example", + bandwidth_mbps=1, + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links", + body=marshal_CreateLinkRequest( + CreateLinkRequest( + name=name, + pop_id=pop_id, + bandwidth_mbps=bandwidth_mbps, + region=region, + project_id=project_id, + tags=tags, + dedicated=dedicated, + port_id=port_id, + partner_id=partner_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def update_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> Link: + """ + Update a link. + Update an existing link, specified by its link ID. Only its name and tags can be updated. + :param link_id: ID of the link to update. + :param region: Region to target. If none is passed will use default region from the config. + :param name: Name of the link. + :param tags: List of tags to apply to the link. + :return: :class:`Link ` + + Usage: + :: + + result = await api.update_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "PATCH", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + body=marshal_UpdateLinkRequest( + UpdateLinkRequest( + link_id=link_id, + region=region, + name=name, + tags=tags, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def delete_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Delete a link. + Delete an existing link, specified by its link ID. Note that as well as deleting the link here on the Scaleway side, it is also necessary to request deletion from the partner on their side. Only when this action has been carried out on both sides will the resource be completely deleted. + :param link_id: ID of the link to delete. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.delete_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "DELETE", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def attach_vpc( + self, + *, + link_id: str, + vpc_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Attach a VPC. + Attach a VPC to an existing link. This facilitates communication between the resources in your Scaleway VPC, and your on-premises infrastructure. + :param link_id: ID of the link to attach VPC to. + :param vpc_id: ID of the VPC to attach. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.attach_vpc( + link_id="example", + vpc_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/attach-vpc", + body=marshal_AttachVpcRequest( + AttachVpcRequest( + link_id=link_id, + vpc_id=vpc_id, + region=region, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def detach_vpc( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Detach a VPC. + Detach a VPC from an existing link. + :param link_id: ID of the link to detach the VPC from. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.detach_vpc( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/detach-vpc", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def attach_routing_policy( + self, + *, + link_id: str, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Attach a routing policy. + Attach a routing policy to an existing link. As all routes across the link are blocked by default, you must attach a routing policy to set IP prefix filters for allowed routes, facilitating traffic flow. + :param link_id: ID of the link to attach a routing policy to. + :param routing_policy_id: ID of the routing policy to be attached. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.attach_routing_policy( + link_id="example", + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/attach-routing-policy", + body=marshal_AttachRoutingPolicyRequest( + AttachRoutingPolicyRequest( + link_id=link_id, + routing_policy_id=routing_policy_id, + region=region, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def detach_routing_policy( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Detach a routing policy. + Detach a routing policy from an existing link. Without a routing policy, all routes across the link are blocked by default. + :param link_id: ID of the link to detach a routing policy from. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.detach_routing_policy( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/detach-routing-policy", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def enable_route_propagation( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Enable route propagation. + Enable all allowed prefixes (defined in a routing policy) to be announced in the BGP session. This allows traffic to flow between the attached VPC and the on-premises infrastructure along the announced routes. Note that by default, even when route propagation is enabled, all routes are blocked. It is essential to attach a routing policy to define the ranges of routes to announce. + :param link_id: ID of the link on which to enable route propagation. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.enable_route_propagation( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/enable-route-propagation", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def disable_route_propagation( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Disable route propagation. + Prevent any prefixes from being announced in the BGP session. Traffic will not be able to flow over the InterLink until route propagation is re-enabled. + :param link_id: ID of the link on which to disable route propagation. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = await api.disable_route_propagation( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/disable-route-propagation", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + async def list_routing_policies( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListRoutingPoliciesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> ListRoutingPoliciesResponse: + """ + List routing policies. + List all routing policies in a given region. A routing policy can be attached to one or multiple links (InterLink connections). + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of routing policies to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Routing policy name to filter for. + :param tags: Tags to filter for. + :return: :class:`ListRoutingPoliciesResponse ` + + Usage: + :: + + result = await api.list_routing_policies() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/routing-policies", + params={ + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "project_id": project_id or self.client.default_project_id, + "tags": tags, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListRoutingPoliciesResponse(res.json()) + + async def list_routing_policies_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListRoutingPoliciesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> List[RoutingPolicy]: + """ + List routing policies. + List all routing policies in a given region. A routing policy can be attached to one or multiple links (InterLink connections). + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of routing policies to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Routing policy name to filter for. + :param tags: Tags to filter for. + :return: :class:`List[RoutingPolicy] ` + + Usage: + :: + + result = await api.list_routing_policies_all() + """ + + return await fetch_all_pages_async( + type=ListRoutingPoliciesResponse, + key="routing_policies", + fetcher=self.list_routing_policies, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "project_id": project_id, + "organization_id": organization_id, + "name": name, + "tags": tags, + }, + ) + + async def get_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> RoutingPolicy: + """ + Get routing policy. + Get a routing policy for the given routing policy ID. The response object gives information including the policy's name, tags and prefix filters. + :param routing_policy_id: ID of the routing policy to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = await api.get_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + async def create_routing_policy( + self, + *, + name: str, + region: Optional[Region] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + prefix_filter_in: Optional[List[str]] = None, + prefix_filter_out: Optional[List[str]] = None, + ) -> RoutingPolicy: + """ + Create a routing policy. + Create a routing policy. Routing policies allow you to set IP prefix filters to define the incoming route announcements to accept from the peer, and the outgoing routes to announce to the peer. + :param name: Name of the routing policy. + :param region: Region to target. If none is passed will use default region from the config. + :param project_id: ID of the Project to create the routing policy in. + :param tags: List of tags to apply to the routing policy. + :param prefix_filter_in: IP prefixes to accept from the peer (ranges of route announcements to accept). + :param prefix_filter_out: IP prefix filters to advertise to the peer (ranges of routes to advertise). + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = await api.create_routing_policy( + name="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/routing-policies", + body=marshal_CreateRoutingPolicyRequest( + CreateRoutingPolicyRequest( + name=name, + region=region, + project_id=project_id, + tags=tags, + prefix_filter_in=prefix_filter_in, + prefix_filter_out=prefix_filter_out, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + async def update_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + prefix_filter_in: Optional[List[str]] = None, + prefix_filter_out: Optional[List[str]] = None, + ) -> RoutingPolicy: + """ + Update a routing policy. + Update an existing routing policy, specified by its routing policy ID. Its name, tags and incoming/outgoing prefix filters can be updated. + :param routing_policy_id: ID of the routing policy to update. + :param region: Region to target. If none is passed will use default region from the config. + :param name: Name of the routing policy. + :param tags: List of tags to apply to the routing policy. + :param prefix_filter_in: IP prefixes to accept from the peer (ranges of route announcements to accept). + :param prefix_filter_out: IP prefix filters for routes to advertise to the peer (ranges of routes to advertise). + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = await api.update_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "PATCH", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + body=marshal_UpdateRoutingPolicyRequest( + UpdateRoutingPolicyRequest( + routing_policy_id=routing_policy_id, + region=region, + name=name, + tags=tags, + prefix_filter_in=prefix_filter_in, + prefix_filter_out=prefix_filter_out, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + async def delete_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete a routing policy. + Delete an existing routing policy, specified by its routing policy ID. + :param routing_policy_id: ID of the routing policy to delete. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = await api.delete_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "DELETE", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway-async/scaleway_async/interlink/v1beta1/marshalling.py b/scaleway-async/scaleway_async/interlink/v1beta1/marshalling.py new file mode 100644 index 000000000..b78b208fa --- /dev/null +++ b/scaleway-async/scaleway_async/interlink/v1beta1/marshalling.py @@ -0,0 +1,460 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from scaleway_core.utils import ( + OneOfPossibility, + resolve_one_of, +) +from .types import ( + Link, + Partner, + Pop, + RoutingPolicy, + ListLinksResponse, + ListPartnersResponse, + ListPopsResponse, + ListRoutingPoliciesResponse, + AttachRoutingPolicyRequest, + AttachVpcRequest, + CreateLinkRequest, + CreateRoutingPolicyRequest, + UpdateLinkRequest, + UpdateRoutingPolicyRequest, +) + + +def unmarshal_Link(data: Any) -> Link: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Link' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("pop_id", None) + if field is not None: + args["pop_id"] = field + + field = data.get("bandwidth_mbps", None) + if field is not None: + args["bandwidth_mbps"] = field + + field = data.get("partner_id", None) + if field is not None: + args["partner_id"] = field + else: + args["partner_id"] = None + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("bgp_v4_status", None) + if field is not None: + args["bgp_v4_status"] = field + + field = data.get("bgp_v6_status", None) + if field is not None: + args["bgp_v6_status"] = field + + field = data.get("enable_route_propagation", None) + if field is not None: + args["enable_route_propagation"] = field + + field = data.get("pairing_key", None) + if field is not None: + args["pairing_key"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + field = data.get("vpc_id", None) + if field is not None: + args["vpc_id"] = field + else: + args["vpc_id"] = None + + field = data.get("routing_policy_id", None) + if field is not None: + args["routing_policy_id"] = field + else: + args["routing_policy_id"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Link(**args) + + +def unmarshal_Partner(data: Any) -> Partner: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Partner' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("contact_email", None) + if field is not None: + args["contact_email"] = field + + field = data.get("logo_url", None) + if field is not None: + args["logo_url"] = field + + field = data.get("portal_url", None) + if field is not None: + args["portal_url"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Partner(**args) + + +def unmarshal_Pop(data: Any) -> Pop: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Pop' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("hosting_provider_name", None) + if field is not None: + args["hosting_provider_name"] = field + + field = data.get("address", None) + if field is not None: + args["address"] = field + + field = data.get("city", None) + if field is not None: + args["city"] = field + + field = data.get("logo_url", None) + if field is not None: + args["logo_url"] = field + + field = data.get("available_link_bandwidths_mbps", None) + if field is not None: + args["available_link_bandwidths_mbps"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + return Pop(**args) + + +def unmarshal_RoutingPolicy(data: Any) -> RoutingPolicy: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'RoutingPolicy' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("prefix_filter_in", None) + if field is not None: + args["prefix_filter_in"] = field + + field = data.get("prefix_filter_out", None) + if field is not None: + args["prefix_filter_out"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return RoutingPolicy(**args) + + +def unmarshal_ListLinksResponse(data: Any) -> ListLinksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListLinksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("links", None) + if field is not None: + args["links"] = ( + [unmarshal_Link(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListLinksResponse(**args) + + +def unmarshal_ListPartnersResponse(data: Any) -> ListPartnersResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPartnersResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("partners", None) + if field is not None: + args["partners"] = ( + [unmarshal_Partner(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPartnersResponse(**args) + + +def unmarshal_ListPopsResponse(data: Any) -> ListPopsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPopsResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pops", None) + if field is not None: + args["pops"] = [unmarshal_Pop(v) for v in field] if field is not None else None + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPopsResponse(**args) + + +def unmarshal_ListRoutingPoliciesResponse(data: Any) -> ListRoutingPoliciesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListRoutingPoliciesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("routing_policies", None) + if field is not None: + args["routing_policies"] = ( + [unmarshal_RoutingPolicy(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListRoutingPoliciesResponse(**args) + + +def marshal_AttachRoutingPolicyRequest( + request: AttachRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.routing_policy_id is not None: + output["routing_policy_id"] = request.routing_policy_id + + return output + + +def marshal_AttachVpcRequest( + request: AttachVpcRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.vpc_id is not None: + output["vpc_id"] = request.vpc_id + + return output + + +def marshal_CreateLinkRequest( + request: CreateLinkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + output.update( + resolve_one_of( + [ + OneOfPossibility("dedicated", request.dedicated), + OneOfPossibility("port_id", request.port_id), + OneOfPossibility("partner_id", request.partner_id), + ] + ), + ) + + if request.name is not None: + output["name"] = request.name + + if request.pop_id is not None: + output["pop_id"] = request.pop_id + + if request.bandwidth_mbps is not None: + output["bandwidth_mbps"] = request.bandwidth_mbps + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_CreateRoutingPolicyRequest( + request: CreateRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + if request.prefix_filter_in is not None: + output["prefix_filter_in"] = request.prefix_filter_in + + if request.prefix_filter_out is not None: + output["prefix_filter_out"] = request.prefix_filter_out + + return output + + +def marshal_UpdateLinkRequest( + request: UpdateLinkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_UpdateRoutingPolicyRequest( + request: UpdateRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.prefix_filter_in is not None: + output["prefix_filter_in"] = request.prefix_filter_in + + if request.prefix_filter_out is not None: + output["prefix_filter_out"] = request.prefix_filter_out + + return output diff --git a/scaleway-async/scaleway_async/interlink/v1beta1/types.py b/scaleway-async/scaleway_async/interlink/v1beta1/types.py new file mode 100644 index 000000000..f369fec70 --- /dev/null +++ b/scaleway-async/scaleway_async/interlink/v1beta1/types.py @@ -0,0 +1,850 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import List, Optional + +from scaleway_core.bridge import ( + Region, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class BgpStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_BGP_STATUS = "unknown_bgp_status" + UP = "up" + DOWN = "down" + + def __str__(self) -> str: + return str(self.value) + + +class LinkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_LINK_STATUS = "unknown_link_status" + CONFIGURING = "configuring" + FAILED = "failed" + REQUESTED = "requested" + REFUSED = "refused" + EXPIRED = "expired" + PROVISIONING = "provisioning" + ACTIVE = "active" + LIMITED_CONNECTIVITY = "limited_connectivity" + ALL_DOWN = "all_down" + DEPROVISIONING = "deprovisioning" + DELETED = "deleted" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ListLinksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPartnersRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPopsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListRoutingPoliciesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class Link: + id: str + """ + Unique identifier of the link. + """ + + project_id: str + """ + Project ID. + """ + + organization_id: str + """ + Organization ID. + """ + + name: str + """ + Name of the link. + """ + + tags: List[str] + """ + List of tags associated with the link. + """ + + pop_id: str + """ + ID of the PoP where the link's corresponding port is located. + """ + + bandwidth_mbps: int + """ + Rate limited bandwidth of the link. + """ + + partner_id: Optional[str] + """ + ID of the partner facilitating this link. + """ + + status: LinkStatus + """ + Status of the link. + """ + + bgp_v4_status: BgpStatus + """ + Status of the link's BGP IPv4 session. + """ + + bgp_v6_status: BgpStatus + """ + Status of the link's BGP IPv6 session. + """ + + enable_route_propagation: bool + """ + Defines whether route propagation is enabled or not. To enable or disable route propagation, use the dedicated endpoint. + """ + + pairing_key: str + """ + Used to identify a link from a user or partner's point of view. + """ + + region: Region + """ + Region of the link. + """ + + vpc_id: Optional[str] + """ + ID of the Scaleway VPC attached to the link. + """ + + routing_policy_id: Optional[str] + """ + ID of the routing policy attached to the link. + """ + + created_at: Optional[datetime] + """ + Creation date of the link. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the link. + """ + + +@dataclass +class Partner: + id: str + """ + Unique identifier of the partner. + """ + + name: str + """ + Name of the partner. + """ + + contact_email: str + """ + Contact email address of partner. + """ + + logo_url: str + """ + Image URL of the partner's logo. + """ + + portal_url: str + """ + URL of the partner's portal. + """ + + created_at: Optional[datetime] + """ + Creation date of the partner. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the partner. + """ + + +@dataclass +class Pop: + id: str + """ + Unique identifier of the PoP. + """ + + name: str + """ + Name of the PoP. It is the common reference of Hosting DC (ex: TH2). + """ + + hosting_provider_name: str + """ + Name of the PoP's hosting provider, e.g. Telehouse for TH2 or OpCore for DC3. + """ + + address: str + """ + Physical address of the PoP. + """ + + city: str + """ + City where PoP is located. + """ + + logo_url: str + """ + Image URL of the PoP's logo. + """ + + available_link_bandwidths_mbps: List[int] + """ + Available bandwidth in Mbits/s for future hosted_links from available ports in this PoP. + """ + + region: Region + """ + Region of the PoP. + """ + + +@dataclass +class RoutingPolicy: + id: str + """ + Unique identifier of the routing policy. + """ + + project_id: str + """ + Project ID. + """ + + organization_id: str + """ + Organization ID. + """ + + name: str + """ + Name of the routing policy. + """ + + tags: List[str] + """ + List of tags associated with the routing policy. + """ + + prefix_filter_in: List[str] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: List[str] + """ + IP prefix filters to advertise to the peer (ranges of routes to advertise). + """ + + region: Region + """ + Region of the routing policy. + """ + + created_at: Optional[datetime] + """ + Creation date of the routing policy. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the routing policy. + """ + + +@dataclass +class AttachRoutingPolicyRequest: + link_id: str + """ + ID of the link to attach a routing policy to. + """ + + routing_policy_id: str + """ + ID of the routing policy to be attached. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class AttachVpcRequest: + link_id: str + """ + ID of the link to attach VPC to. + """ + + vpc_id: str + """ + ID of the VPC to attach. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class CreateLinkRequest: + name: str + """ + Name of the link. + """ + + pop_id: str + """ + PoP (location) where the link will be created. + """ + + bandwidth_mbps: int + """ + Desired bandwidth for the link. Must be compatible with available link bandwidths and remaining bandwidth capacity of the port. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + project_id: Optional[str] + """ + ID of the Project to create the link in. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the link. + """ + + dedicated: Optional[bool] + + port_id: Optional[str] + + partner_id: Optional[str] + + +@dataclass +class CreateRoutingPolicyRequest: + name: str + """ + Name of the routing policy. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + project_id: Optional[str] + """ + ID of the Project to create the routing policy in. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the routing policy. + """ + + prefix_filter_in: Optional[List[str]] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: Optional[List[str]] + """ + IP prefix filters to advertise to the peer (ranges of routes to advertise). + """ + + +@dataclass +class DeleteLinkRequest: + link_id: str + """ + ID of the link to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DeleteRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DetachRoutingPolicyRequest: + link_id: str + """ + ID of the link to detach a routing policy from. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DetachVpcRequest: + link_id: str + """ + ID of the link to detach the VPC from. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DisableRoutePropagationRequest: + link_id: str + """ + ID of the link on which to disable route propagation. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class EnableRoutePropagationRequest: + link_id: str + """ + ID of the link on which to enable route propagation. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetLinkRequest: + link_id: str + """ + ID of the link to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetPartnerRequest: + partner_id: str + """ + ID of partner to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetPopRequest: + pop_id: str + """ + ID of PoP to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class ListLinksRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListLinksRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of links to return per page. + """ + + project_id: Optional[str] + """ + Project ID to filter for. + """ + + organization_id: Optional[str] + """ + Organization ID to filter for. + """ + + name: Optional[str] + """ + Link name to filter for. + """ + + tags: Optional[List[str]] + """ + Tags to filter for. + """ + + status: Optional[LinkStatus] + """ + Link status to filter for. + """ + + bgp_v4_status: Optional[BgpStatus] + """ + BGP IPv4 status to filter for. + """ + + bgp_v6_status: Optional[BgpStatus] + """ + BGP IPv6 status to filter for. + """ + + pop_id: Optional[str] + """ + Filter for links attached to this PoP (via ports). + """ + + bandwidth_mbps: Optional[int] + """ + Filter for link bandwidth (in Mbps). + """ + + partner_id: Optional[str] + """ + Filter for links hosted by this partner. + """ + + vpc_id: Optional[str] + """ + Filter for links attached to this VPC. + """ + + routing_policy_id: Optional[str] + """ + Filter for links using this routing policy. + """ + + pairing_key: Optional[str] + """ + Filter for the link with this pairing_key. + """ + + +@dataclass +class ListLinksResponse: + links: List[Link] + """ + List of links on the current page. + """ + + total_count: int + """ + Total number of links. + """ + + +@dataclass +class ListPartnersRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListPartnersRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of partners to return per page. + """ + + pop_ids: Optional[List[str]] + """ + Filter for partners present (offering a port) in one of these PoPs. + """ + + +@dataclass +class ListPartnersResponse: + partners: List[Partner] + """ + List of partners on current page. + """ + + total_count: int + """ + Total number of partners returned. + """ + + +@dataclass +class ListPopsRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListPopsRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of PoPs to return per page. + """ + + name: Optional[str] + """ + PoP name to filter for. + """ + + hosting_provider_name: Optional[str] + """ + Hosting provider name to filter for. + """ + + partner_id: Optional[str] + """ + Filter for PoPs hosting an available shared port from this partner. + """ + + link_bandwidth_mbps: Optional[int] + """ + Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + """ + + +@dataclass +class ListPopsResponse: + pops: List[Pop] + """ + List of PoPs on the current page. + """ + + total_count: int + """ + Total number of PoPs. + """ + + +@dataclass +class ListRoutingPoliciesRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListRoutingPoliciesRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of routing policies to return per page. + """ + + project_id: Optional[str] + """ + Project ID to filter for. + """ + + organization_id: Optional[str] + """ + Organization ID to filter for. + """ + + name: Optional[str] + """ + Routing policy name to filter for. + """ + + tags: Optional[List[str]] + """ + Tags to filter for. + """ + + +@dataclass +class ListRoutingPoliciesResponse: + routing_policies: List[RoutingPolicy] + + total_count: int + + +@dataclass +class UpdateLinkRequest: + link_id: str + """ + ID of the link to update. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + name: Optional[str] + """ + Name of the link. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the link. + """ + + +@dataclass +class UpdateRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to update. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + name: Optional[str] + """ + Name of the routing policy. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the routing policy. + """ + + prefix_filter_in: Optional[List[str]] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: Optional[List[str]] + """ + IP prefix filters for routes to advertise to the peer (ranges of routes to advertise). + """ diff --git a/scaleway-async/scaleway_async/k8s/v1/api.py b/scaleway-async/scaleway_async/k8s/v1/api.py index ef7e135d9..b96a0abba 100644 --- a/scaleway-async/scaleway_async/k8s/v1/api.py +++ b/scaleway-async/scaleway_async/k8s/v1/api.py @@ -244,7 +244,7 @@ async def create_cluster( """ Create a new Cluster. Create a new Kubernetes cluster in a Scaleway region. - :param type_: Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16). + :param type_: Type of the cluster. See [list available cluster types](#list-available-cluster-types-for-a-cluster) for a list of valid types. :param description: Cluster description. :param version: Kubernetes version of the cluster. :param region: Region to target. If none is passed will use default region from the config. @@ -407,7 +407,7 @@ async def update_cluster( :param description: New description for the cluster. :param tags: New tags associated with the cluster. :param autoscaler_config: New autoscaler config for the cluster. - :param auto_upgrade: New auto upgrade configuration for the cluster. Note that all fields need to be set. + :param auto_upgrade: New auto upgrade configuration for the cluster. Note that all fields needs to be set. :param feature_gates: List of feature gates to enable. :param admission_plugins: List of admission plugins to enable. :param open_id_connect_config: OpenID Connect configuration of the cluster. This configuration enables to update the OpenID Connect configuration of the Kubernetes API server. @@ -460,7 +460,7 @@ async def delete_cluster( ) -> Cluster: """ Delete a Cluster. - Delete a specific Kubernetes cluster and all its associated pools and nodes. Note that this method will not delete any Load Balancer or Block Volume that are associated with the cluster. + Delete a specific Kubernetes cluster and all its associated pools and nodes, and possibly its associated Load Balancers or Block Volumes. :param cluster_id: ID of the cluster to delete. :param with_additional_resources: Defines whether all volumes (including retain volume type), empty Private Networks and Load Balancers with a name starting with the cluster ID will also be deleted. :param region: Region to target. If none is passed will use default region from the config. @@ -549,7 +549,7 @@ async def set_cluster_type( ) -> Cluster: """ Change the Cluster type. - Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#path-clusters-list-available-cluster-types-for-a-cluster). + Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#list-available-cluster-types-for-a-cluster). :param cluster_id: ID of the cluster to migrate from one type to another. :param type_: Type of the cluster. Note that some migrations are not possible (please refer to product documentation). :param region: Region to target. If none is passed will use default region from the config. @@ -701,7 +701,7 @@ async def reset_cluster_admin_token( ) -> None: """ Reset the admin token of a Cluster. - Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download kubeconfig again to keep interacting with the cluster. + Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download the kubeconfig again to keep interacting with the cluster. :param cluster_id: Cluster ID on which the admin token will be renewed. :param region: Region to target. If none is passed will use default region from the config. @@ -735,6 +735,7 @@ async def migrate_cluster_to_sbscsi( """ Migrate a cluster to SBS CSI. Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. + Make sure to have the necessary Quota before running this command. :param cluster_id: Cluster ID for which the latest CSI compatible with Scaleway Block Storage will be enabled. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Cluster ` @@ -1087,17 +1088,20 @@ async def create_pool( :param autoscaling: Defines whether the autoscaling feature is enabled for the pool. :param size: Size (number of nodes) of the pool. :param name: Pool name. - :param placement_group_id: Placement group ID in which all the nodes of the pool will be created. + :param placement_group_id: Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. :param min_size: Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. :param autohealing: Defines whether the autohealing feature is enabled for the pool. :param public_ip_disabled: Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway. :param max_size: Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. - :param container_runtime: Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. - :param tags: Tags associated with the pool. + :param container_runtime: Customization of the container runtime is available for each pool. + :param tags: Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). :param kubelet_args: Kubelet arguments to be used by this pool. Note that this feature is experimental. :param upgrade_policy: Pool upgrade policy. :param zone: Zone in which the pool's nodes will be spawned. - :param root_volume_type: Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + :param root_volume_type: * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types + * `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits + * `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits + * `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. :param root_volume_size: System volume disk size. :return: :class:`Pool ` @@ -1231,6 +1235,7 @@ async def upgrade_pool( """ Upgrade a Pool in a Cluster. Upgrade the Kubernetes version of a specific pool. Note that it only works if the targeted version matches the cluster's version. + This will drain and replace the nodes in that pool. :param pool_id: ID of the pool to upgrade. :param version: New Kubernetes version for the pool. :param region: Region to target. If none is passed will use default region from the config. @@ -1282,7 +1287,7 @@ async def update_pool( ) -> Pool: """ Update a Pool in a Cluster. - Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. + Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. To upgrade a pool, you will need to use the dedicated endpoint. :param pool_id: ID of the pool to update. :param region: Region to target. If none is passed will use default region from the config. :param autoscaling: New value for the pool autoscaling enablement. @@ -1646,7 +1651,7 @@ async def replace_node( ) -> Node: """ Replace a Node in a Cluster. - Replace a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Replace a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to replace. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Node ` @@ -1682,7 +1687,7 @@ async def reboot_node( ) -> Node: """ Reboot a Node in a Cluster. - Reboot a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Reboot a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to reboot. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Node ` @@ -1719,7 +1724,7 @@ async def delete_node( ) -> Node: """ Delete a Node in a Cluster. - Delete a specific Node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Delete a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to replace. :param skip_drain: Skip draining node from its workload (Note: this parameter is currently inactive). :param replace: Add a new node after the deletion of this node. diff --git a/scaleway-async/scaleway_async/k8s/v1/marshalling.py b/scaleway-async/scaleway_async/k8s/v1/marshalling.py index e14047db0..a325023d3 100644 --- a/scaleway-async/scaleway_async/k8s/v1/marshalling.py +++ b/scaleway-async/scaleway_async/k8s/v1/marshalling.py @@ -724,13 +724,13 @@ def unmarshal_ExternalNodeAuth(data: Any) -> ExternalNodeAuth: args: Dict[str, Any] = {} - field = data.get("node_token", None) + field = data.get("node_secret_key", None) if field is not None: - args["node_token"] = field + args["node_secret_key"] = field - field = data.get("api_url", None) + field = data.get("metadata_url", None) if field is not None: - args["api_url"] = field + args["metadata_url"] = field return ExternalNodeAuth(**args) @@ -1023,18 +1023,6 @@ def unmarshal_NodeMetadata(data: Any) -> NodeMetadata: else None ) - field = data.get("private_network_mode", None) - if field is not None: - args["private_network_mode"] = field - - field = data.get("kapsule_iface_mac", None) - if field is not None: - args["kapsule_iface_mac"] = field - - field = data.get("full_isolation", None) - if field is not None: - args["full_isolation"] = field - field = data.get("has_gpu", None) if field is not None: args["has_gpu"] = field diff --git a/scaleway-async/scaleway_async/k8s/v1/types.py b/scaleway-async/scaleway_async/k8s/v1/types.py index cd0c4deb5..1f5c8d6c2 100644 --- a/scaleway-async/scaleway_async/k8s/v1/types.py +++ b/scaleway-async/scaleway_async/k8s/v1/types.py @@ -100,6 +100,14 @@ def __str__(self) -> str: class ListNodesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + VERSION_ASC = "version_asc" + VERSION_DESC = "version_desc" def __str__(self) -> str: return str(self.value) @@ -243,7 +251,7 @@ class ClusterAutoscalerConfig: scale_down_delay_after_add: str """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ estimator: AutoscalerEstimator @@ -389,7 +397,7 @@ class Pool: container_runtime: Runtime """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ autohealing: bool @@ -399,7 +407,7 @@ class Pool: tags: List[str] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Dict[str, str] @@ -414,7 +422,10 @@ class Pool: root_volume_type: PoolVolumeType """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ public_ip_disabled: bool @@ -429,7 +440,7 @@ class Pool: placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ upgrade_policy: Optional[PoolUpgradePolicy] @@ -504,7 +515,7 @@ class CreateClusterRequestAutoscalerConfig: scale_down_delay_after_add: Optional[str] """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ ignore_daemonsets_utilization: Optional[bool] @@ -600,12 +611,12 @@ class CreateClusterRequestPoolConfig: container_runtime: Runtime """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ min_size: Optional[int] @@ -625,7 +636,7 @@ class CreateClusterRequestPoolConfig: tags: List[str] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Dict[str, str] @@ -640,7 +651,10 @@ class CreateClusterRequestPoolConfig: root_volume_type: PoolVolumeType """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ public_ip_disabled: bool @@ -865,7 +879,7 @@ class Cluster: auto_upgrade: Optional[ClusterAutoUpgrade] """ - Auto upgrade configuration of the cluster. + Auto upgrade Kubernetes version of the cluster. """ admission_plugins: List[str] @@ -1013,7 +1027,7 @@ class UpdateClusterRequestAutoscalerConfig: scale_down_delay_after_add: Optional[str] """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ ignore_daemonsets_utilization: Optional[bool] @@ -1135,7 +1149,7 @@ class AuthExternalNodeRequest: class CreateClusterRequest: type_: str """ - Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16). + Type of the cluster. See [list available cluster types](#list-available-cluster-types-for-a-cluster) for a list of valid types. """ description: str @@ -1257,7 +1271,7 @@ class CreatePoolRequest: placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ min_size: Optional[int] @@ -1282,12 +1296,12 @@ class CreatePoolRequest: container_runtime: Optional[Runtime] """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ tags: Optional[List[str]] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Optional[Dict[str, str]] @@ -1307,7 +1321,10 @@ class CreatePoolRequest: root_volume_type: Optional[PoolVolumeType] """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ root_volume_size: Optional[int] @@ -1414,9 +1431,9 @@ class ExternalNode: @dataclass class ExternalNodeAuth: - node_token: str + node_secret_key: str - api_url: str + metadata_url: str @dataclass @@ -1833,12 +1850,6 @@ class NodeMetadata: node_taints: List[NodeMetadataCoreV1Taint] - private_network_mode: str - - kapsule_iface_mac: str - - full_isolation: bool - has_gpu: bool external_ip: str @@ -1963,7 +1974,7 @@ class UpdateClusterRequest: auto_upgrade: Optional[UpdateClusterRequestAutoUpgrade] """ - New auto upgrade configuration for the cluster. Note that all fields need to be set. + New auto upgrade configuration for the cluster. Note that all fields needs to be set. """ feature_gates: Optional[List[str]] diff --git a/scaleway-async/scaleway_async/mongodb/v1alpha1/__init__.py b/scaleway-async/scaleway_async/mongodb/v1alpha1/__init__.py index f422c9405..d1d42a9ed 100644 --- a/scaleway-async/scaleway_async/mongodb/v1alpha1/__init__.py +++ b/scaleway-async/scaleway_async/mongodb/v1alpha1/__init__.py @@ -35,6 +35,7 @@ from .types import DeleteEndpointRequest from .types import DeleteInstanceRequest from .types import DeleteSnapshotRequest +from .types import DeleteUserRequest from .types import GetInstanceCertificateRequest from .types import GetInstanceRequest from .types import GetSnapshotRequest @@ -91,6 +92,7 @@ "DeleteEndpointRequest", "DeleteInstanceRequest", "DeleteSnapshotRequest", + "DeleteUserRequest", "GetInstanceCertificateRequest", "GetInstanceRequest", "GetSnapshotRequest", diff --git a/scaleway-async/scaleway_async/mongodb/v1alpha1/api.py b/scaleway-async/scaleway_async/mongodb/v1alpha1/api.py index 0f60d2b6d..0e9bf09e7 100644 --- a/scaleway-async/scaleway_async/mongodb/v1alpha1/api.py +++ b/scaleway-async/scaleway_async/mongodb/v1alpha1/api.py @@ -1174,6 +1174,43 @@ async def update_user( self._throw_on_error(res) return unmarshal_User(res.json()) + async def delete_user( + self, + *, + instance_id: str, + name: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete a user on a Database Instance. + Delete an existing user on a Database Instance. + :param instance_id: UUID of the Database Instance the user belongs to. + :param name: Name of the database user. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = await api.delete_user( + instance_id="example", + name="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_instance_id = validate_path_param("instance_id", instance_id) + param_name = validate_path_param("name", name) + + res = self._request( + "DELETE", + f"/mongodb/v1alpha1/regions/{param_region}/instances/{param_instance_id}/users/{param_name}", + body={}, + ) + + self._throw_on_error(res) + async def delete_endpoint( self, *, diff --git a/scaleway-async/scaleway_async/mongodb/v1alpha1/types.py b/scaleway-async/scaleway_async/mongodb/v1alpha1/types.py index 517191ae5..ff21c2e8c 100644 --- a/scaleway-async/scaleway_async/mongodb/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/mongodb/v1alpha1/types.py @@ -672,6 +672,24 @@ class DeleteSnapshotRequest: """ +@dataclass +class DeleteUserRequest: + instance_id: str + """ + UUID of the Database Instance the user belongs to. + """ + + name: str + """ + Name of the database user. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + @dataclass class GetInstanceCertificateRequest: instance_id: str diff --git a/scaleway-async/scaleway_async/secret/v1beta1/marshalling.py b/scaleway-async/scaleway_async/secret/v1beta1/marshalling.py index 5464afcfe..699110e53 100644 --- a/scaleway-async/scaleway_async/secret/v1beta1/marshalling.py +++ b/scaleway-async/scaleway_async/secret/v1beta1/marshalling.py @@ -92,6 +92,12 @@ def unmarshal_SecretVersion(data: Any) -> SecretVersion: else: args["updated_at"] = None + field = data.get("deleted_at", None) + if field is not None: + args["deleted_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["deleted_at"] = None + field = data.get("description", None) if field is not None: args["description"] = field diff --git a/scaleway-async/scaleway_async/secret/v1beta1/types.py b/scaleway-async/scaleway_async/secret/v1beta1/types.py index 8229930e0..8c6b07ce1 100644 --- a/scaleway-async/scaleway_async/secret/v1beta1/types.py +++ b/scaleway-async/scaleway_async/secret/v1beta1/types.py @@ -192,6 +192,11 @@ class SecretVersion: Last update of the version. """ + deleted_at: Optional[datetime] + """ + Date and time of the version's deletion. + """ + description: Optional[str] """ Description of the version. diff --git a/scaleway-async/scaleway_async/vpcgw/v2/__init__.py b/scaleway-async/scaleway_async/vpcgw/v2/__init__.py new file mode 100644 index 000000000..7c1cd4fe3 --- /dev/null +++ b/scaleway-async/scaleway_async/vpcgw/v2/__init__.py @@ -0,0 +1,97 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import GatewayNetworkStatus +from .content import GATEWAY_NETWORK_TRANSIENT_STATUSES +from .types import GatewayStatus +from .content import GATEWAY_TRANSIENT_STATUSES +from .types import ListGatewayNetworksRequestOrderBy +from .types import ListGatewaysRequestOrderBy +from .types import ListIPsRequestOrderBy +from .types import ListPatRulesRequestOrderBy +from .types import PatRuleProtocol +from .types import GatewayNetwork +from .types import IP +from .types import GatewayType +from .types import Gateway +from .types import PatRule +from .types import SetPatRulesRequestRule +from .types import CreateGatewayNetworkRequest +from .types import CreateGatewayRequest +from .types import CreateIPRequest +from .types import CreatePatRuleRequest +from .types import DeleteGatewayNetworkRequest +from .types import DeleteGatewayRequest +from .types import DeleteIPRequest +from .types import DeletePatRuleRequest +from .types import GetGatewayNetworkRequest +from .types import GetGatewayRequest +from .types import GetIPRequest +from .types import GetPatRuleRequest +from .types import ListGatewayNetworksRequest +from .types import ListGatewayNetworksResponse +from .types import ListGatewayTypesRequest +from .types import ListGatewayTypesResponse +from .types import ListGatewaysRequest +from .types import ListGatewaysResponse +from .types import ListIPsRequest +from .types import ListIPsResponse +from .types import ListPatRulesRequest +from .types import ListPatRulesResponse +from .types import RefreshSSHKeysRequest +from .types import SetPatRulesRequest +from .types import SetPatRulesResponse +from .types import UpdateGatewayNetworkRequest +from .types import UpdateGatewayRequest +from .types import UpdateIPRequest +from .types import UpdatePatRuleRequest +from .types import UpgradeGatewayRequest +from .api import VpcgwV2API + +__all__ = [ + "GatewayNetworkStatus", + "GATEWAY_NETWORK_TRANSIENT_STATUSES", + "GatewayStatus", + "GATEWAY_TRANSIENT_STATUSES", + "ListGatewayNetworksRequestOrderBy", + "ListGatewaysRequestOrderBy", + "ListIPsRequestOrderBy", + "ListPatRulesRequestOrderBy", + "PatRuleProtocol", + "GatewayNetwork", + "IP", + "GatewayType", + "Gateway", + "PatRule", + "SetPatRulesRequestRule", + "CreateGatewayNetworkRequest", + "CreateGatewayRequest", + "CreateIPRequest", + "CreatePatRuleRequest", + "DeleteGatewayNetworkRequest", + "DeleteGatewayRequest", + "DeleteIPRequest", + "DeletePatRuleRequest", + "GetGatewayNetworkRequest", + "GetGatewayRequest", + "GetIPRequest", + "GetPatRuleRequest", + "ListGatewayNetworksRequest", + "ListGatewayNetworksResponse", + "ListGatewayTypesRequest", + "ListGatewayTypesResponse", + "ListGatewaysRequest", + "ListGatewaysResponse", + "ListIPsRequest", + "ListIPsResponse", + "ListPatRulesRequest", + "ListPatRulesResponse", + "RefreshSSHKeysRequest", + "SetPatRulesRequest", + "SetPatRulesResponse", + "UpdateGatewayNetworkRequest", + "UpdateGatewayRequest", + "UpdateIPRequest", + "UpdatePatRuleRequest", + "UpgradeGatewayRequest", + "VpcgwV2API", +] diff --git a/scaleway-async/scaleway_async/vpcgw/v2/api.py b/scaleway-async/scaleway_async/vpcgw/v2/api.py new file mode 100644 index 000000000..a29e79e5f --- /dev/null +++ b/scaleway-async/scaleway_async/vpcgw/v2/api.py @@ -0,0 +1,1385 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Awaitable, List, Optional, Union + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + WaitForOptions, + random_name, + validate_path_param, + fetch_all_pages_async, + wait_for_resource_async, +) +from .types import ( + GatewayNetworkStatus, + GatewayStatus, + ListGatewayNetworksRequestOrderBy, + ListGatewaysRequestOrderBy, + ListIPsRequestOrderBy, + ListPatRulesRequestOrderBy, + PatRuleProtocol, + CreateGatewayNetworkRequest, + CreateGatewayRequest, + CreateIPRequest, + CreatePatRuleRequest, + Gateway, + GatewayNetwork, + IP, + ListGatewayNetworksResponse, + ListGatewayTypesResponse, + ListGatewaysResponse, + ListIPsResponse, + ListPatRulesResponse, + PatRule, + SetPatRulesRequest, + SetPatRulesRequestRule, + SetPatRulesResponse, + UpdateGatewayNetworkRequest, + UpdateGatewayRequest, + UpdateIPRequest, + UpdatePatRuleRequest, + UpgradeGatewayRequest, +) +from .content import ( + GATEWAY_NETWORK_TRANSIENT_STATUSES, + GATEWAY_TRANSIENT_STATUSES, +) +from .marshalling import ( + unmarshal_GatewayNetwork, + unmarshal_IP, + unmarshal_Gateway, + unmarshal_PatRule, + unmarshal_ListGatewayNetworksResponse, + unmarshal_ListGatewayTypesResponse, + unmarshal_ListGatewaysResponse, + unmarshal_ListIPsResponse, + unmarshal_ListPatRulesResponse, + unmarshal_SetPatRulesResponse, + marshal_CreateGatewayNetworkRequest, + marshal_CreateGatewayRequest, + marshal_CreateIPRequest, + marshal_CreatePatRuleRequest, + marshal_SetPatRulesRequest, + marshal_UpdateGatewayNetworkRequest, + marshal_UpdateGatewayRequest, + marshal_UpdateIPRequest, + marshal_UpdatePatRuleRequest, + marshal_UpgradeGatewayRequest, +) + + +class VpcgwV2API(API): + """ + This API allows you to manage your Public Gateways. + """ + + async def list_gateways( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewaysRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + types: Optional[List[str]] = None, + status: Optional[List[GatewayStatus]] = None, + private_network_ids: Optional[List[str]] = None, + include_legacy: Optional[bool] = None, + ) -> ListGatewaysResponse: + """ + List Public Gateways. + List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Gateways per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Include only gateways in this Project. + :param name: Filter for gateways which have this search term in their name. + :param tags: Filter for gateways with these tags. + :param types: Filter for gateways of these types. + :param status: Filter for gateways with these status. Use `unknown` to include all statuses. + :param private_network_ids: Filter for gateways attached to these Private Networks. + :param include_legacy: Include also legacy gateways. + :return: :class:`ListGatewaysResponse ` + + Usage: + :: + + result = await api.list_gateways() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateways", + params={ + "include_legacy": include_legacy, + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_ids": private_network_ids, + "project_id": project_id or self.client.default_project_id, + "status": status, + "tags": tags, + "types": types, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListGatewaysResponse(res.json()) + + async def list_gateways_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewaysRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + types: Optional[List[str]] = None, + status: Optional[List[GatewayStatus]] = None, + private_network_ids: Optional[List[str]] = None, + include_legacy: Optional[bool] = None, + ) -> List[Gateway]: + """ + List Public Gateways. + List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Gateways per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Include only gateways in this Project. + :param name: Filter for gateways which have this search term in their name. + :param tags: Filter for gateways with these tags. + :param types: Filter for gateways of these types. + :param status: Filter for gateways with these status. Use `unknown` to include all statuses. + :param private_network_ids: Filter for gateways attached to these Private Networks. + :param include_legacy: Include also legacy gateways. + :return: :class:`List[Gateway] ` + + Usage: + :: + + result = await api.list_gateways_all() + """ + + return await fetch_all_pages_async( + type=ListGatewaysResponse, + key="gateways", + fetcher=self.list_gateways, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "organization_id": organization_id, + "project_id": project_id, + "name": name, + "tags": tags, + "types": types, + "status": status, + "private_network_ids": private_network_ids, + "include_legacy": include_legacy, + }, + ) + + async def get_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Get a Public Gateway. + Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. + :param gateway_id: ID of the gateway to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.get_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + async def wait_for_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + options: Optional[WaitForOptions[Gateway, Union[bool, Awaitable[bool]]]] = None, + ) -> Gateway: + """ + Get a Public Gateway. + Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. + :param gateway_id: ID of the gateway to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.get_gateway( + gateway_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = lambda res: res.status not in GATEWAY_TRANSIENT_STATUSES + + return await wait_for_resource_async( + fetcher=self.get_gateway, + options=options, + args={ + "gateway_id": gateway_id, + "zone": zone, + }, + ) + + async def create_gateway( + self, + *, + type_: str, + enable_smtp: bool, + enable_bastion: bool, + zone: Optional[Zone] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ip_id: Optional[str] = None, + bastion_port: Optional[int] = None, + ) -> Gateway: + """ + Create a Public Gateway. + Create a new Public Gateway in the specified Scaleway Project, defining its **name**, **type** and other configuration details such as whether to enable SSH bastion. + :param type_: Gateway type (commercial offer type). + :param enable_smtp: Defines whether SMTP traffic should be allowed pass through the gateway. + :param enable_bastion: Defines whether SSH bastion should be enabled the gateway. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param project_id: Scaleway Project to create the gateway in. + :param name: Name for the gateway. + :param tags: Tags for the gateway. + :param ip_id: Existing IP address to attach to the gateway. + :param bastion_port: Port of the SSH bastion. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.create_gateway( + type="example", + enable_smtp=False, + enable_bastion=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways", + body=marshal_CreateGatewayRequest( + CreateGatewayRequest( + type_=type_, + enable_smtp=enable_smtp, + enable_bastion=enable_bastion, + zone=zone, + project_id=project_id, + name=name or random_name(prefix="gw"), + tags=tags, + ip_id=ip_id, + bastion_port=bastion_port, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + async def update_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + enable_bastion: Optional[bool] = None, + bastion_port: Optional[int] = None, + enable_smtp: Optional[bool] = None, + ) -> Gateway: + """ + Update a Public Gateway. + Update the parameters of an existing Public Gateway, for example, its **name**, **tags**, **SSH bastion configuration**, and **DNS servers**. + :param gateway_id: ID of the gateway to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param name: Name for the gateway. + :param tags: Tags for the gateway. + :param enable_bastion: Defines whether SSH bastion should be enabled the gateway. + :param bastion_port: Port of the SSH bastion. + :param enable_smtp: Defines whether SMTP traffic should be allowed to pass through the gateway. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.update_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + body=marshal_UpdateGatewayRequest( + UpdateGatewayRequest( + gateway_id=gateway_id, + zone=zone, + name=name, + tags=tags, + enable_bastion=enable_bastion, + bastion_port=bastion_port, + enable_smtp=enable_smtp, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + async def delete_gateway( + self, + *, + gateway_id: str, + delete_ip: bool, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Delete a Public Gateway. + Delete an existing Public Gateway, specified by its gateway ID. This action is irreversible. + :param gateway_id: ID of the gateway to delete. + :param delete_ip: Defines whether the PGW's IP should be deleted. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.delete_gateway( + gateway_id="example", + delete_ip=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + params={ + "delete_ip": delete_ip, + }, + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + async def upgrade_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + type_: Optional[str] = None, + ) -> Gateway: + """ + Upgrade a Public Gateway to the latest version and/or to a different commercial offer type. + Upgrade a given Public Gateway to the newest software version or to a different commercial offer type. This applies the latest bugfixes and features to your Public Gateway. Note that gateway service will be interrupted during the update. + :param gateway_id: ID of the gateway to upgrade. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param type_: Gateway type (commercial offer). + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.upgrade_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}/upgrade", + body=marshal_UpgradeGatewayRequest( + UpgradeGatewayRequest( + gateway_id=gateway_id, + zone=zone, + type_=type_, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + async def list_gateway_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewayNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + status: Optional[List[GatewayNetworkStatus]] = None, + gateway_ids: Optional[List[str]] = None, + private_network_ids: Optional[List[str]] = None, + masquerade_enabled: Optional[bool] = None, + ) -> ListGatewayNetworksResponse: + """ + List Public Gateway connections to Private Networks. + List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: GatewayNetworks per page. + :param status: Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + :param gateway_ids: Filter for GatewayNetworks connected to these gateways. + :param private_network_ids: Filter for GatewayNetworks connected to these Private Networks. + :param masquerade_enabled: Filter for GatewayNetworks with this `enable_masquerade` setting. + :return: :class:`ListGatewayNetworksResponse ` + + Usage: + :: + + result = await api.list_gateway_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks", + params={ + "gateway_ids": gateway_ids, + "masquerade_enabled": masquerade_enabled, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_ids": private_network_ids, + "status": status, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListGatewayNetworksResponse(res.json()) + + async def list_gateway_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewayNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + status: Optional[List[GatewayNetworkStatus]] = None, + gateway_ids: Optional[List[str]] = None, + private_network_ids: Optional[List[str]] = None, + masquerade_enabled: Optional[bool] = None, + ) -> List[GatewayNetwork]: + """ + List Public Gateway connections to Private Networks. + List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: GatewayNetworks per page. + :param status: Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + :param gateway_ids: Filter for GatewayNetworks connected to these gateways. + :param private_network_ids: Filter for GatewayNetworks connected to these Private Networks. + :param masquerade_enabled: Filter for GatewayNetworks with this `enable_masquerade` setting. + :return: :class:`List[GatewayNetwork] ` + + Usage: + :: + + result = await api.list_gateway_networks_all() + """ + + return await fetch_all_pages_async( + type=ListGatewayNetworksResponse, + key="gateway_networks", + fetcher=self.list_gateway_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "status": status, + "gateway_ids": gateway_ids, + "private_network_ids": private_network_ids, + "masquerade_enabled": masquerade_enabled, + }, + ) + + async def get_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + ) -> GatewayNetwork: + """ + Get a Public Gateway connection to a Private Network. + Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. + :param gateway_network_id: ID of the GatewayNetwork to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = await api.get_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + async def wait_for_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + options: Optional[ + WaitForOptions[GatewayNetwork, Union[bool, Awaitable[bool]]] + ] = None, + ) -> GatewayNetwork: + """ + Get a Public Gateway connection to a Private Network. + Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. + :param gateway_network_id: ID of the GatewayNetwork to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = await api.get_gateway_network( + gateway_network_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = ( + lambda res: res.status not in GATEWAY_NETWORK_TRANSIENT_STATUSES + ) + + return await wait_for_resource_async( + fetcher=self.get_gateway_network, + options=options, + args={ + "gateway_network_id": gateway_network_id, + "zone": zone, + }, + ) + + async def create_gateway_network( + self, + *, + gateway_id: str, + private_network_id: str, + enable_masquerade: bool, + push_default_route: bool, + zone: Optional[Zone] = None, + ipam_ip_id: Optional[str] = None, + ) -> GatewayNetwork: + """ + Attach a Public Gateway to a Private Network. + Attach a specific Public Gateway to a specific Private Network (create a GatewayNetwork). You can configure parameters for the connection including whether to enable masquerade (dynamic NAT), and more. + :param gateway_id: Public Gateway to connect. + :param private_network_id: Private Network to connect. + :param enable_masquerade: Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + :param push_default_route: Enabling the default route also enables masquerading. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_id: Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = await api.create_gateway_network( + gateway_id="example", + private_network_id="example", + enable_masquerade=False, + push_default_route=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks", + body=marshal_CreateGatewayNetworkRequest( + CreateGatewayNetworkRequest( + gateway_id=gateway_id, + private_network_id=private_network_id, + enable_masquerade=enable_masquerade, + push_default_route=push_default_route, + zone=zone, + ipam_ip_id=ipam_ip_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + async def update_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + enable_masquerade: Optional[bool] = None, + push_default_route: Optional[bool] = None, + ipam_ip_id: Optional[str] = None, + ) -> GatewayNetwork: + """ + Update a Public Gateway's connection to a Private Network. + Update the configuration parameters of a connection between a given Public Gateway and Private Network (the connection = a GatewayNetwork). Updatable parameters include whether to enable traffic masquerade (dynamic NAT). + :param gateway_network_id: ID of the GatewayNetwork to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param enable_masquerade: Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + :param push_default_route: Enabling the default route also enables masquerading. + :param ipam_ip_id: Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = await api.update_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + body=marshal_UpdateGatewayNetworkRequest( + UpdateGatewayNetworkRequest( + gateway_network_id=gateway_network_id, + zone=zone, + enable_masquerade=enable_masquerade, + push_default_route=push_default_route, + ipam_ip_id=ipam_ip_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + async def delete_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + ) -> GatewayNetwork: + """ + Detach a Public Gateway from a Private Network. + Detach a given Public Gateway from a given Private Network, i.e. delete a GatewayNetwork specified by a gateway_network_id. + :param gateway_network_id: ID of the GatewayNetwork to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = await api.delete_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + async def list_pat_rules( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListPatRulesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + gateway_ids: Optional[List[str]] = None, + private_ips: Optional[List[str]] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> ListPatRulesResponse: + """ + List PAT rules. + List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: PAT rules per page. + :param gateway_ids: Filter for PAT rules on these gateways. + :param private_ips: Filter for PAT rules targeting these private ips. + :param protocol: Filter for PAT rules with this protocol. + :return: :class:`ListPatRulesResponse ` + + Usage: + :: + + result = await api.list_pat_rules() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + params={ + "gateway_ids": gateway_ids, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_ips": private_ips, + "protocol": protocol, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPatRulesResponse(res.json()) + + async def list_pat_rules_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListPatRulesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + gateway_ids: Optional[List[str]] = None, + private_ips: Optional[List[str]] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> List[PatRule]: + """ + List PAT rules. + List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: PAT rules per page. + :param gateway_ids: Filter for PAT rules on these gateways. + :param private_ips: Filter for PAT rules targeting these private ips. + :param protocol: Filter for PAT rules with this protocol. + :return: :class:`List[PatRule] ` + + Usage: + :: + + result = await api.list_pat_rules_all() + """ + + return await fetch_all_pages_async( + type=ListPatRulesResponse, + key="pat_rules", + fetcher=self.list_pat_rules, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "gateway_ids": gateway_ids, + "private_ips": private_ips, + "protocol": protocol, + }, + ) + + async def get_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + ) -> PatRule: + """ + Get a PAT rule. + Get a PAT rule, specified by its PAT rule ID. The response object gives full details of the PAT rule, including the Public Gateway it belongs to and the configuration settings in terms of public / private ports, private IP and protocol. + :param pat_rule_id: ID of the PAT rule to get. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`PatRule ` + + Usage: + :: + + result = await api.get_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + async def create_pat_rule( + self, + *, + gateway_id: str, + public_port: int, + private_ip: str, + private_port: int, + zone: Optional[Zone] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> PatRule: + """ + Create a PAT rule. + Create a new PAT rule on a specified Public Gateway, defining the protocol to use, public port to listen on, and private port / IP address to map to. + :param gateway_id: ID of the Gateway on which to create the rule. + :param public_port: Public port to listen on. + :param private_ip: Private IP to forward data to. + :param private_port: Private port to translate to. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param protocol: Protocol the rule should apply to. + :return: :class:`PatRule ` + + Usage: + :: + + result = await api.create_pat_rule( + gateway_id="example", + public_port=1, + private_ip="example", + private_port=1, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + body=marshal_CreatePatRuleRequest( + CreatePatRuleRequest( + gateway_id=gateway_id, + public_port=public_port, + private_ip=private_ip, + private_port=private_port, + zone=zone, + protocol=protocol, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + async def update_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + public_port: Optional[int] = None, + private_ip: Optional[str] = None, + private_port: Optional[int] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> PatRule: + """ + Update a PAT rule. + Update a PAT rule, specified by its PAT rule ID. Configuration settings including private/public port, private IP address and protocol can all be updated. + :param pat_rule_id: ID of the PAT rule to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param public_port: Public port to listen on. + :param private_ip: Private IP to forward data to. + :param private_port: Private port to translate to. + :param protocol: Protocol the rule should apply to. + :return: :class:`PatRule ` + + Usage: + :: + + result = await api.update_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + body=marshal_UpdatePatRuleRequest( + UpdatePatRuleRequest( + pat_rule_id=pat_rule_id, + zone=zone, + public_port=public_port, + private_ip=private_ip, + private_port=private_port, + protocol=protocol, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + async def set_pat_rules( + self, + *, + gateway_id: str, + pat_rules: List[SetPatRulesRequestRule], + zone: Optional[Zone] = None, + ) -> SetPatRulesResponse: + """ + Set all PAT rules. + Set a definitive list of PAT rules attached to a Public Gateway. Each rule is identified by its public port and protocol. This will sync the current PAT rule list on the gateway with the new list, creating, updating or deleting PAT rules accordingly. + :param gateway_id: ID of the gateway on which to set the PAT rules. + :param pat_rules: New list of PAT rules. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetPatRulesResponse ` + + Usage: + :: + + result = await api.set_pat_rules( + gateway_id="example", + pat_rules=[], + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "PUT", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + body=marshal_SetPatRulesRequest( + SetPatRulesRequest( + gateway_id=gateway_id, + pat_rules=pat_rules, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetPatRulesResponse(res.json()) + + async def delete_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a PAT rule. + Delete a PAT rule, identified by its PAT rule ID. This action is irreversible. + :param pat_rule_id: ID of the PAT rule to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = await api.delete_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + ) + + self._throw_on_error(res) + + async def list_gateway_types( + self, + *, + zone: Optional[Zone] = None, + ) -> ListGatewayTypesResponse: + """ + List Public Gateway types. + List the different Public Gateway commercial offer types available at Scaleway. The response is an array of objects describing the name and technical details of each available gateway type. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ListGatewayTypesResponse ` + + Usage: + :: + + result = await api.list_gateway_types() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-types", + ) + + self._throw_on_error(res) + return unmarshal_ListGatewayTypesResponse(res.json()) + + async def list_i_ps( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListIPsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + is_free: Optional[bool] = None, + ) -> ListIPsResponse: + """ + List IPs. + List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: IP addresses per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Filter for IP addresses in this Project. + :param tags: Filter for IP addresses with these tags. + :param reverse: Filter for IP addresses that have a reverse containing this string. + :param is_free: Filter based on whether the IP is attached to a gateway or not. + :return: :class:`ListIPsResponse ` + + Usage: + :: + + result = await api.list_i_ps() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/ips", + params={ + "is_free": is_free, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "project_id": project_id or self.client.default_project_id, + "reverse": reverse, + "tags": tags, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListIPsResponse(res.json()) + + async def list_i_ps_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListIPsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + is_free: Optional[bool] = None, + ) -> List[IP]: + """ + List IPs. + List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: IP addresses per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Filter for IP addresses in this Project. + :param tags: Filter for IP addresses with these tags. + :param reverse: Filter for IP addresses that have a reverse containing this string. + :param is_free: Filter based on whether the IP is attached to a gateway or not. + :return: :class:`List[IP] ` + + Usage: + :: + + result = await api.list_i_ps_all() + """ + + return await fetch_all_pages_async( + type=ListIPsResponse, + key="ips", + fetcher=self.list_i_ps, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "organization_id": organization_id, + "project_id": project_id, + "tags": tags, + "reverse": reverse, + "is_free": is_free, + }, + ) + + async def get_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + ) -> IP: + """ + Get an IP. + Get details of a Public Gateway flexible IP address, identified by its IP ID. The response object contains information including which (if any) Public Gateway using this IP address, the reverse and various other metadata. + :param ip_id: ID of the IP address to get. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`IP ` + + Usage: + :: + + result = await api.get_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + async def create_ip( + self, + *, + zone: Optional[Zone] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> IP: + """ + Reserve an IP. + Create (reserve) a new flexible IP address that can be used for a Public Gateway in a specified Scaleway Project. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param project_id: Project to create the IP address in. + :param tags: Tags to give to the IP address. + :return: :class:`IP ` + + Usage: + :: + + result = await api.create_ip() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/ips", + body=marshal_CreateIPRequest( + CreateIPRequest( + zone=zone, + project_id=project_id, + tags=tags, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + async def update_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + gateway_id: Optional[str] = None, + ) -> IP: + """ + Update an IP. + Update details of an existing flexible IP address, including its tags, reverse and the Public Gateway it is assigned to. + :param ip_id: ID of the IP address to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param tags: Tags to give to the IP address. + :param reverse: Reverse to set on the address. Empty string to unset. + :param gateway_id: Gateway to attach the IP address to. Empty string to detach. + :return: :class:`IP ` + + Usage: + :: + + result = await api.update_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + body=marshal_UpdateIPRequest( + UpdateIPRequest( + ip_id=ip_id, + zone=zone, + tags=tags, + reverse=reverse, + gateway_id=gateway_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + async def delete_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete an IP. + Delete a flexible IP address from your account. This action is irreversible. + :param ip_id: ID of the IP address to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = await api.delete_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + ) + + self._throw_on_error(res) + + async def refresh_ssh_keys( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Refresh a Public Gateway's SSH keys. + Refresh the SSH keys of a given Public Gateway, specified by its gateway ID. This adds any new SSH keys in the gateway's Scaleway Project to the gateway itself. + :param gateway_id: ID of the gateway to refresh SSH keys on. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = await api.refresh_ssh_keys( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}/refresh-ssh-keys", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) diff --git a/scaleway-async/scaleway_async/vpcgw/v2/content.py b/scaleway-async/scaleway_async/vpcgw/v2/content.py new file mode 100644 index 000000000..a5b8a7acf --- /dev/null +++ b/scaleway-async/scaleway_async/vpcgw/v2/content.py @@ -0,0 +1,26 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from typing import List + +from .types import ( + GatewayNetworkStatus, + GatewayStatus, +) + +GATEWAY_NETWORK_TRANSIENT_STATUSES: List[GatewayNetworkStatus] = [ + GatewayNetworkStatus.ATTACHING, + GatewayNetworkStatus.CONFIGURING, + GatewayNetworkStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`GatewayNetworkStatus `. +""" +GATEWAY_TRANSIENT_STATUSES: List[GatewayStatus] = [ + GatewayStatus.ALLOCATING, + GatewayStatus.CONFIGURING, + GatewayStatus.STOPPING, + GatewayStatus.DELETING, +] +""" +Lists transient statutes of the enum :class:`GatewayStatus `. +""" diff --git a/scaleway-async/scaleway_async/vpcgw/v2/marshalling.py b/scaleway-async/scaleway_async/vpcgw/v2/marshalling.py new file mode 100644 index 000000000..ff9cb1e66 --- /dev/null +++ b/scaleway-async/scaleway_async/vpcgw/v2/marshalling.py @@ -0,0 +1,667 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from .types import ( + GatewayNetwork, + IP, + Gateway, + PatRule, + ListGatewayNetworksResponse, + GatewayType, + ListGatewayTypesResponse, + ListGatewaysResponse, + ListIPsResponse, + ListPatRulesResponse, + SetPatRulesResponse, + CreateGatewayNetworkRequest, + CreateGatewayRequest, + CreateIPRequest, + CreatePatRuleRequest, + SetPatRulesRequestRule, + SetPatRulesRequest, + UpdateGatewayNetworkRequest, + UpdateGatewayRequest, + UpdateIPRequest, + UpdatePatRuleRequest, + UpgradeGatewayRequest, +) + + +def unmarshal_GatewayNetwork(data: Any) -> GatewayNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'GatewayNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("masquerade_enabled", None) + if field is not None: + args["masquerade_enabled"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("push_default_route", None) + if field is not None: + args["push_default_route"] = field + + field = data.get("ipam_ip_id", None) + if field is not None: + args["ipam_ip_id"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("mac_address", None) + if field is not None: + args["mac_address"] = field + else: + args["mac_address"] = None + + return GatewayNetwork(**args) + + +def unmarshal_IP(data: Any) -> IP: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'IP' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("address", None) + if field is not None: + args["address"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("reverse", None) + if field is not None: + args["reverse"] = field + else: + args["reverse"] = None + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + else: + args["gateway_id"] = None + + return IP(**args) + + +def unmarshal_Gateway(data: Any) -> Gateway: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Gateway' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("type", None) + if field is not None: + args["type_"] = field + + field = data.get("bandwidth", None) + if field is not None: + args["bandwidth"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("gateway_networks", None) + if field is not None: + args["gateway_networks"] = ( + [unmarshal_GatewayNetwork(v) for v in field] if field is not None else None + ) + + field = data.get("bastion_enabled", None) + if field is not None: + args["bastion_enabled"] = field + + field = data.get("bastion_port", None) + if field is not None: + args["bastion_port"] = field + + field = data.get("smtp_enabled", None) + if field is not None: + args["smtp_enabled"] = field + + field = data.get("is_legacy", None) + if field is not None: + args["is_legacy"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("ipv4", None) + if field is not None: + args["ipv4"] = unmarshal_IP(field) + else: + args["ipv4"] = None + + field = data.get("version", None) + if field is not None: + args["version"] = field + else: + args["version"] = None + + field = data.get("can_upgrade_to", None) + if field is not None: + args["can_upgrade_to"] = field + else: + args["can_upgrade_to"] = None + + return Gateway(**args) + + +def unmarshal_PatRule(data: Any) -> PatRule: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'PatRule' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + + field = data.get("public_port", None) + if field is not None: + args["public_port"] = field + + field = data.get("private_ip", None) + if field is not None: + args["private_ip"] = field + + field = data.get("private_port", None) + if field is not None: + args["private_port"] = field + + field = data.get("protocol", None) + if field is not None: + args["protocol"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return PatRule(**args) + + +def unmarshal_ListGatewayNetworksResponse(data: Any) -> ListGatewayNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewayNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("gateway_networks", None) + if field is not None: + args["gateway_networks"] = ( + [unmarshal_GatewayNetwork(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListGatewayNetworksResponse(**args) + + +def unmarshal_GatewayType(data: Any) -> GatewayType: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'GatewayType' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("bandwidth", None) + if field is not None: + args["bandwidth"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + return GatewayType(**args) + + +def unmarshal_ListGatewayTypesResponse(data: Any) -> ListGatewayTypesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewayTypesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("types", None) + if field is not None: + args["types"] = ( + [unmarshal_GatewayType(v) for v in field] if field is not None else None + ) + + return ListGatewayTypesResponse(**args) + + +def unmarshal_ListGatewaysResponse(data: Any) -> ListGatewaysResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewaysResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("gateways", None) + if field is not None: + args["gateways"] = ( + [unmarshal_Gateway(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListGatewaysResponse(**args) + + +def unmarshal_ListIPsResponse(data: Any) -> ListIPsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListIPsResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("ips", None) + if field is not None: + args["ips"] = [unmarshal_IP(v) for v in field] if field is not None else None + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListIPsResponse(**args) + + +def unmarshal_ListPatRulesResponse(data: Any) -> ListPatRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPatRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pat_rules", None) + if field is not None: + args["pat_rules"] = ( + [unmarshal_PatRule(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPatRulesResponse(**args) + + +def unmarshal_SetPatRulesResponse(data: Any) -> SetPatRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetPatRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pat_rules", None) + if field is not None: + args["pat_rules"] = ( + [unmarshal_PatRule(v) for v in field] if field is not None else None + ) + + return SetPatRulesResponse(**args) + + +def marshal_CreateGatewayNetworkRequest( + request: CreateGatewayNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.enable_masquerade is not None: + output["enable_masquerade"] = request.enable_masquerade + + if request.push_default_route is not None: + output["push_default_route"] = request.push_default_route + + if request.ipam_ip_id is not None: + output["ipam_ip_id"] = request.ipam_ip_id + + return output + + +def marshal_CreateGatewayRequest( + request: CreateGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.type_ is not None: + output["type"] = request.type_ + + if request.enable_smtp is not None: + output["enable_smtp"] = request.enable_smtp + + if request.enable_bastion is not None: + output["enable_bastion"] = request.enable_bastion + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.ip_id is not None: + output["ip_id"] = request.ip_id + + if request.bastion_port is not None: + output["bastion_port"] = request.bastion_port + + return output + + +def marshal_CreateIPRequest( + request: CreateIPRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_CreatePatRuleRequest( + request: CreatePatRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_SetPatRulesRequestRule( + request: SetPatRulesRequestRule, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_SetPatRulesRequest( + request: SetPatRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.pat_rules is not None: + output["pat_rules"] = [ + marshal_SetPatRulesRequestRule(item, defaults) for item in request.pat_rules + ] + + return output + + +def marshal_UpdateGatewayNetworkRequest( + request: UpdateGatewayNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.enable_masquerade is not None: + output["enable_masquerade"] = request.enable_masquerade + + if request.push_default_route is not None: + output["push_default_route"] = request.push_default_route + + if request.ipam_ip_id is not None: + output["ipam_ip_id"] = request.ipam_ip_id + + return output + + +def marshal_UpdateGatewayRequest( + request: UpdateGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.enable_bastion is not None: + output["enable_bastion"] = request.enable_bastion + + if request.bastion_port is not None: + output["bastion_port"] = request.bastion_port + + if request.enable_smtp is not None: + output["enable_smtp"] = request.enable_smtp + + return output + + +def marshal_UpdateIPRequest( + request: UpdateIPRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.tags is not None: + output["tags"] = request.tags + + if request.reverse is not None: + output["reverse"] = request.reverse + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + return output + + +def marshal_UpdatePatRuleRequest( + request: UpdatePatRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_UpgradeGatewayRequest( + request: UpgradeGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.type_ is not None: + output["type"] = request.type_ + + return output diff --git a/scaleway-async/scaleway_async/vpcgw/v2/types.py b/scaleway-async/scaleway_async/vpcgw/v2/types.py new file mode 100644 index 000000000..9bcf99b86 --- /dev/null +++ b/scaleway-async/scaleway_async/vpcgw/v2/types.py @@ -0,0 +1,1081 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import List, Optional + +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class GatewayNetworkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + CREATED = "created" + ATTACHING = "attaching" + CONFIGURING = "configuring" + READY = "ready" + DETACHING = "detaching" + + def __str__(self) -> str: + return str(self.value) + + +class GatewayStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + STOPPED = "stopped" + ALLOCATING = "allocating" + CONFIGURING = "configuring" + RUNNING = "running" + STOPPING = "stopping" + FAILED = "failed" + DELETING = "deleting" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ListGatewayNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListGatewaysRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + TYPE_ASC = "type_asc" + TYPE_DESC = "type_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListIPsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + ADDRESS_ASC = "address_asc" + ADDRESS_DESC = "address_desc" + REVERSE_ASC = "reverse_asc" + REVERSE_DESC = "reverse_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPatRulesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + PUBLIC_PORT_ASC = "public_port_asc" + PUBLIC_PORT_DESC = "public_port_desc" + + def __str__(self) -> str: + return str(self.value) + + +class PatRuleProtocol(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_PROTOCOL = "unknown_protocol" + BOTH = "both" + TCP = "tcp" + UDP = "udp" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class GatewayNetwork: + id: str + """ + ID of the Public Gateway-Private Network connection. + """ + + gateway_id: str + """ + ID of the connected Public Gateway. + """ + + private_network_id: str + """ + ID of the connected Private Network. + """ + + masquerade_enabled: bool + """ + Defines whether the gateway masquerades traffic for this Private Network (Dynamic NAT). + """ + + status: GatewayNetworkStatus + """ + Current status of the Public Gateway's connection to the Private Network. + """ + + push_default_route: bool + """ + Enabling the default route also enables masquerading. + """ + + ipam_ip_id: str + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + zone: Zone + """ + Zone of the GatewayNetwork connection. + """ + + created_at: Optional[datetime] + """ + Connection creation date. + """ + + updated_at: Optional[datetime] + """ + Connection last modification date. + """ + + mac_address: Optional[str] + """ + MAC address of the gateway in the Private Network (if the gateway is up and running). + """ + + +@dataclass +class IP: + id: str + """ + IP address ID. + """ + + organization_id: str + """ + Owning Organization. + """ + + project_id: str + """ + Owning Project. + """ + + tags: List[str] + """ + Tags associated with the IP address. + """ + + address: str + """ + The IP address itself. + """ + + zone: Zone + """ + Zone of the IP address. + """ + + created_at: Optional[datetime] + """ + IP address creation date. + """ + + updated_at: Optional[datetime] + """ + IP address last modification date. + """ + + reverse: Optional[str] + """ + Reverse domain name for the IP address. + """ + + gateway_id: Optional[str] + """ + Public Gateway associated with the IP address. + """ + + +@dataclass +class GatewayType: + name: str + """ + Public Gateway type name. + """ + + bandwidth: int + """ + Bandwidth, in bps, of the Public Gateway. This is the public bandwidth to the outer Internet, and the internal bandwidth to each connected Private Networks. + """ + + zone: Zone + """ + Zone the Public Gateway type is available in. + """ + + +@dataclass +class Gateway: + id: str + """ + ID of the gateway. + """ + + organization_id: str + """ + Owning Organization. + """ + + project_id: str + """ + Owning Project. + """ + + type_: str + """ + Gateway type name (commercial offer). + """ + + bandwidth: int + """ + Bandwidth available of the gateway. + """ + + status: GatewayStatus + """ + Current status of the gateway. + """ + + created_at: Optional[datetime] + """ + Gateway creation date. + """ + + updated_at: Optional[datetime] + """ + Gateway last modification date. + """ + + name: str + """ + Name of the gateway. + """ + + tags: List[str] + """ + Tags associated with the gateway. + """ + + gateway_networks: List[GatewayNetwork] + """ + GatewayNetwork objects attached to the gateway (each one represents a connection to a Private Network). + """ + + bastion_enabled: bool + """ + Defines whether SSH bastion is enabled on the gateway. + """ + + bastion_port: int + """ + Port of the SSH bastion. + """ + + smtp_enabled: bool + """ + Defines whether SMTP traffic is allowed to pass through the gateway. + """ + + is_legacy: bool + """ + Defines whether the gateway uses non-IPAM IP configurations. + """ + + zone: Zone + """ + Zone of the gateway. + """ + + ipv4: Optional[IP] + """ + Public IPv4 address of the gateway. + """ + + version: Optional[str] + """ + Version of the running gateway software. + """ + + can_upgrade_to: Optional[str] + """ + Newly available gateway software version that can be updated to. + """ + + +@dataclass +class PatRule: + id: str + """ + PAT rule ID. + """ + + gateway_id: str + """ + Gateway the PAT rule applies to. + """ + + public_port: int + """ + Public port to listen on. + """ + + private_ip: str + """ + Private IP address to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + protocol: PatRuleProtocol + """ + Protocol the rule applies to. + """ + + zone: Zone + """ + Zone of the PAT rule. + """ + + created_at: Optional[datetime] + """ + PAT rule creation date. + """ + + updated_at: Optional[datetime] + """ + PAT rule last modification date. + """ + + +@dataclass +class SetPatRulesRequestRule: + public_port: int + """ + Public port to listen on. Uniquely identifies the rule, and a matching rule will be updated with the new parameters. + """ + + private_ip: str + """ + Private IP to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + protocol: PatRuleProtocol + """ + Protocol the rule should apply to. + """ + + +@dataclass +class CreateGatewayNetworkRequest: + gateway_id: str + """ + Public Gateway to connect. + """ + + private_network_id: str + """ + Private Network to connect. + """ + + enable_masquerade: bool + """ + Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + """ + + push_default_route: bool + """ + Enabling the default route also enables masquerading. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_id: Optional[str] + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + +@dataclass +class CreateGatewayRequest: + type_: str + """ + Gateway type (commercial offer type). + """ + + enable_smtp: bool + """ + Defines whether SMTP traffic should be allowed pass through the gateway. + """ + + enable_bastion: bool + """ + Defines whether SSH bastion should be enabled the gateway. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + project_id: Optional[str] + """ + Scaleway Project to create the gateway in. + """ + + name: Optional[str] + """ + Name for the gateway. + """ + + tags: Optional[List[str]] + """ + Tags for the gateway. + """ + + ip_id: Optional[str] + """ + Existing IP address to attach to the gateway. + """ + + bastion_port: Optional[int] + """ + Port of the SSH bastion. + """ + + +@dataclass +class CreateIPRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + project_id: Optional[str] + """ + Project to create the IP address in. + """ + + tags: Optional[List[str]] + """ + Tags to give to the IP address. + """ + + +@dataclass +class CreatePatRuleRequest: + gateway_id: str + """ + ID of the Gateway on which to create the rule. + """ + + public_port: int + """ + Public port to listen on. + """ + + private_ip: str + """ + Private IP to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + protocol: Optional[PatRuleProtocol] + """ + Protocol the rule should apply to. + """ + + +@dataclass +class DeleteGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeleteGatewayRequest: + gateway_id: str + """ + ID of the gateway to delete. + """ + + delete_ip: bool + """ + Defines whether the PGW's IP should be deleted. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeleteIPRequest: + ip_id: str + """ + ID of the IP address to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeletePatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to fetch. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetGatewayRequest: + gateway_id: str + """ + ID of the gateway to fetch. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetIPRequest: + ip_id: str + """ + ID of the IP address to get. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetPatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to get. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class ListGatewayNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListGatewayNetworksRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + GatewayNetworks per page. + """ + + status: Optional[List[GatewayNetworkStatus]] + """ + Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + """ + + gateway_ids: Optional[List[str]] + """ + Filter for GatewayNetworks connected to these gateways. + """ + + private_network_ids: Optional[List[str]] + """ + Filter for GatewayNetworks connected to these Private Networks. + """ + + masquerade_enabled: Optional[bool] + """ + Filter for GatewayNetworks with this `enable_masquerade` setting. + """ + + +@dataclass +class ListGatewayNetworksResponse: + gateway_networks: List[GatewayNetwork] + """ + GatewayNetworks on this page. + """ + + total_count: int + """ + Total GatewayNetworks count matching the filter. + """ + + +@dataclass +class ListGatewayTypesRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class ListGatewayTypesResponse: + types: List[GatewayType] + """ + Available types of Public Gateway. + """ + + +@dataclass +class ListGatewaysRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListGatewaysRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Gateways per page. + """ + + organization_id: Optional[str] + """ + Include only gateways in this Organization. + """ + + project_id: Optional[str] + """ + Include only gateways in this Project. + """ + + name: Optional[str] + """ + Filter for gateways which have this search term in their name. + """ + + tags: Optional[List[str]] + """ + Filter for gateways with these tags. + """ + + types: Optional[List[str]] + """ + Filter for gateways of these types. + """ + + status: Optional[List[GatewayStatus]] + """ + Filter for gateways with these status. Use `unknown` to include all statuses. + """ + + private_network_ids: Optional[List[str]] + """ + Filter for gateways attached to these Private Networks. + """ + + include_legacy: Optional[bool] + """ + Include also legacy gateways. + """ + + +@dataclass +class ListGatewaysResponse: + gateways: List[Gateway] + """ + Gateways on this page. + """ + + total_count: int + """ + Total count of gateways matching the filter. + """ + + +@dataclass +class ListIPsRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListIPsRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + IP addresses per page. + """ + + organization_id: Optional[str] + """ + Include only gateways in this Organization. + """ + + project_id: Optional[str] + """ + Filter for IP addresses in this Project. + """ + + tags: Optional[List[str]] + """ + Filter for IP addresses with these tags. + """ + + reverse: Optional[str] + """ + Filter for IP addresses that have a reverse containing this string. + """ + + is_free: Optional[bool] + """ + Filter based on whether the IP is attached to a gateway or not. + """ + + +@dataclass +class ListIPsResponse: + ips: List[IP] + """ + IP addresses on this page. + """ + + total_count: int + """ + Total count of IP addresses matching the filter. + """ + + +@dataclass +class ListPatRulesRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListPatRulesRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + PAT rules per page. + """ + + gateway_ids: Optional[List[str]] + """ + Filter for PAT rules on these gateways. + """ + + private_ips: Optional[List[str]] + """ + Filter for PAT rules targeting these private ips. + """ + + protocol: Optional[PatRuleProtocol] + """ + Filter for PAT rules with this protocol. + """ + + +@dataclass +class ListPatRulesResponse: + pat_rules: List[PatRule] + """ + Array of PAT rules matching the filter. + """ + + total_count: int + """ + Total count of PAT rules matching the filter. + """ + + +@dataclass +class RefreshSSHKeysRequest: + gateway_id: str + """ + ID of the gateway to refresh SSH keys on. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetPatRulesRequest: + gateway_id: str + """ + ID of the gateway on which to set the PAT rules. + """ + + pat_rules: List[SetPatRulesRequestRule] + """ + New list of PAT rules. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetPatRulesResponse: + pat_rules: List[PatRule] + """ + List of PAT rules. + """ + + +@dataclass +class UpdateGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + enable_masquerade: Optional[bool] + """ + Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + """ + + push_default_route: Optional[bool] + """ + Enabling the default route also enables masquerading. + """ + + ipam_ip_id: Optional[str] + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + +@dataclass +class UpdateGatewayRequest: + gateway_id: str + """ + ID of the gateway to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + name: Optional[str] + """ + Name for the gateway. + """ + + tags: Optional[List[str]] + """ + Tags for the gateway. + """ + + enable_bastion: Optional[bool] + """ + Defines whether SSH bastion should be enabled the gateway. + """ + + bastion_port: Optional[int] + """ + Port of the SSH bastion. + """ + + enable_smtp: Optional[bool] + """ + Defines whether SMTP traffic should be allowed to pass through the gateway. + """ + + +@dataclass +class UpdateIPRequest: + ip_id: str + """ + ID of the IP address to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + tags: Optional[List[str]] + """ + Tags to give to the IP address. + """ + + reverse: Optional[str] + """ + Reverse to set on the address. Empty string to unset. + """ + + gateway_id: Optional[str] + """ + Gateway to attach the IP address to. Empty string to detach. + """ + + +@dataclass +class UpdatePatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + public_port: Optional[int] + """ + Public port to listen on. + """ + + private_ip: Optional[str] + """ + Private IP to forward data to. + """ + + private_port: Optional[int] + """ + Private port to translate to. + """ + + protocol: Optional[PatRuleProtocol] + """ + Protocol the rule should apply to. + """ + + +@dataclass +class UpgradeGatewayRequest: + gateway_id: str + """ + ID of the gateway to upgrade. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + type_: Optional[str] + """ + Gateway type (commercial offer). + """ diff --git a/scaleway-async/scaleway_async/webhosting/v1/__init__.py b/scaleway-async/scaleway_async/webhosting/v1/__init__.py index 894681eeb..0ae2a2342 100644 --- a/scaleway-async/scaleway_async/webhosting/v1/__init__.py +++ b/scaleway-async/scaleway_async/webhosting/v1/__init__.py @@ -24,6 +24,7 @@ from .types import CreateDatabaseRequestUser from .types import CreateHostingRequestDomainConfiguration from .types import OfferOptionRequest +from .types import SyncDomainDnsRecordsRequestRecord from .types import DnsRecord from .types import Nameserver from .types import HostingUser @@ -51,6 +52,7 @@ from .types import DatabaseApiUnassignDatabaseUserRequest from .types import DnsApiCheckUserOwnsDomainRequest from .types import DnsApiGetDomainDnsRecordsRequest +from .types import DnsApiSyncDomainDnsRecordsRequest from .types import DnsRecords from .types import FtpAccountApiChangeFtpAccountPasswordRequest from .types import FtpAccountApiCreateFtpAccountRequest @@ -116,6 +118,7 @@ "CreateDatabaseRequestUser", "CreateHostingRequestDomainConfiguration", "OfferOptionRequest", + "SyncDomainDnsRecordsRequestRecord", "DnsRecord", "Nameserver", "HostingUser", @@ -143,6 +146,7 @@ "DatabaseApiUnassignDatabaseUserRequest", "DnsApiCheckUserOwnsDomainRequest", "DnsApiGetDomainDnsRecordsRequest", + "DnsApiSyncDomainDnsRecordsRequest", "DnsRecords", "FtpAccountApiChangeFtpAccountPasswordRequest", "FtpAccountApiCreateFtpAccountRequest", diff --git a/scaleway-async/scaleway_async/webhosting/v1/api.py b/scaleway-async/scaleway_async/webhosting/v1/api.py index 3d1b374e2..ae6449691 100644 --- a/scaleway-async/scaleway_async/webhosting/v1/api.py +++ b/scaleway-async/scaleway_async/webhosting/v1/api.py @@ -34,6 +34,7 @@ DatabaseApiUnassignDatabaseUserRequest, DatabaseUser, DnsApiCheckUserOwnsDomainRequest, + DnsApiSyncDomainDnsRecordsRequest, DnsRecords, FtpAccount, FtpAccountApiChangeFtpAccountPasswordRequest, @@ -59,6 +60,7 @@ ResetHostingPasswordResponse, ResourceSummary, Session, + SyncDomainDnsRecordsRequestRecord, Website, ) from .content import ( @@ -89,6 +91,7 @@ marshal_DatabaseApiCreateDatabaseUserRequest, marshal_DatabaseApiUnassignDatabaseUserRequest, marshal_DnsApiCheckUserOwnsDomainRequest, + marshal_DnsApiSyncDomainDnsRecordsRequest, marshal_FtpAccountApiChangeFtpAccountPasswordRequest, marshal_FtpAccountApiCreateFtpAccountRequest, marshal_HostingApiCreateHostingRequest, @@ -824,6 +827,61 @@ async def check_user_owns_domain( self._throw_on_error(res) return unmarshal_CheckUserOwnsDomainResponse(res.json()) + async def sync_domain_dns_records( + self, + *, + domain: str, + update_web_records: bool, + update_mail_records: bool, + update_all_records: bool, + region: Optional[Region] = None, + custom_records: Optional[List[SyncDomainDnsRecordsRequestRecord]] = None, + ) -> DnsRecords: + """ + "Synchronize your DNS records on the Elements Console and on cPanel.". + :param domain: Domain for which the DNS records will be synchronized. + :param update_web_records: Whether or not to synchronize the web records. + :param update_mail_records: Whether or not to synchronize the mail records. + :param update_all_records: Whether or not to synchronize all types of records. This one has priority. + :param region: Region to target. If none is passed will use default region from the config. + :param custom_records: Custom records to synchronize. + :return: :class:`DnsRecords ` + + Usage: + :: + + result = await api.sync_domain_dns_records( + domain="example", + update_web_records=False, + update_mail_records=False, + update_all_records=False, + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_domain = validate_path_param("domain", domain) + + res = self._request( + "POST", + f"/webhosting/v1/regions/{param_region}/domains/{param_domain}/sync-domain-dns-records", + body=marshal_DnsApiSyncDomainDnsRecordsRequest( + DnsApiSyncDomainDnsRecordsRequest( + domain=domain, + update_web_records=update_web_records, + update_mail_records=update_mail_records, + update_all_records=update_all_records, + region=region, + custom_records=custom_records, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_DnsRecords(res.json()) + class WebhostingV1OfferAPI(API): """ diff --git a/scaleway-async/scaleway_async/webhosting/v1/marshalling.py b/scaleway-async/scaleway_async/webhosting/v1/marshalling.py index 99221035a..1c85301fe 100644 --- a/scaleway-async/scaleway_async/webhosting/v1/marshalling.py +++ b/scaleway-async/scaleway_async/webhosting/v1/marshalling.py @@ -49,6 +49,8 @@ DatabaseApiCreateDatabaseUserRequest, DatabaseApiUnassignDatabaseUserRequest, DnsApiCheckUserOwnsDomainRequest, + SyncDomainDnsRecordsRequestRecord, + DnsApiSyncDomainDnsRecordsRequest, FtpAccountApiChangeFtpAccountPasswordRequest, FtpAccountApiCreateFtpAccountRequest, CreateHostingRequestDomainConfiguration, @@ -364,6 +366,10 @@ def unmarshal_Offer(data: Any) -> Offer: if field is not None: args["id"] = field + field = data.get("name", None) + if field is not None: + args["name"] = field + field = data.get("billing_operation_path", None) if field is not None: args["billing_operation_path"] = field @@ -386,6 +392,10 @@ def unmarshal_Offer(data: Any) -> Offer: if field is not None: args["end_of_life"] = field + field = data.get("quota_warning", None) + if field is not None: + args["quota_warning"] = field + field = data.get("price", None) if field is not None: args["price"] = unmarshal_Money(field) @@ -939,6 +949,45 @@ def marshal_DnsApiCheckUserOwnsDomainRequest( return output +def marshal_SyncDomainDnsRecordsRequestRecord( + request: SyncDomainDnsRecordsRequestRecord, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.type_ is not None: + output["type"] = str(request.type_) + + return output + + +def marshal_DnsApiSyncDomainDnsRecordsRequest( + request: DnsApiSyncDomainDnsRecordsRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.update_web_records is not None: + output["update_web_records"] = request.update_web_records + + if request.update_mail_records is not None: + output["update_mail_records"] = request.update_mail_records + + if request.update_all_records is not None: + output["update_all_records"] = request.update_all_records + + if request.custom_records is not None: + output["custom_records"] = [ + marshal_SyncDomainDnsRecordsRequestRecord(item, defaults) + for item in request.custom_records + ] + + return output + + def marshal_FtpAccountApiChangeFtpAccountPasswordRequest( request: FtpAccountApiChangeFtpAccountPasswordRequest, defaults: ProfileDefaults, diff --git a/scaleway-async/scaleway_async/webhosting/v1/types.py b/scaleway-async/scaleway_async/webhosting/v1/types.py index 1202b2331..efcb5ba53 100644 --- a/scaleway-async/scaleway_async/webhosting/v1/types.py +++ b/scaleway-async/scaleway_async/webhosting/v1/types.py @@ -152,6 +152,8 @@ class OfferOptionName(str, Enum, metaclass=StrEnumMeta): RAM_GB = "ram_gb" BACKUP = "backup" DEDICATED_IP = "dedicated_ip" + EMAIL_STORAGE_GB = "email_storage_gb" + DATABASE_COUNT = "database_count" def __str__(self) -> str: return str(self.value) @@ -160,6 +162,7 @@ def __str__(self) -> str: class OfferOptionWarning(str, Enum, metaclass=StrEnumMeta): UNKNOWN_WARNING = "unknown_warning" QUOTA_EXCEEDED_WARNING = "quota_exceeded_warning" + USAGE_LOW_WARNING = "usage_low_warning" def __str__(self) -> str: return str(self.value) @@ -274,6 +277,13 @@ class OfferOptionRequest: """ +@dataclass +class SyncDomainDnsRecordsRequestRecord: + name: str + + type_: DnsRecordType + + @dataclass class DnsRecord: name: str @@ -350,6 +360,11 @@ class Offer: Offer ID. """ + name: str + """ + Offer name. + """ + billing_operation_path: str """ Unique identifier used for billing. @@ -375,6 +390,11 @@ class Offer: Indicates if the offer has reached its end of life. """ + quota_warning: OfferOptionWarning + """ + Defines a warning if the maximum value for an option in the offer is exceeded. + """ + price: Optional[Money] """ Price of the offer. @@ -859,6 +879,39 @@ class DnsApiGetDomainDnsRecordsRequest: """ +@dataclass +class DnsApiSyncDomainDnsRecordsRequest: + domain: str + """ + Domain for which the DNS records will be synchronized. + """ + + update_web_records: bool + """ + Whether or not to synchronize the web records. + """ + + update_mail_records: bool + """ + Whether or not to synchronize the mail records. + """ + + update_all_records: bool + """ + Whether or not to synchronize all types of records. This one has priority. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + custom_records: Optional[List[SyncDomainDnsRecordsRequestRecord]] + """ + Custom records to synchronize. + """ + + @dataclass class DnsRecords: records: List[DnsRecord] diff --git a/scaleway-core/poetry.lock b/scaleway-core/poetry.lock index ceea4bd15..8f8961626 100644 --- a/scaleway-core/poetry.lock +++ b/scaleway-core/poetry.lock @@ -1,171 +1,182 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "idna" -version = "3.6" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -284,84 +295,114 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.8.1" +version = "0.8.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, - {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, - {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, - {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, - {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, - {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, - {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, + {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, + {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, + {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, + {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, + {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, + {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, + {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, ] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "types-python-dateutil" -version = "2.9.0.20241003" +version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, - {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -372,5 +413,5 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "f2b56149dc0fe1d00315c7cc3507ed6de77fdbd15197831b814525f8aedb5d3f" +python-versions = ">=3.10" +content-hash = "61d79741b65f81f6ae1e8cbf7c9e9f18fd949cba49e6773131a020ffab7068a9" diff --git a/scaleway-core/pyproject.toml b/scaleway-core/pyproject.toml index a60c15cba..7e2b5ca67 100644 --- a/scaleway-core/pyproject.toml +++ b/scaleway-core/pyproject.toml @@ -23,14 +23,14 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.8" +python = ">=3.10" requests = "^2.28.1" PyYAML = "^6.0" python-dateutil = "^2.8.2" [tool.poetry.group.dev.dependencies] types-python-dateutil = "^2.8.19" -ruff = ">=0.5.0,<0.8.2" +ruff = ">=0.5.0,<0.8.5" mypy = "^1.5.1" [build-system] diff --git a/scaleway/poetry.lock b/scaleway/poetry.lock index d9eb2cc0b..52c2b7e34 100644 --- a/scaleway/poetry.lock +++ b/scaleway/poetry.lock @@ -1,171 +1,182 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "idna" -version = "3.6" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -201,73 +212,75 @@ six = ">=1.5" [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -282,29 +295,29 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.8.1" +version = "0.8.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, - {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, - {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, - {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, - {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, - {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, - {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, + {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, + {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, + {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, + {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, + {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, + {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, + {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, ] [[package]] @@ -312,7 +325,7 @@ name = "scaleway-core" version = "2.0.0" description = "Scaleway SDK for Python" optional = false -python-versions = "^3.8" +python-versions = ">=3.10" files = [] develop = true @@ -327,46 +340,76 @@ url = "../scaleway-core" [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -377,5 +420,5 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "d991069426a40c40b9c5f76b3df686fde71b552a4874342ba9ae3c989970100f" +python-versions = ">=3.10" +content-hash = "6f3ba5275f7b3eb4c3d480a0b7fe7e95fd6a816d9c1d0cfd96a6d4c61a0d09e0" diff --git a/scaleway/pyproject.toml b/scaleway/pyproject.toml index 01d5bfdd4..9121fa570 100644 --- a/scaleway/pyproject.toml +++ b/scaleway/pyproject.toml @@ -23,12 +23,12 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.8" +python = ">=3.10" scaleway-core = "*" [tool.poetry.group.dev.dependencies] scaleway-core = { path = "../scaleway-core", develop = true } -ruff = ">=0.5.0,<0.8.2" +ruff = ">=0.5.0,<0.8.5" mypy = "^1.5.1" [build-system] diff --git a/scaleway/scaleway/applesilicon/v1alpha1/__init__.py b/scaleway/scaleway/applesilicon/v1alpha1/__init__.py index 55d659e89..6078c5b74 100644 --- a/scaleway/scaleway/applesilicon/v1alpha1/__init__.py +++ b/scaleway/scaleway/applesilicon/v1alpha1/__init__.py @@ -2,7 +2,12 @@ # If you have any remark or suggestion do not hesitate to open an issue. from .types import ConnectivityDiagnosticActionType from .types import ConnectivityDiagnosticDiagnosticStatus +from .types import ListServerPrivateNetworksRequestOrderBy from .types import ListServersRequestOrderBy +from .types import ServerPrivateNetworkServerStatus +from .content import SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES +from .types import ServerPrivateNetworkStatus +from .content import SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES from .types import ServerStatus from .content import SERVER_TRANSIENT_STATUSES from .types import ServerTypeStock @@ -13,6 +18,7 @@ from .types import ServerTypeMemory from .types import ServerTypeNetwork from .types import ConnectivityDiagnosticServerHealth +from .types import ServerPrivateNetwork from .types import ServerType from .types import Server from .types import ConnectivityDiagnostic @@ -24,21 +30,34 @@ from .types import GetServerTypeRequest from .types import ListOSRequest from .types import ListOSResponse +from .types import ListServerPrivateNetworksResponse from .types import ListServerTypesRequest from .types import ListServerTypesResponse from .types import ListServersRequest from .types import ListServersResponse +from .types import PrivateNetworkApiAddServerPrivateNetworkRequest +from .types import PrivateNetworkApiDeleteServerPrivateNetworkRequest +from .types import PrivateNetworkApiGetServerPrivateNetworkRequest +from .types import PrivateNetworkApiListServerPrivateNetworksRequest +from .types import PrivateNetworkApiSetServerPrivateNetworksRequest from .types import RebootServerRequest from .types import ReinstallServerRequest +from .types import SetServerPrivateNetworksResponse from .types import StartConnectivityDiagnosticRequest from .types import StartConnectivityDiagnosticResponse from .types import UpdateServerRequest from .api import ApplesiliconV1Alpha1API +from .api import ApplesiliconV1Alpha1PrivateNetworkAPI __all__ = [ "ConnectivityDiagnosticActionType", "ConnectivityDiagnosticDiagnosticStatus", + "ListServerPrivateNetworksRequestOrderBy", "ListServersRequestOrderBy", + "ServerPrivateNetworkServerStatus", + "SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES", + "ServerPrivateNetworkStatus", + "SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES", "ServerStatus", "SERVER_TRANSIENT_STATUSES", "ServerTypeStock", @@ -49,6 +68,7 @@ "ServerTypeMemory", "ServerTypeNetwork", "ConnectivityDiagnosticServerHealth", + "ServerPrivateNetwork", "ServerType", "Server", "ConnectivityDiagnostic", @@ -60,14 +80,22 @@ "GetServerTypeRequest", "ListOSRequest", "ListOSResponse", + "ListServerPrivateNetworksResponse", "ListServerTypesRequest", "ListServerTypesResponse", "ListServersRequest", "ListServersResponse", + "PrivateNetworkApiAddServerPrivateNetworkRequest", + "PrivateNetworkApiDeleteServerPrivateNetworkRequest", + "PrivateNetworkApiGetServerPrivateNetworkRequest", + "PrivateNetworkApiListServerPrivateNetworksRequest", + "PrivateNetworkApiSetServerPrivateNetworksRequest", "RebootServerRequest", "ReinstallServerRequest", + "SetServerPrivateNetworksResponse", "StartConnectivityDiagnosticRequest", "StartConnectivityDiagnosticResponse", "UpdateServerRequest", "ApplesiliconV1Alpha1API", + "ApplesiliconV1Alpha1PrivateNetworkAPI", ] diff --git a/scaleway/scaleway/applesilicon/v1alpha1/api.py b/scaleway/scaleway/applesilicon/v1alpha1/api.py index d295da15c..c3cfb8698 100644 --- a/scaleway/scaleway/applesilicon/v1alpha1/api.py +++ b/scaleway/scaleway/applesilicon/v1alpha1/api.py @@ -1,7 +1,7 @@ # This file was automatically generated. DO NOT EDIT. # If you have any remark or suggestion do not hesitate to open an issue. -from typing import List, Optional +from typing import Dict, List, Optional from scaleway_core.api import API from scaleway_core.bridge import ( @@ -15,33 +15,45 @@ wait_for_resource, ) from .types import ( + ListServerPrivateNetworksRequestOrderBy, ListServersRequestOrderBy, ConnectivityDiagnostic, CreateServerRequest, ListOSResponse, + ListServerPrivateNetworksResponse, ListServerTypesResponse, ListServersResponse, OS, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, ReinstallServerRequest, Server, + ServerPrivateNetwork, ServerType, + SetServerPrivateNetworksResponse, StartConnectivityDiagnosticRequest, StartConnectivityDiagnosticResponse, UpdateServerRequest, ) from .content import ( + SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES, SERVER_TRANSIENT_STATUSES, ) from .marshalling import ( unmarshal_OS, + unmarshal_ServerPrivateNetwork, unmarshal_ServerType, unmarshal_Server, unmarshal_ConnectivityDiagnostic, unmarshal_ListOSResponse, + unmarshal_ListServerPrivateNetworksResponse, unmarshal_ListServerTypesResponse, unmarshal_ListServersResponse, + unmarshal_SetServerPrivateNetworksResponse, unmarshal_StartConnectivityDiagnosticResponse, marshal_CreateServerRequest, + marshal_PrivateNetworkApiAddServerPrivateNetworkRequest, + marshal_PrivateNetworkApiSetServerPrivateNetworksRequest, marshal_ReinstallServerRequest, marshal_StartConnectivityDiagnosticRequest, marshal_UpdateServerRequest, @@ -116,6 +128,7 @@ def create_server( self, *, type_: str, + enable_vpc: bool, zone: Optional[Zone] = None, name: Optional[str] = None, project_id: Optional[str] = None, @@ -125,6 +138,7 @@ def create_server( Create a server. Create a new server in the targeted zone, specifying its configuration including name and type. :param type_: Create a server of the given type. + :param enable_vpc: Activate the Private Network feature for this server. This feature is configured through the Apple Silicon - Private Networks API. :param zone: Zone to target. If none is passed will use default zone from the config. :param name: Create a server with this given name. :param project_id: Create a server in the given project ID. @@ -136,6 +150,7 @@ def create_server( result = api.create_server( type="example", + enable_vpc=False, ) """ @@ -147,6 +162,7 @@ def create_server( body=marshal_CreateServerRequest( CreateServerRequest( type_=type_, + enable_vpc=enable_vpc, zone=zone, name=name or random_name(prefix="as"), project_id=project_id, @@ -432,6 +448,7 @@ def update_server( zone: Optional[Zone] = None, name: Optional[str] = None, schedule_deletion: Optional[bool] = None, + enable_vpc: Optional[bool] = None, ) -> Server: """ Update a server. @@ -440,6 +457,7 @@ def update_server( :param zone: Zone to target. If none is passed will use default zone from the config. :param name: Updated name for your server. :param schedule_deletion: Specify whether the server should be flagged for automatic deletion. + :param enable_vpc: Activate or deactivate Private Network support for this server. :return: :class:`Server ` Usage: @@ -462,6 +480,7 @@ def update_server( zone=zone, name=name, schedule_deletion=schedule_deletion, + enable_vpc=enable_vpc, ), self.client, ), @@ -640,3 +659,315 @@ def get_connectivity_diagnostic( self._throw_on_error(res) return unmarshal_ConnectivityDiagnostic(res.json()) + + +class ApplesiliconV1Alpha1PrivateNetworkAPI(API): + """ + Apple silicon - Private Networks API. + """ + + def get_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> ServerPrivateNetwork: + """ + :param server_id: + :param private_network_id: + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = api.get_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "GET", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + def wait_for_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + options: Optional[WaitForOptions[ServerPrivateNetwork, bool]] = None, + ) -> ServerPrivateNetwork: + """ + :param server_id: + :param private_network_id: + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = api.get_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = ( + lambda res: res.status + not in SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES + ) + + return wait_for_resource( + fetcher=self.get_server_private_network, + options=options, + args={ + "server_id": server_id, + "private_network_id": private_network_id, + "zone": zone, + }, + ) + + def add_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ServerPrivateNetwork: + """ + Add a server to a Private Network. + Add an Apple silicon server to a Private Network. + :param server_id: ID of the server. + :param private_network_id: ID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_ids: IPAM IDs of IPs to attach to the server. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = api.add_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "POST", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + PrivateNetworkApiAddServerPrivateNetworkRequest( + server_id=server_id, + private_network_id=private_network_id, + zone=zone, + ipam_ip_ids=ipam_ip_ids, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + def set_server_private_networks( + self, + *, + server_id: str, + per_private_network_ipam_ip_ids: Dict[str, List[str]], + zone: Optional[Zone] = None, + ) -> SetServerPrivateNetworksResponse: + """ + Set multiple Private Networks on a server. + Configure multiple Private Networks on an Apple silicon server. + :param server_id: ID of the server. + :param per_private_network_ipam_ip_ids: Object where the keys are the IDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Apple silicon server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetServerPrivateNetworksResponse ` + + Usage: + :: + + result = api.set_server_private_networks( + server_id="example", + per_private_network_ipam_ip_ids={}, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "PUT", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + PrivateNetworkApiSetServerPrivateNetworksRequest( + server_id=server_id, + per_private_network_ipam_ip_ids=per_private_network_ipam_ip_ids, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetServerPrivateNetworksResponse(res.json()) + + def list_server_private_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ListServerPrivateNetworksResponse: + """ + List the Private Networks of a server. + List the Private Networks of an Apple silicon server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server ID. + :param private_network_id: Filter Private Networks by Private Network ID. + :param organization_id: Filter Private Networks by Organization ID. + :param project_id: Filter Private Networks by Project ID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP IDs. + :return: :class:`ListServerPrivateNetworksResponse ` + + Usage: + :: + + result = api.list_server_private_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/apple-silicon/v1alpha1/zones/{param_zone}/server-private-networks", + params={ + "ipam_ip_ids": ipam_ip_ids, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_id": private_network_id, + "project_id": project_id or self.client.default_project_id, + "server_id": server_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListServerPrivateNetworksResponse(res.json()) + + def list_server_private_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> List[ServerPrivateNetwork]: + """ + List the Private Networks of a server. + List the Private Networks of an Apple silicon server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server ID. + :param private_network_id: Filter Private Networks by Private Network ID. + :param organization_id: Filter Private Networks by Organization ID. + :param project_id: Filter Private Networks by Project ID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP IDs. + :return: :class:`List[ServerPrivateNetwork] ` + + Usage: + :: + + result = api.list_server_private_networks_all() + """ + + return fetch_all_pages( + type=ListServerPrivateNetworksResponse, + key="server_private_networks", + fetcher=self.list_server_private_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "server_id": server_id, + "private_network_id": private_network_id, + "organization_id": organization_id, + "project_id": project_id, + "ipam_ip_ids": ipam_ip_ids, + }, + ) + + def delete_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a Private Network. + :param server_id: ID of the server. + :param private_network_id: ID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = api.delete_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "DELETE", + f"/apple-silicon/v1alpha1/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway/scaleway/applesilicon/v1alpha1/content.py b/scaleway/scaleway/applesilicon/v1alpha1/content.py index 6d8396fa6..d8118f9fb 100644 --- a/scaleway/scaleway/applesilicon/v1alpha1/content.py +++ b/scaleway/scaleway/applesilicon/v1alpha1/content.py @@ -3,9 +3,26 @@ from typing import List from .types import ( + ServerPrivateNetworkServerStatus, + ServerPrivateNetworkStatus, ServerStatus, ) +SERVER_PRIVATE_NETWORK_SERVER_TRANSIENT_STATUSES: List[ + ServerPrivateNetworkServerStatus +] = [ + ServerPrivateNetworkServerStatus.ATTACHING, + ServerPrivateNetworkServerStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkServerStatus `. +""" +SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES: List[ServerPrivateNetworkStatus] = [ + ServerPrivateNetworkStatus.VPC_UPDATING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkStatus `. +""" SERVER_TRANSIENT_STATUSES: List[ServerStatus] = [ ServerStatus.STARTING, ServerStatus.REBOOTING, diff --git a/scaleway/scaleway/applesilicon/v1alpha1/marshalling.py b/scaleway/scaleway/applesilicon/v1alpha1/marshalling.py index 2d7ac679c..edbb4774b 100644 --- a/scaleway/scaleway/applesilicon/v1alpha1/marshalling.py +++ b/scaleway/scaleway/applesilicon/v1alpha1/marshalling.py @@ -8,6 +8,7 @@ from .types import ( ConnectivityDiagnosticActionType, OS, + ServerPrivateNetwork, ServerTypeCPU, ServerTypeDisk, ServerTypeGPU, @@ -18,10 +19,14 @@ ConnectivityDiagnosticServerHealth, ConnectivityDiagnostic, ListOSResponse, + ListServerPrivateNetworksResponse, ListServerTypesResponse, ListServersResponse, + SetServerPrivateNetworksResponse, StartConnectivityDiagnosticResponse, CreateServerRequest, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, ReinstallServerRequest, StartConnectivityDiagnosticRequest, UpdateServerRequest, @@ -75,6 +80,59 @@ def unmarshal_OS(data: Any) -> OS: return OS(**args) +def unmarshal_ServerPrivateNetwork(data: Any) -> ServerPrivateNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ServerPrivateNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("server_id", None) + if field is not None: + args["server_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("ipam_ip_ids", None) + if field is not None: + args["ipam_ip_ids"] = field + + field = data.get("vlan", None) + if field is not None: + args["vlan"] = field + else: + args["vlan"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return ServerPrivateNetwork(**args) + + def unmarshal_ServerTypeCPU(data: Any) -> ServerTypeCPU: if not isinstance(data, dict): raise TypeError( @@ -291,6 +349,10 @@ def unmarshal_Server(data: Any) -> Server: if field is not None: args["delivered"] = field + field = data.get("vpc_status", None) + if field is not None: + args["vpc_status"] = field + field = data.get("os", None) if field is not None: args["os"] = unmarshal_OS(field) @@ -421,6 +483,31 @@ def unmarshal_ListOSResponse(data: Any) -> ListOSResponse: return ListOSResponse(**args) +def unmarshal_ListServerPrivateNetworksResponse( + data: Any, +) -> ListServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListServerPrivateNetworksResponse(**args) + + def unmarshal_ListServerTypesResponse(data: Any) -> ListServerTypesResponse: if not isinstance(data, dict): raise TypeError( @@ -459,6 +546,27 @@ def unmarshal_ListServersResponse(data: Any) -> ListServersResponse: return ListServersResponse(**args) +def unmarshal_SetServerPrivateNetworksResponse( + data: Any, +) -> SetServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + return SetServerPrivateNetworksResponse(**args) + + def unmarshal_StartConnectivityDiagnosticResponse( data: Any, ) -> StartConnectivityDiagnosticResponse: @@ -485,6 +593,9 @@ def marshal_CreateServerRequest( if request.type_ is not None: output["type"] = request.type_ + if request.enable_vpc is not None: + output["enable_vpc"] = request.enable_vpc + if request.name is not None: output["name"] = request.name @@ -497,6 +608,35 @@ def marshal_CreateServerRequest( return output +def marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + request: PrivateNetworkApiAddServerPrivateNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.ipam_ip_ids is not None: + output["ipam_ip_ids"] = request.ipam_ip_ids + + return output + + +def marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + request: PrivateNetworkApiSetServerPrivateNetworksRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.per_private_network_ipam_ip_ids is not None: + output["per_private_network_ipam_ip_ids"] = { + key: value for key, value in request.per_private_network_ipam_ip_ids.items() + } + + return output + + def marshal_ReinstallServerRequest( request: ReinstallServerRequest, defaults: ProfileDefaults, @@ -533,4 +673,7 @@ def marshal_UpdateServerRequest( if request.schedule_deletion is not None: output["schedule_deletion"] = request.schedule_deletion + if request.enable_vpc is not None: + output["enable_vpc"] = request.enable_vpc + return output diff --git a/scaleway/scaleway/applesilicon/v1alpha1/types.py b/scaleway/scaleway/applesilicon/v1alpha1/types.py index 08fce83e0..02fc9fc26 100644 --- a/scaleway/scaleway/applesilicon/v1alpha1/types.py +++ b/scaleway/scaleway/applesilicon/v1alpha1/types.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from datetime import datetime from enum import Enum -from typing import List, Optional +from typing import Dict, List, Optional from scaleway_core.bridge import ( Zone, @@ -33,6 +33,16 @@ def __str__(self) -> str: return str(self.value) +class ListServerPrivateNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + + def __str__(self) -> str: + return str(self.value) + + class ListServersRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" CREATED_AT_DESC = "created_at_desc" @@ -41,6 +51,28 @@ def __str__(self) -> str: return str(self.value) +class ServerPrivateNetworkServerStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + ATTACHING = "attaching" + ATTACHED = "attached" + ERROR = "error" + DETACHING = "detaching" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ServerPrivateNetworkStatus(str, Enum, metaclass=StrEnumMeta): + VPC_UNKNOWN_STATUS = "vpc_unknown_status" + VPC_ENABLED = "vpc_enabled" + VPC_UPDATING = "vpc_updating" + VPC_DISABLED = "vpc_disabled" + + def __str__(self) -> str: + return str(self.value) + + class ServerStatus(str, Enum, metaclass=StrEnumMeta): UNKNOWN_STATUS = "unknown_status" STARTING = "starting" @@ -164,6 +196,54 @@ class ConnectivityDiagnosticServerHealth: last_checkin_date: Optional[datetime] +@dataclass +class ServerPrivateNetwork: + id: str + """ + ID of the Server-to-Private Network mapping. + """ + + project_id: str + """ + Private Network Project ID. + """ + + server_id: str + """ + Apple silicon server ID. + """ + + private_network_id: str + """ + Private Network ID. + """ + + status: ServerPrivateNetworkServerStatus + """ + Configuration status of the Private Network. + """ + + ipam_ip_ids: List[str] + """ + IPAM IP IDs of the server, if it has any. + """ + + vlan: Optional[int] + """ + ID of the VLAN associated with the Private Network. + """ + + created_at: Optional[datetime] + """ + Private Network creation date. + """ + + updated_at: Optional[datetime] + """ + Date the Private Network was last modified. + """ + + @dataclass class ServerType: name: str @@ -284,6 +364,11 @@ class Server: Set to true once the server has completed its provisioning steps and is ready to use. Some OS configurations might require a reinstallation of the server before delivery depending on the available stock. A reinstallation after the initial delivery will not change this flag and can be tracked using the server status. """ + vpc_status: ServerPrivateNetworkStatus + """ + Activation status of optional Private Network feature support for this server. + """ + os: Optional[OS] """ Initially installed OS, this does not necessarily reflect the current OS version. @@ -327,6 +412,11 @@ class CreateServerRequest: Create a server of the given type. """ + enable_vpc: bool + """ + Activate the Private Network feature for this server. This feature is configured through the Apple Silicon - Private Networks API. + """ + zone: Optional[Zone] """ Zone to target. If none is passed will use default zone from the config. @@ -451,6 +541,13 @@ class ListOSResponse: """ +@dataclass +class ListServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + total_count: int + + @dataclass class ListServerTypesRequest: zone: Optional[Zone] @@ -513,6 +610,125 @@ class ListServersResponse: """ +@dataclass +class PrivateNetworkApiAddServerPrivateNetworkRequest: + server_id: str + """ + ID of the server. + """ + + private_network_id: str + """ + ID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_ids: Optional[List[str]] + """ + IPAM IDs of IPs to attach to the server. + """ + + +@dataclass +class PrivateNetworkApiDeleteServerPrivateNetworkRequest: + server_id: str + """ + ID of the server. + """ + + private_network_id: str + """ + ID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiGetServerPrivateNetworkRequest: + server_id: str + + private_network_id: str + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiListServerPrivateNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] + """ + Sort order for the returned Private Networks. + """ + + page: Optional[int] + """ + Page number for the returned Private Networks. + """ + + page_size: Optional[int] + """ + Maximum number of Private Networks per page. + """ + + server_id: Optional[str] + """ + Filter Private Networks by server ID. + """ + + private_network_id: Optional[str] + """ + Filter Private Networks by Private Network ID. + """ + + organization_id: Optional[str] + """ + Filter Private Networks by Organization ID. + """ + + project_id: Optional[str] + """ + Filter Private Networks by Project ID. + """ + + ipam_ip_ids: Optional[List[str]] + """ + Filter Private Networks by IPAM IP IDs. + """ + + +@dataclass +class PrivateNetworkApiSetServerPrivateNetworksRequest: + server_id: str + """ + ID of the server. + """ + + per_private_network_ipam_ip_ids: Dict[str, List[str]] + """ + Object where the keys are the IDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Apple silicon server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + @dataclass class RebootServerRequest: server_id: str @@ -544,6 +760,11 @@ class ReinstallServerRequest: """ +@dataclass +class SetServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + @dataclass class StartConnectivityDiagnosticRequest: server_id: str @@ -580,3 +801,8 @@ class UpdateServerRequest: """ Specify whether the server should be flagged for automatic deletion. """ + + enable_vpc: Optional[bool] + """ + Activate or deactivate Private Network support for this server. + """ diff --git a/scaleway/scaleway/edge_services/v1alpha1/types.py b/scaleway/scaleway/edge_services/v1alpha1/types.py index bb8a3736f..1df8f4c27 100644 --- a/scaleway/scaleway/edge_services/v1alpha1/types.py +++ b/scaleway/scaleway/edge_services/v1alpha1/types.py @@ -765,12 +765,12 @@ class GetBillingResponse: current_plan_cache_usage: int """ - Total amount of data egressed from the cache in gigabytes from the beginning of the month, included in the active subscription plan. + Total amount of data egressed from the cache in gigabytes from the beginning of the month, for the active subscription plan. """ extra_cache_usage: int """ - Total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the active subscription plan. + Total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the subscription plans. """ current_plan: Optional[PlanDetails] @@ -785,12 +785,12 @@ class GetBillingResponse: extra_pipelines_cost: Optional[Money] """ - Cost to date (this month) of pipelines not included in the subscription plan. + Cost to date (this month) of pipelines not included in the subscription plans. """ extra_cache_cost: Optional[Money] """ - Cost to date (this month) of the data egressed from the cache that is not included in the active subscription plan. + Cost to date (this month) of the data egressed from the cache that is not included in the subscription plans. """ total_cost: Optional[Money] diff --git a/scaleway/scaleway/interlink/__init__.py b/scaleway/scaleway/interlink/__init__.py new file mode 100644 index 000000000..8b74a5ed7 --- /dev/null +++ b/scaleway/scaleway/interlink/__init__.py @@ -0,0 +1,2 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. diff --git a/scaleway/scaleway/interlink/v1beta1/__init__.py b/scaleway/scaleway/interlink/v1beta1/__init__.py new file mode 100644 index 000000000..479a0815b --- /dev/null +++ b/scaleway/scaleway/interlink/v1beta1/__init__.py @@ -0,0 +1,75 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import BgpStatus +from .types import LinkStatus +from .types import ListLinksRequestOrderBy +from .types import ListPartnersRequestOrderBy +from .types import ListPopsRequestOrderBy +from .types import ListRoutingPoliciesRequestOrderBy +from .types import Link +from .types import Partner +from .types import Pop +from .types import RoutingPolicy +from .types import AttachRoutingPolicyRequest +from .types import AttachVpcRequest +from .types import CreateLinkRequest +from .types import CreateRoutingPolicyRequest +from .types import DeleteLinkRequest +from .types import DeleteRoutingPolicyRequest +from .types import DetachRoutingPolicyRequest +from .types import DetachVpcRequest +from .types import DisableRoutePropagationRequest +from .types import EnableRoutePropagationRequest +from .types import GetLinkRequest +from .types import GetPartnerRequest +from .types import GetPopRequest +from .types import GetRoutingPolicyRequest +from .types import ListLinksRequest +from .types import ListLinksResponse +from .types import ListPartnersRequest +from .types import ListPartnersResponse +from .types import ListPopsRequest +from .types import ListPopsResponse +from .types import ListRoutingPoliciesRequest +from .types import ListRoutingPoliciesResponse +from .types import UpdateLinkRequest +from .types import UpdateRoutingPolicyRequest +from .api import InterlinkV1Beta1API + +__all__ = [ + "BgpStatus", + "LinkStatus", + "ListLinksRequestOrderBy", + "ListPartnersRequestOrderBy", + "ListPopsRequestOrderBy", + "ListRoutingPoliciesRequestOrderBy", + "Link", + "Partner", + "Pop", + "RoutingPolicy", + "AttachRoutingPolicyRequest", + "AttachVpcRequest", + "CreateLinkRequest", + "CreateRoutingPolicyRequest", + "DeleteLinkRequest", + "DeleteRoutingPolicyRequest", + "DetachRoutingPolicyRequest", + "DetachVpcRequest", + "DisableRoutePropagationRequest", + "EnableRoutePropagationRequest", + "GetLinkRequest", + "GetPartnerRequest", + "GetPopRequest", + "GetRoutingPolicyRequest", + "ListLinksRequest", + "ListLinksResponse", + "ListPartnersRequest", + "ListPartnersResponse", + "ListPopsRequest", + "ListPopsResponse", + "ListRoutingPoliciesRequest", + "ListRoutingPoliciesResponse", + "UpdateLinkRequest", + "UpdateRoutingPolicyRequest", + "InterlinkV1Beta1API", +] diff --git a/scaleway/scaleway/interlink/v1beta1/api.py b/scaleway/scaleway/interlink/v1beta1/api.py new file mode 100644 index 000000000..6b059dbe6 --- /dev/null +++ b/scaleway/scaleway/interlink/v1beta1/api.py @@ -0,0 +1,1147 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import List, Optional + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Region, +) +from scaleway_core.utils import ( + validate_path_param, + fetch_all_pages, +) +from .types import ( + BgpStatus, + LinkStatus, + ListLinksRequestOrderBy, + ListPartnersRequestOrderBy, + ListPopsRequestOrderBy, + ListRoutingPoliciesRequestOrderBy, + AttachRoutingPolicyRequest, + AttachVpcRequest, + CreateLinkRequest, + CreateRoutingPolicyRequest, + Link, + ListLinksResponse, + ListPartnersResponse, + ListPopsResponse, + ListRoutingPoliciesResponse, + Partner, + Pop, + RoutingPolicy, + UpdateLinkRequest, + UpdateRoutingPolicyRequest, +) +from .marshalling import ( + unmarshal_Link, + unmarshal_Partner, + unmarshal_Pop, + unmarshal_RoutingPolicy, + unmarshal_ListLinksResponse, + unmarshal_ListPartnersResponse, + unmarshal_ListPopsResponse, + unmarshal_ListRoutingPoliciesResponse, + marshal_AttachRoutingPolicyRequest, + marshal_AttachVpcRequest, + marshal_CreateLinkRequest, + marshal_CreateRoutingPolicyRequest, + marshal_UpdateLinkRequest, + marshal_UpdateRoutingPolicyRequest, +) + + +class InterlinkV1Beta1API(API): + """ + This API allows you to manage your Scaleway InterLink, to connect your on-premises infrastructure with your Scaleway VPC. + """ + + def list_partners( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPartnersRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + pop_ids: Optional[List[str]] = None, + ) -> ListPartnersResponse: + """ + List available partners. + List all available partners. By default, the partners returned in the list are ordered by name in ascending order, though this can be modified via the `order_by` field. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of partners to return per page. + :param pop_ids: Filter for partners present (offering a port) in one of these PoPs. + :return: :class:`ListPartnersResponse ` + + Usage: + :: + + result = api.list_partners() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/partners", + params={ + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "pop_ids": pop_ids, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPartnersResponse(res.json()) + + def list_partners_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPartnersRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + pop_ids: Optional[List[str]] = None, + ) -> List[Partner]: + """ + List available partners. + List all available partners. By default, the partners returned in the list are ordered by name in ascending order, though this can be modified via the `order_by` field. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of partners to return per page. + :param pop_ids: Filter for partners present (offering a port) in one of these PoPs. + :return: :class:`List[Partner] ` + + Usage: + :: + + result = api.list_partners_all() + """ + + return fetch_all_pages( + type=ListPartnersResponse, + key="partners", + fetcher=self.list_partners, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "pop_ids": pop_ids, + }, + ) + + def get_partner( + self, + *, + partner_id: str, + region: Optional[Region] = None, + ) -> Partner: + """ + Get a partner. + Get a partner for the given partner IP. The response object includes information such as the partner's name, email address and portal URL. + :param partner_id: ID of partner to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Partner ` + + Usage: + :: + + result = api.get_partner( + partner_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_partner_id = validate_path_param("partner_id", partner_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/partners/{param_partner_id}", + ) + + self._throw_on_error(res) + return unmarshal_Partner(res.json()) + + def list_pops( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPopsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + name: Optional[str] = None, + hosting_provider_name: Optional[str] = None, + partner_id: Optional[str] = None, + link_bandwidth_mbps: Optional[int] = None, + ) -> ListPopsResponse: + """ + List PoPs. + List all available PoPs (locations) for a given region. By default, the results are returned in ascending alphabetical order by name. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of PoPs to return per page. + :param name: PoP name to filter for. + :param hosting_provider_name: Hosting provider name to filter for. + :param partner_id: Filter for PoPs hosting an available shared port from this partner. + :param link_bandwidth_mbps: Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + :return: :class:`ListPopsResponse ` + + Usage: + :: + + result = api.list_pops() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/pops", + params={ + "hosting_provider_name": hosting_provider_name, + "link_bandwidth_mbps": link_bandwidth_mbps, + "name": name, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "partner_id": partner_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPopsResponse(res.json()) + + def list_pops_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListPopsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + name: Optional[str] = None, + hosting_provider_name: Optional[str] = None, + partner_id: Optional[str] = None, + link_bandwidth_mbps: Optional[int] = None, + ) -> List[Pop]: + """ + List PoPs. + List all available PoPs (locations) for a given region. By default, the results are returned in ascending alphabetical order by name. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of PoPs to return per page. + :param name: PoP name to filter for. + :param hosting_provider_name: Hosting provider name to filter for. + :param partner_id: Filter for PoPs hosting an available shared port from this partner. + :param link_bandwidth_mbps: Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + :return: :class:`List[Pop] ` + + Usage: + :: + + result = api.list_pops_all() + """ + + return fetch_all_pages( + type=ListPopsResponse, + key="pops", + fetcher=self.list_pops, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "name": name, + "hosting_provider_name": hosting_provider_name, + "partner_id": partner_id, + "link_bandwidth_mbps": link_bandwidth_mbps, + }, + ) + + def get_pop( + self, + *, + pop_id: str, + region: Optional[Region] = None, + ) -> Pop: + """ + Get a PoP. + Get a PoP for the given PoP ID. The response object includes the PoP's name and information about its physical location. + :param pop_id: ID of PoP to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Pop ` + + Usage: + :: + + result = api.get_pop( + pop_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_pop_id = validate_path_param("pop_id", pop_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/pops/{param_pop_id}", + ) + + self._throw_on_error(res) + return unmarshal_Pop(res.json()) + + def list_links( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListLinksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + status: Optional[LinkStatus] = None, + bgp_v4_status: Optional[BgpStatus] = None, + bgp_v6_status: Optional[BgpStatus] = None, + pop_id: Optional[str] = None, + bandwidth_mbps: Optional[int] = None, + partner_id: Optional[str] = None, + vpc_id: Optional[str] = None, + routing_policy_id: Optional[str] = None, + pairing_key: Optional[str] = None, + ) -> ListLinksResponse: + """ + List links. + List all your links (InterLink connections). A number of filters are available, including Project ID, name, tags and status. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of links to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Link name to filter for. + :param tags: Tags to filter for. + :param status: Link status to filter for. + :param bgp_v4_status: BGP IPv4 status to filter for. + :param bgp_v6_status: BGP IPv6 status to filter for. + :param pop_id: Filter for links attached to this PoP (via ports). + :param bandwidth_mbps: Filter for link bandwidth (in Mbps). + :param partner_id: Filter for links hosted by this partner. + :param vpc_id: Filter for links attached to this VPC. + :param routing_policy_id: Filter for links using this routing policy. + :param pairing_key: Filter for the link with this pairing_key. + :return: :class:`ListLinksResponse ` + + Usage: + :: + + result = api.list_links() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/links", + params={ + "bandwidth_mbps": bandwidth_mbps, + "bgp_v4_status": bgp_v4_status, + "bgp_v6_status": bgp_v6_status, + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "pairing_key": pairing_key, + "partner_id": partner_id, + "pop_id": pop_id, + "project_id": project_id or self.client.default_project_id, + "routing_policy_id": routing_policy_id, + "status": status, + "tags": tags, + "vpc_id": vpc_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListLinksResponse(res.json()) + + def list_links_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListLinksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + status: Optional[LinkStatus] = None, + bgp_v4_status: Optional[BgpStatus] = None, + bgp_v6_status: Optional[BgpStatus] = None, + pop_id: Optional[str] = None, + bandwidth_mbps: Optional[int] = None, + partner_id: Optional[str] = None, + vpc_id: Optional[str] = None, + routing_policy_id: Optional[str] = None, + pairing_key: Optional[str] = None, + ) -> List[Link]: + """ + List links. + List all your links (InterLink connections). A number of filters are available, including Project ID, name, tags and status. + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of links to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Link name to filter for. + :param tags: Tags to filter for. + :param status: Link status to filter for. + :param bgp_v4_status: BGP IPv4 status to filter for. + :param bgp_v6_status: BGP IPv6 status to filter for. + :param pop_id: Filter for links attached to this PoP (via ports). + :param bandwidth_mbps: Filter for link bandwidth (in Mbps). + :param partner_id: Filter for links hosted by this partner. + :param vpc_id: Filter for links attached to this VPC. + :param routing_policy_id: Filter for links using this routing policy. + :param pairing_key: Filter for the link with this pairing_key. + :return: :class:`List[Link] ` + + Usage: + :: + + result = api.list_links_all() + """ + + return fetch_all_pages( + type=ListLinksResponse, + key="links", + fetcher=self.list_links, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "project_id": project_id, + "organization_id": organization_id, + "name": name, + "tags": tags, + "status": status, + "bgp_v4_status": bgp_v4_status, + "bgp_v6_status": bgp_v6_status, + "pop_id": pop_id, + "bandwidth_mbps": bandwidth_mbps, + "partner_id": partner_id, + "vpc_id": vpc_id, + "routing_policy_id": routing_policy_id, + "pairing_key": pairing_key, + }, + ) + + def get_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Get a link. + Get a link (InterLink connection) for the given link ID. The response object includes information about the link's various configuration details. + :param link_id: ID of the link to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.get_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def create_link( + self, + *, + name: str, + pop_id: str, + bandwidth_mbps: int, + region: Optional[Region] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + dedicated: Optional[bool] = None, + port_id: Optional[str] = None, + partner_id: Optional[str] = None, + ) -> Link: + """ + Create a link. + Create a link (InterLink connection) in a given PoP, specifying its various configuration details. For the moment only hosted links (faciliated by partners) are available, though in the future dedicated and shared links will also be possible. + :param name: Name of the link. + :param pop_id: PoP (location) where the link will be created. + :param bandwidth_mbps: Desired bandwidth for the link. Must be compatible with available link bandwidths and remaining bandwidth capacity of the port. + :param region: Region to target. If none is passed will use default region from the config. + :param project_id: ID of the Project to create the link in. + :param tags: List of tags to apply to the link. + :param dedicated: If true, a dedicated link (1 link per port, dedicated to one customer) will be crated. It is not necessary to specify a `port_id` or `partner_id`. A new port will created and assigned to the link. Note that Scaleway has not yet enabled the creation of dedicated links, this field is reserved for future use. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :param port_id: If set, a shared link (N links per port, one of which is this customer's port) will be created. As the customer, specify the ID of the port you already have for this link. Note that shared links are not currently available. Note that Scaleway has not yet enabled the creation of shared links, this field is reserved for future use. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :param partner_id: If set, a hosted link (N links per port on a partner port) will be created. Specify the ID of the chosen partner, who already has a shareable port with available bandwidth. Note that this is currently the only type of link offered by Scaleway, and therefore this field must be set when creating a link. + One-Of ('link_kind'): at most one of 'dedicated', 'port_id', 'partner_id' could be set. + :return: :class:`Link ` + + Usage: + :: + + result = api.create_link( + name="example", + pop_id="example", + bandwidth_mbps=1, + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links", + body=marshal_CreateLinkRequest( + CreateLinkRequest( + name=name, + pop_id=pop_id, + bandwidth_mbps=bandwidth_mbps, + region=region, + project_id=project_id, + tags=tags, + dedicated=dedicated, + port_id=port_id, + partner_id=partner_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def update_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> Link: + """ + Update a link. + Update an existing link, specified by its link ID. Only its name and tags can be updated. + :param link_id: ID of the link to update. + :param region: Region to target. If none is passed will use default region from the config. + :param name: Name of the link. + :param tags: List of tags to apply to the link. + :return: :class:`Link ` + + Usage: + :: + + result = api.update_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "PATCH", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + body=marshal_UpdateLinkRequest( + UpdateLinkRequest( + link_id=link_id, + region=region, + name=name, + tags=tags, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def delete_link( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Delete a link. + Delete an existing link, specified by its link ID. Note that as well as deleting the link here on the Scaleway side, it is also necessary to request deletion from the partner on their side. Only when this action has been carried out on both sides will the resource be completely deleted. + :param link_id: ID of the link to delete. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.delete_link( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "DELETE", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}", + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def attach_vpc( + self, + *, + link_id: str, + vpc_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Attach a VPC. + Attach a VPC to an existing link. This facilitates communication between the resources in your Scaleway VPC, and your on-premises infrastructure. + :param link_id: ID of the link to attach VPC to. + :param vpc_id: ID of the VPC to attach. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.attach_vpc( + link_id="example", + vpc_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/attach-vpc", + body=marshal_AttachVpcRequest( + AttachVpcRequest( + link_id=link_id, + vpc_id=vpc_id, + region=region, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def detach_vpc( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Detach a VPC. + Detach a VPC from an existing link. + :param link_id: ID of the link to detach the VPC from. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.detach_vpc( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/detach-vpc", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def attach_routing_policy( + self, + *, + link_id: str, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Attach a routing policy. + Attach a routing policy to an existing link. As all routes across the link are blocked by default, you must attach a routing policy to set IP prefix filters for allowed routes, facilitating traffic flow. + :param link_id: ID of the link to attach a routing policy to. + :param routing_policy_id: ID of the routing policy to be attached. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.attach_routing_policy( + link_id="example", + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/attach-routing-policy", + body=marshal_AttachRoutingPolicyRequest( + AttachRoutingPolicyRequest( + link_id=link_id, + routing_policy_id=routing_policy_id, + region=region, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def detach_routing_policy( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Detach a routing policy. + Detach a routing policy from an existing link. Without a routing policy, all routes across the link are blocked by default. + :param link_id: ID of the link to detach a routing policy from. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.detach_routing_policy( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/detach-routing-policy", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def enable_route_propagation( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Enable route propagation. + Enable all allowed prefixes (defined in a routing policy) to be announced in the BGP session. This allows traffic to flow between the attached VPC and the on-premises infrastructure along the announced routes. Note that by default, even when route propagation is enabled, all routes are blocked. It is essential to attach a routing policy to define the ranges of routes to announce. + :param link_id: ID of the link on which to enable route propagation. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.enable_route_propagation( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/enable-route-propagation", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def disable_route_propagation( + self, + *, + link_id: str, + region: Optional[Region] = None, + ) -> Link: + """ + Disable route propagation. + Prevent any prefixes from being announced in the BGP session. Traffic will not be able to flow over the InterLink until route propagation is re-enabled. + :param link_id: ID of the link on which to disable route propagation. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`Link ` + + Usage: + :: + + result = api.disable_route_propagation( + link_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_link_id = validate_path_param("link_id", link_id) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/links/{param_link_id}/disable-route-propagation", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Link(res.json()) + + def list_routing_policies( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListRoutingPoliciesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> ListRoutingPoliciesResponse: + """ + List routing policies. + List all routing policies in a given region. A routing policy can be attached to one or multiple links (InterLink connections). + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of routing policies to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Routing policy name to filter for. + :param tags: Tags to filter for. + :return: :class:`ListRoutingPoliciesResponse ` + + Usage: + :: + + result = api.list_routing_policies() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/routing-policies", + params={ + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "project_id": project_id or self.client.default_project_id, + "tags": tags, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListRoutingPoliciesResponse(res.json()) + + def list_routing_policies_all( + self, + *, + region: Optional[Region] = None, + order_by: Optional[ListRoutingPoliciesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + project_id: Optional[str] = None, + organization_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> List[RoutingPolicy]: + """ + List routing policies. + List all routing policies in a given region. A routing policy can be attached to one or multiple links (InterLink connections). + :param region: Region to target. If none is passed will use default region from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Maximum number of routing policies to return per page. + :param project_id: Project ID to filter for. + :param organization_id: Organization ID to filter for. + :param name: Routing policy name to filter for. + :param tags: Tags to filter for. + :return: :class:`List[RoutingPolicy] ` + + Usage: + :: + + result = api.list_routing_policies_all() + """ + + return fetch_all_pages( + type=ListRoutingPoliciesResponse, + key="routing_policies", + fetcher=self.list_routing_policies, + args={ + "region": region, + "order_by": order_by, + "page": page, + "page_size": page_size, + "project_id": project_id, + "organization_id": organization_id, + "name": name, + "tags": tags, + }, + ) + + def get_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> RoutingPolicy: + """ + Get routing policy. + Get a routing policy for the given routing policy ID. The response object gives information including the policy's name, tags and prefix filters. + :param routing_policy_id: ID of the routing policy to get. + :param region: Region to target. If none is passed will use default region from the config. + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = api.get_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "GET", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + def create_routing_policy( + self, + *, + name: str, + region: Optional[Region] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + prefix_filter_in: Optional[List[str]] = None, + prefix_filter_out: Optional[List[str]] = None, + ) -> RoutingPolicy: + """ + Create a routing policy. + Create a routing policy. Routing policies allow you to set IP prefix filters to define the incoming route announcements to accept from the peer, and the outgoing routes to announce to the peer. + :param name: Name of the routing policy. + :param region: Region to target. If none is passed will use default region from the config. + :param project_id: ID of the Project to create the routing policy in. + :param tags: List of tags to apply to the routing policy. + :param prefix_filter_in: IP prefixes to accept from the peer (ranges of route announcements to accept). + :param prefix_filter_out: IP prefix filters to advertise to the peer (ranges of routes to advertise). + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = api.create_routing_policy( + name="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "POST", + f"/interlink/v1beta1/regions/{param_region}/routing-policies", + body=marshal_CreateRoutingPolicyRequest( + CreateRoutingPolicyRequest( + name=name, + region=region, + project_id=project_id, + tags=tags, + prefix_filter_in=prefix_filter_in, + prefix_filter_out=prefix_filter_out, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + def update_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + prefix_filter_in: Optional[List[str]] = None, + prefix_filter_out: Optional[List[str]] = None, + ) -> RoutingPolicy: + """ + Update a routing policy. + Update an existing routing policy, specified by its routing policy ID. Its name, tags and incoming/outgoing prefix filters can be updated. + :param routing_policy_id: ID of the routing policy to update. + :param region: Region to target. If none is passed will use default region from the config. + :param name: Name of the routing policy. + :param tags: List of tags to apply to the routing policy. + :param prefix_filter_in: IP prefixes to accept from the peer (ranges of route announcements to accept). + :param prefix_filter_out: IP prefix filters for routes to advertise to the peer (ranges of routes to advertise). + :return: :class:`RoutingPolicy ` + + Usage: + :: + + result = api.update_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "PATCH", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + body=marshal_UpdateRoutingPolicyRequest( + UpdateRoutingPolicyRequest( + routing_policy_id=routing_policy_id, + region=region, + name=name, + tags=tags, + prefix_filter_in=prefix_filter_in, + prefix_filter_out=prefix_filter_out, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_RoutingPolicy(res.json()) + + def delete_routing_policy( + self, + *, + routing_policy_id: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete a routing policy. + Delete an existing routing policy, specified by its routing policy ID. + :param routing_policy_id: ID of the routing policy to delete. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = api.delete_routing_policy( + routing_policy_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_routing_policy_id = validate_path_param( + "routing_policy_id", routing_policy_id + ) + + res = self._request( + "DELETE", + f"/interlink/v1beta1/regions/{param_region}/routing-policies/{param_routing_policy_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway/scaleway/interlink/v1beta1/marshalling.py b/scaleway/scaleway/interlink/v1beta1/marshalling.py new file mode 100644 index 000000000..b78b208fa --- /dev/null +++ b/scaleway/scaleway/interlink/v1beta1/marshalling.py @@ -0,0 +1,460 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from scaleway_core.utils import ( + OneOfPossibility, + resolve_one_of, +) +from .types import ( + Link, + Partner, + Pop, + RoutingPolicy, + ListLinksResponse, + ListPartnersResponse, + ListPopsResponse, + ListRoutingPoliciesResponse, + AttachRoutingPolicyRequest, + AttachVpcRequest, + CreateLinkRequest, + CreateRoutingPolicyRequest, + UpdateLinkRequest, + UpdateRoutingPolicyRequest, +) + + +def unmarshal_Link(data: Any) -> Link: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Link' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("pop_id", None) + if field is not None: + args["pop_id"] = field + + field = data.get("bandwidth_mbps", None) + if field is not None: + args["bandwidth_mbps"] = field + + field = data.get("partner_id", None) + if field is not None: + args["partner_id"] = field + else: + args["partner_id"] = None + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("bgp_v4_status", None) + if field is not None: + args["bgp_v4_status"] = field + + field = data.get("bgp_v6_status", None) + if field is not None: + args["bgp_v6_status"] = field + + field = data.get("enable_route_propagation", None) + if field is not None: + args["enable_route_propagation"] = field + + field = data.get("pairing_key", None) + if field is not None: + args["pairing_key"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + field = data.get("vpc_id", None) + if field is not None: + args["vpc_id"] = field + else: + args["vpc_id"] = None + + field = data.get("routing_policy_id", None) + if field is not None: + args["routing_policy_id"] = field + else: + args["routing_policy_id"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Link(**args) + + +def unmarshal_Partner(data: Any) -> Partner: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Partner' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("contact_email", None) + if field is not None: + args["contact_email"] = field + + field = data.get("logo_url", None) + if field is not None: + args["logo_url"] = field + + field = data.get("portal_url", None) + if field is not None: + args["portal_url"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Partner(**args) + + +def unmarshal_Pop(data: Any) -> Pop: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Pop' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("hosting_provider_name", None) + if field is not None: + args["hosting_provider_name"] = field + + field = data.get("address", None) + if field is not None: + args["address"] = field + + field = data.get("city", None) + if field is not None: + args["city"] = field + + field = data.get("logo_url", None) + if field is not None: + args["logo_url"] = field + + field = data.get("available_link_bandwidths_mbps", None) + if field is not None: + args["available_link_bandwidths_mbps"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + return Pop(**args) + + +def unmarshal_RoutingPolicy(data: Any) -> RoutingPolicy: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'RoutingPolicy' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("prefix_filter_in", None) + if field is not None: + args["prefix_filter_in"] = field + + field = data.get("prefix_filter_out", None) + if field is not None: + args["prefix_filter_out"] = field + + field = data.get("region", None) + if field is not None: + args["region"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return RoutingPolicy(**args) + + +def unmarshal_ListLinksResponse(data: Any) -> ListLinksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListLinksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("links", None) + if field is not None: + args["links"] = ( + [unmarshal_Link(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListLinksResponse(**args) + + +def unmarshal_ListPartnersResponse(data: Any) -> ListPartnersResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPartnersResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("partners", None) + if field is not None: + args["partners"] = ( + [unmarshal_Partner(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPartnersResponse(**args) + + +def unmarshal_ListPopsResponse(data: Any) -> ListPopsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPopsResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pops", None) + if field is not None: + args["pops"] = [unmarshal_Pop(v) for v in field] if field is not None else None + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPopsResponse(**args) + + +def unmarshal_ListRoutingPoliciesResponse(data: Any) -> ListRoutingPoliciesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListRoutingPoliciesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("routing_policies", None) + if field is not None: + args["routing_policies"] = ( + [unmarshal_RoutingPolicy(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListRoutingPoliciesResponse(**args) + + +def marshal_AttachRoutingPolicyRequest( + request: AttachRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.routing_policy_id is not None: + output["routing_policy_id"] = request.routing_policy_id + + return output + + +def marshal_AttachVpcRequest( + request: AttachVpcRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.vpc_id is not None: + output["vpc_id"] = request.vpc_id + + return output + + +def marshal_CreateLinkRequest( + request: CreateLinkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + output.update( + resolve_one_of( + [ + OneOfPossibility("dedicated", request.dedicated), + OneOfPossibility("port_id", request.port_id), + OneOfPossibility("partner_id", request.partner_id), + ] + ), + ) + + if request.name is not None: + output["name"] = request.name + + if request.pop_id is not None: + output["pop_id"] = request.pop_id + + if request.bandwidth_mbps is not None: + output["bandwidth_mbps"] = request.bandwidth_mbps + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_CreateRoutingPolicyRequest( + request: CreateRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + if request.prefix_filter_in is not None: + output["prefix_filter_in"] = request.prefix_filter_in + + if request.prefix_filter_out is not None: + output["prefix_filter_out"] = request.prefix_filter_out + + return output + + +def marshal_UpdateLinkRequest( + request: UpdateLinkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_UpdateRoutingPolicyRequest( + request: UpdateRoutingPolicyRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.prefix_filter_in is not None: + output["prefix_filter_in"] = request.prefix_filter_in + + if request.prefix_filter_out is not None: + output["prefix_filter_out"] = request.prefix_filter_out + + return output diff --git a/scaleway/scaleway/interlink/v1beta1/types.py b/scaleway/scaleway/interlink/v1beta1/types.py new file mode 100644 index 000000000..f369fec70 --- /dev/null +++ b/scaleway/scaleway/interlink/v1beta1/types.py @@ -0,0 +1,850 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import List, Optional + +from scaleway_core.bridge import ( + Region, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class BgpStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_BGP_STATUS = "unknown_bgp_status" + UP = "up" + DOWN = "down" + + def __str__(self) -> str: + return str(self.value) + + +class LinkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_LINK_STATUS = "unknown_link_status" + CONFIGURING = "configuring" + FAILED = "failed" + REQUESTED = "requested" + REFUSED = "refused" + EXPIRED = "expired" + PROVISIONING = "provisioning" + ACTIVE = "active" + LIMITED_CONNECTIVITY = "limited_connectivity" + ALL_DOWN = "all_down" + DEPROVISIONING = "deprovisioning" + DELETED = "deleted" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ListLinksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPartnersRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPopsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListRoutingPoliciesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class Link: + id: str + """ + Unique identifier of the link. + """ + + project_id: str + """ + Project ID. + """ + + organization_id: str + """ + Organization ID. + """ + + name: str + """ + Name of the link. + """ + + tags: List[str] + """ + List of tags associated with the link. + """ + + pop_id: str + """ + ID of the PoP where the link's corresponding port is located. + """ + + bandwidth_mbps: int + """ + Rate limited bandwidth of the link. + """ + + partner_id: Optional[str] + """ + ID of the partner facilitating this link. + """ + + status: LinkStatus + """ + Status of the link. + """ + + bgp_v4_status: BgpStatus + """ + Status of the link's BGP IPv4 session. + """ + + bgp_v6_status: BgpStatus + """ + Status of the link's BGP IPv6 session. + """ + + enable_route_propagation: bool + """ + Defines whether route propagation is enabled or not. To enable or disable route propagation, use the dedicated endpoint. + """ + + pairing_key: str + """ + Used to identify a link from a user or partner's point of view. + """ + + region: Region + """ + Region of the link. + """ + + vpc_id: Optional[str] + """ + ID of the Scaleway VPC attached to the link. + """ + + routing_policy_id: Optional[str] + """ + ID of the routing policy attached to the link. + """ + + created_at: Optional[datetime] + """ + Creation date of the link. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the link. + """ + + +@dataclass +class Partner: + id: str + """ + Unique identifier of the partner. + """ + + name: str + """ + Name of the partner. + """ + + contact_email: str + """ + Contact email address of partner. + """ + + logo_url: str + """ + Image URL of the partner's logo. + """ + + portal_url: str + """ + URL of the partner's portal. + """ + + created_at: Optional[datetime] + """ + Creation date of the partner. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the partner. + """ + + +@dataclass +class Pop: + id: str + """ + Unique identifier of the PoP. + """ + + name: str + """ + Name of the PoP. It is the common reference of Hosting DC (ex: TH2). + """ + + hosting_provider_name: str + """ + Name of the PoP's hosting provider, e.g. Telehouse for TH2 or OpCore for DC3. + """ + + address: str + """ + Physical address of the PoP. + """ + + city: str + """ + City where PoP is located. + """ + + logo_url: str + """ + Image URL of the PoP's logo. + """ + + available_link_bandwidths_mbps: List[int] + """ + Available bandwidth in Mbits/s for future hosted_links from available ports in this PoP. + """ + + region: Region + """ + Region of the PoP. + """ + + +@dataclass +class RoutingPolicy: + id: str + """ + Unique identifier of the routing policy. + """ + + project_id: str + """ + Project ID. + """ + + organization_id: str + """ + Organization ID. + """ + + name: str + """ + Name of the routing policy. + """ + + tags: List[str] + """ + List of tags associated with the routing policy. + """ + + prefix_filter_in: List[str] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: List[str] + """ + IP prefix filters to advertise to the peer (ranges of routes to advertise). + """ + + region: Region + """ + Region of the routing policy. + """ + + created_at: Optional[datetime] + """ + Creation date of the routing policy. + """ + + updated_at: Optional[datetime] + """ + Last modification date of the routing policy. + """ + + +@dataclass +class AttachRoutingPolicyRequest: + link_id: str + """ + ID of the link to attach a routing policy to. + """ + + routing_policy_id: str + """ + ID of the routing policy to be attached. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class AttachVpcRequest: + link_id: str + """ + ID of the link to attach VPC to. + """ + + vpc_id: str + """ + ID of the VPC to attach. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class CreateLinkRequest: + name: str + """ + Name of the link. + """ + + pop_id: str + """ + PoP (location) where the link will be created. + """ + + bandwidth_mbps: int + """ + Desired bandwidth for the link. Must be compatible with available link bandwidths and remaining bandwidth capacity of the port. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + project_id: Optional[str] + """ + ID of the Project to create the link in. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the link. + """ + + dedicated: Optional[bool] + + port_id: Optional[str] + + partner_id: Optional[str] + + +@dataclass +class CreateRoutingPolicyRequest: + name: str + """ + Name of the routing policy. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + project_id: Optional[str] + """ + ID of the Project to create the routing policy in. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the routing policy. + """ + + prefix_filter_in: Optional[List[str]] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: Optional[List[str]] + """ + IP prefix filters to advertise to the peer (ranges of routes to advertise). + """ + + +@dataclass +class DeleteLinkRequest: + link_id: str + """ + ID of the link to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DeleteRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DetachRoutingPolicyRequest: + link_id: str + """ + ID of the link to detach a routing policy from. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DetachVpcRequest: + link_id: str + """ + ID of the link to detach the VPC from. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class DisableRoutePropagationRequest: + link_id: str + """ + ID of the link on which to disable route propagation. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class EnableRoutePropagationRequest: + link_id: str + """ + ID of the link on which to enable route propagation. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetLinkRequest: + link_id: str + """ + ID of the link to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetPartnerRequest: + partner_id: str + """ + ID of partner to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetPopRequest: + pop_id: str + """ + ID of PoP to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class GetRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to get. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + +@dataclass +class ListLinksRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListLinksRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of links to return per page. + """ + + project_id: Optional[str] + """ + Project ID to filter for. + """ + + organization_id: Optional[str] + """ + Organization ID to filter for. + """ + + name: Optional[str] + """ + Link name to filter for. + """ + + tags: Optional[List[str]] + """ + Tags to filter for. + """ + + status: Optional[LinkStatus] + """ + Link status to filter for. + """ + + bgp_v4_status: Optional[BgpStatus] + """ + BGP IPv4 status to filter for. + """ + + bgp_v6_status: Optional[BgpStatus] + """ + BGP IPv6 status to filter for. + """ + + pop_id: Optional[str] + """ + Filter for links attached to this PoP (via ports). + """ + + bandwidth_mbps: Optional[int] + """ + Filter for link bandwidth (in Mbps). + """ + + partner_id: Optional[str] + """ + Filter for links hosted by this partner. + """ + + vpc_id: Optional[str] + """ + Filter for links attached to this VPC. + """ + + routing_policy_id: Optional[str] + """ + Filter for links using this routing policy. + """ + + pairing_key: Optional[str] + """ + Filter for the link with this pairing_key. + """ + + +@dataclass +class ListLinksResponse: + links: List[Link] + """ + List of links on the current page. + """ + + total_count: int + """ + Total number of links. + """ + + +@dataclass +class ListPartnersRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListPartnersRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of partners to return per page. + """ + + pop_ids: Optional[List[str]] + """ + Filter for partners present (offering a port) in one of these PoPs. + """ + + +@dataclass +class ListPartnersResponse: + partners: List[Partner] + """ + List of partners on current page. + """ + + total_count: int + """ + Total number of partners returned. + """ + + +@dataclass +class ListPopsRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListPopsRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of PoPs to return per page. + """ + + name: Optional[str] + """ + PoP name to filter for. + """ + + hosting_provider_name: Optional[str] + """ + Hosting provider name to filter for. + """ + + partner_id: Optional[str] + """ + Filter for PoPs hosting an available shared port from this partner. + """ + + link_bandwidth_mbps: Optional[int] + """ + Filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + """ + + +@dataclass +class ListPopsResponse: + pops: List[Pop] + """ + List of PoPs on the current page. + """ + + total_count: int + """ + Total number of PoPs. + """ + + +@dataclass +class ListRoutingPoliciesRequest: + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + order_by: Optional[ListRoutingPoliciesRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Maximum number of routing policies to return per page. + """ + + project_id: Optional[str] + """ + Project ID to filter for. + """ + + organization_id: Optional[str] + """ + Organization ID to filter for. + """ + + name: Optional[str] + """ + Routing policy name to filter for. + """ + + tags: Optional[List[str]] + """ + Tags to filter for. + """ + + +@dataclass +class ListRoutingPoliciesResponse: + routing_policies: List[RoutingPolicy] + + total_count: int + + +@dataclass +class UpdateLinkRequest: + link_id: str + """ + ID of the link to update. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + name: Optional[str] + """ + Name of the link. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the link. + """ + + +@dataclass +class UpdateRoutingPolicyRequest: + routing_policy_id: str + """ + ID of the routing policy to update. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + name: Optional[str] + """ + Name of the routing policy. + """ + + tags: Optional[List[str]] + """ + List of tags to apply to the routing policy. + """ + + prefix_filter_in: Optional[List[str]] + """ + IP prefixes to accept from the peer (ranges of route announcements to accept). + """ + + prefix_filter_out: Optional[List[str]] + """ + IP prefix filters for routes to advertise to the peer (ranges of routes to advertise). + """ diff --git a/scaleway/scaleway/k8s/v1/api.py b/scaleway/scaleway/k8s/v1/api.py index b6dc69b9c..b944b6a3a 100644 --- a/scaleway/scaleway/k8s/v1/api.py +++ b/scaleway/scaleway/k8s/v1/api.py @@ -244,7 +244,7 @@ def create_cluster( """ Create a new Cluster. Create a new Kubernetes cluster in a Scaleway region. - :param type_: Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16). + :param type_: Type of the cluster. See [list available cluster types](#list-available-cluster-types-for-a-cluster) for a list of valid types. :param description: Cluster description. :param version: Kubernetes version of the cluster. :param region: Region to target. If none is passed will use default region from the config. @@ -407,7 +407,7 @@ def update_cluster( :param description: New description for the cluster. :param tags: New tags associated with the cluster. :param autoscaler_config: New autoscaler config for the cluster. - :param auto_upgrade: New auto upgrade configuration for the cluster. Note that all fields need to be set. + :param auto_upgrade: New auto upgrade configuration for the cluster. Note that all fields needs to be set. :param feature_gates: List of feature gates to enable. :param admission_plugins: List of admission plugins to enable. :param open_id_connect_config: OpenID Connect configuration of the cluster. This configuration enables to update the OpenID Connect configuration of the Kubernetes API server. @@ -460,7 +460,7 @@ def delete_cluster( ) -> Cluster: """ Delete a Cluster. - Delete a specific Kubernetes cluster and all its associated pools and nodes. Note that this method will not delete any Load Balancer or Block Volume that are associated with the cluster. + Delete a specific Kubernetes cluster and all its associated pools and nodes, and possibly its associated Load Balancers or Block Volumes. :param cluster_id: ID of the cluster to delete. :param with_additional_resources: Defines whether all volumes (including retain volume type), empty Private Networks and Load Balancers with a name starting with the cluster ID will also be deleted. :param region: Region to target. If none is passed will use default region from the config. @@ -549,7 +549,7 @@ def set_cluster_type( ) -> Cluster: """ Change the Cluster type. - Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#path-clusters-list-available-cluster-types-for-a-cluster). + Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#list-available-cluster-types-for-a-cluster). :param cluster_id: ID of the cluster to migrate from one type to another. :param type_: Type of the cluster. Note that some migrations are not possible (please refer to product documentation). :param region: Region to target. If none is passed will use default region from the config. @@ -701,7 +701,7 @@ def reset_cluster_admin_token( ) -> None: """ Reset the admin token of a Cluster. - Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download kubeconfig again to keep interacting with the cluster. + Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download the kubeconfig again to keep interacting with the cluster. :param cluster_id: Cluster ID on which the admin token will be renewed. :param region: Region to target. If none is passed will use default region from the config. @@ -735,6 +735,7 @@ def migrate_cluster_to_sbscsi( """ Migrate a cluster to SBS CSI. Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. + Make sure to have the necessary Quota before running this command. :param cluster_id: Cluster ID for which the latest CSI compatible with Scaleway Block Storage will be enabled. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Cluster ` @@ -1087,17 +1088,20 @@ def create_pool( :param autoscaling: Defines whether the autoscaling feature is enabled for the pool. :param size: Size (number of nodes) of the pool. :param name: Pool name. - :param placement_group_id: Placement group ID in which all the nodes of the pool will be created. + :param placement_group_id: Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. :param min_size: Defines the minimum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. :param autohealing: Defines whether the autohealing feature is enabled for the pool. :param public_ip_disabled: Defines if the public IP should be removed from Nodes. To use this feature, your Cluster must have an attached Private Network set up with a Public Gateway. :param max_size: Defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. - :param container_runtime: Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. - :param tags: Tags associated with the pool. + :param container_runtime: Customization of the container runtime is available for each pool. + :param tags: Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). :param kubelet_args: Kubelet arguments to be used by this pool. Note that this feature is experimental. :param upgrade_policy: Pool upgrade policy. :param zone: Zone in which the pool's nodes will be spawned. - :param root_volume_type: Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + :param root_volume_type: * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types + * `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits + * `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits + * `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. :param root_volume_size: System volume disk size. :return: :class:`Pool ` @@ -1231,6 +1235,7 @@ def upgrade_pool( """ Upgrade a Pool in a Cluster. Upgrade the Kubernetes version of a specific pool. Note that it only works if the targeted version matches the cluster's version. + This will drain and replace the nodes in that pool. :param pool_id: ID of the pool to upgrade. :param version: New Kubernetes version for the pool. :param region: Region to target. If none is passed will use default region from the config. @@ -1282,7 +1287,7 @@ def update_pool( ) -> Pool: """ Update a Pool in a Cluster. - Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. + Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. To upgrade a pool, you will need to use the dedicated endpoint. :param pool_id: ID of the pool to update. :param region: Region to target. If none is passed will use default region from the config. :param autoscaling: New value for the pool autoscaling enablement. @@ -1646,7 +1651,7 @@ def replace_node( ) -> Node: """ Replace a Node in a Cluster. - Replace a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Replace a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to replace. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Node ` @@ -1682,7 +1687,7 @@ def reboot_node( ) -> Node: """ Reboot a Node in a Cluster. - Reboot a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Reboot a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to reboot. :param region: Region to target. If none is passed will use default region from the config. :return: :class:`Node ` @@ -1719,7 +1724,7 @@ def delete_node( ) -> Node: """ Delete a Node in a Cluster. - Delete a specific Node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. + Delete a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. :param node_id: ID of the node to replace. :param skip_drain: Skip draining node from its workload (Note: this parameter is currently inactive). :param replace: Add a new node after the deletion of this node. diff --git a/scaleway/scaleway/k8s/v1/marshalling.py b/scaleway/scaleway/k8s/v1/marshalling.py index e14047db0..a325023d3 100644 --- a/scaleway/scaleway/k8s/v1/marshalling.py +++ b/scaleway/scaleway/k8s/v1/marshalling.py @@ -724,13 +724,13 @@ def unmarshal_ExternalNodeAuth(data: Any) -> ExternalNodeAuth: args: Dict[str, Any] = {} - field = data.get("node_token", None) + field = data.get("node_secret_key", None) if field is not None: - args["node_token"] = field + args["node_secret_key"] = field - field = data.get("api_url", None) + field = data.get("metadata_url", None) if field is not None: - args["api_url"] = field + args["metadata_url"] = field return ExternalNodeAuth(**args) @@ -1023,18 +1023,6 @@ def unmarshal_NodeMetadata(data: Any) -> NodeMetadata: else None ) - field = data.get("private_network_mode", None) - if field is not None: - args["private_network_mode"] = field - - field = data.get("kapsule_iface_mac", None) - if field is not None: - args["kapsule_iface_mac"] = field - - field = data.get("full_isolation", None) - if field is not None: - args["full_isolation"] = field - field = data.get("has_gpu", None) if field is not None: args["has_gpu"] = field diff --git a/scaleway/scaleway/k8s/v1/types.py b/scaleway/scaleway/k8s/v1/types.py index cd0c4deb5..1f5c8d6c2 100644 --- a/scaleway/scaleway/k8s/v1/types.py +++ b/scaleway/scaleway/k8s/v1/types.py @@ -100,6 +100,14 @@ def __str__(self) -> str: class ListNodesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + VERSION_ASC = "version_asc" + VERSION_DESC = "version_desc" def __str__(self) -> str: return str(self.value) @@ -243,7 +251,7 @@ class ClusterAutoscalerConfig: scale_down_delay_after_add: str """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ estimator: AutoscalerEstimator @@ -389,7 +397,7 @@ class Pool: container_runtime: Runtime """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ autohealing: bool @@ -399,7 +407,7 @@ class Pool: tags: List[str] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Dict[str, str] @@ -414,7 +422,10 @@ class Pool: root_volume_type: PoolVolumeType """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ public_ip_disabled: bool @@ -429,7 +440,7 @@ class Pool: placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ upgrade_policy: Optional[PoolUpgradePolicy] @@ -504,7 +515,7 @@ class CreateClusterRequestAutoscalerConfig: scale_down_delay_after_add: Optional[str] """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ ignore_daemonsets_utilization: Optional[bool] @@ -600,12 +611,12 @@ class CreateClusterRequestPoolConfig: container_runtime: Runtime """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ min_size: Optional[int] @@ -625,7 +636,7 @@ class CreateClusterRequestPoolConfig: tags: List[str] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Dict[str, str] @@ -640,7 +651,10 @@ class CreateClusterRequestPoolConfig: root_volume_type: PoolVolumeType """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ public_ip_disabled: bool @@ -865,7 +879,7 @@ class Cluster: auto_upgrade: Optional[ClusterAutoUpgrade] """ - Auto upgrade configuration of the cluster. + Auto upgrade Kubernetes version of the cluster. """ admission_plugins: List[str] @@ -1013,7 +1027,7 @@ class UpdateClusterRequestAutoscalerConfig: scale_down_delay_after_add: Optional[str] """ - How long after scale up that scale down evaluation resumes. + How long after scale up the scale down evaluation resumes. """ ignore_daemonsets_utilization: Optional[bool] @@ -1135,7 +1149,7 @@ class AuthExternalNodeRequest: class CreateClusterRequest: type_: str """ - Type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16). + Type of the cluster. See [list available cluster types](#list-available-cluster-types-for-a-cluster) for a list of valid types. """ description: str @@ -1257,7 +1271,7 @@ class CreatePoolRequest: placement_group_id: Optional[str] """ - Placement group ID in which all the nodes of the pool will be created. + Placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. """ min_size: Optional[int] @@ -1282,12 +1296,12 @@ class CreatePoolRequest: container_runtime: Optional[Runtime] """ - Customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + Customization of the container runtime is available for each pool. """ tags: Optional[List[str]] """ - Tags associated with the pool. + Tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). """ kubelet_args: Optional[Dict[str, str]] @@ -1307,7 +1321,10 @@ class CreatePoolRequest: root_volume_type: Optional[PoolVolumeType] """ - Defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types +* `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits +* `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits +* `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. """ root_volume_size: Optional[int] @@ -1414,9 +1431,9 @@ class ExternalNode: @dataclass class ExternalNodeAuth: - node_token: str + node_secret_key: str - api_url: str + metadata_url: str @dataclass @@ -1833,12 +1850,6 @@ class NodeMetadata: node_taints: List[NodeMetadataCoreV1Taint] - private_network_mode: str - - kapsule_iface_mac: str - - full_isolation: bool - has_gpu: bool external_ip: str @@ -1963,7 +1974,7 @@ class UpdateClusterRequest: auto_upgrade: Optional[UpdateClusterRequestAutoUpgrade] """ - New auto upgrade configuration for the cluster. Note that all fields need to be set. + New auto upgrade configuration for the cluster. Note that all fields needs to be set. """ feature_gates: Optional[List[str]] diff --git a/scaleway/scaleway/mongodb/v1alpha1/__init__.py b/scaleway/scaleway/mongodb/v1alpha1/__init__.py index f422c9405..d1d42a9ed 100644 --- a/scaleway/scaleway/mongodb/v1alpha1/__init__.py +++ b/scaleway/scaleway/mongodb/v1alpha1/__init__.py @@ -35,6 +35,7 @@ from .types import DeleteEndpointRequest from .types import DeleteInstanceRequest from .types import DeleteSnapshotRequest +from .types import DeleteUserRequest from .types import GetInstanceCertificateRequest from .types import GetInstanceRequest from .types import GetSnapshotRequest @@ -91,6 +92,7 @@ "DeleteEndpointRequest", "DeleteInstanceRequest", "DeleteSnapshotRequest", + "DeleteUserRequest", "GetInstanceCertificateRequest", "GetInstanceRequest", "GetSnapshotRequest", diff --git a/scaleway/scaleway/mongodb/v1alpha1/api.py b/scaleway/scaleway/mongodb/v1alpha1/api.py index fe505dc92..17e400054 100644 --- a/scaleway/scaleway/mongodb/v1alpha1/api.py +++ b/scaleway/scaleway/mongodb/v1alpha1/api.py @@ -1170,6 +1170,43 @@ def update_user( self._throw_on_error(res) return unmarshal_User(res.json()) + def delete_user( + self, + *, + instance_id: str, + name: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete a user on a Database Instance. + Delete an existing user on a Database Instance. + :param instance_id: UUID of the Database Instance the user belongs to. + :param name: Name of the database user. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = api.delete_user( + instance_id="example", + name="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_instance_id = validate_path_param("instance_id", instance_id) + param_name = validate_path_param("name", name) + + res = self._request( + "DELETE", + f"/mongodb/v1alpha1/regions/{param_region}/instances/{param_instance_id}/users/{param_name}", + body={}, + ) + + self._throw_on_error(res) + def delete_endpoint( self, *, diff --git a/scaleway/scaleway/mongodb/v1alpha1/types.py b/scaleway/scaleway/mongodb/v1alpha1/types.py index 517191ae5..ff21c2e8c 100644 --- a/scaleway/scaleway/mongodb/v1alpha1/types.py +++ b/scaleway/scaleway/mongodb/v1alpha1/types.py @@ -672,6 +672,24 @@ class DeleteSnapshotRequest: """ +@dataclass +class DeleteUserRequest: + instance_id: str + """ + UUID of the Database Instance the user belongs to. + """ + + name: str + """ + Name of the database user. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + @dataclass class GetInstanceCertificateRequest: instance_id: str diff --git a/scaleway/scaleway/secret/v1beta1/marshalling.py b/scaleway/scaleway/secret/v1beta1/marshalling.py index 5464afcfe..699110e53 100644 --- a/scaleway/scaleway/secret/v1beta1/marshalling.py +++ b/scaleway/scaleway/secret/v1beta1/marshalling.py @@ -92,6 +92,12 @@ def unmarshal_SecretVersion(data: Any) -> SecretVersion: else: args["updated_at"] = None + field = data.get("deleted_at", None) + if field is not None: + args["deleted_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["deleted_at"] = None + field = data.get("description", None) if field is not None: args["description"] = field diff --git a/scaleway/scaleway/secret/v1beta1/types.py b/scaleway/scaleway/secret/v1beta1/types.py index 8229930e0..8c6b07ce1 100644 --- a/scaleway/scaleway/secret/v1beta1/types.py +++ b/scaleway/scaleway/secret/v1beta1/types.py @@ -192,6 +192,11 @@ class SecretVersion: Last update of the version. """ + deleted_at: Optional[datetime] + """ + Date and time of the version's deletion. + """ + description: Optional[str] """ Description of the version. diff --git a/scaleway/scaleway/vpcgw/v2/__init__.py b/scaleway/scaleway/vpcgw/v2/__init__.py new file mode 100644 index 000000000..7c1cd4fe3 --- /dev/null +++ b/scaleway/scaleway/vpcgw/v2/__init__.py @@ -0,0 +1,97 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import GatewayNetworkStatus +from .content import GATEWAY_NETWORK_TRANSIENT_STATUSES +from .types import GatewayStatus +from .content import GATEWAY_TRANSIENT_STATUSES +from .types import ListGatewayNetworksRequestOrderBy +from .types import ListGatewaysRequestOrderBy +from .types import ListIPsRequestOrderBy +from .types import ListPatRulesRequestOrderBy +from .types import PatRuleProtocol +from .types import GatewayNetwork +from .types import IP +from .types import GatewayType +from .types import Gateway +from .types import PatRule +from .types import SetPatRulesRequestRule +from .types import CreateGatewayNetworkRequest +from .types import CreateGatewayRequest +from .types import CreateIPRequest +from .types import CreatePatRuleRequest +from .types import DeleteGatewayNetworkRequest +from .types import DeleteGatewayRequest +from .types import DeleteIPRequest +from .types import DeletePatRuleRequest +from .types import GetGatewayNetworkRequest +from .types import GetGatewayRequest +from .types import GetIPRequest +from .types import GetPatRuleRequest +from .types import ListGatewayNetworksRequest +from .types import ListGatewayNetworksResponse +from .types import ListGatewayTypesRequest +from .types import ListGatewayTypesResponse +from .types import ListGatewaysRequest +from .types import ListGatewaysResponse +from .types import ListIPsRequest +from .types import ListIPsResponse +from .types import ListPatRulesRequest +from .types import ListPatRulesResponse +from .types import RefreshSSHKeysRequest +from .types import SetPatRulesRequest +from .types import SetPatRulesResponse +from .types import UpdateGatewayNetworkRequest +from .types import UpdateGatewayRequest +from .types import UpdateIPRequest +from .types import UpdatePatRuleRequest +from .types import UpgradeGatewayRequest +from .api import VpcgwV2API + +__all__ = [ + "GatewayNetworkStatus", + "GATEWAY_NETWORK_TRANSIENT_STATUSES", + "GatewayStatus", + "GATEWAY_TRANSIENT_STATUSES", + "ListGatewayNetworksRequestOrderBy", + "ListGatewaysRequestOrderBy", + "ListIPsRequestOrderBy", + "ListPatRulesRequestOrderBy", + "PatRuleProtocol", + "GatewayNetwork", + "IP", + "GatewayType", + "Gateway", + "PatRule", + "SetPatRulesRequestRule", + "CreateGatewayNetworkRequest", + "CreateGatewayRequest", + "CreateIPRequest", + "CreatePatRuleRequest", + "DeleteGatewayNetworkRequest", + "DeleteGatewayRequest", + "DeleteIPRequest", + "DeletePatRuleRequest", + "GetGatewayNetworkRequest", + "GetGatewayRequest", + "GetIPRequest", + "GetPatRuleRequest", + "ListGatewayNetworksRequest", + "ListGatewayNetworksResponse", + "ListGatewayTypesRequest", + "ListGatewayTypesResponse", + "ListGatewaysRequest", + "ListGatewaysResponse", + "ListIPsRequest", + "ListIPsResponse", + "ListPatRulesRequest", + "ListPatRulesResponse", + "RefreshSSHKeysRequest", + "SetPatRulesRequest", + "SetPatRulesResponse", + "UpdateGatewayNetworkRequest", + "UpdateGatewayRequest", + "UpdateIPRequest", + "UpdatePatRuleRequest", + "UpgradeGatewayRequest", + "VpcgwV2API", +] diff --git a/scaleway/scaleway/vpcgw/v2/api.py b/scaleway/scaleway/vpcgw/v2/api.py new file mode 100644 index 000000000..42d7b57d7 --- /dev/null +++ b/scaleway/scaleway/vpcgw/v2/api.py @@ -0,0 +1,1383 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import List, Optional + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + WaitForOptions, + random_name, + validate_path_param, + fetch_all_pages, + wait_for_resource, +) +from .types import ( + GatewayNetworkStatus, + GatewayStatus, + ListGatewayNetworksRequestOrderBy, + ListGatewaysRequestOrderBy, + ListIPsRequestOrderBy, + ListPatRulesRequestOrderBy, + PatRuleProtocol, + CreateGatewayNetworkRequest, + CreateGatewayRequest, + CreateIPRequest, + CreatePatRuleRequest, + Gateway, + GatewayNetwork, + IP, + ListGatewayNetworksResponse, + ListGatewayTypesResponse, + ListGatewaysResponse, + ListIPsResponse, + ListPatRulesResponse, + PatRule, + SetPatRulesRequest, + SetPatRulesRequestRule, + SetPatRulesResponse, + UpdateGatewayNetworkRequest, + UpdateGatewayRequest, + UpdateIPRequest, + UpdatePatRuleRequest, + UpgradeGatewayRequest, +) +from .content import ( + GATEWAY_NETWORK_TRANSIENT_STATUSES, + GATEWAY_TRANSIENT_STATUSES, +) +from .marshalling import ( + unmarshal_GatewayNetwork, + unmarshal_IP, + unmarshal_Gateway, + unmarshal_PatRule, + unmarshal_ListGatewayNetworksResponse, + unmarshal_ListGatewayTypesResponse, + unmarshal_ListGatewaysResponse, + unmarshal_ListIPsResponse, + unmarshal_ListPatRulesResponse, + unmarshal_SetPatRulesResponse, + marshal_CreateGatewayNetworkRequest, + marshal_CreateGatewayRequest, + marshal_CreateIPRequest, + marshal_CreatePatRuleRequest, + marshal_SetPatRulesRequest, + marshal_UpdateGatewayNetworkRequest, + marshal_UpdateGatewayRequest, + marshal_UpdateIPRequest, + marshal_UpdatePatRuleRequest, + marshal_UpgradeGatewayRequest, +) + + +class VpcgwV2API(API): + """ + This API allows you to manage your Public Gateways. + """ + + def list_gateways( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewaysRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + types: Optional[List[str]] = None, + status: Optional[List[GatewayStatus]] = None, + private_network_ids: Optional[List[str]] = None, + include_legacy: Optional[bool] = None, + ) -> ListGatewaysResponse: + """ + List Public Gateways. + List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Gateways per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Include only gateways in this Project. + :param name: Filter for gateways which have this search term in their name. + :param tags: Filter for gateways with these tags. + :param types: Filter for gateways of these types. + :param status: Filter for gateways with these status. Use `unknown` to include all statuses. + :param private_network_ids: Filter for gateways attached to these Private Networks. + :param include_legacy: Include also legacy gateways. + :return: :class:`ListGatewaysResponse ` + + Usage: + :: + + result = api.list_gateways() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateways", + params={ + "include_legacy": include_legacy, + "name": name, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_ids": private_network_ids, + "project_id": project_id or self.client.default_project_id, + "status": status, + "tags": tags, + "types": types, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListGatewaysResponse(res.json()) + + def list_gateways_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewaysRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + types: Optional[List[str]] = None, + status: Optional[List[GatewayStatus]] = None, + private_network_ids: Optional[List[str]] = None, + include_legacy: Optional[bool] = None, + ) -> List[Gateway]: + """ + List Public Gateways. + List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number to return. + :param page_size: Gateways per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Include only gateways in this Project. + :param name: Filter for gateways which have this search term in their name. + :param tags: Filter for gateways with these tags. + :param types: Filter for gateways of these types. + :param status: Filter for gateways with these status. Use `unknown` to include all statuses. + :param private_network_ids: Filter for gateways attached to these Private Networks. + :param include_legacy: Include also legacy gateways. + :return: :class:`List[Gateway] ` + + Usage: + :: + + result = api.list_gateways_all() + """ + + return fetch_all_pages( + type=ListGatewaysResponse, + key="gateways", + fetcher=self.list_gateways, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "organization_id": organization_id, + "project_id": project_id, + "name": name, + "tags": tags, + "types": types, + "status": status, + "private_network_ids": private_network_ids, + "include_legacy": include_legacy, + }, + ) + + def get_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Get a Public Gateway. + Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. + :param gateway_id: ID of the gateway to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.get_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + def wait_for_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + options: Optional[WaitForOptions[Gateway, bool]] = None, + ) -> Gateway: + """ + Get a Public Gateway. + Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. + :param gateway_id: ID of the gateway to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.get_gateway( + gateway_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = lambda res: res.status not in GATEWAY_TRANSIENT_STATUSES + + return wait_for_resource( + fetcher=self.get_gateway, + options=options, + args={ + "gateway_id": gateway_id, + "zone": zone, + }, + ) + + def create_gateway( + self, + *, + type_: str, + enable_smtp: bool, + enable_bastion: bool, + zone: Optional[Zone] = None, + project_id: Optional[str] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + ip_id: Optional[str] = None, + bastion_port: Optional[int] = None, + ) -> Gateway: + """ + Create a Public Gateway. + Create a new Public Gateway in the specified Scaleway Project, defining its **name**, **type** and other configuration details such as whether to enable SSH bastion. + :param type_: Gateway type (commercial offer type). + :param enable_smtp: Defines whether SMTP traffic should be allowed pass through the gateway. + :param enable_bastion: Defines whether SSH bastion should be enabled the gateway. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param project_id: Scaleway Project to create the gateway in. + :param name: Name for the gateway. + :param tags: Tags for the gateway. + :param ip_id: Existing IP address to attach to the gateway. + :param bastion_port: Port of the SSH bastion. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.create_gateway( + type="example", + enable_smtp=False, + enable_bastion=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways", + body=marshal_CreateGatewayRequest( + CreateGatewayRequest( + type_=type_, + enable_smtp=enable_smtp, + enable_bastion=enable_bastion, + zone=zone, + project_id=project_id, + name=name or random_name(prefix="gw"), + tags=tags, + ip_id=ip_id, + bastion_port=bastion_port, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + def update_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + name: Optional[str] = None, + tags: Optional[List[str]] = None, + enable_bastion: Optional[bool] = None, + bastion_port: Optional[int] = None, + enable_smtp: Optional[bool] = None, + ) -> Gateway: + """ + Update a Public Gateway. + Update the parameters of an existing Public Gateway, for example, its **name**, **tags**, **SSH bastion configuration**, and **DNS servers**. + :param gateway_id: ID of the gateway to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param name: Name for the gateway. + :param tags: Tags for the gateway. + :param enable_bastion: Defines whether SSH bastion should be enabled the gateway. + :param bastion_port: Port of the SSH bastion. + :param enable_smtp: Defines whether SMTP traffic should be allowed to pass through the gateway. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.update_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + body=marshal_UpdateGatewayRequest( + UpdateGatewayRequest( + gateway_id=gateway_id, + zone=zone, + name=name, + tags=tags, + enable_bastion=enable_bastion, + bastion_port=bastion_port, + enable_smtp=enable_smtp, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + def delete_gateway( + self, + *, + gateway_id: str, + delete_ip: bool, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Delete a Public Gateway. + Delete an existing Public Gateway, specified by its gateway ID. This action is irreversible. + :param gateway_id: ID of the gateway to delete. + :param delete_ip: Defines whether the PGW's IP should be deleted. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.delete_gateway( + gateway_id="example", + delete_ip=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}", + params={ + "delete_ip": delete_ip, + }, + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + def upgrade_gateway( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + type_: Optional[str] = None, + ) -> Gateway: + """ + Upgrade a Public Gateway to the latest version and/or to a different commercial offer type. + Upgrade a given Public Gateway to the newest software version or to a different commercial offer type. This applies the latest bugfixes and features to your Public Gateway. Note that gateway service will be interrupted during the update. + :param gateway_id: ID of the gateway to upgrade. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param type_: Gateway type (commercial offer). + :return: :class:`Gateway ` + + Usage: + :: + + result = api.upgrade_gateway( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}/upgrade", + body=marshal_UpgradeGatewayRequest( + UpgradeGatewayRequest( + gateway_id=gateway_id, + zone=zone, + type_=type_, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) + + def list_gateway_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewayNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + status: Optional[List[GatewayNetworkStatus]] = None, + gateway_ids: Optional[List[str]] = None, + private_network_ids: Optional[List[str]] = None, + masquerade_enabled: Optional[bool] = None, + ) -> ListGatewayNetworksResponse: + """ + List Public Gateway connections to Private Networks. + List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: GatewayNetworks per page. + :param status: Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + :param gateway_ids: Filter for GatewayNetworks connected to these gateways. + :param private_network_ids: Filter for GatewayNetworks connected to these Private Networks. + :param masquerade_enabled: Filter for GatewayNetworks with this `enable_masquerade` setting. + :return: :class:`ListGatewayNetworksResponse ` + + Usage: + :: + + result = api.list_gateway_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks", + params={ + "gateway_ids": gateway_ids, + "masquerade_enabled": masquerade_enabled, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_ids": private_network_ids, + "status": status, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListGatewayNetworksResponse(res.json()) + + def list_gateway_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListGatewayNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + status: Optional[List[GatewayNetworkStatus]] = None, + gateway_ids: Optional[List[str]] = None, + private_network_ids: Optional[List[str]] = None, + masquerade_enabled: Optional[bool] = None, + ) -> List[GatewayNetwork]: + """ + List Public Gateway connections to Private Networks. + List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: GatewayNetworks per page. + :param status: Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + :param gateway_ids: Filter for GatewayNetworks connected to these gateways. + :param private_network_ids: Filter for GatewayNetworks connected to these Private Networks. + :param masquerade_enabled: Filter for GatewayNetworks with this `enable_masquerade` setting. + :return: :class:`List[GatewayNetwork] ` + + Usage: + :: + + result = api.list_gateway_networks_all() + """ + + return fetch_all_pages( + type=ListGatewayNetworksResponse, + key="gateway_networks", + fetcher=self.list_gateway_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "status": status, + "gateway_ids": gateway_ids, + "private_network_ids": private_network_ids, + "masquerade_enabled": masquerade_enabled, + }, + ) + + def get_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + ) -> GatewayNetwork: + """ + Get a Public Gateway connection to a Private Network. + Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. + :param gateway_network_id: ID of the GatewayNetwork to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = api.get_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + def wait_for_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + options: Optional[WaitForOptions[GatewayNetwork, bool]] = None, + ) -> GatewayNetwork: + """ + Get a Public Gateway connection to a Private Network. + Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. + :param gateway_network_id: ID of the GatewayNetwork to fetch. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = api.get_gateway_network( + gateway_network_id="example", + ) + """ + + if not options: + options = WaitForOptions() + + if not options.stop: + options.stop = ( + lambda res: res.status not in GATEWAY_NETWORK_TRANSIENT_STATUSES + ) + + return wait_for_resource( + fetcher=self.get_gateway_network, + options=options, + args={ + "gateway_network_id": gateway_network_id, + "zone": zone, + }, + ) + + def create_gateway_network( + self, + *, + gateway_id: str, + private_network_id: str, + enable_masquerade: bool, + push_default_route: bool, + zone: Optional[Zone] = None, + ipam_ip_id: Optional[str] = None, + ) -> GatewayNetwork: + """ + Attach a Public Gateway to a Private Network. + Attach a specific Public Gateway to a specific Private Network (create a GatewayNetwork). You can configure parameters for the connection including whether to enable masquerade (dynamic NAT), and more. + :param gateway_id: Public Gateway to connect. + :param private_network_id: Private Network to connect. + :param enable_masquerade: Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + :param push_default_route: Enabling the default route also enables masquerading. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_id: Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = api.create_gateway_network( + gateway_id="example", + private_network_id="example", + enable_masquerade=False, + push_default_route=False, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks", + body=marshal_CreateGatewayNetworkRequest( + CreateGatewayNetworkRequest( + gateway_id=gateway_id, + private_network_id=private_network_id, + enable_masquerade=enable_masquerade, + push_default_route=push_default_route, + zone=zone, + ipam_ip_id=ipam_ip_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + def update_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + enable_masquerade: Optional[bool] = None, + push_default_route: Optional[bool] = None, + ipam_ip_id: Optional[str] = None, + ) -> GatewayNetwork: + """ + Update a Public Gateway's connection to a Private Network. + Update the configuration parameters of a connection between a given Public Gateway and Private Network (the connection = a GatewayNetwork). Updatable parameters include whether to enable traffic masquerade (dynamic NAT). + :param gateway_network_id: ID of the GatewayNetwork to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param enable_masquerade: Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + :param push_default_route: Enabling the default route also enables masquerading. + :param ipam_ip_id: Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = api.update_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + body=marshal_UpdateGatewayNetworkRequest( + UpdateGatewayNetworkRequest( + gateway_network_id=gateway_network_id, + zone=zone, + enable_masquerade=enable_masquerade, + push_default_route=push_default_route, + ipam_ip_id=ipam_ip_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + def delete_gateway_network( + self, + *, + gateway_network_id: str, + zone: Optional[Zone] = None, + ) -> GatewayNetwork: + """ + Detach a Public Gateway from a Private Network. + Detach a given Public Gateway from a given Private Network, i.e. delete a GatewayNetwork specified by a gateway_network_id. + :param gateway_network_id: ID of the GatewayNetwork to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`GatewayNetwork ` + + Usage: + :: + + result = api.delete_gateway_network( + gateway_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_network_id = validate_path_param( + "gateway_network_id", gateway_network_id + ) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/gateway-networks/{param_gateway_network_id}", + ) + + self._throw_on_error(res) + return unmarshal_GatewayNetwork(res.json()) + + def list_pat_rules( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListPatRulesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + gateway_ids: Optional[List[str]] = None, + private_ips: Optional[List[str]] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> ListPatRulesResponse: + """ + List PAT rules. + List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: PAT rules per page. + :param gateway_ids: Filter for PAT rules on these gateways. + :param private_ips: Filter for PAT rules targeting these private ips. + :param protocol: Filter for PAT rules with this protocol. + :return: :class:`ListPatRulesResponse ` + + Usage: + :: + + result = api.list_pat_rules() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + params={ + "gateway_ids": gateway_ids, + "order_by": order_by, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_ips": private_ips, + "protocol": protocol, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListPatRulesResponse(res.json()) + + def list_pat_rules_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListPatRulesRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + gateway_ids: Optional[List[str]] = None, + private_ips: Optional[List[str]] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> List[PatRule]: + """ + List PAT rules. + List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: PAT rules per page. + :param gateway_ids: Filter for PAT rules on these gateways. + :param private_ips: Filter for PAT rules targeting these private ips. + :param protocol: Filter for PAT rules with this protocol. + :return: :class:`List[PatRule] ` + + Usage: + :: + + result = api.list_pat_rules_all() + """ + + return fetch_all_pages( + type=ListPatRulesResponse, + key="pat_rules", + fetcher=self.list_pat_rules, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "gateway_ids": gateway_ids, + "private_ips": private_ips, + "protocol": protocol, + }, + ) + + def get_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + ) -> PatRule: + """ + Get a PAT rule. + Get a PAT rule, specified by its PAT rule ID. The response object gives full details of the PAT rule, including the Public Gateway it belongs to and the configuration settings in terms of public / private ports, private IP and protocol. + :param pat_rule_id: ID of the PAT rule to get. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`PatRule ` + + Usage: + :: + + result = api.get_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + def create_pat_rule( + self, + *, + gateway_id: str, + public_port: int, + private_ip: str, + private_port: int, + zone: Optional[Zone] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> PatRule: + """ + Create a PAT rule. + Create a new PAT rule on a specified Public Gateway, defining the protocol to use, public port to listen on, and private port / IP address to map to. + :param gateway_id: ID of the Gateway on which to create the rule. + :param public_port: Public port to listen on. + :param private_ip: Private IP to forward data to. + :param private_port: Private port to translate to. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param protocol: Protocol the rule should apply to. + :return: :class:`PatRule ` + + Usage: + :: + + result = api.create_pat_rule( + gateway_id="example", + public_port=1, + private_ip="example", + private_port=1, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + body=marshal_CreatePatRuleRequest( + CreatePatRuleRequest( + gateway_id=gateway_id, + public_port=public_port, + private_ip=private_ip, + private_port=private_port, + zone=zone, + protocol=protocol, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + def update_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + public_port: Optional[int] = None, + private_ip: Optional[str] = None, + private_port: Optional[int] = None, + protocol: Optional[PatRuleProtocol] = None, + ) -> PatRule: + """ + Update a PAT rule. + Update a PAT rule, specified by its PAT rule ID. Configuration settings including private/public port, private IP address and protocol can all be updated. + :param pat_rule_id: ID of the PAT rule to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param public_port: Public port to listen on. + :param private_ip: Private IP to forward data to. + :param private_port: Private port to translate to. + :param protocol: Protocol the rule should apply to. + :return: :class:`PatRule ` + + Usage: + :: + + result = api.update_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + body=marshal_UpdatePatRuleRequest( + UpdatePatRuleRequest( + pat_rule_id=pat_rule_id, + zone=zone, + public_port=public_port, + private_ip=private_ip, + private_port=private_port, + protocol=protocol, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_PatRule(res.json()) + + def set_pat_rules( + self, + *, + gateway_id: str, + pat_rules: List[SetPatRulesRequestRule], + zone: Optional[Zone] = None, + ) -> SetPatRulesResponse: + """ + Set all PAT rules. + Set a definitive list of PAT rules attached to a Public Gateway. Each rule is identified by its public port and protocol. This will sync the current PAT rule list on the gateway with the new list, creating, updating or deleting PAT rules accordingly. + :param gateway_id: ID of the gateway on which to set the PAT rules. + :param pat_rules: New list of PAT rules. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetPatRulesResponse ` + + Usage: + :: + + result = api.set_pat_rules( + gateway_id="example", + pat_rules=[], + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "PUT", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules", + body=marshal_SetPatRulesRequest( + SetPatRulesRequest( + gateway_id=gateway_id, + pat_rules=pat_rules, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetPatRulesResponse(res.json()) + + def delete_pat_rule( + self, + *, + pat_rule_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a PAT rule. + Delete a PAT rule, identified by its PAT rule ID. This action is irreversible. + :param pat_rule_id: ID of the PAT rule to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = api.delete_pat_rule( + pat_rule_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_pat_rule_id = validate_path_param("pat_rule_id", pat_rule_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/pat-rules/{param_pat_rule_id}", + ) + + self._throw_on_error(res) + + def list_gateway_types( + self, + *, + zone: Optional[Zone] = None, + ) -> ListGatewayTypesResponse: + """ + List Public Gateway types. + List the different Public Gateway commercial offer types available at Scaleway. The response is an array of objects describing the name and technical details of each available gateway type. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`ListGatewayTypesResponse ` + + Usage: + :: + + result = api.list_gateway_types() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/gateway-types", + ) + + self._throw_on_error(res) + return unmarshal_ListGatewayTypesResponse(res.json()) + + def list_i_ps( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListIPsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + is_free: Optional[bool] = None, + ) -> ListIPsResponse: + """ + List IPs. + List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: IP addresses per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Filter for IP addresses in this Project. + :param tags: Filter for IP addresses with these tags. + :param reverse: Filter for IP addresses that have a reverse containing this string. + :param is_free: Filter based on whether the IP is attached to a gateway or not. + :return: :class:`ListIPsResponse ` + + Usage: + :: + + result = api.list_i_ps() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/ips", + params={ + "is_free": is_free, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "project_id": project_id or self.client.default_project_id, + "reverse": reverse, + "tags": tags, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListIPsResponse(res.json()) + + def list_i_ps_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListIPsRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + is_free: Optional[bool] = None, + ) -> List[IP]: + """ + List IPs. + List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Order in which to return results. + :param page: Page number. + :param page_size: IP addresses per page. + :param organization_id: Include only gateways in this Organization. + :param project_id: Filter for IP addresses in this Project. + :param tags: Filter for IP addresses with these tags. + :param reverse: Filter for IP addresses that have a reverse containing this string. + :param is_free: Filter based on whether the IP is attached to a gateway or not. + :return: :class:`List[IP] ` + + Usage: + :: + + result = api.list_i_ps_all() + """ + + return fetch_all_pages( + type=ListIPsResponse, + key="ips", + fetcher=self.list_i_ps, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "organization_id": organization_id, + "project_id": project_id, + "tags": tags, + "reverse": reverse, + "is_free": is_free, + }, + ) + + def get_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + ) -> IP: + """ + Get an IP. + Get details of a Public Gateway flexible IP address, identified by its IP ID. The response object contains information including which (if any) Public Gateway using this IP address, the reverse and various other metadata. + :param ip_id: ID of the IP address to get. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`IP ` + + Usage: + :: + + result = api.get_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "GET", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + def create_ip( + self, + *, + zone: Optional[Zone] = None, + project_id: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> IP: + """ + Reserve an IP. + Create (reserve) a new flexible IP address that can be used for a Public Gateway in a specified Scaleway Project. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param project_id: Project to create the IP address in. + :param tags: Tags to give to the IP address. + :return: :class:`IP ` + + Usage: + :: + + result = api.create_ip() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/ips", + body=marshal_CreateIPRequest( + CreateIPRequest( + zone=zone, + project_id=project_id, + tags=tags, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + def update_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + tags: Optional[List[str]] = None, + reverse: Optional[str] = None, + gateway_id: Optional[str] = None, + ) -> IP: + """ + Update an IP. + Update details of an existing flexible IP address, including its tags, reverse and the Public Gateway it is assigned to. + :param ip_id: ID of the IP address to update. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param tags: Tags to give to the IP address. + :param reverse: Reverse to set on the address. Empty string to unset. + :param gateway_id: Gateway to attach the IP address to. Empty string to detach. + :return: :class:`IP ` + + Usage: + :: + + result = api.update_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "PATCH", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + body=marshal_UpdateIPRequest( + UpdateIPRequest( + ip_id=ip_id, + zone=zone, + tags=tags, + reverse=reverse, + gateway_id=gateway_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_IP(res.json()) + + def delete_ip( + self, + *, + ip_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete an IP. + Delete a flexible IP address from your account. This action is irreversible. + :param ip_id: ID of the IP address to delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = api.delete_ip( + ip_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_ip_id = validate_path_param("ip_id", ip_id) + + res = self._request( + "DELETE", + f"/vpc-gw/v2/zones/{param_zone}/ips/{param_ip_id}", + ) + + self._throw_on_error(res) + + def refresh_ssh_keys( + self, + *, + gateway_id: str, + zone: Optional[Zone] = None, + ) -> Gateway: + """ + Refresh a Public Gateway's SSH keys. + Refresh the SSH keys of a given Public Gateway, specified by its gateway ID. This adds any new SSH keys in the gateway's Scaleway Project to the gateway itself. + :param gateway_id: ID of the gateway to refresh SSH keys on. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`Gateway ` + + Usage: + :: + + result = api.refresh_ssh_keys( + gateway_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_gateway_id = validate_path_param("gateway_id", gateway_id) + + res = self._request( + "POST", + f"/vpc-gw/v2/zones/{param_zone}/gateways/{param_gateway_id}/refresh-ssh-keys", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_Gateway(res.json()) diff --git a/scaleway/scaleway/vpcgw/v2/content.py b/scaleway/scaleway/vpcgw/v2/content.py new file mode 100644 index 000000000..a5b8a7acf --- /dev/null +++ b/scaleway/scaleway/vpcgw/v2/content.py @@ -0,0 +1,26 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from typing import List + +from .types import ( + GatewayNetworkStatus, + GatewayStatus, +) + +GATEWAY_NETWORK_TRANSIENT_STATUSES: List[GatewayNetworkStatus] = [ + GatewayNetworkStatus.ATTACHING, + GatewayNetworkStatus.CONFIGURING, + GatewayNetworkStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`GatewayNetworkStatus `. +""" +GATEWAY_TRANSIENT_STATUSES: List[GatewayStatus] = [ + GatewayStatus.ALLOCATING, + GatewayStatus.CONFIGURING, + GatewayStatus.STOPPING, + GatewayStatus.DELETING, +] +""" +Lists transient statutes of the enum :class:`GatewayStatus `. +""" diff --git a/scaleway/scaleway/vpcgw/v2/marshalling.py b/scaleway/scaleway/vpcgw/v2/marshalling.py new file mode 100644 index 000000000..ff9cb1e66 --- /dev/null +++ b/scaleway/scaleway/vpcgw/v2/marshalling.py @@ -0,0 +1,667 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from .types import ( + GatewayNetwork, + IP, + Gateway, + PatRule, + ListGatewayNetworksResponse, + GatewayType, + ListGatewayTypesResponse, + ListGatewaysResponse, + ListIPsResponse, + ListPatRulesResponse, + SetPatRulesResponse, + CreateGatewayNetworkRequest, + CreateGatewayRequest, + CreateIPRequest, + CreatePatRuleRequest, + SetPatRulesRequestRule, + SetPatRulesRequest, + UpdateGatewayNetworkRequest, + UpdateGatewayRequest, + UpdateIPRequest, + UpdatePatRuleRequest, + UpgradeGatewayRequest, +) + + +def unmarshal_GatewayNetwork(data: Any) -> GatewayNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'GatewayNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("masquerade_enabled", None) + if field is not None: + args["masquerade_enabled"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("push_default_route", None) + if field is not None: + args["push_default_route"] = field + + field = data.get("ipam_ip_id", None) + if field is not None: + args["ipam_ip_id"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("mac_address", None) + if field is not None: + args["mac_address"] = field + else: + args["mac_address"] = None + + return GatewayNetwork(**args) + + +def unmarshal_IP(data: Any) -> IP: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'IP' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("address", None) + if field is not None: + args["address"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("reverse", None) + if field is not None: + args["reverse"] = field + else: + args["reverse"] = None + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + else: + args["gateway_id"] = None + + return IP(**args) + + +def unmarshal_Gateway(data: Any) -> Gateway: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Gateway' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("type", None) + if field is not None: + args["type_"] = field + + field = data.get("bandwidth", None) + if field is not None: + args["bandwidth"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("tags", None) + if field is not None: + args["tags"] = field + + field = data.get("gateway_networks", None) + if field is not None: + args["gateway_networks"] = ( + [unmarshal_GatewayNetwork(v) for v in field] if field is not None else None + ) + + field = data.get("bastion_enabled", None) + if field is not None: + args["bastion_enabled"] = field + + field = data.get("bastion_port", None) + if field is not None: + args["bastion_port"] = field + + field = data.get("smtp_enabled", None) + if field is not None: + args["smtp_enabled"] = field + + field = data.get("is_legacy", None) + if field is not None: + args["is_legacy"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("ipv4", None) + if field is not None: + args["ipv4"] = unmarshal_IP(field) + else: + args["ipv4"] = None + + field = data.get("version", None) + if field is not None: + args["version"] = field + else: + args["version"] = None + + field = data.get("can_upgrade_to", None) + if field is not None: + args["can_upgrade_to"] = field + else: + args["can_upgrade_to"] = None + + return Gateway(**args) + + +def unmarshal_PatRule(data: Any) -> PatRule: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'PatRule' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("gateway_id", None) + if field is not None: + args["gateway_id"] = field + + field = data.get("public_port", None) + if field is not None: + args["public_port"] = field + + field = data.get("private_ip", None) + if field is not None: + args["private_ip"] = field + + field = data.get("private_port", None) + if field is not None: + args["private_port"] = field + + field = data.get("protocol", None) + if field is not None: + args["protocol"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return PatRule(**args) + + +def unmarshal_ListGatewayNetworksResponse(data: Any) -> ListGatewayNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewayNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("gateway_networks", None) + if field is not None: + args["gateway_networks"] = ( + [unmarshal_GatewayNetwork(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListGatewayNetworksResponse(**args) + + +def unmarshal_GatewayType(data: Any) -> GatewayType: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'GatewayType' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("bandwidth", None) + if field is not None: + args["bandwidth"] = field + + field = data.get("zone", None) + if field is not None: + args["zone"] = field + + return GatewayType(**args) + + +def unmarshal_ListGatewayTypesResponse(data: Any) -> ListGatewayTypesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewayTypesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("types", None) + if field is not None: + args["types"] = ( + [unmarshal_GatewayType(v) for v in field] if field is not None else None + ) + + return ListGatewayTypesResponse(**args) + + +def unmarshal_ListGatewaysResponse(data: Any) -> ListGatewaysResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListGatewaysResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("gateways", None) + if field is not None: + args["gateways"] = ( + [unmarshal_Gateway(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListGatewaysResponse(**args) + + +def unmarshal_ListIPsResponse(data: Any) -> ListIPsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListIPsResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("ips", None) + if field is not None: + args["ips"] = [unmarshal_IP(v) for v in field] if field is not None else None + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListIPsResponse(**args) + + +def unmarshal_ListPatRulesResponse(data: Any) -> ListPatRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListPatRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pat_rules", None) + if field is not None: + args["pat_rules"] = ( + [unmarshal_PatRule(v) for v in field] if field is not None else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListPatRulesResponse(**args) + + +def unmarshal_SetPatRulesResponse(data: Any) -> SetPatRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetPatRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("pat_rules", None) + if field is not None: + args["pat_rules"] = ( + [unmarshal_PatRule(v) for v in field] if field is not None else None + ) + + return SetPatRulesResponse(**args) + + +def marshal_CreateGatewayNetworkRequest( + request: CreateGatewayNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.enable_masquerade is not None: + output["enable_masquerade"] = request.enable_masquerade + + if request.push_default_route is not None: + output["push_default_route"] = request.push_default_route + + if request.ipam_ip_id is not None: + output["ipam_ip_id"] = request.ipam_ip_id + + return output + + +def marshal_CreateGatewayRequest( + request: CreateGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.type_ is not None: + output["type"] = request.type_ + + if request.enable_smtp is not None: + output["enable_smtp"] = request.enable_smtp + + if request.enable_bastion is not None: + output["enable_bastion"] = request.enable_bastion + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.ip_id is not None: + output["ip_id"] = request.ip_id + + if request.bastion_port is not None: + output["bastion_port"] = request.bastion_port + + return output + + +def marshal_CreateIPRequest( + request: CreateIPRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.project_id is not None: + output["project_id"] = request.project_id or defaults.default_project_id + + if request.tags is not None: + output["tags"] = request.tags + + return output + + +def marshal_CreatePatRuleRequest( + request: CreatePatRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_SetPatRulesRequestRule( + request: SetPatRulesRequestRule, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_SetPatRulesRequest( + request: SetPatRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + if request.pat_rules is not None: + output["pat_rules"] = [ + marshal_SetPatRulesRequestRule(item, defaults) for item in request.pat_rules + ] + + return output + + +def marshal_UpdateGatewayNetworkRequest( + request: UpdateGatewayNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.enable_masquerade is not None: + output["enable_masquerade"] = request.enable_masquerade + + if request.push_default_route is not None: + output["push_default_route"] = request.push_default_route + + if request.ipam_ip_id is not None: + output["ipam_ip_id"] = request.ipam_ip_id + + return output + + +def marshal_UpdateGatewayRequest( + request: UpdateGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.tags is not None: + output["tags"] = request.tags + + if request.enable_bastion is not None: + output["enable_bastion"] = request.enable_bastion + + if request.bastion_port is not None: + output["bastion_port"] = request.bastion_port + + if request.enable_smtp is not None: + output["enable_smtp"] = request.enable_smtp + + return output + + +def marshal_UpdateIPRequest( + request: UpdateIPRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.tags is not None: + output["tags"] = request.tags + + if request.reverse is not None: + output["reverse"] = request.reverse + + if request.gateway_id is not None: + output["gateway_id"] = request.gateway_id + + return output + + +def marshal_UpdatePatRuleRequest( + request: UpdatePatRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.public_port is not None: + output["public_port"] = request.public_port + + if request.private_ip is not None: + output["private_ip"] = request.private_ip + + if request.private_port is not None: + output["private_port"] = request.private_port + + if request.protocol is not None: + output["protocol"] = str(request.protocol) + + return output + + +def marshal_UpgradeGatewayRequest( + request: UpgradeGatewayRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.type_ is not None: + output["type"] = request.type_ + + return output diff --git a/scaleway/scaleway/vpcgw/v2/types.py b/scaleway/scaleway/vpcgw/v2/types.py new file mode 100644 index 000000000..9bcf99b86 --- /dev/null +++ b/scaleway/scaleway/vpcgw/v2/types.py @@ -0,0 +1,1081 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import List, Optional + +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class GatewayNetworkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + CREATED = "created" + ATTACHING = "attaching" + CONFIGURING = "configuring" + READY = "ready" + DETACHING = "detaching" + + def __str__(self) -> str: + return str(self.value) + + +class GatewayStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + STOPPED = "stopped" + ALLOCATING = "allocating" + CONFIGURING = "configuring" + RUNNING = "running" + STOPPING = "stopping" + FAILED = "failed" + DELETING = "deleting" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +class ListGatewayNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListGatewaysRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + TYPE_ASC = "type_asc" + TYPE_DESC = "type_desc" + STATUS_ASC = "status_asc" + STATUS_DESC = "status_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListIPsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + ADDRESS_ASC = "address_asc" + ADDRESS_DESC = "address_desc" + REVERSE_ASC = "reverse_asc" + REVERSE_DESC = "reverse_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ListPatRulesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + PUBLIC_PORT_ASC = "public_port_asc" + PUBLIC_PORT_DESC = "public_port_desc" + + def __str__(self) -> str: + return str(self.value) + + +class PatRuleProtocol(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_PROTOCOL = "unknown_protocol" + BOTH = "both" + TCP = "tcp" + UDP = "udp" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class GatewayNetwork: + id: str + """ + ID of the Public Gateway-Private Network connection. + """ + + gateway_id: str + """ + ID of the connected Public Gateway. + """ + + private_network_id: str + """ + ID of the connected Private Network. + """ + + masquerade_enabled: bool + """ + Defines whether the gateway masquerades traffic for this Private Network (Dynamic NAT). + """ + + status: GatewayNetworkStatus + """ + Current status of the Public Gateway's connection to the Private Network. + """ + + push_default_route: bool + """ + Enabling the default route also enables masquerading. + """ + + ipam_ip_id: str + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + zone: Zone + """ + Zone of the GatewayNetwork connection. + """ + + created_at: Optional[datetime] + """ + Connection creation date. + """ + + updated_at: Optional[datetime] + """ + Connection last modification date. + """ + + mac_address: Optional[str] + """ + MAC address of the gateway in the Private Network (if the gateway is up and running). + """ + + +@dataclass +class IP: + id: str + """ + IP address ID. + """ + + organization_id: str + """ + Owning Organization. + """ + + project_id: str + """ + Owning Project. + """ + + tags: List[str] + """ + Tags associated with the IP address. + """ + + address: str + """ + The IP address itself. + """ + + zone: Zone + """ + Zone of the IP address. + """ + + created_at: Optional[datetime] + """ + IP address creation date. + """ + + updated_at: Optional[datetime] + """ + IP address last modification date. + """ + + reverse: Optional[str] + """ + Reverse domain name for the IP address. + """ + + gateway_id: Optional[str] + """ + Public Gateway associated with the IP address. + """ + + +@dataclass +class GatewayType: + name: str + """ + Public Gateway type name. + """ + + bandwidth: int + """ + Bandwidth, in bps, of the Public Gateway. This is the public bandwidth to the outer Internet, and the internal bandwidth to each connected Private Networks. + """ + + zone: Zone + """ + Zone the Public Gateway type is available in. + """ + + +@dataclass +class Gateway: + id: str + """ + ID of the gateway. + """ + + organization_id: str + """ + Owning Organization. + """ + + project_id: str + """ + Owning Project. + """ + + type_: str + """ + Gateway type name (commercial offer). + """ + + bandwidth: int + """ + Bandwidth available of the gateway. + """ + + status: GatewayStatus + """ + Current status of the gateway. + """ + + created_at: Optional[datetime] + """ + Gateway creation date. + """ + + updated_at: Optional[datetime] + """ + Gateway last modification date. + """ + + name: str + """ + Name of the gateway. + """ + + tags: List[str] + """ + Tags associated with the gateway. + """ + + gateway_networks: List[GatewayNetwork] + """ + GatewayNetwork objects attached to the gateway (each one represents a connection to a Private Network). + """ + + bastion_enabled: bool + """ + Defines whether SSH bastion is enabled on the gateway. + """ + + bastion_port: int + """ + Port of the SSH bastion. + """ + + smtp_enabled: bool + """ + Defines whether SMTP traffic is allowed to pass through the gateway. + """ + + is_legacy: bool + """ + Defines whether the gateway uses non-IPAM IP configurations. + """ + + zone: Zone + """ + Zone of the gateway. + """ + + ipv4: Optional[IP] + """ + Public IPv4 address of the gateway. + """ + + version: Optional[str] + """ + Version of the running gateway software. + """ + + can_upgrade_to: Optional[str] + """ + Newly available gateway software version that can be updated to. + """ + + +@dataclass +class PatRule: + id: str + """ + PAT rule ID. + """ + + gateway_id: str + """ + Gateway the PAT rule applies to. + """ + + public_port: int + """ + Public port to listen on. + """ + + private_ip: str + """ + Private IP address to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + protocol: PatRuleProtocol + """ + Protocol the rule applies to. + """ + + zone: Zone + """ + Zone of the PAT rule. + """ + + created_at: Optional[datetime] + """ + PAT rule creation date. + """ + + updated_at: Optional[datetime] + """ + PAT rule last modification date. + """ + + +@dataclass +class SetPatRulesRequestRule: + public_port: int + """ + Public port to listen on. Uniquely identifies the rule, and a matching rule will be updated with the new parameters. + """ + + private_ip: str + """ + Private IP to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + protocol: PatRuleProtocol + """ + Protocol the rule should apply to. + """ + + +@dataclass +class CreateGatewayNetworkRequest: + gateway_id: str + """ + Public Gateway to connect. + """ + + private_network_id: str + """ + Private Network to connect. + """ + + enable_masquerade: bool + """ + Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + """ + + push_default_route: bool + """ + Enabling the default route also enables masquerading. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_id: Optional[str] + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + +@dataclass +class CreateGatewayRequest: + type_: str + """ + Gateway type (commercial offer type). + """ + + enable_smtp: bool + """ + Defines whether SMTP traffic should be allowed pass through the gateway. + """ + + enable_bastion: bool + """ + Defines whether SSH bastion should be enabled the gateway. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + project_id: Optional[str] + """ + Scaleway Project to create the gateway in. + """ + + name: Optional[str] + """ + Name for the gateway. + """ + + tags: Optional[List[str]] + """ + Tags for the gateway. + """ + + ip_id: Optional[str] + """ + Existing IP address to attach to the gateway. + """ + + bastion_port: Optional[int] + """ + Port of the SSH bastion. + """ + + +@dataclass +class CreateIPRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + project_id: Optional[str] + """ + Project to create the IP address in. + """ + + tags: Optional[List[str]] + """ + Tags to give to the IP address. + """ + + +@dataclass +class CreatePatRuleRequest: + gateway_id: str + """ + ID of the Gateway on which to create the rule. + """ + + public_port: int + """ + Public port to listen on. + """ + + private_ip: str + """ + Private IP to forward data to. + """ + + private_port: int + """ + Private port to translate to. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + protocol: Optional[PatRuleProtocol] + """ + Protocol the rule should apply to. + """ + + +@dataclass +class DeleteGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeleteGatewayRequest: + gateway_id: str + """ + ID of the gateway to delete. + """ + + delete_ip: bool + """ + Defines whether the PGW's IP should be deleted. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeleteIPRequest: + ip_id: str + """ + ID of the IP address to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class DeletePatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to delete. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to fetch. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetGatewayRequest: + gateway_id: str + """ + ID of the gateway to fetch. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetIPRequest: + ip_id: str + """ + ID of the IP address to get. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class GetPatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to get. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class ListGatewayNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListGatewayNetworksRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + GatewayNetworks per page. + """ + + status: Optional[List[GatewayNetworkStatus]] + """ + Filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + """ + + gateway_ids: Optional[List[str]] + """ + Filter for GatewayNetworks connected to these gateways. + """ + + private_network_ids: Optional[List[str]] + """ + Filter for GatewayNetworks connected to these Private Networks. + """ + + masquerade_enabled: Optional[bool] + """ + Filter for GatewayNetworks with this `enable_masquerade` setting. + """ + + +@dataclass +class ListGatewayNetworksResponse: + gateway_networks: List[GatewayNetwork] + """ + GatewayNetworks on this page. + """ + + total_count: int + """ + Total GatewayNetworks count matching the filter. + """ + + +@dataclass +class ListGatewayTypesRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class ListGatewayTypesResponse: + types: List[GatewayType] + """ + Available types of Public Gateway. + """ + + +@dataclass +class ListGatewaysRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListGatewaysRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number to return. + """ + + page_size: Optional[int] + """ + Gateways per page. + """ + + organization_id: Optional[str] + """ + Include only gateways in this Organization. + """ + + project_id: Optional[str] + """ + Include only gateways in this Project. + """ + + name: Optional[str] + """ + Filter for gateways which have this search term in their name. + """ + + tags: Optional[List[str]] + """ + Filter for gateways with these tags. + """ + + types: Optional[List[str]] + """ + Filter for gateways of these types. + """ + + status: Optional[List[GatewayStatus]] + """ + Filter for gateways with these status. Use `unknown` to include all statuses. + """ + + private_network_ids: Optional[List[str]] + """ + Filter for gateways attached to these Private Networks. + """ + + include_legacy: Optional[bool] + """ + Include also legacy gateways. + """ + + +@dataclass +class ListGatewaysResponse: + gateways: List[Gateway] + """ + Gateways on this page. + """ + + total_count: int + """ + Total count of gateways matching the filter. + """ + + +@dataclass +class ListIPsRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListIPsRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + IP addresses per page. + """ + + organization_id: Optional[str] + """ + Include only gateways in this Organization. + """ + + project_id: Optional[str] + """ + Filter for IP addresses in this Project. + """ + + tags: Optional[List[str]] + """ + Filter for IP addresses with these tags. + """ + + reverse: Optional[str] + """ + Filter for IP addresses that have a reverse containing this string. + """ + + is_free: Optional[bool] + """ + Filter based on whether the IP is attached to a gateway or not. + """ + + +@dataclass +class ListIPsResponse: + ips: List[IP] + """ + IP addresses on this page. + """ + + total_count: int + """ + Total count of IP addresses matching the filter. + """ + + +@dataclass +class ListPatRulesRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListPatRulesRequestOrderBy] + """ + Order in which to return results. + """ + + page: Optional[int] + """ + Page number. + """ + + page_size: Optional[int] + """ + PAT rules per page. + """ + + gateway_ids: Optional[List[str]] + """ + Filter for PAT rules on these gateways. + """ + + private_ips: Optional[List[str]] + """ + Filter for PAT rules targeting these private ips. + """ + + protocol: Optional[PatRuleProtocol] + """ + Filter for PAT rules with this protocol. + """ + + +@dataclass +class ListPatRulesResponse: + pat_rules: List[PatRule] + """ + Array of PAT rules matching the filter. + """ + + total_count: int + """ + Total count of PAT rules matching the filter. + """ + + +@dataclass +class RefreshSSHKeysRequest: + gateway_id: str + """ + ID of the gateway to refresh SSH keys on. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetPatRulesRequest: + gateway_id: str + """ + ID of the gateway on which to set the PAT rules. + """ + + pat_rules: List[SetPatRulesRequestRule] + """ + New list of PAT rules. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetPatRulesResponse: + pat_rules: List[PatRule] + """ + List of PAT rules. + """ + + +@dataclass +class UpdateGatewayNetworkRequest: + gateway_network_id: str + """ + ID of the GatewayNetwork to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + enable_masquerade: Optional[bool] + """ + Defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + """ + + push_default_route: Optional[bool] + """ + Enabling the default route also enables masquerading. + """ + + ipam_ip_id: Optional[str] + """ + Use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + """ + + +@dataclass +class UpdateGatewayRequest: + gateway_id: str + """ + ID of the gateway to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + name: Optional[str] + """ + Name for the gateway. + """ + + tags: Optional[List[str]] + """ + Tags for the gateway. + """ + + enable_bastion: Optional[bool] + """ + Defines whether SSH bastion should be enabled the gateway. + """ + + bastion_port: Optional[int] + """ + Port of the SSH bastion. + """ + + enable_smtp: Optional[bool] + """ + Defines whether SMTP traffic should be allowed to pass through the gateway. + """ + + +@dataclass +class UpdateIPRequest: + ip_id: str + """ + ID of the IP address to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + tags: Optional[List[str]] + """ + Tags to give to the IP address. + """ + + reverse: Optional[str] + """ + Reverse to set on the address. Empty string to unset. + """ + + gateway_id: Optional[str] + """ + Gateway to attach the IP address to. Empty string to detach. + """ + + +@dataclass +class UpdatePatRuleRequest: + pat_rule_id: str + """ + ID of the PAT rule to update. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + public_port: Optional[int] + """ + Public port to listen on. + """ + + private_ip: Optional[str] + """ + Private IP to forward data to. + """ + + private_port: Optional[int] + """ + Private port to translate to. + """ + + protocol: Optional[PatRuleProtocol] + """ + Protocol the rule should apply to. + """ + + +@dataclass +class UpgradeGatewayRequest: + gateway_id: str + """ + ID of the gateway to upgrade. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + type_: Optional[str] + """ + Gateway type (commercial offer). + """ diff --git a/scaleway/scaleway/webhosting/v1/__init__.py b/scaleway/scaleway/webhosting/v1/__init__.py index 894681eeb..0ae2a2342 100644 --- a/scaleway/scaleway/webhosting/v1/__init__.py +++ b/scaleway/scaleway/webhosting/v1/__init__.py @@ -24,6 +24,7 @@ from .types import CreateDatabaseRequestUser from .types import CreateHostingRequestDomainConfiguration from .types import OfferOptionRequest +from .types import SyncDomainDnsRecordsRequestRecord from .types import DnsRecord from .types import Nameserver from .types import HostingUser @@ -51,6 +52,7 @@ from .types import DatabaseApiUnassignDatabaseUserRequest from .types import DnsApiCheckUserOwnsDomainRequest from .types import DnsApiGetDomainDnsRecordsRequest +from .types import DnsApiSyncDomainDnsRecordsRequest from .types import DnsRecords from .types import FtpAccountApiChangeFtpAccountPasswordRequest from .types import FtpAccountApiCreateFtpAccountRequest @@ -116,6 +118,7 @@ "CreateDatabaseRequestUser", "CreateHostingRequestDomainConfiguration", "OfferOptionRequest", + "SyncDomainDnsRecordsRequestRecord", "DnsRecord", "Nameserver", "HostingUser", @@ -143,6 +146,7 @@ "DatabaseApiUnassignDatabaseUserRequest", "DnsApiCheckUserOwnsDomainRequest", "DnsApiGetDomainDnsRecordsRequest", + "DnsApiSyncDomainDnsRecordsRequest", "DnsRecords", "FtpAccountApiChangeFtpAccountPasswordRequest", "FtpAccountApiCreateFtpAccountRequest", diff --git a/scaleway/scaleway/webhosting/v1/api.py b/scaleway/scaleway/webhosting/v1/api.py index 2745e2302..850c0caac 100644 --- a/scaleway/scaleway/webhosting/v1/api.py +++ b/scaleway/scaleway/webhosting/v1/api.py @@ -34,6 +34,7 @@ DatabaseApiUnassignDatabaseUserRequest, DatabaseUser, DnsApiCheckUserOwnsDomainRequest, + DnsApiSyncDomainDnsRecordsRequest, DnsRecords, FtpAccount, FtpAccountApiChangeFtpAccountPasswordRequest, @@ -59,6 +60,7 @@ ResetHostingPasswordResponse, ResourceSummary, Session, + SyncDomainDnsRecordsRequestRecord, Website, ) from .content import ( @@ -89,6 +91,7 @@ marshal_DatabaseApiCreateDatabaseUserRequest, marshal_DatabaseApiUnassignDatabaseUserRequest, marshal_DnsApiCheckUserOwnsDomainRequest, + marshal_DnsApiSyncDomainDnsRecordsRequest, marshal_FtpAccountApiChangeFtpAccountPasswordRequest, marshal_FtpAccountApiCreateFtpAccountRequest, marshal_HostingApiCreateHostingRequest, @@ -824,6 +827,61 @@ def check_user_owns_domain( self._throw_on_error(res) return unmarshal_CheckUserOwnsDomainResponse(res.json()) + def sync_domain_dns_records( + self, + *, + domain: str, + update_web_records: bool, + update_mail_records: bool, + update_all_records: bool, + region: Optional[Region] = None, + custom_records: Optional[List[SyncDomainDnsRecordsRequestRecord]] = None, + ) -> DnsRecords: + """ + "Synchronize your DNS records on the Elements Console and on cPanel.". + :param domain: Domain for which the DNS records will be synchronized. + :param update_web_records: Whether or not to synchronize the web records. + :param update_mail_records: Whether or not to synchronize the mail records. + :param update_all_records: Whether or not to synchronize all types of records. This one has priority. + :param region: Region to target. If none is passed will use default region from the config. + :param custom_records: Custom records to synchronize. + :return: :class:`DnsRecords ` + + Usage: + :: + + result = api.sync_domain_dns_records( + domain="example", + update_web_records=False, + update_mail_records=False, + update_all_records=False, + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_domain = validate_path_param("domain", domain) + + res = self._request( + "POST", + f"/webhosting/v1/regions/{param_region}/domains/{param_domain}/sync-domain-dns-records", + body=marshal_DnsApiSyncDomainDnsRecordsRequest( + DnsApiSyncDomainDnsRecordsRequest( + domain=domain, + update_web_records=update_web_records, + update_mail_records=update_mail_records, + update_all_records=update_all_records, + region=region, + custom_records=custom_records, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_DnsRecords(res.json()) + class WebhostingV1OfferAPI(API): """ diff --git a/scaleway/scaleway/webhosting/v1/marshalling.py b/scaleway/scaleway/webhosting/v1/marshalling.py index 99221035a..1c85301fe 100644 --- a/scaleway/scaleway/webhosting/v1/marshalling.py +++ b/scaleway/scaleway/webhosting/v1/marshalling.py @@ -49,6 +49,8 @@ DatabaseApiCreateDatabaseUserRequest, DatabaseApiUnassignDatabaseUserRequest, DnsApiCheckUserOwnsDomainRequest, + SyncDomainDnsRecordsRequestRecord, + DnsApiSyncDomainDnsRecordsRequest, FtpAccountApiChangeFtpAccountPasswordRequest, FtpAccountApiCreateFtpAccountRequest, CreateHostingRequestDomainConfiguration, @@ -364,6 +366,10 @@ def unmarshal_Offer(data: Any) -> Offer: if field is not None: args["id"] = field + field = data.get("name", None) + if field is not None: + args["name"] = field + field = data.get("billing_operation_path", None) if field is not None: args["billing_operation_path"] = field @@ -386,6 +392,10 @@ def unmarshal_Offer(data: Any) -> Offer: if field is not None: args["end_of_life"] = field + field = data.get("quota_warning", None) + if field is not None: + args["quota_warning"] = field + field = data.get("price", None) if field is not None: args["price"] = unmarshal_Money(field) @@ -939,6 +949,45 @@ def marshal_DnsApiCheckUserOwnsDomainRequest( return output +def marshal_SyncDomainDnsRecordsRequestRecord( + request: SyncDomainDnsRecordsRequestRecord, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.name is not None: + output["name"] = request.name + + if request.type_ is not None: + output["type"] = str(request.type_) + + return output + + +def marshal_DnsApiSyncDomainDnsRecordsRequest( + request: DnsApiSyncDomainDnsRecordsRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.update_web_records is not None: + output["update_web_records"] = request.update_web_records + + if request.update_mail_records is not None: + output["update_mail_records"] = request.update_mail_records + + if request.update_all_records is not None: + output["update_all_records"] = request.update_all_records + + if request.custom_records is not None: + output["custom_records"] = [ + marshal_SyncDomainDnsRecordsRequestRecord(item, defaults) + for item in request.custom_records + ] + + return output + + def marshal_FtpAccountApiChangeFtpAccountPasswordRequest( request: FtpAccountApiChangeFtpAccountPasswordRequest, defaults: ProfileDefaults, diff --git a/scaleway/scaleway/webhosting/v1/types.py b/scaleway/scaleway/webhosting/v1/types.py index 1202b2331..efcb5ba53 100644 --- a/scaleway/scaleway/webhosting/v1/types.py +++ b/scaleway/scaleway/webhosting/v1/types.py @@ -152,6 +152,8 @@ class OfferOptionName(str, Enum, metaclass=StrEnumMeta): RAM_GB = "ram_gb" BACKUP = "backup" DEDICATED_IP = "dedicated_ip" + EMAIL_STORAGE_GB = "email_storage_gb" + DATABASE_COUNT = "database_count" def __str__(self) -> str: return str(self.value) @@ -160,6 +162,7 @@ def __str__(self) -> str: class OfferOptionWarning(str, Enum, metaclass=StrEnumMeta): UNKNOWN_WARNING = "unknown_warning" QUOTA_EXCEEDED_WARNING = "quota_exceeded_warning" + USAGE_LOW_WARNING = "usage_low_warning" def __str__(self) -> str: return str(self.value) @@ -274,6 +277,13 @@ class OfferOptionRequest: """ +@dataclass +class SyncDomainDnsRecordsRequestRecord: + name: str + + type_: DnsRecordType + + @dataclass class DnsRecord: name: str @@ -350,6 +360,11 @@ class Offer: Offer ID. """ + name: str + """ + Offer name. + """ + billing_operation_path: str """ Unique identifier used for billing. @@ -375,6 +390,11 @@ class Offer: Indicates if the offer has reached its end of life. """ + quota_warning: OfferOptionWarning + """ + Defines a warning if the maximum value for an option in the offer is exceeded. + """ + price: Optional[Money] """ Price of the offer. @@ -859,6 +879,39 @@ class DnsApiGetDomainDnsRecordsRequest: """ +@dataclass +class DnsApiSyncDomainDnsRecordsRequest: + domain: str + """ + Domain for which the DNS records will be synchronized. + """ + + update_web_records: bool + """ + Whether or not to synchronize the web records. + """ + + update_mail_records: bool + """ + Whether or not to synchronize the mail records. + """ + + update_all_records: bool + """ + Whether or not to synchronize all types of records. This one has priority. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + custom_records: Optional[List[SyncDomainDnsRecordsRequestRecord]] + """ + Custom records to synchronize. + """ + + @dataclass class DnsRecords: records: List[DnsRecord]