diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5409917470..b84a19b8a1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -117,7 +117,7 @@ jobs: run: tox -e coverage-ci - name: Upload Coverage to codecov.io - uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 + uses: codecov/codecov-action@e53489f4d376d79066609109e7a95a29eb3740b1 # v7.0.0 with: # We utilize secret for more realiable builds. Without secret being set, upload step # fails fairly often. diff --git a/integration/storage/test_azure_blobs.py b/integration/storage/test_azure_blobs.py index 50dc3418f7..8a9483cc81 100644 --- a/integration/storage/test_azure_blobs.py +++ b/integration/storage/test_azure_blobs.py @@ -119,7 +119,7 @@ def setUpClass(cls): client_secret=config["AZURE_CLIENT_SECRET"], ) - resource_client = resource.ResourceManagementClient( + resource_client = resource.resources.ResourceManagementClient( credentials, config["AZURE_SUBSCRIPTION_ID"], ) @@ -205,7 +205,7 @@ def setUpClass(cls): ) cls.account = account.name - cls.secret = keys.keys[0].value + cls.secret = keys["keys"][0]["value"] class StorageV2Test(StorageTest): diff --git a/libcloud/compute/ssh.py b/libcloud/compute/ssh.py index 7a1ec1214f..aab2886bf1 100644 --- a/libcloud/compute/ssh.py +++ b/libcloud/compute/ssh.py @@ -668,7 +668,9 @@ def _get_pkey_object(self, key, password=None): if paramiko_version < (4, 0, 0): # DSSKey removed in paramiko 4.0.0 - key_types.insert(1, (paramiko.DSSKey, "DSA")) + dss_key_cls = getattr(paramiko, "DSSKey", None) + if dss_key_cls: + key_types.insert(1, (dss_key_cls, "DSA")) if paramiko_version >= (2, 2, 0): # Ed25519 is only supported in paramiko >= 2.2.0 key_types.append((paramiko.ed25519key.Ed25519Key, "Ed25519")) diff --git a/pyproject.toml b/pyproject.toml index b8ea1260e2..ee5cf0fbf1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,8 +89,10 @@ test = [ "cryptography==46.0.7", "pyopenssl==26.0.0", "fasteners", - "paramiko==3.5.1; platform_python_implementation != 'PyPy'", + "paramiko==5.0.0; platform_python_implementation != 'PyPy'", "libvirt-python==12.0.0", + "urllib3>=2.7.0", # to avoid security issues with older versions of urllib3 + "idna>=3.15", # to avoid security issues with older versions of idna ] lint = [ "pep8==1.7.1", @@ -105,7 +107,7 @@ lint = [ "codespell==2.4.1", "prek>=0.2.17", "requests>=2.27.1", - "paramiko==3.5.1; platform_python_implementation != 'PyPy'", + "paramiko==5.0.0; platform_python_implementation != 'PyPy'", ] docs = [ "rstcheck==6.2.5; python_version >= '3.10'", diff --git a/uv.lock b/uv.lock index 6a411cbecc..1a7f18e54a 100644 --- a/uv.lock +++ b/uv.lock @@ -48,6 +48,7 @@ dev = [ { name = "cryptography" }, { name = "fasteners" }, { name = "flake8" }, + { name = "idna" }, { name = "isort" }, { name = "libvirt-python" }, { name = "mypy", marker = "implementation_name == 'cpython'" }, @@ -69,6 +70,7 @@ dev = [ { name = "types-requests" }, { name = "types-simplejson" }, { name = "types-urllib3" }, + { name = "urllib3" }, ] docs = [ { name = "fasteners" }, @@ -117,6 +119,7 @@ test = [ { name = "coverage", extra = ["toml"] }, { name = "cryptography" }, { name = "fasteners" }, + { name = "idna" }, { name = "libvirt-python" }, { name = "paramiko", marker = "platform_python_implementation != 'PyPy'" }, { name = "pyopenssl" }, @@ -126,6 +129,7 @@ test = [ { name = "pytest-xdist" }, { name = "requests" }, { name = "requests-mock" }, + { name = "urllib3" }, ] [package.metadata] @@ -143,10 +147,11 @@ dev = [ { name = "cryptography", specifier = "==46.0.7" }, { name = "fasteners" }, { name = "flake8", specifier = "==5.0.4" }, + { name = "idna", specifier = ">=3.15" }, { name = "isort", marker = "python_full_version >= '3.10'", specifier = "==6.0.1" }, { name = "libvirt-python", specifier = "==12.0.0" }, { name = "mypy", marker = "python_full_version >= '3.10' and implementation_name == 'cpython'", specifier = "==1.15.0" }, - { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==3.5.1" }, + { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==5.0.0" }, { name = "pep8", specifier = "==1.7.1" }, { name = "prek", specifier = ">=0.2.17" }, { name = "pylint", marker = "python_full_version >= '3.10'", specifier = "==3.3.4" }, @@ -159,17 +164,18 @@ dev = [ { name = "requests", specifier = ">=2.27.1" }, { name = "requests", specifier = ">=2.33.0" }, { name = "requests-mock", specifier = "==1.12.1" }, - { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.4" }, + { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.5" }, { name = "tox", specifier = "==4.24.1" }, { name = "types-certifi" }, { name = "types-requests" }, { name = "types-simplejson" }, { name = "types-urllib3" }, + { name = "urllib3", specifier = ">=2.7.0" }, ] docs = [ { name = "fasteners" }, { name = "pygments", specifier = ">=2.20.0,<3.0.0" }, - { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.4" }, + { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.5" }, { name = "sphinx", specifier = "==6.2.1" }, { name = "sphinx-rtd-theme", specifier = "==2.0.0" }, ] @@ -189,13 +195,13 @@ lint = [ { name = "codespell", specifier = "==2.4.1" }, { name = "flake8", specifier = "==5.0.4" }, { name = "isort", marker = "python_full_version >= '3.10'", specifier = "==6.0.1" }, - { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==3.5.1" }, + { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==5.0.0" }, { name = "pep8", specifier = "==1.7.1" }, { name = "prek", specifier = ">=0.2.17" }, { name = "pylint", marker = "python_full_version >= '3.10'", specifier = "==3.3.4" }, { name = "pyupgrade", specifier = "==3.3.1" }, { name = "requests", specifier = ">=2.27.1" }, - { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.4" }, + { name = "rstcheck", marker = "python_full_version >= '3.10'", specifier = "==6.2.5" }, ] mypy = [ { name = "mypy", marker = "python_full_version >= '3.10' and implementation_name == 'cpython'", specifier = "==1.15.0" }, @@ -209,8 +215,9 @@ test = [ { name = "coverage", extras = ["toml"], marker = "python_full_version >= '3.10'", specifier = "==7.2.7" }, { name = "cryptography", specifier = "==46.0.7" }, { name = "fasteners" }, + { name = "idna", specifier = ">=3.15" }, { name = "libvirt-python", specifier = "==12.0.0" }, - { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==3.5.1" }, + { name = "paramiko", marker = "platform_python_implementation != 'PyPy'", specifier = "==5.0.0" }, { name = "pyopenssl", specifier = "==26.0.0" }, { name = "pytest", specifier = "==9.0.3" }, { name = "pytest-benchmark", extras = ["histogram"], marker = "python_full_version >= '3.10'", specifier = "==5.1.0" }, @@ -218,6 +225,7 @@ test = [ { name = "pytest-xdist", specifier = "==3.6.1" }, { name = "requests", specifier = ">=2.33.0" }, { name = "requests-mock", specifier = "==1.12.1" }, + { name = "urllib3", specifier = ">=2.7.0" }, ] [[package]] @@ -942,11 +950,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -979,6 +987,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "invoke" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/227c48c5fe47fa178ccf1fda8f047d16c97ba926567b661e9ce2045c600c/invoke-3.0.3.tar.gz", hash = "sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c", size = 343419, upload-time = "2026-04-07T15:17:48.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/de/bbc12563bbf979618d17625a4e753ff7a078523e28d870d3626daa97261a/invoke-3.0.3-py3-none-any.whl", hash = "sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053", size = 160958, upload-time = "2026-04-07T15:17:46.875Z" }, +] + [[package]] name = "isodate" version = "0.7.2" @@ -1213,16 +1230,16 @@ wheels = [ [[package]] name = "msal" -version = "1.34.0" +version = "1.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/99/d840198ecf6e8057bbc937f129ae940404485d736cda73253bbff9537f01/msal-1.37.0.tar.gz", hash = "sha256:1b1672a33ee467c1d70b341bb16cafd51bb3c817147a95b93263794b03971bec", size = 182444, upload-time = "2026-05-29T19:49:05.561Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/d807279f4b55d16d1f120d5ac4344c6e39b56732e2a224d40bded7fd67ad/msal-1.37.0-py3-none-any.whl", hash = "sha256:dd17e95a7c71bce75e8108113438ba7c4a086b3bcad4f57a8c09b7af3d753c2d", size = 123725, upload-time = "2026-05-29T19:49:04.335Z" }, ] [[package]] @@ -1353,16 +1370,17 @@ wheels = [ [[package]] name = "paramiko" -version = "3.5.1" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bcrypt" }, { name = "cryptography" }, + { name = "invoke" }, { name = "pynacl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/15/ad6ce226e8138315f2451c2aeea985bf35ee910afb477bae7477dc3a8f3b/paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822", size = 1566110, upload-time = "2025-02-04T02:37:59.783Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/93/dcc25d52f49022ae6175d15e6bd751f1acc99b98bc61fc55e5155a7be2e7/paramiko-5.0.0.tar.gz", hash = "sha256:36763b5b95c2a0dcfdf1abc48e48156ee425b21efe2f0e787c2dd5a95c0e5e79", size = 1548586, upload-time = "2026-05-09T18:28:52.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/f8/c7bd0ef12954a81a1d3cea60a13946bd9a49a0036a5927770c461eade7ae/paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61", size = 227298, upload-time = "2025-02-04T02:37:57.672Z" }, + { url = "https://files.pythonhosted.org/packages/82/5b/eadf6d45de38d30ab603f49393b6cd2cbe7e233af8cf90197e32782b68a9/paramiko-5.0.0-py3-none-any.whl", hash = "sha256:b7044611c30140d9a75261653210e2002977b71a0497ff3ba0d98d7edbf62f7c", size = 208919, upload-time = "2026-05-09T18:28:50.295Z" }, ] [[package]] @@ -2047,15 +2065,15 @@ wheels = [ [[package]] name = "rstcheck" -version = "6.2.4" +version = "6.2.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "rstcheck-core" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/fe/000cc83279123cf21f68d28b8bcd76849acf8e2a9bb75cc834d4a3212a33/rstcheck-6.2.4.tar.gz", hash = "sha256:384942563dfbfcc85903a587ecf050447217c46b51e266ed3fe51371bc599015", size = 24520, upload-time = "2024-07-07T16:16:57.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/c9/4910e032405dbe1178bc410c45531b7bcc4f36326af167f4648f212c2409/rstcheck-6.2.5.tar.gz", hash = "sha256:122b6d6b953fa1a09d7e7de42ac5d8938da291c6f68351ace6166bb50fc3bd6c", size = 25235, upload-time = "2025-06-01T13:06:36.324Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/49/e55ba65b9e805cc97a1115ba51bbec346013814b6d6ded216bb4e97cf3a1/rstcheck-6.2.4-py3-none-any.whl", hash = "sha256:23de2575ba0af1adcddea87a20d69187f0fb9dd8270f59eb98d63461c95375a7", size = 8533, upload-time = "2024-07-07T16:16:55.386Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c2/67e0fa861f250e343c5c25de5f09800e85227241942d018a3e303d14d965/rstcheck-6.2.5-py3-none-any.whl", hash = "sha256:09af9555cf05f23651189154066d483ced25d36ebb3f01dc3a5d27524e4a5fdc", size = 8679, upload-time = "2025-06-01T13:06:35.16Z" }, ] [[package]] @@ -2439,11 +2457,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]]