From 897e6c933972f637cbb7c2d17534263ce586dbe3 Mon Sep 17 00:00:00 2001 From: ThibautOVH Date: Wed, 3 Dec 2025 12:05:13 +0100 Subject: [PATCH 1/3] feat(vcd): create guide how to use api --- .../vcd-how-to-use-api/guide.fr-fr.md | 191 ++++++++++++++++++ .../vcd-how-to-use-api/meta.yaml | 2 + 2 files changed, 193 insertions(+) create mode 100644 pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md create mode 100644 pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/meta.yaml diff --git a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md new file mode 100644 index 00000000000..92a6dcd94de --- /dev/null +++ b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md @@ -0,0 +1,191 @@ +--- +title: "Comment utiliser les API de Public VCF aaS (alias Public VCF as-a-Service)" +excerpt: "Guide d’utilisation des API Public VCF aaS (alias Public VCF as-a-Service)" +updated: 2025-12-03 +--- + +## Objectif + +Ce guide présente les étapes permettant d'appeler l’API et d'exécuter des opérations courantes (listing, actions VM, snapshots, etc.). + +## Prérequis + +Avant d’utiliser l’API, nous vous recommandons de consulter les guides suivants : + +- [Public VCF as-a-Service - Concepts fondamentaux](/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-get-concepts) +- [Public VCF as-a-Service - Concepts réseau](/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd_network_concepts) +- [Création d'une VM sur Public VCF as-a-Service](/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-first-vm-creation) +- [Création de composants réseau via Public VCF as-a-Service](/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd_network_creation) + +## En pratique + +### Récupérer l’URL de l’API + +L’URL des API Public VCF aaS est disponible dans votre espace client **OVHcldoud** +Vous pouvez ensuite la stocker dans des variables pour simplifier les commandes : + +```bash +apiURL="https://cloud.infra01.example.ovhcloud.com/api/" +baseURL="${apiURL::-4}" +``` + +- **apiURL** : Remplacer l'URL par l'URL indiqué dans votre espace client **OVHcldoud**. + +## Autorisation + +Pour appeler l'API, vous devez obtenir un **token de session**, valable pour une durée limitée. + +### Récupérer la version d’API supportée + +Cette commande liste toutes les versions disponibles et indique lesquelles sont dépréciées : + +```bash +curl $apiURL"versions" +``` + +Définition de la version : + +```bash +VER="39.0" +``` + +> **Tip** +> Utilisez toujours la version la plus récente (`deprecated = false`) pour bénéficier des dernières fonctionnalités. + +### Encoder votre utilisateur et mot de passe + +Cette commande encode vos identifiants au format requis par VMware Cloud Director : + +```bash +AUTH=$(echo "@:" | base64 -w 0) +``` + +### Créer un token de session + +La commande suivante ouvre une session et extrait automatiquement le token renvoyé dans les headers HTTP : + +```bash +TOKEN=$(curl -Is -XPOST \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Basic $AUTH" \ + $baseURL"cloudapi/1.0.0/sessions/" \ + | grep "x-vmware-vcloud-access-token" | awk '{print $2}') +``` + +> **Warning** +> Le token n’apparaît **pas** dans le corps de la réponse mais uniquement dans les **headers**. + +## Utilisation de l'API + +### Lister les vApps + +Cette requête renvoie toutes les vApps accessibles dans votre organisation. + +```bash +curl -XGET \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Bearer $TOKEN" \ + $apiURL"vApps/query" +``` + +### Lister les VM + +Cette commande liste les VMs (hors templates) : + +```bash +curl -XGET \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Bearer $TOKEN" \ + $apiURL"vms/query?filter=isVAppTemplate==false" +``` + +--- + +### Démarrer une VM + +Cette commande envoie l’action `powerOn` à la VM cible : + +```bash +curl -XPOST \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Bearer $TOKEN" \ + $apiURL"vApp/vm-0c443b13-1db8-4723-850e-dc3ecd08b2c1/power/action/powerOn" +``` + +> **Note** +> Cette opération renvoie une **tâche**, consultable via l’API des tâches. + +--- + +### Créer un snapshot + +Cette commande crée un snapshot de la VM sélectionnée : + +```bash +curl -XPOST \ + -H "Accept: application/*;version=$VER" \ + -H 'Content-Type: application/vnd.vmware.vcloud.createSnapshotParams+json' \ + -H "Authorization: Bearer $TOKEN" \ + $apiURL"vApp/vm-0c443b13-1db8-4723-850e-dc3ecd08b2c1/action/createSnapshot" \ + -d '{ + "name": "MonSnapshot", + "memory": false, + "quiesce": true + }' +``` + +> **Warning** +> Le quiescing nécessite des VMware Tools fonctionnels. En cas d’erreur, essayez `"quiesce": false`. + +--- + +### Consulter une tâche + +Cette commande interroge le statut d'une tâche via son identifiant : + +```bash +curl -XGET \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Bearer $TOKEN" \ + $apiURL"task/156c9ea2-1ff8-45be-a920-612195eddac7" +``` + +--- + +### Supprimer la session + +Il est recommandé de supprimer votre session une fois les opérations terminées : + +```bash +curl -i -XDELETE \ + -H "Accept: application/*;version=$VER" \ + -H "Authorization: Bearer $TOKEN" \ + $baseURL"cloudapi/1.0.0/sessions/current" +``` + +> **Tip** +> Fermer votre session améliore la sécurité en évitant toute utilisation prolongée du token. + +## Erreurs courantes + +| Erreur | Cause possible | Résolution | +|-------|----------------|------------| +| **401 Unauthorized** | Token expiré ou invalide | Générer un nouveau token | +| **403 Forbidden** | Permissions insuffisantes | Vérifier les rôles attribués dans VCD | +| **404 Not Found** | Mauvais ID de ressource | Vérifier l’UUID de la VM/vApp | +| **500 Internal Server Error** | Snapshot impossible ou ressource indisponible | Réessayer sans quiescing, vérifier VMware Tools | +| **503 Service Unavailable** | Plateforme en maintenance | Réessayer plus tard | + +> **Note** +> Certaines opérations (snapshot, powerOn, etc.) peuvent prendre plusieurs minutes. + +## Aller plus loin + +Pour plus d’informations sur les appels API disponibles et la documentation officielle VMware Cloud Director, consultez : +[VMware Cloud Director API](https://developer.broadcom.com/xapis/vmware-cloud-director-api/latest/doc/landing-user_operations.html) + +Si vous souhaitez obtenir une formation ou une assistance technique personnalisée, contactez votre commercial ou cliquez sur [ce lien](/links/professional-services). + +Rejoignez le canal [Discord](https://discord.gg/ovhcloud) pour échanger directement avec notre équipe. + +Vous pouvez également participer à la [communauté d’utilisateurs](/links/community) pour partager vos expériences et bonnes pratiques. diff --git a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/meta.yaml b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/meta.yaml new file mode 100644 index 00000000000..59926d9de83 --- /dev/null +++ b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/meta.yaml @@ -0,0 +1,2 @@ +id: ee73f58d-30b7-47d1-8188-a277e9ecd4f0 +full_slug: vmware-vcd-api \ No newline at end of file From 5b0decd525809ebb3023a56e31527fb828ff52c1 Mon Sep 17 00:00:00 2001 From: ThibautOVH Date: Wed, 3 Dec 2025 12:17:52 +0100 Subject: [PATCH 2/3] fix url and object id --- .../vcd-how-to-use-api/guide.fr-fr.md | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md index 92a6dcd94de..dc6e81ba9e6 100644 --- a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md +++ b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md @@ -25,11 +25,12 @@ L’URL des API Public VCF aaS est disponible dans votre espace client **OVHcldo Vous pouvez ensuite la stocker dans des variables pour simplifier les commandes : ```bash -apiURL="https://cloud.infra01.example.ovhcloud.com/api/" +apiURL="https://cloud.infra01.example.ovhcloud.com/api" baseURL="${apiURL::-4}" ``` -- **apiURL** : Remplacer l'URL par l'URL indiqué dans votre espace client **OVHcldoud**. +**apiURL** : Remplacer l'URL par l'URL indiqué dans votre espace client **OVHcldoud**. + ## Autorisation @@ -40,7 +41,7 @@ Pour appeler l'API, vous devez obtenir un **token de session**, valable pour une Cette commande liste toutes les versions disponibles et indique lesquelles sont dépréciées : ```bash -curl $apiURL"versions" +curl $apiURL"/versions" ``` Définition de la version : @@ -68,7 +69,7 @@ La commande suivante ouvre une session et extrait automatiquement le token renvo TOKEN=$(curl -Is -XPOST \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Basic $AUTH" \ - $baseURL"cloudapi/1.0.0/sessions/" \ + $baseURL"/cloudapi/1.0.0/sessions/" \ | grep "x-vmware-vcloud-access-token" | awk '{print $2}') ``` @@ -85,7 +86,7 @@ Cette requête renvoie toutes les vApps accessibles dans votre organisation. curl -XGET \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Bearer $TOKEN" \ - $apiURL"vApps/query" + $apiURL"/vApps/query" ``` ### Lister les VM @@ -96,7 +97,7 @@ Cette commande liste les VMs (hors templates) : curl -XGET \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Bearer $TOKEN" \ - $apiURL"vms/query?filter=isVAppTemplate==false" + $apiURL"/vms/query?filter=isVAppTemplate==false" ``` --- @@ -109,7 +110,7 @@ Cette commande envoie l’action `powerOn` à la VM cible : curl -XPOST \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Bearer $TOKEN" \ - $apiURL"vApp/vm-0c443b13-1db8-4723-850e-dc3ecd08b2c1/power/action/powerOn" + $apiURL"/vApp//power/action/powerOn" ``` > **Note** @@ -126,7 +127,7 @@ curl -XPOST \ -H "Accept: application/*;version=$VER" \ -H 'Content-Type: application/vnd.vmware.vcloud.createSnapshotParams+json' \ -H "Authorization: Bearer $TOKEN" \ - $apiURL"vApp/vm-0c443b13-1db8-4723-850e-dc3ecd08b2c1/action/createSnapshot" \ + $apiURL"/vApp//action/createSnapshot" \ -d '{ "name": "MonSnapshot", "memory": false, @@ -147,7 +148,7 @@ Cette commande interroge le statut d'une tâche via son identifiant : curl -XGET \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Bearer $TOKEN" \ - $apiURL"task/156c9ea2-1ff8-45be-a920-612195eddac7" + $apiURL"/task/" ``` --- @@ -160,7 +161,7 @@ Il est recommandé de supprimer votre session une fois les opérations terminée curl -i -XDELETE \ -H "Accept: application/*;version=$VER" \ -H "Authorization: Bearer $TOKEN" \ - $baseURL"cloudapi/1.0.0/sessions/current" + $baseURL"/cloudapi/1.0.0/sessions/current" ``` > **Tip** From 531b7117586edba2cd2105cf958be8311e93bcd7 Mon Sep 17 00:00:00 2001 From: ThibautOVH Date: Wed, 3 Dec 2025 12:29:17 +0100 Subject: [PATCH 3/3] add screen API URL --- .../vcd-how-to-use-api/guide.fr-fr.md | 9 ++++++--- .../images/vcd-manager-api-url.png | Bin 0 -> 7640 bytes 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/images/vcd-manager-api-url.png diff --git a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md index dc6e81ba9e6..154277e316c 100644 --- a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md +++ b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/guide.fr-fr.md @@ -21,15 +21,18 @@ Avant d’utiliser l’API, nous vous recommandons de consulter les guides suiva ### Récupérer l’URL de l’API -L’URL des API Public VCF aaS est disponible dans votre espace client **OVHcldoud** -Vous pouvez ensuite la stocker dans des variables pour simplifier les commandes : +L’URL des API Public VCF aaS est disponible dans votre espace client **OVHcldoud** +Vous pouvez retrouver cette information dans **Informations générales** > **URL API** de votre service **Public VCF aaS** +![vcd-manager-api-url](images/vcd-manager-api-url.png) + +Vous pouvez ensuite la stocker dans une variable pour simplifier les commandes : ```bash apiURL="https://cloud.infra01.example.ovhcloud.com/api" baseURL="${apiURL::-4}" ``` -**apiURL** : Remplacer l'URL par l'URL indiqué dans votre espace client **OVHcldoud**. +**apiURL** : Remplacer l'URL correspondante à l'URL de votre service. ## Autorisation diff --git a/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/images/vcd-manager-api-url.png b/pages/hosted_private_cloud/hosted_private_cloud_powered_by_vmware/vcd-how-to-use-api/images/vcd-manager-api-url.png new file mode 100644 index 0000000000000000000000000000000000000000..e54db362f98253fb0f72aad6eabb6299fce36704 GIT binary patch literal 7640 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 literal 0 HcmV?d00001