From 5880120a84be0b19df5537082c6fd0fddff8bdf7 Mon Sep 17 00:00:00 2001 From: git_admin Date: Sun, 3 May 2026 18:54:32 +0000 Subject: [PATCH] Tower: upload cetmix_tower_ovh 18.0.1.0.1 (was 18.0.1.0.1, via marketplace) --- addons/cetmix_tower_ovh/README.rst | 263 ++++++++ addons/cetmix_tower_ovh/__init__.py | 1 + addons/cetmix_tower_ovh/__manifest__.py | 24 + addons/cetmix_tower_ovh/demo/demo_data.xml | 179 +++++ .../i18n/cetmix_tower_ovh.pot | 30 + addons/cetmix_tower_ovh/i18n/it.po | 54 ++ addons/cetmix_tower_ovh/models/__init__.py | 1 + .../models/cx_tower_command.py | 39 ++ addons/cetmix_tower_ovh/pyproject.toml | 3 + addons/cetmix_tower_ovh/readme/CONFIGURE.md | 44 ++ addons/cetmix_tower_ovh/readme/CONTEXT.md | 1 + addons/cetmix_tower_ovh/readme/DESCRIPTION.md | 1 + addons/cetmix_tower_ovh/readme/HISTORY.md | 0 addons/cetmix_tower_ovh/readme/USAGE.md | 86 +++ .../readme/newsfragments/.gitkeep | 0 .../static/description/banner.png | Bin 0 -> 93816 bytes .../static/description/icon.png | Bin 0 -> 22128 bytes .../static/description/index.html | 635 ++++++++++++++++++ addons/cetmix_tower_ovh/tests/__init__.py | 1 + .../tests/test_ovh_integration.py | 63 ++ 20 files changed, 1425 insertions(+) create mode 100644 addons/cetmix_tower_ovh/README.rst create mode 100644 addons/cetmix_tower_ovh/__init__.py create mode 100644 addons/cetmix_tower_ovh/__manifest__.py create mode 100644 addons/cetmix_tower_ovh/demo/demo_data.xml create mode 100644 addons/cetmix_tower_ovh/i18n/cetmix_tower_ovh.pot create mode 100644 addons/cetmix_tower_ovh/i18n/it.po create mode 100644 addons/cetmix_tower_ovh/models/__init__.py create mode 100644 addons/cetmix_tower_ovh/models/cx_tower_command.py create mode 100644 addons/cetmix_tower_ovh/pyproject.toml create mode 100644 addons/cetmix_tower_ovh/readme/CONFIGURE.md create mode 100644 addons/cetmix_tower_ovh/readme/CONTEXT.md create mode 100644 addons/cetmix_tower_ovh/readme/DESCRIPTION.md create mode 100644 addons/cetmix_tower_ovh/readme/HISTORY.md create mode 100644 addons/cetmix_tower_ovh/readme/USAGE.md create mode 100644 addons/cetmix_tower_ovh/readme/newsfragments/.gitkeep create mode 100644 addons/cetmix_tower_ovh/static/description/banner.png create mode 100644 addons/cetmix_tower_ovh/static/description/icon.png create mode 100644 addons/cetmix_tower_ovh/static/description/index.html create mode 100644 addons/cetmix_tower_ovh/tests/__init__.py create mode 100644 addons/cetmix_tower_ovh/tests/test_ovh_integration.py diff --git a/addons/cetmix_tower_ovh/README.rst b/addons/cetmix_tower_ovh/README.rst new file mode 100644 index 0000000..71f7e15 --- /dev/null +++ b/addons/cetmix_tower_ovh/README.rst @@ -0,0 +1,263 @@ +================ +Cetmix Tower OVH +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:857636ba9899c2980b8ee24c3cf12b3854a7a31704c39395c7f81648d1b3ca57 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github + :target: https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower_ovh + :alt: cetmix/cetmix-tower + +|badge1| |badge2| |badge3| + +This module integrates the OVH Python client, enabling seamless +interaction with OVH cloud services within the Cetmix Tower. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +Although OVH allows API calls without using an SDK, we found that +integrating the OVH SDK into Cetmix Tower makes provisioning, +configuring, and maintaining OVH instances more convenient for the end +user. However, not all Cetmix Tower users require this functionality, so +to avoid overloading the system, we have included it in a separate +module. + +Configuration +============= + +Setting up OVH Access +===================== + +Create OVH API Credentials +-------------------------- + +To use the OVH integration with Cetmix Tower, you need to create OVH API +credentials: + +- Follow the `official OVH + documentation `__ + (https://docs.ovh.com/gb/en/api/first-steps/) for creating an + application and generating API keys +- It's recommended to create a dedicated application with appropriate + permissions for Cetmix Tower +- Store your Application Key, Application Secret, and Consumer Key + securely—you'll need them in the next step + +Configure OVH Secrets in Cetmix Tower +------------------------------------- + +Create three secrets in Cetmix Tower to store your OVH credentials: + +- Navigate to ``Cetmix Tower > Settings > Keys and Secrets`` +- Create a new Secret with: + + - Name: ``OVH Application Key`` + - Reference: ``ovh_application_key`` + - Key Type: ``Secret`` + +- Enter your OVH Application Key in the Secret Value tab +- Similarly, create another Secret with: + + - Name: ``OVH Application Secret`` + - Reference: ``ovh_application_secret`` + - Key Type: ``Secret`` + +- Enter your OVH Application Secret in the Secret Value tab +- Finally, create a Secret with: + + - Name: ``OVH Consumer Key`` + - Reference: ``ovh_consumer_key`` + - Key Type: ``Secret`` + +- Enter your OVH Consumer Key in the Secret Value tab + +.. + + Note: These secrets will be accessible as + ``#!cxtower.secret.ovh_application_key!#``, + ``#!cxtower.secret.ovh_application_secret!#``, and + ``#!cxtower.secret.ovh_consumer_key!#`` in your commands. + +Configure OVH Endpoint +---------------------- + +Create a variable to define your OVH API endpoint (region): + +- Navigate to ``Cetmix Tower > Settings > Variables`` +- Create a new Variable with: + + - Name: ``OVH Endpoint`` + - Reference: ``ovh_endpoint`` + - Type: ``String`` + +- Set your OVH endpoint (e.g., ``ovh-eu``, ``ovh-ca``, ``ovh-us``) as + the value + +Usage +===== + +Cetmix Tower OVHcloud Command Usage +=================================== + + **Disclaimer**: The following example demonstrates one of many + possible commands you can create and run with this module. The + ``ovh`` Python library provides access to the full range of OVHcloud + APIs – this is just a starting point to help you get familiar with + the integration. + +Example of Cetmix Tower Python Command to Create DNS Records +------------------------------------------------------------ + +- **Navigate to Command Creation** + + - Go to ``Cetmix Tower > Commands > Commands`` + - Click the ``Create`` button + +- **Configure Command Settings** + + - Set a descriptive ``Name`` (e.g., "List OVHcloud Instances") + - Leave ``Reference`` blank to generate automatically (or set a custom + reference) + - Select ``Action``: "Execute Python code" + - Set ``Access Level``: Choose appropriate level (e.g., "Manager") + - Optional: Set ``Default Path`` if needed + - Optional: Add ``Tags`` (e.g., "ovh", "cloud", "instance") for better + organization + +- **Add Required Variables** + + - In the ``Variables`` tab, add the previously configured variable: + + - ``ovh_endpoint`` (e.g., "ovh-eu") + +- **Add Required Secrets** + + - In the ``Secrets`` field, add the previously configured secrets: + + - ``ovh_application_key`` + - ``ovh_application_secret`` + - ``ovh_consumer_key`` + +- **Write Python Code** + + - Go to the ``Code`` tab + - Enter the following Python code: + + .. code:: python + + # List OVHcloud instances using ovh API + result = {"exit_code": 0, "message": None} + + client = ovh.Client( + endpoint={{ ovh_endpoint }}, + application_key=#!cxtower.secret.ovh_application_key!#, + application_secret=#!cxtower.secret.ovh_application_secret!#, + consumer_key=#!cxtower.secret.ovh_consumer_key!# + ) + + # Required variables: + # - domain_name: The main domain (e.g., "example.com") + # - subdomain: The subdomain to create (e.g., "test") + + try: + # Create a new subdomain by adding a DNS entry (A record as example) + ip_address = "1.2.3.4" # Replace with the desired IP address + response = client.post( + "/domain/zone/" + domain_name + "/record", + fieldType="A", + subDomain=subdomain, + target=ip_address, + ttl=3600 + ) + # Refresh the zone to apply changes + client.post("/domain/zone/" + domain_name + "/refresh") + result["message"] = "Subdomain '" + subdomain + "." + domain_name + "' created and DNS zone refreshed." + except Exception as e: + result["exit_code"] = 1 + result["message"] = "Error: " + str(e) + +- **Save the Command** + + - Click the ``Save`` button to create the command + +Running the OVHcloud Instance Command +------------------------------------- + +- **Navigate to Server** + + - Go to ``Cetmix Tower > Servers > Servers`` + - Open the server where you want to run the command + +- **Execute Command from Server** + + - Click the ``Command`` button at the top of the server form + - In the popup dialog: + + - Select your OVHcloud instance command from the dropdown + - Verify the variable values (if any need adjustment) + - Click ``Run`` to execute + +- **View Command Results** + + - After execution, the command log will display showing: + + - The command executed + - Execution status + - Output message containing OVHcloud instance details if successful + +Changelog +========= + + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Cetmix +* Giovanni Serra + +Maintainers +----------- + +.. |maintainer-GSLabIt| image:: https://github.com/GSLabIt.png?size=40px + :target: https://github.com/GSLabIt + :alt: GSLabIt + +Current maintainer: + +|maintainer-GSLabIt| + +This module is part of the `cetmix/cetmix-tower `_ project on GitHub. + +You are welcome to contribute. diff --git a/addons/cetmix_tower_ovh/__init__.py b/addons/cetmix_tower_ovh/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/addons/cetmix_tower_ovh/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons/cetmix_tower_ovh/__manifest__.py b/addons/cetmix_tower_ovh/__manifest__.py new file mode 100644 index 0000000..fe1a3ec --- /dev/null +++ b/addons/cetmix_tower_ovh/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2024 Cetmix OÜ +# Copyright 2025 Giovanni Serra +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Cetmix Tower OVH", + "summary": """Cetmix Tower OVH API integration""", + "version": "18.0.1.0.1", + "category": "Productivity", + "license": "AGPL-3", + "author": "Cetmix, Giovanni Serra", + "maintainers": ["GSLabIt"], + "website": "https://tower.cetmix.com", + "images": ["static/description/banner.png"], + "application": False, + "installable": True, + "demo": [ + "demo/demo_data.xml", + ], + "external_dependencies": {"python": ["ovh"]}, + "depends": [ + "cetmix_tower_server", + ], +} diff --git a/addons/cetmix_tower_ovh/demo/demo_data.xml b/addons/cetmix_tower_ovh/demo/demo_data.xml new file mode 100644 index 0000000..9aea62f --- /dev/null +++ b/addons/cetmix_tower_ovh/demo/demo_data.xml @@ -0,0 +1,179 @@ + + + + + OVH Application Key + ovh_application_key + s + + + + + OVH Application Secret + ovh_application_secret + s + + + + + OVH Consumer Key + ovh_consumer_key + s + + + + + + + OVH Endpoint + ovh_endpoint + o + + + + OVH Zone Name + ovh_zone_name + + + + + + + your_zone.name + + + + + ovh-eu + ovh-eu + ovh-eu + 10 + + + + ovh-us + ovh-us + ovh-us + 20 + + + + ovh-ca + ovh-ca + ovh-ca + 30 + + + + soyoustart-eu + soyoustart-eu + soyoustart-eu + 40 + + + + soyoustart-ca + soyoustart-ca + soyoustart-ca + 50 + + + + kimsufi-eu + kimsufi-eu + kimsufi-eu + 60 + + + + kimsufi-ca + kimsufi-ca + kimsufi-ca + 70 + + + + + + Register OVH DNS Record + python_code + +# ---------------- +# Tower properties +# ---------------- +cetmix_tower = env["cetmix.tower"] + +# Ensure the domain in your server URL matches your OVH DNS Zone name! +# Example: If your DNS Zone is "example.com", your URL should be "*.example.com" + +instance_url = {{ tower.server.url }} +ovh_endpoint = env["cx.tower.variable.option"].get_by_reference("option_ovh_endpoint_eu").value_char +ovh_application_key = #!cxtower.secret.ovh_application_key!# +ovh_application_secret = #!cxtower.secret.ovh_application_secret!# +ovh_consumer_key = #!cxtower.secret.ovh_consumer_key!# +ovh_zone_name = {{ ovh_zone_name }} +# ---------------- +# Request settings +# ---------------- + +path = "/domain/zone/"+ovh_zone_name+"/record" + +# Subdomain extraction with tldextract: +sub_domain = tldextract.extract(instance_url).subdomain + +# Send request to Ovh +exit_code = 0 +message = "" + +try: + client = ovh.Client( + endpoint=ovh_endpoint, + application_key=ovh_application_key, + application_secret=ovh_application_secret, + consumer_key=ovh_consumer_key + ) + records = client.get(path, subDomain=sub_domain, fieldType="A") + if not records: + records = client.post( + path, + fieldType="A", + subDomain=sub_domain, + target={{ tower.server.ipv4 }}, + ttl=3600 + ) + client.post("/domain/zone/" + ovh_zone_name + "/refresh") + if records: + exit_code = 0 + message = "subDomain " + sub_domain + " registered" + else: + exit_code = 0 + message = "subDomain " + sub_domain + " already exists" +except Exception as e: + exit_code = 500 + message = str(e) + +result = { + "exit_code": exit_code, + "message": message, +} + + + + + + Register or check DNS A record for current server in OVH DNS zone + + diff --git a/addons/cetmix_tower_ovh/i18n/cetmix_tower_ovh.pot b/addons/cetmix_tower_ovh/i18n/cetmix_tower_ovh.pot new file mode 100644 index 0000000..6ce0ddf --- /dev/null +++ b/addons/cetmix_tower_ovh/i18n/cetmix_tower_ovh.pot @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * cetmix_tower_ovh +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: cetmix_tower_ovh +#: model:ir.model,name:cetmix_tower_ovh.model_cx_tower_command +msgid "Cetmix Tower Command" +msgstr "" + +#. module: cetmix_tower_ovh +#. odoo-python +#: code:addons/cetmix_tower_ovh/models/cx_tower_command.py:0 +msgid "" +"Python 'ovh' library for OVH services. Available methods: " +"'Client'
Supports OVH services
Please check the OVH Documentation for detailed information about the " +"services and methods." +msgstr "" diff --git a/addons/cetmix_tower_ovh/i18n/it.po b/addons/cetmix_tower_ovh/i18n/it.po new file mode 100644 index 0000000..f93bd29 --- /dev/null +++ b/addons/cetmix_tower_ovh/i18n/it.po @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * cetmix_tower_ovh +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3\n" + +#. module: cetmix_tower_ovh +#: model:ir.model,name:cetmix_tower_ovh.model_cx_tower_command +msgid "Cetmix Tower Command" +msgstr "Comando Cetmix Tower" + +#. module: cetmix_tower_ovh +#. odoo-python +#: code:addons/cetmix_tower_ovh/models/cx_tower_command.py:0 +#, python-format +msgid "Python 'ovh' library for OVH services. Available methods: 'Client'
Supports OVH services
Please check the OVH Documentation for detailed information about the services and methods." +msgstr "Libreria Python 'ovh' per servizi OVH. Metodi disponibili: 'Client'
Supporta i servizi OVH
Verificare la documentazione OVH per informazioni dettagliate sui servizi e i metodi." + +#~ msgid "Display Name" +#~ msgstr "Nome visualizzato" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "" +#~ "# - ovh: Python 'ovh' library for OVH services. Available methods: " +#~ "'Client'\n" +#~ "# Supports OVH services\n" +#~ "# - tldextract: Python 'tldextract' library. Available methods: " +#~ "'extract'\n" +#~ "# Supports domain extraction" +#~ msgstr "" +#~ "# - ovh: libreria Python 'ovh' per i servizi OVH. Metodi disponibili: " +#~ "'Client'\n" +#~ "# Supporta servizi OVH\n" +#~ "# - tldextract: libreria Python 'tldextract'. Metodi disponibili: " +#~ "'extract'\n" +#~ "# Supporta estrazione dominio" diff --git a/addons/cetmix_tower_ovh/models/__init__.py b/addons/cetmix_tower_ovh/models/__init__.py new file mode 100644 index 0000000..e868e3a --- /dev/null +++ b/addons/cetmix_tower_ovh/models/__init__.py @@ -0,0 +1 @@ +from . import cx_tower_command # noqa: F401 diff --git a/addons/cetmix_tower_ovh/models/cx_tower_command.py b/addons/cetmix_tower_ovh/models/cx_tower_command.py new file mode 100644 index 0000000..7d7b5de --- /dev/null +++ b/addons/cetmix_tower_ovh/models/cx_tower_command.py @@ -0,0 +1,39 @@ +# Copyright 2024 Cetmix OÜ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, models +from odoo.tools.safe_eval import wrap_module + +# Wrap ovh safely +ovh = wrap_module(__import__("ovh"), ["Client"]) + + +class CxTowerCommand(models.Model): + """Extends cx.tower.command to add OVH functionality.""" + + _inherit = "cx.tower.command" + + def _custom_python_libraries(self): + """ + Add the ovh library to the available libraries. + """ + python_libraries = super()._custom_python_libraries() + python_libraries.update( + { + "cetmix_tower_ovh": { + "ovh": { + "import": ovh, + "help": _( + "Python 'ovh' library for OVH services. " + "Available methods: 'Client'
" + "Supports OVH services
" + "Please check the OVH Documentation for detailed " + "information about the services and methods." + ), + } + } + } + ) + return python_libraries diff --git a/addons/cetmix_tower_ovh/pyproject.toml b/addons/cetmix_tower_ovh/pyproject.toml new file mode 100644 index 0000000..4231d0c --- /dev/null +++ b/addons/cetmix_tower_ovh/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/addons/cetmix_tower_ovh/readme/CONFIGURE.md b/addons/cetmix_tower_ovh/readme/CONFIGURE.md new file mode 100644 index 0000000..575663c --- /dev/null +++ b/addons/cetmix_tower_ovh/readme/CONFIGURE.md @@ -0,0 +1,44 @@ + +# Setting up OVH Access + +## Create OVH API Credentials + +To use the OVH integration with Cetmix Tower, you need to create OVH API credentials: + +- Follow the [official OVH documentation](https://docs.ovh.com/gb/en/api/first-steps/) (https://docs.ovh.com/gb/en/api/first-steps/) for creating an application and generating API keys +- It's recommended to create a dedicated application with appropriate permissions for Cetmix Tower +- Store your Application Key, Application Secret, and Consumer Key securely—you'll need them in the next step + +## Configure OVH Secrets in Cetmix Tower + +Create three secrets in Cetmix Tower to store your OVH credentials: + +- Navigate to `Cetmix Tower > Settings > Keys and Secrets` +- Create a new Secret with: + - Name: `OVH Application Key` + - Reference: `ovh_application_key` + - Key Type: `Secret` +- Enter your OVH Application Key in the Secret Value tab +- Similarly, create another Secret with: + - Name: `OVH Application Secret` + - Reference: `ovh_application_secret` + - Key Type: `Secret` +- Enter your OVH Application Secret in the Secret Value tab +- Finally, create a Secret with: + - Name: `OVH Consumer Key` + - Reference: `ovh_consumer_key` + - Key Type: `Secret` +- Enter your OVH Consumer Key in the Secret Value tab + +> Note: These secrets will be accessible as `#!cxtower.secret.ovh_application_key!#`, `#!cxtower.secret.ovh_application_secret!#`, and `#!cxtower.secret.ovh_consumer_key!#` in your commands. + +## Configure OVH Endpoint + +Create a variable to define your OVH API endpoint (region): + +- Navigate to `Cetmix Tower > Settings > Variables` +- Create a new Variable with: + - Name: `OVH Endpoint` + - Reference: `ovh_endpoint` + - Type: `String` +- Set your OVH endpoint (e.g., `ovh-eu`, `ovh-ca`, `ovh-us`) as the value diff --git a/addons/cetmix_tower_ovh/readme/CONTEXT.md b/addons/cetmix_tower_ovh/readme/CONTEXT.md new file mode 100644 index 0000000..4ddde14 --- /dev/null +++ b/addons/cetmix_tower_ovh/readme/CONTEXT.md @@ -0,0 +1 @@ +Although OVH allows API calls without using an SDK, we found that integrating the OVH SDK into Cetmix Tower makes provisioning, configuring, and maintaining OVH instances more convenient for the end user. However, not all Cetmix Tower users require this functionality, so to avoid overloading the system, we have included it in a separate module. diff --git a/addons/cetmix_tower_ovh/readme/DESCRIPTION.md b/addons/cetmix_tower_ovh/readme/DESCRIPTION.md new file mode 100644 index 0000000..e0643cb --- /dev/null +++ b/addons/cetmix_tower_ovh/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module integrates the OVH Python client, enabling seamless interaction with OVH cloud services within the Cetmix Tower. diff --git a/addons/cetmix_tower_ovh/readme/HISTORY.md b/addons/cetmix_tower_ovh/readme/HISTORY.md new file mode 100644 index 0000000..e69de29 diff --git a/addons/cetmix_tower_ovh/readme/USAGE.md b/addons/cetmix_tower_ovh/readme/USAGE.md new file mode 100644 index 0000000..e991cc0 --- /dev/null +++ b/addons/cetmix_tower_ovh/readme/USAGE.md @@ -0,0 +1,86 @@ +# Cetmix Tower OVHcloud Command Usage + +> **Disclaimer**: The following example demonstrates one of many possible commands you can create and run with this module. The `ovh` Python library provides access to the full range of OVHcloud APIs – this is just a starting point to help you get familiar with the integration. + +## Example of Cetmix Tower Python Command to Create DNS Records + +* **Navigate to Command Creation** + * Go to `Cetmix Tower > Commands > Commands` + * Click the `Create` button + +* **Configure Command Settings** + * Set a descriptive `Name` (e.g., "List OVHcloud Instances") + * Leave `Reference` blank to generate automatically (or set a custom reference) + * Select `Action`: "Execute Python code" + * Set `Access Level`: Choose appropriate level (e.g., "Manager") + * Optional: Set `Default Path` if needed + * Optional: Add `Tags` (e.g., "ovh", "cloud", "instance") for better organization + +* **Add Required Variables** + * In the `Variables` tab, add the previously configured variable: + * `ovh_endpoint` (e.g., "ovh-eu") + +* **Add Required Secrets** + * In the `Secrets` field, add the previously configured secrets: + * `ovh_application_key` + * `ovh_application_secret` + * `ovh_consumer_key` + +* **Write Python Code** + * Go to the `Code` tab + * Enter the following Python code: + + ```python + # List OVHcloud instances using ovh API + result = {"exit_code": 0, "message": None} + + client = ovh.Client( + endpoint={{ ovh_endpoint }}, + application_key=#!cxtower.secret.ovh_application_key!#, + application_secret=#!cxtower.secret.ovh_application_secret!#, + consumer_key=#!cxtower.secret.ovh_consumer_key!# + ) + + # Required variables: + # - domain_name: The main domain (e.g., "example.com") + # - subdomain: The subdomain to create (e.g., "test") + + try: + # Create a new subdomain by adding a DNS entry (A record as example) + ip_address = "1.2.3.4" # Replace with the desired IP address + response = client.post( + "/domain/zone/" + domain_name + "/record", + fieldType="A", + subDomain=subdomain, + target=ip_address, + ttl=3600 + ) + # Refresh the zone to apply changes + client.post("/domain/zone/" + domain_name + "/refresh") + result["message"] = "Subdomain '" + subdomain + "." + domain_name + "' created and DNS zone refreshed." + except Exception as e: + result["exit_code"] = 1 + result["message"] = "Error: " + str(e) + ``` + +* **Save the Command** + * Click the `Save` button to create the command + +## Running the OVHcloud Instance Command + +* **Navigate to Server** + * Go to `Cetmix Tower > Servers > Servers` + * Open the server where you want to run the command + +* **Execute Command from Server** + * Click the `Command` button at the top of the server form + * In the popup dialog: + * Select your OVHcloud instance command from the dropdown + * Verify the variable values (if any need adjustment) + * Click `Run` to execute + +* **View Command Results** + * After execution, the command log will display showing: + * The command executed + * Execution status + * Output message containing OVHcloud instance details if successful diff --git a/addons/cetmix_tower_ovh/readme/newsfragments/.gitkeep b/addons/cetmix_tower_ovh/readme/newsfragments/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/addons/cetmix_tower_ovh/static/description/banner.png b/addons/cetmix_tower_ovh/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcd7b8157c19163acf8ada88b724fd8f8c4e5fe GIT binary patch literal 93816 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� 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 F{{#JqH_ZS5 literal 0 HcmV?d00001 diff --git a/addons/cetmix_tower_ovh/static/description/index.html b/addons/cetmix_tower_ovh/static/description/index.html new file mode 100644 index 0000000..2499bfd --- /dev/null +++ b/addons/cetmix_tower_ovh/static/description/index.html @@ -0,0 +1,635 @@ + + + + + +Cetmix Tower OVH + + + + + + diff --git a/addons/cetmix_tower_ovh/tests/__init__.py b/addons/cetmix_tower_ovh/tests/__init__.py new file mode 100644 index 0000000..44a0931 --- /dev/null +++ b/addons/cetmix_tower_ovh/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ovh_integration diff --git a/addons/cetmix_tower_ovh/tests/test_ovh_integration.py b/addons/cetmix_tower_ovh/tests/test_ovh_integration.py new file mode 100644 index 0000000..8d33d4f --- /dev/null +++ b/addons/cetmix_tower_ovh/tests/test_ovh_integration.py @@ -0,0 +1,63 @@ +# Copyright 2024 Cetmix OÜ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import common + + +class TestOvhIntegration(common.TransactionCase): + """Test OVH integration with Cetmix Tower commands.""" + + def setUp(self): + super().setUp() + # Create a test command + self.command = self.env["cx.tower.command"].create( + { + "name": "Test OVH Command", + "action": "python_code", + } + ) + self.eval_context = self.env[ + "cx.tower.command" + ]._get_python_command_eval_context() + + def test_ovh_in_evaluation_context(self): + """Test that ovh is added to the evaluation context.""" + self.assertIn("ovh", self.eval_context) + ovh_obj = self.eval_context["ovh"] + self.assertTrue(hasattr(ovh_obj, "Client")) + + def test_ovh_in_evaluation_context_with_server(self): + """Test that ovh is added to the evaluation context when server is provided.""" + test_server = self.env["cx.tower.server"].create( + { + "name": "Test OVH Server", + "reference": "test_ovh_server", + "ip_v4_address": "localhost", + "ssh_username": "admin", + "ssh_password": "password", + "ssh_auth_mode": "p", + "host_key": "test_key", + } + ) + eval_context = self.env["cx.tower.command"]._get_python_command_eval_context( + server=test_server + ) + + self.assertIn("ovh", eval_context) + ovh_obj = eval_context["ovh"] + self.assertTrue(hasattr(ovh_obj, "Client")) + self.assertEqual(eval_context["server"], test_server) + + def test_ovh_client_instantiation(self): + """Test that ovh.Client can be instantiated from context.""" + ovh_mod = self.eval_context["ovh"] + # Only test instantiation, do not require credentials + try: + client = ovh_mod.Client( + endpoint="ovh-eu", + application_key="a", + application_secret="b", + consumer_key="c", + ) + self.assertIsNotNone(client) + except Exception as e: + self.fail(f"ovh.Client instantiation failed: {e}")
+

Cetmix Tower OVH

+ + +

Beta License: AGPL-3 cetmix/cetmix-tower

+

This module integrates the OVH Python client, enabling seamless +interaction with OVH cloud services within the Cetmix Tower.

+

Table of contents

+ +
+

Use Cases / Context

+

Although OVH allows API calls without using an SDK, we found that +integrating the OVH SDK into Cetmix Tower makes provisioning, +configuring, and maintaining OVH instances more convenient for the end +user. However, not all Cetmix Tower users require this functionality, so +to avoid overloading the system, we have included it in a separate +module.

+
+ +
+

Setting up OVH Access

+
+

Create OVH API Credentials

+

To use the OVH integration with Cetmix Tower, you need to create OVH API +credentials:

+
    +
  • Follow the official OVH +documentation +(https://docs.ovh.com/gb/en/api/first-steps/) for creating an +application and generating API keys
  • +
  • It’s recommended to create a dedicated application with appropriate +permissions for Cetmix Tower
  • +
  • Store your Application Key, Application Secret, and Consumer Key +securely—you’ll need them in the next step
  • +
+
+
+

Configure OVH Secrets in Cetmix Tower

+

Create three secrets in Cetmix Tower to store your OVH credentials:

+
    +
  • Navigate to Cetmix Tower > Settings > Keys and Secrets
  • +
  • Create a new Secret with:
      +
    • Name: OVH Application Key
    • +
    • Reference: ovh_application_key
    • +
    • Key Type: Secret
    • +
    +
  • +
  • Enter your OVH Application Key in the Secret Value tab
  • +
  • Similarly, create another Secret with:
      +
    • Name: OVH Application Secret
    • +
    • Reference: ovh_application_secret
    • +
    • Key Type: Secret
    • +
    +
  • +
  • Enter your OVH Application Secret in the Secret Value tab
  • +
  • Finally, create a Secret with:
      +
    • Name: OVH Consumer Key
    • +
    • Reference: ovh_consumer_key
    • +
    • Key Type: Secret
    • +
    +
  • +
  • Enter your OVH Consumer Key in the Secret Value tab
  • +
+ +
+Note: These secrets will be accessible as +#!cxtower.secret.ovh_application_key!#, +#!cxtower.secret.ovh_application_secret!#, and +#!cxtower.secret.ovh_consumer_key!# in your commands.
+
+
+

Configure OVH Endpoint

+

Create a variable to define your OVH API endpoint (region):

+
    +
  • Navigate to Cetmix Tower > Settings > Variables
  • +
  • Create a new Variable with:
      +
    • Name: OVH Endpoint
    • +
    • Reference: ovh_endpoint
    • +
    • Type: String
    • +
    +
  • +
  • Set your OVH endpoint (e.g., ovh-eu, ovh-ca, ovh-us) as +the value
  • +
+
+
+
+

Usage

+
+
+

Cetmix Tower OVHcloud Command Usage

+
+Disclaimer: The following example demonstrates one of many +possible commands you can create and run with this module. The +ovh Python library provides access to the full range of OVHcloud +APIs – this is just a starting point to help you get familiar with +the integration.
+
+

Example of Cetmix Tower Python Command to Create DNS Records

+
    +
  • Navigate to Command Creation

    +
      +
    • Go to Cetmix Tower > Commands > Commands
    • +
    • Click the Create button
    • +
    +
  • +
  • Configure Command Settings

    +
      +
    • Set a descriptive Name (e.g., “List OVHcloud Instances”)
    • +
    • Leave Reference blank to generate automatically (or set a custom +reference)
    • +
    • Select Action: “Execute Python code”
    • +
    • Set Access Level: Choose appropriate level (e.g., “Manager”)
    • +
    • Optional: Set Default Path if needed
    • +
    • Optional: Add Tags (e.g., “ovh”, “cloud”, “instance”) for better +organization
    • +
    +
  • +
  • Add Required Variables

    +
      +
    • In the Variables tab, add the previously configured variable:
        +
      • ovh_endpoint (e.g., “ovh-eu”)
      • +
      +
    • +
    +
  • +
  • Add Required Secrets

    +
      +
    • In the Secrets field, add the previously configured secrets:
        +
      • ovh_application_key
      • +
      • ovh_application_secret
      • +
      • ovh_consumer_key
      • +
      +
    • +
    +
  • +
  • Write Python Code

    +
      +
    • Go to the Code tab
    • +
    • Enter the following Python code:
    • +
    +
    +# List OVHcloud instances using ovh API
    + result = {"exit_code": 0, "message": None}
    +
    +client = ovh.Client(
    + endpoint={{ ovh_endpoint }},
    + application_key=#!cxtower.secret.ovh_application_key!#,
    + application_secret=#!cxtower.secret.ovh_application_secret!#,
    + consumer_key=#!cxtower.secret.ovh_consumer_key!#
    +)
    +
    +# Required variables:
    +# - domain_name: The main domain (e.g., "example.com")
    +# - subdomain: The subdomain to create (e.g., "test")
    +
    +try:
    +  # Create a new subdomain by adding a DNS entry (A record as example)
    +  ip_address = "1.2.3.4"  # Replace with the desired IP address
    +  response = client.post(
    +     "/domain/zone/" + domain_name + "/record",
    +     fieldType="A",
    +     subDomain=subdomain,
    +     target=ip_address,
    +     ttl=3600
    +  )
    +  # Refresh the zone to apply changes
    +  client.post("/domain/zone/" + domain_name + "/refresh")
    +  result["message"] = "Subdomain '" + subdomain + "." + domain_name + "' created and DNS zone refreshed."
    +except Exception as e:
    +  result["exit_code"] = 1
    +  result["message"] = "Error: " + str(e)
    +
    +
  • +
  • Save the Command

    +
      +
    • Click the Save button to create the command
    • +
    +
  • +
+
+
+

Running the OVHcloud Instance Command

+
    +
  • Navigate to Server
      +
    • Go to Cetmix Tower > Servers > Servers
    • +
    • Open the server where you want to run the command
    • +
    +
  • +
  • Execute Command from Server
      +
    • Click the Command button at the top of the server form
    • +
    • In the popup dialog:
        +
      • Select your OVHcloud instance command from the dropdown
      • +
      • Verify the variable values (if any need adjustment)
      • +
      • Click Run to execute
      • +
      +
    • +
    +
  • +
  • View Command Results
      +
    • After execution, the command log will display showing:
        +
      • The command executed
      • +
      • Execution status
      • +
      • Output message containing OVHcloud instance details if successful
      • +
      +
    • +
    +
  • +
+
+
+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Cetmix
  • +
  • Giovanni Serra
  • +
+
+
+

Maintainers

+

Current maintainer:

+

GSLabIt

+

This module is part of the cetmix/cetmix-tower project on GitHub.

+

You are welcome to contribute.

+
+
+