aioovh 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aioovh-0.1.0/.github/workflows/pull-request.yml +68 -0
- aioovh-0.1.0/.github/workflows/release.yml +59 -0
- aioovh-0.1.0/.gitignore +23 -0
- aioovh-0.1.0/.python-version +1 -0
- aioovh-0.1.0/CHANGELOG.md +35 -0
- aioovh-0.1.0/CITATION.cff +27 -0
- aioovh-0.1.0/CONTRIBUTING.md +116 -0
- aioovh-0.1.0/LICENSE +21 -0
- aioovh-0.1.0/PKG-INFO +188 -0
- aioovh-0.1.0/README.md +153 -0
- aioovh-0.1.0/mapping.yaml +196 -0
- aioovh-0.1.0/pyproject.toml +94 -0
- aioovh-0.1.0/scripts/fetch_specs.py +37 -0
- aioovh-0.1.0/scripts/generate.py +28 -0
- aioovh-0.1.0/scripts/objects.py +1219 -0
- aioovh-0.1.0/scripts/operations.py +635 -0
- aioovh-0.1.0/scripts/release.sh +74 -0
- aioovh-0.1.0/scripts/roll_changelog.py +87 -0
- aioovh-0.1.0/src/aioovh/__init__.py +49 -0
- aioovh-0.1.0/src/aioovh/_client.py +402 -0
- aioovh-0.1.0/src/aioovh/_endpoints.py +25 -0
- aioovh-0.1.0/src/aioovh/_enums.py +15 -0
- aioovh-0.1.0/src/aioovh/_errors.py +127 -0
- aioovh-0.1.0/src/aioovh/_models.py +17 -0
- aioovh-0.1.0/src/aioovh/_namespaces.py +158 -0
- aioovh-0.1.0/src/aioovh/_objects.py +168 -0
- aioovh-0.1.0/src/aioovh/_operations/__init__.py +1 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/__init__.py +1 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/all_dom/__init__.py +34 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/all_dom/api.py +149 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/all_dom/models.py +244 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/auth/__init__.py +74 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/auth/api.py +93 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/auth/models.py +747 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cdn_dedicated/__init__.py +82 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cdn_dedicated/api.py +1144 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cdn_dedicated/models.py +610 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cloud/__init__.py +1782 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cloud/api.py +27226 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cloud/models.py +21959 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cluster_hadoop/__init__.py +68 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cluster_hadoop/api.py +1071 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/cluster_hadoop/models.py +559 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/connectivity/__init__.py +148 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/connectivity/api.py +618 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/connectivity/models.py +1637 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/contact/__init__.py +14 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/contact/api.py +50 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/contact/models.py +53 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dbaas_logs/__init__.py +228 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dbaas_logs/api.py +3125 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dbaas_logs/models.py +2921 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_ceph/__init__.py +98 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_ceph/api.py +872 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_ceph/models.py +938 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cloud/__init__.py +442 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cloud/api.py +8577 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cloud/models.py +5578 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cluster/__init__.py +50 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cluster/api.py +280 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_cluster/models.py +502 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_housing/__init__.py +70 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_housing/api.py +447 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_housing/models.py +667 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_installation_template/__init__.py +54 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_installation_template/api.py +229 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_installation_template/models.py +921 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_nasha/__init__.py +76 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_nasha/api.py +1094 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_nasha/models.py +660 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_server/__init__.py +406 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_server/api.py +3434 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/dedicated_server/models.py +5721 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/domain/__init__.py +322 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/domain/api.py +2587 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/domain/models.py +3886 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_domain/__init__.py +132 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_domain/api.py +2845 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_domain/models.py +1307 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_exchange/__init__.py +210 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_exchange/api.py +7063 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_exchange/models.py +3447 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_mxplan/__init__.py +66 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_mxplan/api.py +1233 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_mxplan/models.py +951 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_pro/__init__.py +100 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_pro/api.py +1671 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/email_pro/models.py +1631 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/freefax/__init__.py +70 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/freefax/api.py +436 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/freefax/models.py +603 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/horizon_view/__init__.py +58 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/horizon_view/api.py +1181 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/horizon_view/models.py +588 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_private_database/__init__.py +182 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_private_database/api.py +1872 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_private_database/models.py +1805 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_web/__init__.py +476 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_web/api.py +5366 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/hosting_web/models.py +5563 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip/__init__.py +140 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip/api.py +1830 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip/models.py +1656 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip_loadbalancing/__init__.py +168 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip_loadbalancing/api.py +3620 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ip_loadbalancing/models.py +2055 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cloud_linux/__init__.py +48 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cloud_linux/api.py +236 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cloud_linux/models.py +393 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cpanel/__init__.py +54 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cpanel/api.py +331 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_cpanel/models.py +1475 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_directadmin/__init__.py +56 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_directadmin/api.py +359 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_directadmin/models.py +476 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_hycu/__init__.py +46 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_hycu/api.py +274 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_hycu/models.py +388 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office/__init__.py +86 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office/api.py +433 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office/models.py +1668 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office_prepaid/__init__.py +90 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office_prepaid/api.py +439 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_office_prepaid/models.py +1680 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_plesk/__init__.py +68 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_plesk/api.py +404 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_plesk/models.py +693 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_redhat/__init__.py +42 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_redhat/api.py +258 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_redhat/models.py +360 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_sqlserver/__init__.py +48 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_sqlserver/api.py +236 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_sqlserver/models.py +2547 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_virtuozzo/__init__.py +64 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_virtuozzo/api.py +409 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_virtuozzo/models.py +547 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_windows/__init__.py +54 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_windows/api.py +359 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_windows/models.py +2238 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_worklight/__init__.py +52 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_worklight/api.py +333 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/license_worklight/models.py +430 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/me/__init__.py +762 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/me/api.py +7580 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/me/models.py +8830 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/metrics/__init__.py +62 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/metrics/api.py +427 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/metrics/models.py +546 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ms_services/__init__.py +98 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ms_services/api.py +1424 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ms_services/models.py +1413 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/new_account/__init__.py +32 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/new_account/api.py +289 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/new_account/models.py +485 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/nutanix/__init__.py +86 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/nutanix/api.py +496 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/nutanix/models.py +970 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/order/__init__.py +608 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/order/api.py +22436 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/order/models.py +12173 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/over_the_box/__init__.py +152 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/over_the_box/api.py +1462 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/over_the_box/models.py +1630 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ovh_cloud_connect/__init__.py +154 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ovh_cloud_connect/api.py +1479 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ovh_cloud_connect/models.py +1547 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_siptrunk/__init__.py +28 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_siptrunk/api.py +131 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_siptrunk/models.py +193 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_xdsl/__init__.py +152 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_xdsl/api.py +1570 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/pack_xdsl/models.py +1794 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/partner/__init__.py +28 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/partner/api.py +42 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/partner/models.py +521 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/price/__init__.py +1186 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/price/api.py +14827 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/price/models.py +10269 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/products/__init__.py +206 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/products/models.py +2597 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/saas_csp2/__init__.py +56 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/saas_csp2/api.py +509 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/saas_csp2/models.py +563 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/secret/__init__.py +10 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/secret/api.py +34 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/secret/models.py +25 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/service/__init__.py +50 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/service/api.py +189 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/service/models.py +441 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/services/__init__.py +262 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/services/api.py +1306 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/services/models.py +2686 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/sms/__init__.py +190 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/sms/api.py +3469 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/sms/models.py +1979 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl/__init__.py +40 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl/api.py +143 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl/models.py +361 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl_gateway/__init__.py +58 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl_gateway/api.py +607 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/ssl_gateway/models.py +560 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/stack_mis/__init__.py +30 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/stack_mis/api.py +99 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/stack_mis/models.py +211 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/startup/__init__.py +42 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/startup/api.py +42 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/startup/models.py +653 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/storage/__init__.py +130 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/storage/api.py +1283 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/storage/models.py +1196 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/supply_mondial_relay/__init__.py +24 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/supply_mondial_relay/api.py +48 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/supply_mondial_relay/models.py +454 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/support/__init__.py +28 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/support/api.py +288 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/support/models.py +231 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/telephony/__init__.py +596 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/telephony/api.py +16610 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/telephony/models.py +6289 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_cloud_connect/__init__.py +46 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_cloud_connect/api.py +347 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_cloud_connect/models.py +393 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_veeam_enterprise/__init__.py +38 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_veeam_enterprise/api.py +295 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/veeam_veeam_enterprise/models.py +317 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vip/__init__.py +30 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vip/api.py +98 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vip/models.py +212 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vps/__init__.py +230 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vps/api.py +2131 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vps/models.py +2406 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vrack/__init__.py +102 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vrack/api.py +1952 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/vrack/models.py +895 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/xdsl/__init__.py +412 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/xdsl/api.py +3351 -0
- aioovh-0.1.0/src/aioovh/_operations/v1/xdsl/models.py +4832 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/__init__.py +1 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/account/__init__.py +16 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/account/api.py +50 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/account/models.py +69 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/backup_services/__init__.py +134 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/backup_services/api.py +1590 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/backup_services/models.py +1633 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/commercial_catalog/__init__.py +90 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/commercial_catalog/api.py +148 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/commercial_catalog/models.py +895 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/dedicated_server/__init__.py +74 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/dedicated_server/api.py +357 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/dedicated_server/models.py +605 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/domain/__init__.py +134 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/domain/api.py +683 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/domain/models.py +1485 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/finops/__init__.py +38 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/finops/api.py +329 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/finops/models.py +330 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/iam/__init__.py +86 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/iam/api.py +1155 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/iam/models.py +952 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/location/__init__.py +20 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/location/api.py +235 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/location/models.py +169 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/managed_cms/__init__.py +172 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/managed_cms/api.py +1348 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/managed_cms/models.py +1733 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/network_defense/__init__.py +68 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/network_defense/api.py +503 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/network_defense/models.py +657 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/notification/__init__.py +68 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/notification/api.py +677 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/notification/models.py +656 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/okms/__init__.py +136 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/okms/api.py +1300 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/okms/models.py +1598 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/public_cloud/__init__.py +1834 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/public_cloud/api.py +27197 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/public_cloud/models.py +22976 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/videocenter/__init__.py +32 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/videocenter/api.py +140 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/videocenter/models.py +224 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vmware_cloud_director/__init__.py +150 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vmware_cloud_director/api.py +2190 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vmware_cloud_director/models.py +1630 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vrack_services/__init__.py +60 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vrack_services/api.py +428 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/vrack_services/models.py +567 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/webhosting/__init__.py +122 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/webhosting/api.py +777 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/webhosting/models.py +1169 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/zimbra/__init__.py +198 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/zimbra/api.py +1428 -0
- aioovh-0.1.0/src/aioovh/_operations/v2/zimbra/models.py +2159 -0
- aioovh-0.1.0/src/aioovh/_root.py +77 -0
- aioovh-0.1.0/src/aioovh/_settings.py +23 -0
- aioovh-0.1.0/src/aioovh/account/__init__.py +524 -0
- aioovh-0.1.0/src/aioovh/account/resources.py +9516 -0
- aioovh-0.1.0/src/aioovh/account/types.py +4812 -0
- aioovh-0.1.0/src/aioovh/ai/__init__.py +200 -0
- aioovh-0.1.0/src/aioovh/ai/resources.py +4199 -0
- aioovh-0.1.0/src/aioovh/ai/types.py +3596 -0
- aioovh-0.1.0/src/aioovh/analytics/__init__.py +396 -0
- aioovh-0.1.0/src/aioovh/analytics/resources.py +8897 -0
- aioovh-0.1.0/src/aioovh/analytics/types.py +1856 -0
- aioovh-0.1.0/src/aioovh/backup/__init__.py +96 -0
- aioovh-0.1.0/src/aioovh/backup/resources.py +1565 -0
- aioovh-0.1.0/src/aioovh/backup/types.py +216 -0
- aioovh-0.1.0/src/aioovh/billing/__init__.py +316 -0
- aioovh-0.1.0/src/aioovh/billing/resources.py +4917 -0
- aioovh-0.1.0/src/aioovh/billing/types.py +1098 -0
- aioovh-0.1.0/src/aioovh/compute/__init__.py +328 -0
- aioovh-0.1.0/src/aioovh/compute/resources.py +6852 -0
- aioovh-0.1.0/src/aioovh/compute/types.py +4614 -0
- aioovh-0.1.0/src/aioovh/databases/__init__.py +888 -0
- aioovh-0.1.0/src/aioovh/databases/resources.py +20879 -0
- aioovh-0.1.0/src/aioovh/databases/types.py +3562 -0
- aioovh-0.1.0/src/aioovh/domains/__init__.py +178 -0
- aioovh-0.1.0/src/aioovh/domains/resources.py +3101 -0
- aioovh-0.1.0/src/aioovh/domains/types.py +516 -0
- aioovh-0.1.0/src/aioovh/email/__init__.py +612 -0
- aioovh-0.1.0/src/aioovh/email/resources.py +13794 -0
- aioovh-0.1.0/src/aioovh/email/types.py +734 -0
- aioovh-0.1.0/src/aioovh/iam/__init__.py +252 -0
- aioovh-0.1.0/src/aioovh/iam/resources.py +4786 -0
- aioovh-0.1.0/src/aioovh/iam/types.py +4624 -0
- aioovh-0.1.0/src/aioovh/kubernetes/__init__.py +110 -0
- aioovh-0.1.0/src/aioovh/kubernetes/resources.py +2672 -0
- aioovh-0.1.0/src/aioovh/kubernetes/types.py +3622 -0
- aioovh-0.1.0/src/aioovh/licenses/__init__.py +236 -0
- aioovh-0.1.0/src/aioovh/licenses/resources.py +4412 -0
- aioovh-0.1.0/src/aioovh/licenses/types.py +1024 -0
- aioovh-0.1.0/src/aioovh/network/__init__.py +716 -0
- aioovh-0.1.0/src/aioovh/network/resources.py +13607 -0
- aioovh-0.1.0/src/aioovh/network/types.py +4428 -0
- aioovh-0.1.0/src/aioovh/observability/__init__.py +164 -0
- aioovh-0.1.0/src/aioovh/observability/resources.py +2765 -0
- aioovh-0.1.0/src/aioovh/observability/types.py +2032 -0
- aioovh-0.1.0/src/aioovh/orders/__init__.py +3446 -0
- aioovh-0.1.0/src/aioovh/orders/resources.py +33826 -0
- aioovh-0.1.0/src/aioovh/orders/types.py +2682 -0
- aioovh-0.1.0/src/aioovh/py.typed +0 -0
- aioovh-0.1.0/src/aioovh/storage/__init__.py +236 -0
- aioovh-0.1.0/src/aioovh/storage/resources.py +4920 -0
- aioovh-0.1.0/src/aioovh/storage/types.py +3946 -0
- aioovh-0.1.0/src/aioovh/telecom/__init__.py +1130 -0
- aioovh-0.1.0/src/aioovh/telecom/resources.py +24737 -0
- aioovh-0.1.0/src/aioovh/telecom/types.py +2570 -0
- aioovh-0.1.0/src/aioovh/virtualization/__init__.py +462 -0
- aioovh-0.1.0/src/aioovh/virtualization/resources.py +9555 -0
- aioovh-0.1.0/src/aioovh/virtualization/types.py +724 -0
- aioovh-0.1.0/src/aioovh/web_hosting/__init__.py +398 -0
- aioovh-0.1.0/src/aioovh/web_hosting/resources.py +7570 -0
- aioovh-0.1.0/src/aioovh/web_hosting/types.py +944 -0
- aioovh-0.1.0/tests/__init__.py +0 -0
- aioovh-0.1.0/tests/conftest.py +82 -0
- aioovh-0.1.0/tests/test_client.py +243 -0
- aioovh-0.1.0/tests/test_objects.py +216 -0
- aioovh-0.1.0/tests/test_operations.py +131 -0
- aioovh-0.1.0/uv.lock +1152 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Pull request
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [development]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
UV_FROZEN: "1"
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
check:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
python-version: ["3.12", "3.13", "3.14"]
|
|
24
|
+
env:
|
|
25
|
+
UV_PYTHON: ${{ matrix.python-version }}
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v7
|
|
28
|
+
|
|
29
|
+
- name: Install uv
|
|
30
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
31
|
+
with:
|
|
32
|
+
version: "0.13.4"
|
|
33
|
+
enable-cache: true
|
|
34
|
+
|
|
35
|
+
- name: Install the project
|
|
36
|
+
run: uv sync
|
|
37
|
+
|
|
38
|
+
- name: Lint
|
|
39
|
+
run: |
|
|
40
|
+
uv run ruff check .
|
|
41
|
+
uv run ruff format --check .
|
|
42
|
+
|
|
43
|
+
- name: Check the generated code matches the specs
|
|
44
|
+
run: |
|
|
45
|
+
uv run python scripts/generate.py
|
|
46
|
+
git diff --exit-code -- src docs
|
|
47
|
+
|
|
48
|
+
- name: Type check
|
|
49
|
+
run: uv run mypy
|
|
50
|
+
|
|
51
|
+
- name: Test
|
|
52
|
+
run: uv run pytest -q
|
|
53
|
+
|
|
54
|
+
docs:
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v7
|
|
58
|
+
|
|
59
|
+
- name: Install uv
|
|
60
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
61
|
+
with:
|
|
62
|
+
version: "0.13.4"
|
|
63
|
+
enable-cache: true
|
|
64
|
+
|
|
65
|
+
- name: Build the documentation site
|
|
66
|
+
run: |
|
|
67
|
+
uv sync --group docs
|
|
68
|
+
uv run zensical build --clean
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
env:
|
|
8
|
+
UV_FROZEN: "1"
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
release:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
# PyPI trusts this workflow over OIDC, so no token is stored; the pypi
|
|
15
|
+
# environment waits for a reviewer, since an upload cannot be taken back
|
|
16
|
+
environment:
|
|
17
|
+
name: pypi
|
|
18
|
+
url: https://pypi.org/project/aioovh/
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
id-token: write
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v7
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
29
|
+
with:
|
|
30
|
+
version: "0.13.4"
|
|
31
|
+
enable-cache: true
|
|
32
|
+
|
|
33
|
+
- name: Check the tag matches the declared version
|
|
34
|
+
run: test "v$(uv version --short)" = "$GITHUB_REF_NAME"
|
|
35
|
+
|
|
36
|
+
- name: Install the project
|
|
37
|
+
run: uv sync
|
|
38
|
+
|
|
39
|
+
- name: Lint
|
|
40
|
+
run: |
|
|
41
|
+
uv run ruff check .
|
|
42
|
+
uv run ruff format --check .
|
|
43
|
+
|
|
44
|
+
- name: Check the generated code matches the specs
|
|
45
|
+
run: |
|
|
46
|
+
uv run python scripts/generate.py
|
|
47
|
+
git diff --exit-code -- src docs
|
|
48
|
+
|
|
49
|
+
- name: Type check
|
|
50
|
+
run: uv run mypy
|
|
51
|
+
|
|
52
|
+
- name: Test
|
|
53
|
+
run: uv run pytest -q
|
|
54
|
+
|
|
55
|
+
- name: Build
|
|
56
|
+
run: uv build
|
|
57
|
+
|
|
58
|
+
- name: Publish to PyPI
|
|
59
|
+
run: uv publish --trusted-publishing always
|
aioovh-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Python-generated files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[oc]
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
wheels/
|
|
7
|
+
*.egg-info
|
|
8
|
+
|
|
9
|
+
# Virtual environments
|
|
10
|
+
.venv
|
|
11
|
+
|
|
12
|
+
# Tooling caches
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
|
|
17
|
+
# Profiler output
|
|
18
|
+
gmon.out
|
|
19
|
+
|
|
20
|
+
# Documentation site build
|
|
21
|
+
site/
|
|
22
|
+
.cache/
|
|
23
|
+
.claude/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes to this project, newest first.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2026-11-11
|
|
11
|
+
|
|
12
|
+
First version published on PyPI.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- `OVH`, the client, read from the `OVH_*` variables of the official package,
|
|
17
|
+
signing each request with the `$1$` signature and the server clock offset,
|
|
18
|
+
or using OAuth2 client credentials; `with_options()` shares its connections.
|
|
19
|
+
- Business areas shared with aioscaleway: `compute`, `storage`, `backup`,
|
|
20
|
+
`network`, `kubernetes`, `databases`, `analytics`, `ai`, `email`,
|
|
21
|
+
`domains`, `web_hosting`, `observability`, `iam`, `account`, `billing`,
|
|
22
|
+
`orders`, `telecom`, `licenses` and `virtualization`, covering the 70 APIs
|
|
23
|
+
of version 1.0 and the 18 of v2.
|
|
24
|
+
- Collections iterated with `async for`, the 1.0 lists of identifiers loaded a
|
|
25
|
+
few at a time, the v2 cursor pages followed, `filter()` and `ids()`;
|
|
26
|
+
references that act without loading and load when awaited; loaded objects
|
|
27
|
+
that are references too.
|
|
28
|
+
- Public Cloud resources scoped by project, with `default_project`.
|
|
29
|
+
- Typed errors under `OVHAPIError` with the query id, retries with `stamina`,
|
|
30
|
+
dates as `whenever.Instant` and `whenever.Date`, open enumerations.
|
|
31
|
+
- `ovh.raw`, the underlying client, with the official package's raw calls.
|
|
32
|
+
- Type information shipped with the package (`py.typed`).
|
|
33
|
+
|
|
34
|
+
[Unreleased]: https://gitlab.com/businessagile/libraries/aioovh/-/compare/v0.1.0...development
|
|
35
|
+
[0.1.0]: https://gitlab.com/businessagile/libraries/aioovh/-/tags/v0.1.0
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: If you use aioovh in your work, please cite it as below.
|
|
3
|
+
type: software
|
|
4
|
+
title: aioovh
|
|
5
|
+
abstract: Asynchronous, fully typed client for every OVHcloud API, on httpx2 and pydantic.
|
|
6
|
+
authors:
|
|
7
|
+
- given-names: Alexandre
|
|
8
|
+
family-names: BERREBI
|
|
9
|
+
email: alexandre.berrebi@businessagile.eu
|
|
10
|
+
affiliation: Business Agile
|
|
11
|
+
website: https://businessagile.eu/en/about
|
|
12
|
+
version: 0.1.0
|
|
13
|
+
date-released: 2026-11-11
|
|
14
|
+
license: MIT
|
|
15
|
+
url: https://aioovh.businessagile.eu
|
|
16
|
+
repository-code: https://gitlab.com/businessagile/libraries/aioovh
|
|
17
|
+
keywords:
|
|
18
|
+
- ovh
|
|
19
|
+
- ovhcloud
|
|
20
|
+
- kimsufi
|
|
21
|
+
- soyoustart
|
|
22
|
+
- asyncio
|
|
23
|
+
- httpx
|
|
24
|
+
- pydantic
|
|
25
|
+
- sdk
|
|
26
|
+
- api
|
|
27
|
+
- cloud
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Issues and pull requests
|
|
4
|
+
|
|
5
|
+
Report bugs, ask questions and propose changes on
|
|
6
|
+
[GitHub](https://github.com/BiBzz/aioovh): [issues](https://github.com/BiBzz/aioovh/issues) and pull requests against `development`
|
|
7
|
+
are welcome there, and your commits do not need to be signed.
|
|
8
|
+
|
|
9
|
+
The code is reviewed and merged on
|
|
10
|
+
[GitLab](https://gitlab.com/businessagile/libraries/aioovh), which mirrors
|
|
11
|
+
itself to GitHub. A pull request is picked up into a GitLab merge request that
|
|
12
|
+
links back to it, keeps you as the author of your commits, and runs the full
|
|
13
|
+
CI. Once merged, the mirror brings the commits to GitHub, which marks the pull
|
|
14
|
+
request as merged; if they had to be rebased, the pull request is closed with
|
|
15
|
+
a link to the commit. Do not expect the GitHub merge button to work: only the
|
|
16
|
+
mirror writes to `development`.
|
|
17
|
+
|
|
18
|
+
## Setting up
|
|
19
|
+
|
|
20
|
+
The project is managed with [uv](https://docs.astral.sh/uv/), 0.13 or later:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv sync
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
It uses the interpreter in `.python-version`, the oldest version the library
|
|
27
|
+
supports.
|
|
28
|
+
|
|
29
|
+
## The checks
|
|
30
|
+
|
|
31
|
+
These are the gates CI runs on every merge request on GitLab, and GitHub
|
|
32
|
+
Actions on every pull request:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
uv run ruff check .
|
|
36
|
+
uv run ruff format --check .
|
|
37
|
+
uv run python scripts/generate.py && git diff --exit-code -- src docs
|
|
38
|
+
uv run mypy
|
|
39
|
+
uv run pytest -q
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The tests run on Python 3.12, 3.13 and 3.14 in CI.
|
|
43
|
+
|
|
44
|
+
## Generated code
|
|
45
|
+
|
|
46
|
+
Everything under `src/aioovh/_operations/` and the area packages
|
|
47
|
+
(`src/aioovh/billing/`...) is generated, as are `docs/objects.md` and
|
|
48
|
+
`docs/coverage.md`; each generated file starts with a line saying so. Change
|
|
49
|
+
the generators (`scripts/operations.py`, `scripts/objects.py`), the mapping
|
|
50
|
+
(`mapping.yaml`) or the hand-written runtime (`src/aioovh/_*.py`), never the
|
|
51
|
+
output, then regenerate:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
uv run python scripts/generate.py
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The generator stops on a root missing from `mapping.yaml` or on a name clash.
|
|
58
|
+
Read the diff of `docs/objects.md`: it is the public surface.
|
|
59
|
+
|
|
60
|
+
To pick up what OVHcloud changed in its APIs:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
uv run python scripts/fetch_specs.py
|
|
64
|
+
uv run python scripts/generate.py
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The first command downloads every schema listed by the version 1.0 and v2
|
|
68
|
+
roots. Commit the schemas and the generated code together, in a merge request
|
|
69
|
+
of their own: its diff is the list of API changes.
|
|
70
|
+
|
|
71
|
+
## Commits
|
|
72
|
+
|
|
73
|
+
Work branches off `development`, the default branch, and lands through a
|
|
74
|
+
merge request. Everything in the repository is written in English, and commit
|
|
75
|
+
messages follow the Angular convention: `feat(client): ...`,
|
|
76
|
+
`fix(generator): ...`, `docs: ...`. Maintainers sign their commits and tags.
|
|
77
|
+
|
|
78
|
+
## The changelog
|
|
79
|
+
|
|
80
|
+
Anything a user of the library would notice goes under `## [Unreleased]` in
|
|
81
|
+
[CHANGELOG.md](CHANGELOG.md), in the merge request that changes the behaviour.
|
|
82
|
+
The format is [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
83
|
+
|
|
84
|
+
## Releasing
|
|
85
|
+
|
|
86
|
+
1. In a merge request, bump `version` in `pyproject.toml`, run `uv lock`, and
|
|
87
|
+
turn the `## [Unreleased]` section into the release:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
python3 scripts/roll_changelog.py 0.2.0
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
2. Once it is merged, from an up to date `development`:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
scripts/release.sh
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
It checks the tree matches `origin`, the commit is signed and the
|
|
100
|
+
changelog has the section, replays the checks, signs the `v0.2.0` tag with
|
|
101
|
+
the changelog entry as its message, and pushes it after asking.
|
|
102
|
+
|
|
103
|
+
3. The GitLab mirror carries the tag to GitHub, where the `Release` workflow
|
|
104
|
+
checks the tag matches the version, replays the checks, then waits for a
|
|
105
|
+
reviewer to approve the `pypi` environment. Approving it is the point of no
|
|
106
|
+
return: a version on PyPI can be yanked, but its files can never be uploaded
|
|
107
|
+
again. The workflow builds the wheel and the sdist and uploads them with
|
|
108
|
+
PyPI trusted publishing, so no token is stored anywhere.
|
|
109
|
+
|
|
110
|
+
### What PyPI trusts
|
|
111
|
+
|
|
112
|
+
The trusted publisher declared on PyPI for `aioovh` is the GitHub repository
|
|
113
|
+
`BiBzz/aioovh`, workflow `release.yml`, environment `pypi`. Renaming the
|
|
114
|
+
repository, the workflow or the environment breaks the upload until the
|
|
115
|
+
publisher is updated on PyPI. Tags matching `v*` are protected on GitLab, and
|
|
116
|
+
on GitHub only the mirror may create them.
|
aioovh-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alexandre BERREBI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
aioovh-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: aioovh
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Asynchronous, fully typed client for every OVHcloud API, on httpx2 and pydantic
|
|
5
|
+
Project-URL: Homepage, https://aioovh.businessagile.eu
|
|
6
|
+
Project-URL: Documentation, https://aioovh.businessagile.eu
|
|
7
|
+
Project-URL: Repository, https://gitlab.com/businessagile/libraries/aioovh
|
|
8
|
+
Project-URL: Mirror, https://github.com/BiBzz/aioovh
|
|
9
|
+
Project-URL: Issues, https://github.com/BiBzz/aioovh/issues
|
|
10
|
+
Project-URL: Changelog, https://gitlab.com/businessagile/libraries/aioovh/-/blob/development/CHANGELOG.md
|
|
11
|
+
Author-email: Alexandre BERREBI <alexandre.berrebi@businessagile.eu>
|
|
12
|
+
Maintainer-email: Business Agile <contact@businessagile.eu>
|
|
13
|
+
License-Expression: MIT
|
|
14
|
+
License-File: LICENSE
|
|
15
|
+
Keywords: api,asyncio,cloud,httpx,kimsufi,ovh,ovhcloud,pydantic,sdk,soyoustart
|
|
16
|
+
Classifier: Development Status :: 4 - Beta
|
|
17
|
+
Classifier: Framework :: AsyncIO
|
|
18
|
+
Classifier: Framework :: Pydantic :: 2
|
|
19
|
+
Classifier: Intended Audience :: Developers
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
25
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
26
|
+
Classifier: Topic :: System :: Systems Administration
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.12
|
|
29
|
+
Requires-Dist: httpx2>=2.16.0
|
|
30
|
+
Requires-Dist: pydantic-settings>=2.16.0
|
|
31
|
+
Requires-Dist: pydantic>=2.14.1
|
|
32
|
+
Requires-Dist: stamina>=26.1.0
|
|
33
|
+
Requires-Dist: whenever>=0.11.0
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# aioovh
|
|
37
|
+
|
|
38
|
+
Asynchronous, fully typed Python client for every
|
|
39
|
+
[OVHcloud API](https://eu.api.ovh.com/console/), versions 1.0 and v2, built on
|
|
40
|
+
[httpx2](https://pypi.org/project/httpx2/), [pydantic](https://docs.pydantic.dev/)
|
|
41
|
+
and [whenever](https://whenever.readthedocs.io/).
|
|
42
|
+
|
|
43
|
+
**Documentation**: https://aioovh.businessagile.eu
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from whenever import Date
|
|
47
|
+
|
|
48
|
+
from aioovh import OVH
|
|
49
|
+
|
|
50
|
+
async with OVH() as ovh: # OVH_* from the environment
|
|
51
|
+
async for bill in ovh.billing.bills.filter(date_from=Date(2026, 10, 1)):
|
|
52
|
+
print(bill.bill_id, bill.date, bill.price_without_tax.value)
|
|
53
|
+
async for line in bill.details:
|
|
54
|
+
print(" ", line.description, line.total_price.value)
|
|
55
|
+
|
|
56
|
+
await ovh.compute.vps("vps-1234.vps.ovh.net").reboot()
|
|
57
|
+
account = await ovh.account
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Why it exists
|
|
61
|
+
|
|
62
|
+
The official [`ovh`](https://pypi.org/project/ovh/) package is synchronous and
|
|
63
|
+
untyped: `client.get("/me/bill/FR123")` blocks the event loop and returns a
|
|
64
|
+
`dict`, and the paths are the API's own (`/me`, `/cloud/project/{id}/...`).
|
|
65
|
+
|
|
66
|
+
`aioovh` is asynchronous down to the socket and organised around what you
|
|
67
|
+
manipulate:
|
|
68
|
+
|
|
69
|
+
- **business areas** shared with its sibling
|
|
70
|
+
[aioscaleway](https://pypi.org/project/aioscaleway/): `compute`, `storage`,
|
|
71
|
+
`network`, `billing`, `domains`, `email`, `telecom`...; `/me` disappears,
|
|
72
|
+
its content goes where it belongs (`ovh.billing.bills`, `ovh.iam.ssh_keys`);
|
|
73
|
+
- **collections** you iterate with `async for` and narrow with `filter()`; the
|
|
74
|
+
1.0 lists of identifiers are loaded for you, a few objects at a time, and the
|
|
75
|
+
v2 cursor pages are followed;
|
|
76
|
+
- **references** that act without a request to read them first, and that
|
|
77
|
+
`await` loads; **objects** that are references too, with typed fields;
|
|
78
|
+
- **no API version in any name**;
|
|
79
|
+
- the `$1$` request signature on the exact URL and body sent, with the clock
|
|
80
|
+
offset read once from `/auth/time`, or an OAuth2 bearer token.
|
|
81
|
+
|
|
82
|
+
Everything is generated from the schemas the API serves, committed in
|
|
83
|
+
[`specs/`](specs/): 88 APIs and about 7,300 operations. Every operation is
|
|
84
|
+
reachable, through the objects or through `ovh.raw`, and
|
|
85
|
+
[`docs/coverage.md`](docs/coverage.md) says where.
|
|
86
|
+
|
|
87
|
+
## Installation
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
uv add aioovh
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Python 3.12 or later.
|
|
94
|
+
|
|
95
|
+
## Usage
|
|
96
|
+
|
|
97
|
+
### Client
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
ovh = OVH(
|
|
101
|
+
endpoint="ovh-eu",
|
|
102
|
+
application_key="...",
|
|
103
|
+
application_secret="...",
|
|
104
|
+
consumer_key="...",
|
|
105
|
+
default_project="...", # Public Cloud project used when none is given
|
|
106
|
+
)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Every value left out is read from the variables of the official package
|
|
110
|
+
(`OVH_ENDPOINT`, `OVH_APPLICATION_KEY`, `OVH_APPLICATION_SECRET`,
|
|
111
|
+
`OVH_CONSUMER_KEY`, `OVH_CLIENT_ID`, `OVH_CLIENT_SECRET`), plus
|
|
112
|
+
`OVH_DEFAULT_PROJECT` and `OVH_MAX_CONCURRENCY` (objects loaded at once when a
|
|
113
|
+
list only returns identifiers, 8 by default).
|
|
114
|
+
|
|
115
|
+
### Collections, references, objects
|
|
116
|
+
|
|
117
|
+
| You write | You get | Requests |
|
|
118
|
+
| --- | --- | --- |
|
|
119
|
+
| `ovh.billing.bills` | a collection | none |
|
|
120
|
+
| `ovh.billing.bills.filter(date_from=Date(2026, 10, 1))` | the same collection, narrowed | none |
|
|
121
|
+
| `async for b in ovh.billing.bills` | loaded objects | the list, then one per object |
|
|
122
|
+
| `ovh.billing.bills(bill_id)` | a reference | none |
|
|
123
|
+
| `await ovh.billing.bills(bill_id)` | a loaded object | one |
|
|
124
|
+
| `await ovh.compute.vps(name).reboot()` | the action's result | one |
|
|
125
|
+
| `[i async for i in ovh.billing.bills.ids()]` | identifiers only | one |
|
|
126
|
+
|
|
127
|
+
A loaded object is also a reference. It cannot load itself when printed or
|
|
128
|
+
read, because those are synchronous; mypy flags a field read on a bare
|
|
129
|
+
reference.
|
|
130
|
+
|
|
131
|
+
Public Cloud resources take their project as a keyword, defaulting to
|
|
132
|
+
`default_project`:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
async for instance in ovh.compute.instances.filter(project=project_id):
|
|
136
|
+
...
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Names
|
|
140
|
+
|
|
141
|
+
Collections are named after what they hold (`bills`, `dedicated_servers`,
|
|
142
|
+
`ssh_keys`); under them, the OVHcloud segments in snake case
|
|
143
|
+
(`bill.details`, `server.service_infos()`). Actions are methods named after
|
|
144
|
+
their path (`reboot()`, `change_contact()`), updates `update_...`. The full
|
|
145
|
+
tree is in [docs/objects.md](docs/objects.md).
|
|
146
|
+
|
|
147
|
+
### Types and errors
|
|
148
|
+
|
|
149
|
+
Arguments and fields are typed; enumerations and nested models of an area live
|
|
150
|
+
in its `types` module. Dates are `whenever.Instant` and `whenever.Date`.
|
|
151
|
+
Enumerations are open.
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from aioovh import NotGrantedCallError, OVHAPIError, ResourceNotFoundError
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
await ovh.billing.bills("FR123")
|
|
158
|
+
except NotGrantedCallError:
|
|
159
|
+
... # the consumer key lacks this route
|
|
160
|
+
except OVHAPIError as error:
|
|
161
|
+
print(error.status_code, error.error_code, error.message, error.query_id)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### The raw layer
|
|
165
|
+
|
|
166
|
+
`ovh.raw` keeps the official package's untyped calls:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
await ovh.raw.get("/me/bill", **{"date.from": "2026-10-01"})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Development
|
|
173
|
+
|
|
174
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
175
|
+
[docs/architecture.md](docs/architecture.md).
|
|
176
|
+
|
|
177
|
+
The source lives on [GitLab](https://gitlab.com/businessagile/libraries/aioovh),
|
|
178
|
+
mirrored to [GitHub](https://github.com/BiBzz/aioovh), where
|
|
179
|
+
[issues](https://github.com/BiBzz/aioovh/issues) and pull requests are welcome.
|
|
180
|
+
|
|
181
|
+
## Author
|
|
182
|
+
|
|
183
|
+
Created by [Alexandre BERREBI](https://businessagile.eu/en/about), maintained by
|
|
184
|
+
[Business Agile](https://businessagile.eu).
|
|
185
|
+
|
|
186
|
+
## License
|
|
187
|
+
|
|
188
|
+
MIT, see [LICENSE](LICENSE).
|
aioovh-0.1.0/README.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# aioovh
|
|
2
|
+
|
|
3
|
+
Asynchronous, fully typed Python client for every
|
|
4
|
+
[OVHcloud API](https://eu.api.ovh.com/console/), versions 1.0 and v2, built on
|
|
5
|
+
[httpx2](https://pypi.org/project/httpx2/), [pydantic](https://docs.pydantic.dev/)
|
|
6
|
+
and [whenever](https://whenever.readthedocs.io/).
|
|
7
|
+
|
|
8
|
+
**Documentation**: https://aioovh.businessagile.eu
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from whenever import Date
|
|
12
|
+
|
|
13
|
+
from aioovh import OVH
|
|
14
|
+
|
|
15
|
+
async with OVH() as ovh: # OVH_* from the environment
|
|
16
|
+
async for bill in ovh.billing.bills.filter(date_from=Date(2026, 10, 1)):
|
|
17
|
+
print(bill.bill_id, bill.date, bill.price_without_tax.value)
|
|
18
|
+
async for line in bill.details:
|
|
19
|
+
print(" ", line.description, line.total_price.value)
|
|
20
|
+
|
|
21
|
+
await ovh.compute.vps("vps-1234.vps.ovh.net").reboot()
|
|
22
|
+
account = await ovh.account
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Why it exists
|
|
26
|
+
|
|
27
|
+
The official [`ovh`](https://pypi.org/project/ovh/) package is synchronous and
|
|
28
|
+
untyped: `client.get("/me/bill/FR123")` blocks the event loop and returns a
|
|
29
|
+
`dict`, and the paths are the API's own (`/me`, `/cloud/project/{id}/...`).
|
|
30
|
+
|
|
31
|
+
`aioovh` is asynchronous down to the socket and organised around what you
|
|
32
|
+
manipulate:
|
|
33
|
+
|
|
34
|
+
- **business areas** shared with its sibling
|
|
35
|
+
[aioscaleway](https://pypi.org/project/aioscaleway/): `compute`, `storage`,
|
|
36
|
+
`network`, `billing`, `domains`, `email`, `telecom`...; `/me` disappears,
|
|
37
|
+
its content goes where it belongs (`ovh.billing.bills`, `ovh.iam.ssh_keys`);
|
|
38
|
+
- **collections** you iterate with `async for` and narrow with `filter()`; the
|
|
39
|
+
1.0 lists of identifiers are loaded for you, a few objects at a time, and the
|
|
40
|
+
v2 cursor pages are followed;
|
|
41
|
+
- **references** that act without a request to read them first, and that
|
|
42
|
+
`await` loads; **objects** that are references too, with typed fields;
|
|
43
|
+
- **no API version in any name**;
|
|
44
|
+
- the `$1$` request signature on the exact URL and body sent, with the clock
|
|
45
|
+
offset read once from `/auth/time`, or an OAuth2 bearer token.
|
|
46
|
+
|
|
47
|
+
Everything is generated from the schemas the API serves, committed in
|
|
48
|
+
[`specs/`](specs/): 88 APIs and about 7,300 operations. Every operation is
|
|
49
|
+
reachable, through the objects or through `ovh.raw`, and
|
|
50
|
+
[`docs/coverage.md`](docs/coverage.md) says where.
|
|
51
|
+
|
|
52
|
+
## Installation
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
uv add aioovh
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Python 3.12 or later.
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
### Client
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
ovh = OVH(
|
|
66
|
+
endpoint="ovh-eu",
|
|
67
|
+
application_key="...",
|
|
68
|
+
application_secret="...",
|
|
69
|
+
consumer_key="...",
|
|
70
|
+
default_project="...", # Public Cloud project used when none is given
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Every value left out is read from the variables of the official package
|
|
75
|
+
(`OVH_ENDPOINT`, `OVH_APPLICATION_KEY`, `OVH_APPLICATION_SECRET`,
|
|
76
|
+
`OVH_CONSUMER_KEY`, `OVH_CLIENT_ID`, `OVH_CLIENT_SECRET`), plus
|
|
77
|
+
`OVH_DEFAULT_PROJECT` and `OVH_MAX_CONCURRENCY` (objects loaded at once when a
|
|
78
|
+
list only returns identifiers, 8 by default).
|
|
79
|
+
|
|
80
|
+
### Collections, references, objects
|
|
81
|
+
|
|
82
|
+
| You write | You get | Requests |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| `ovh.billing.bills` | a collection | none |
|
|
85
|
+
| `ovh.billing.bills.filter(date_from=Date(2026, 10, 1))` | the same collection, narrowed | none |
|
|
86
|
+
| `async for b in ovh.billing.bills` | loaded objects | the list, then one per object |
|
|
87
|
+
| `ovh.billing.bills(bill_id)` | a reference | none |
|
|
88
|
+
| `await ovh.billing.bills(bill_id)` | a loaded object | one |
|
|
89
|
+
| `await ovh.compute.vps(name).reboot()` | the action's result | one |
|
|
90
|
+
| `[i async for i in ovh.billing.bills.ids()]` | identifiers only | one |
|
|
91
|
+
|
|
92
|
+
A loaded object is also a reference. It cannot load itself when printed or
|
|
93
|
+
read, because those are synchronous; mypy flags a field read on a bare
|
|
94
|
+
reference.
|
|
95
|
+
|
|
96
|
+
Public Cloud resources take their project as a keyword, defaulting to
|
|
97
|
+
`default_project`:
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
async for instance in ovh.compute.instances.filter(project=project_id):
|
|
101
|
+
...
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Names
|
|
105
|
+
|
|
106
|
+
Collections are named after what they hold (`bills`, `dedicated_servers`,
|
|
107
|
+
`ssh_keys`); under them, the OVHcloud segments in snake case
|
|
108
|
+
(`bill.details`, `server.service_infos()`). Actions are methods named after
|
|
109
|
+
their path (`reboot()`, `change_contact()`), updates `update_...`. The full
|
|
110
|
+
tree is in [docs/objects.md](docs/objects.md).
|
|
111
|
+
|
|
112
|
+
### Types and errors
|
|
113
|
+
|
|
114
|
+
Arguments and fields are typed; enumerations and nested models of an area live
|
|
115
|
+
in its `types` module. Dates are `whenever.Instant` and `whenever.Date`.
|
|
116
|
+
Enumerations are open.
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from aioovh import NotGrantedCallError, OVHAPIError, ResourceNotFoundError
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
await ovh.billing.bills("FR123")
|
|
123
|
+
except NotGrantedCallError:
|
|
124
|
+
... # the consumer key lacks this route
|
|
125
|
+
except OVHAPIError as error:
|
|
126
|
+
print(error.status_code, error.error_code, error.message, error.query_id)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### The raw layer
|
|
130
|
+
|
|
131
|
+
`ovh.raw` keeps the official package's untyped calls:
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
await ovh.raw.get("/me/bill", **{"date.from": "2026-10-01"})
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Development
|
|
138
|
+
|
|
139
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
140
|
+
[docs/architecture.md](docs/architecture.md).
|
|
141
|
+
|
|
142
|
+
The source lives on [GitLab](https://gitlab.com/businessagile/libraries/aioovh),
|
|
143
|
+
mirrored to [GitHub](https://github.com/BiBzz/aioovh), where
|
|
144
|
+
[issues](https://github.com/BiBzz/aioovh/issues) and pull requests are welcome.
|
|
145
|
+
|
|
146
|
+
## Author
|
|
147
|
+
|
|
148
|
+
Created by [Alexandre BERREBI](https://businessagile.eu/en/about), maintained by
|
|
149
|
+
[Business Agile](https://businessagile.eu).
|
|
150
|
+
|
|
151
|
+
## License
|
|
152
|
+
|
|
153
|
+
MIT, see [LICENSE](LICENSE).
|