diff --git a/playbooks/cloud-pre.yml b/playbooks/cloud-pre.yml index e4b2a4dc..f453a2db 100644 --- a/playbooks/cloud-pre.yml +++ b/playbooks/cloud-pre.yml @@ -16,15 +16,25 @@ > /dev/tty || true tags: debug - - name: Install the requirements - pip: - state: present - name: - - pyOpenSSL>=0.15 - - segno - tags: - - always - - skip_ansible_lint + # Install cloud provider specific dependencies + - name: Install cloud provider dependencies + shell: uv pip install '.[{{ cloud_provider_extra }}]' + vars: + cloud_provider_extra: >- + {%- if algo_provider in ['ec2', 'lightsail'] -%}aws + {%- elif algo_provider == 'azure' -%}azure + {%- elif algo_provider == 'gce' -%}gcp + {%- elif algo_provider == 'hetzner' -%}hetzner + {%- elif algo_provider == 'linode' -%}linode + {%- elif algo_provider == 'openstack' -%}openstack + {%- elif algo_provider == 'cloudstack' -%}cloudstack + {%- else -%}{{ algo_provider }} + {%- endif -%} + when: algo_provider != "local" + changed_when: false + + # Note: pyOpenSSL and segno are now included in pyproject.toml dependencies + # and installed automatically by uv sync delegate_to: localhost become: false diff --git a/pyproject.toml b/pyproject.toml index cb7277ef..6d18649b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,39 @@ dependencies = [ "jinja2>=3.1.6", "netaddr==1.3.0", "pyyaml>=6.0.2", + "pyopenssl>=0.15", + "segno>=1.6.0", +] + +[project.optional-dependencies] +# Cloud provider dependencies (installed automatically based on provider selection) +aws = [ + "boto3>=1.34.0", + "boto>=2.49.0", +] +azure = [ + "azure-identity>=1.15.0", + "azure-mgmt-compute>=30.0.0", + "azure-mgmt-network>=25.0.0", + "azure-mgmt-resource>=23.0.0", + "msrestazure>=0.6.4", +] +gcp = [ + "google-auth>=2.28.0", + "requests>=2.31.0", +] +hetzner = [ + "hcloud>=1.33.0", +] +linode = [ + "linode-api4>=5.15.0", +] +openstack = [ + "openstacksdk>=2.1.0", +] +cloudstack = [ + "cs>=3.0.0", + "sshpubkeys>=3.3.1", ] [tool.ruff] diff --git a/roles/cloud-azure/tasks/venv.yml b/roles/cloud-azure/tasks/venv.yml index fb354331..fcbb58e6 100644 --- a/roles/cloud-azure/tasks/venv.yml +++ b/roles/cloud-azure/tasks/venv.yml @@ -1,7 +1,3 @@ --- -- name: Install requirements - pip: - requirements: https://raw.githubusercontent.com/ansible-collections/azure/v3.7.0/requirements.txt - state: latest - virtualenv_python: python3 - no_log: true +# Azure dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-cloudstack/tasks/venv.yml b/roles/cloud-cloudstack/tasks/venv.yml index 28833424..bf7ae21d 100644 --- a/roles/cloud-cloudstack/tasks/venv.yml +++ b/roles/cloud-cloudstack/tasks/venv.yml @@ -1,8 +1,3 @@ --- -- name: Install requirements - pip: - name: - - cs - - sshpubkeys - state: latest - virtualenv_python: python3 +# CloudStack dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-ec2/tasks/venv.yml b/roles/cloud-ec2/tasks/venv.yml index 1ab85bd4..f2dee654 100644 --- a/roles/cloud-ec2/tasks/venv.yml +++ b/roles/cloud-ec2/tasks/venv.yml @@ -1,8 +1,3 @@ --- -- name: Install requirements - pip: - name: - - boto>=2.5 - - boto3 - state: latest - virtualenv_python: python3 +# AWS dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-gce/tasks/venv.yml b/roles/cloud-gce/tasks/venv.yml index e200624f..35311709 100644 --- a/roles/cloud-gce/tasks/venv.yml +++ b/roles/cloud-gce/tasks/venv.yml @@ -1,8 +1,3 @@ --- -- name: Install requirements - pip: - name: - - requests>=2.18.4 - - google-auth>=1.3.0 - state: latest - virtualenv_python: python3 +# GCP dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-hetzner/tasks/venv.yml b/roles/cloud-hetzner/tasks/venv.yml index 52f588a0..b8a2be19 100644 --- a/roles/cloud-hetzner/tasks/venv.yml +++ b/roles/cloud-hetzner/tasks/venv.yml @@ -1,7 +1,3 @@ --- -- name: Install requirements - pip: - name: - - hcloud - state: latest - virtualenv_python: python3 +# Hetzner dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-lightsail/tasks/venv.yml b/roles/cloud-lightsail/tasks/venv.yml index 1ab85bd4..f2dee654 100644 --- a/roles/cloud-lightsail/tasks/venv.yml +++ b/roles/cloud-lightsail/tasks/venv.yml @@ -1,8 +1,3 @@ --- -- name: Install requirements - pip: - name: - - boto>=2.5 - - boto3 - state: latest - virtualenv_python: python3 +# AWS dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-linode/tasks/venv.yml b/roles/cloud-linode/tasks/venv.yml index ece831e7..82cfa8f7 100644 --- a/roles/cloud-linode/tasks/venv.yml +++ b/roles/cloud-linode/tasks/venv.yml @@ -1,7 +1,3 @@ --- -- name: Install requirements - pip: - name: - - linode_api4 - state: latest - virtualenv_python: python3 +# Linode dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/roles/cloud-openstack/tasks/venv.yml b/roles/cloud-openstack/tasks/venv.yml index 7f386a08..807de83e 100644 --- a/roles/cloud-openstack/tasks/venv.yml +++ b/roles/cloud-openstack/tasks/venv.yml @@ -1,6 +1,3 @@ --- -- name: Install requirements - pip: - name: shade - state: latest - virtualenv_python: python3 +# OpenStack dependencies are now managed via pyproject.toml optional dependencies +# They will be installed automatically when needed diff --git a/uv.lock b/uv.lock index ac4ae637..1b0f004e 100644 --- a/uv.lock +++ b/uv.lock @@ -4,13 +4,15 @@ requires-python = ">=3.11" [[package]] name = "algo" -version = "0.1.0" +version = "2.0.0b0" source = { virtual = "." } dependencies = [ { name = "ansible" }, { name = "jinja2" }, { name = "netaddr" }, + { name = "pyopenssl" }, { name = "pyyaml" }, + { name = "segno" }, ] [package.dev-dependencies] @@ -24,7 +26,9 @@ requires-dist = [ { name = "ansible", specifier = "==11.8.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "netaddr", specifier = "==1.3.0" }, + { name = "pyopenssl", specifier = ">=0.15" }, { name = "pyyaml", specifier = ">=6.0.2" }, + { name = "segno", specifier = ">=1.6.0" }, ] [package.metadata.requires-dev] @@ -279,6 +283,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyopenssl" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/8c/cd89ad05804f8e3c17dea8f178c3f40eeab5694c30e0c9f5bcd49f576fc3/pyopenssl-25.1.0.tar.gz", hash = "sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b", size = 179937, upload-time = "2025-05-17T16:28:31.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/28/2659c02301b9500751f8d42f9a6632e1508aa5120de5e43042b8b30f8d5d/pyopenssl-25.1.0-py3-none-any.whl", hash = "sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab", size = 56771, upload-time = "2025-05-17T16:28:29.197Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -351,3 +368,21 @@ sdist = { url = "https://files.pythonhosted.org/packages/ce/10/f699366ce577423cb wheels = [ { url = "https://files.pythonhosted.org/packages/d2/fc/e9ccf0521607bcd244aa0b3fbd574f71b65e9ce6a112c83af988bbbe2e23/resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf", size = 17194, upload-time = "2023-03-09T05:10:36.214Z" }, ] + +[[package]] +name = "segno" +version = "1.6.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/2e/b396f750c53f570055bf5a9fc1ace09bed2dff013c73b7afec5702a581ba/segno-1.6.6.tar.gz", hash = "sha256:e60933afc4b52137d323a4434c8340e0ce1e58cec71439e46680d4db188f11b3", size = 1628586, upload-time = "2025-03-12T22:12:53.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/02/12c73fd423eb9577b97fc1924966b929eff7074ae6b2e15dd3d30cb9e4ae/segno-1.6.6-py3-none-any.whl", hash = "sha256:28c7d081ed0cf935e0411293a465efd4d500704072cdb039778a2ab8736190c7", size = 76503, upload-time = "2025-03-12T22:12:48.106Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, +]