|
| 1 | +--- |
| 2 | +title: APIv2 |
| 3 | +slug: ovh-api-v2 |
| 4 | +excerpt: First Steps with the OVHcloud API v2 |
| 5 | +section: APIv6 OVHcloud |
| 6 | +updated: 2023-03-20 |
| 7 | +--- |
| 8 | + |
| 9 | +**Dernière mise à jour le 20/03/2023** |
| 10 | + |
| 11 | +## Objectif |
| 12 | + |
| 13 | +Les API disponibles sur [https://eu.api.ovh.com/](https://eu.api.ovh.com/){.external} vous permettent d'acheter, gérer, mettre à jour et configurer des produits OVHcloud sans utiliser une interface graphique comme l'espace client. |
| 14 | + |
| 15 | +Une nouvelle branche des API OVHcloud est disponible sous le préfixe **/v2** sur [https://eu.api.ovh.com/v2](https://api.ovh.com/console-preview/?section=%2Fiam&branch=v2){.external}. Ce guide a pour but de présenter les grands principes de cette nouvelle API et les différences avec la première version. |
| 16 | + |
| 17 | +## Principes |
| 18 | + |
| 19 | +### Gestion des versions |
| 20 | + |
| 21 | +Cette nouvelle branche d'API utilise un système de versionnement incluant une version majeure et une version mineure pour la gestion de ses spécifications. |
| 22 | +Cela permet de distinguer les changements mineurs des changements majeurs ou cassants dans les schémas de l'API. De plus, un résumé des changements (*CHANGELOG*) accompagne la publication de chaque nouvelle version majeure afin d'avoir une vue détaillée des modifications apportées. |
| 23 | + |
| 24 | +L'APIv2 est conçue pour pouvoir exposer plusieurs versions majeures en parallèle. Cela signifie que des applications utilisant une version spécifique de l'API continueront de fonctionner après la sortie d'une nouvelle version majeure. |
| 25 | + |
| 26 | +Au moment de la publication d'une nouvelle version majeure, la version précédent celle-ci restera active pendant une période de 6 mois afin de vous laisser le temps d'adapter vos applications. |
| 27 | + |
| 28 | +#### Sélectionner une version majeure spécifique de l'API |
| 29 | + |
| 30 | +Une page spécifique sera prochainement disponible dans l'espace client OVHcloud pour sélectionner la version majeure de l'API utilisée. |
| 31 | + |
| 32 | +Il est cependant déjà possible de pointer sur une version majeure directement dans les appels à l'API en utilisant l'en-tête `X-Schemas-Version`: |
| 33 | +```bash |
| 34 | +curl -X GET -H "X-Schemas-Version: 1.0" https://eu.api.ovh.com/v2/iam/policy |
| 35 | +``` |
| 36 | + |
| 37 | +Si cet en-tête n'est pas fourni lors d'un appel à l'API, la dernière version majeure est utilisée par défaut. |
| 38 | + |
| 39 | +#### Récupérer les versions disponibles via la console |
| 40 | + |
| 41 | +Il est possible de voir la liste des versions disponible sur la console de l'API OVHcloud. Pour cela, ouvrez la [console](https://api.ovh.com/console-preview/?section=%2Fiam&branch=v2#servers){.external}. |
| 42 | + |
| 43 | +Les différentes versions sont affichées dans la section **SCHEMAS VERSION**. Vous pouvez ensuite sélectionner une version pour voir les schémas d'API associés. |
| 44 | + |
| 45 | +{.thumbnail} |
| 46 | + |
| 47 | +### Vision as-code |
| 48 | + |
| 49 | +Deux approches opposées existent pour voir l'état courant d'une ressource à travers une API et changer son état : |
| 50 | +- *Approche centrée sur le processus* : l'API expose l'état courant des ressources (par exemple une instance Public Cloud) et offre des opérations pour les modifier (par exemple changer la taille d'un disque). |
| 51 | +- *Approche centrée sur les ressources* : l'API expose à la fois l'état courant des ressources ainsi que l'état souhaité. Les modifications se font directement en mettant à jour l'état souhaité des ressources. Dans ce cas, l'API effectue elle-même les actions nécessaires pour atteindre l'état ciblé. |
| 52 | + |
| 53 | +La première approche est celle utilisée par l'API actuelle : [https://eu.api.ovh.com/v1](https://eu.api.ovh.com/v1){.external}. |
| 54 | + |
| 55 | +L'APIv2 utilise l'approche centrée sur les ressources, qui la rend plus facilement utilisable "as-code", notamment à travers des outils tels que [Terraform](https://www.terraform.io){.external}. Ce fonctionnement permet également d'abstraire toute la complexité du processus de transformation d'une ressource d'un état à un autre puisqu'il est à la charge de l'API et non du client. |
| 56 | + |
| 57 | +### Gestion asynchrone et évènements |
| 58 | + |
| 59 | +Comme expliqué dans la section précédente, l'APIv2 prend en charge les actions à effectuer pour atteindre l'état cible d'une ressource lorsque ses spécifications ont été modifiées. Ces actions peuvent dans certains cas entraîner des tâches de longue durée, dont la résolution se fera de manière asynchrone. |
| 60 | + |
| 61 | +Dans le cas de ressources pour lesquelles des tâches asynchrones peuvent être exécutées, une route `/task` est exposée pour récupérer la liste des tâches liées à une ressource. La liste des tâches en cours est également disponible dans les informations de la ressource elle-même. |
| 62 | + |
| 63 | +Voici un exemple de tâche retournée par l'API : |
| 64 | +```json |
| 65 | +{ |
| 66 | + "createdAt": "2023-03-21T15:40:05.213Z", |
| 67 | + "startedAt": "2023-03-21T15:41:05.213Z", |
| 68 | + "updatedAt": "2023-03-21T15:42:05.213Z", |
| 69 | + "finishedAt": "2023-03-21T15:43:05.213Z", |
| 70 | + "errors": [], |
| 71 | + "id": "18704d69-7fd0-4000-808f-7e3d8bb42380", |
| 72 | + "progress": [ |
| 73 | + { |
| 74 | + "name": "Restart", |
| 75 | + "status": "DONE" |
| 76 | + } |
| 77 | + ], |
| 78 | + "status": "DONE", |
| 79 | + "type": "CloudRestartInstance" |
| 80 | +} |
| 81 | +``` |
| 82 | + |
| 83 | +Une liste d'évènements est également exposée pour les ressources concernées par des tâches asynchrones. Cela permet de dresser un historique des évènements affectant la ressource comme, par exemple, les modifications demandées par les utilisateurs, les opérations asynchrones, ou bien les maintenances effectuées sur la ressource. Ces évènements sont listés via le chemin `/event`. |
| 84 | + |
| 85 | +Voici un exemple d'évènement retourné par l'API : |
| 86 | +```json |
| 87 | +{ |
| 88 | + "createdAt": "2023-03-21T15:50:08.823Z", |
| 89 | + "message": "Task 18704d69-7fd0-4000-808f-7e3d8bb42380 started", |
| 90 | + "type": "TaskStart" |
| 91 | +} |
| 92 | +``` |
| 93 | + |
| 94 | +Le type de l'évènement peut par exemple être `TargetSpecUpdate` en cas de changement de l'état cible d'une ressource, `TaskSuccess` en cas de tâche terminée sans erreur, etc. |
| 95 | + |
| 96 | +Dans certains cas, un évènement peut aussi contenir un lien vers la ressource concernée par la tâche ainsi qu'un message. |
| 97 | + |
| 98 | +> [!primary] |
| 99 | +> |
| 100 | +> Les exemples d'évènement et de tâche présentés ci-dessus peuvent varier selon la section d'API. Veuillez vous référer à la [console](https://docs.ovh.com/fr/api/api-console-exploration/) pour visualiser la définition exacte relative à chaque section. |
| 101 | +> |
| 102 | +
|
| 103 | +### Pagination |
| 104 | + |
| 105 | +La pagination permet de segmenter les réponses d'API contenant une liste d'éléments en plusieurs pages. |
| 106 | + |
| 107 | +Les avantages principaux de la pagination sont : |
| 108 | +- réduction de l'utilisation de la bande passante pour les clients de l'API |
| 109 | +- temps de réponse de l'API plus courts |
| 110 | +- des corps de réponse moins volumineux, ce qui permet une exploitation moins coûteuse des données retournées du côté du client |
| 111 | + |
| 112 | +L'APIv2 expose une pagination par curseur, dans laquelle les curseurs sont transmis dans les en-têtes des requêtes et des réponses. Il est également possible de contrôler le nombre d'éléments retournés. |
| 113 | + |
| 114 | +Les en-têtes utilisés sont les suivants : |
| 115 | +- `X-Pagination-Size` : cet en-tête optionnel permet de contrôler la taille des pages retournées |
| 116 | +- `X-Pagination-Cursor-Next` : en-tête retourné par l'API qui contient la valeur à utiliser dans la prochaine requête pour récupérer la page suivante |
| 117 | +- `X-Pagination-Cursor` : en-tête à envoyer dans une requête pour récupérer la page suivante |
| 118 | + |
| 119 | +Par exemple, l'appel suivant retournera les 5 premiers éléments ainsi que le curseur à utiliser pour récupérer la page suivante : |
| 120 | +```bash |
| 121 | +curl https://eu.api.ovh.com/v2/iam/policy -H "X-Pagination-Size: 5" |
| 122 | +# Si le nombre de ressources à retourner est supérieur à 5, l'en-tête suivant |
| 123 | +# sera disponible dans la réponse : "X-Pagination-Cursor-Next: xxxyyyzzz" |
| 124 | +``` |
| 125 | + |
| 126 | +La page suivante peut être récupérée en fournissant le curseur renvoyé dans la réponse de l'appel précédent : |
| 127 | +```bash |
| 128 | +curl https://eu.api.ovh.com/v2/iam/policy -H "X-Pagination-Size: 5" -H "X-Pagination-Cursor: xxxyyyzzz" |
| 129 | +``` |
| 130 | + |
| 131 | +L'absence de l'en-tête `X-Pagination-Cursor-Next` dans une réponse d'API contenant une liste d'éléments signifie que la dernière page est atteinte et que tous les éléments disponibles on été retournés. |
| 132 | + |
| 133 | + |
| 134 | +## Clients officiels |
| 135 | + |
| 136 | +Plusieurs bibliothèques sont disponibles pour utiliser les API OVHcloud : |
| 137 | +- Go : [https://github.com/ovh/go-ovh](https://github.com/ovh/go-ovh){.external} |
| 138 | +- Python : [https://github.com/ovh/python-ovh](https://github.com/ovh/python-ovh){.external} |
| 139 | +- PHP : [https://github.com/ovh/php-ovh](https://github.com/ovh/php-ovh){.external} |
0 commit comments