VMware Aria Automation API - Crear Proyecto
En este articulo se describe cómo crear un proyecto, y configurar los datos básicos, en VMware Aria Automation 8.x usando la API.
VMware Aria Automation utiliza sus propias APIs para funcionar. Esto es importante porque todo lo que podemos realizar usando la Interfaz de Usuario podremos hacerlo de forma automatizada utilizando las APIs. Por otra parte, las APIs están bien documentadas en la siguiente URL:
https://<<vraHost>>/automation-ui/api-docs/
Algunas funcionalidades se encuentran en APIs que no están documentadas, esto hace que las tareas sean más difíciles. Entiendo que las APIs no documentadas tienen funcionalidades "peligrosas" con las que podríamos generar muchos problemas, pero también es cierto que necesitamos usarlas si queremos automatizar TODO.
Requerimientos
Si necesitamos un proyecto que permita a los miembros desplegar nuevos recursos, entonces necesitamos (como mínimo):
- Crear el proyecto
- Asignar una Cloud Zone con límite de recursos
- Asignar usuarios y grupos
Para ejecutar las siguientes llamadas debemos primero autenticarnos. Este proceso está descripto en la parte 1 de esta serie de artículos.
Crear Proyecto
Comenzamos creando el proyecto, para esto usaremos la API "Project". En el siguiente ejemplo vamos a crear un nuevo proyecto de nombre "MiProyecto", con un naming Template y con un constraint de Storage con el TAG "tier:gold".
No estamos poniendo un constraint the Network, pero hacerlo sería tan sencillo como usar el mismo bloque de storage para el campo "network":
URL | https://{{vraHost}}/project-service/api/projects |
Method | POST |
Authorization | Bearer {{token}} |
Accept | application/json |
Content-Type | application/json |
Body |
{ "id": "", "properties": { "__namingTemplate": "${project.name}-${######}", "__projectPlacementPolicy": "DEFAULT" }, "operationTimeout": 0, "name": "MiProyecto", "description": "", "constraints": { "network": null, "storage": { "conditions": [ { "enforcement": "HARD", "occurrence": "MUST_OCCUR", "expression": { "key": "tier", "value": "gold" }, "type": "TAG" } ] }, "extensibility": null }, "sharedResources": true } |
Response |
{ "id": "22bcf6ba-d87e-4770-9bd2-5g2d43765a94", "name": "MiProyecto", ... } |
En la respuesta encontraremos el "id" que utilizaremos en las siguientes llamadas.
Ejemplo en CURL
curl --location --request POST 'https://vra.datacenter.local/project-service/api/projects' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer eyJ0eXAiOiJKV1Q...' \ --data-raw '{ "id": "", "properties": { "__namingTemplate": "${project.name}-${######}", "__projectPlacementPolicy": "DEFAULT" }, "operationTimeout": 0, "name": "MiProyecto", "description": "", "constraints": { "network": null, "storage": { "conditions": [ { "enforcement": "HARD", "occurrence": "MUST_OCCUR", "expression": { "key": "tier", "value": "gold" }, "type": "TAG" } ] }, "extensibility": null }, "sharedResources": true }'
Asignar Cloud Zone y límites de recursos
Antes de asignar recursos sobre una Cloud Zone, necesitamos conocer el nombre y el ID de dicha Cloud Zone. Para ello hacemos la primer llamada a una API no documentada:
URL | https://{{vraHost}}/provisioning/uerp/provisioning/mgmt/placement-zones?expand |
Method | POST |
Authorization | Bearer {{token}} |
Accept | application/json |
Content-Type | application/json |
Body | {"odataQuery":"$filter=(type ne 'vpc')&$orderby=name asc&$top=10&$skip=0"} |
En la respuesta veremos todas las Regiones disponibles y, de la que necesitemos usar, debemos tomar nota del Name y del ID.
Ejemplo en CURL
curl --location --request POST 'https://vra.datacenter.local/provisioning/uerp/provisioning/mgmt/placement-zones?expand' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer eyJ0eXAiOiJKV1Q...' \ --data-raw '{"odataQuery":"$filter=(type ne '\''vpc'\'')&$orderby=name asc&$top=10&$skip=0"}'
La siguiente llamada la debemos hacer a para agregar la Cloud Zone al proyecto y asignar los recursos.
Importante:
- memoryLimit se ingresa en Bytes.
- storageLimit se ingresa en MB
URL | https://{{vraHost}}/provisioning/mgmt/project-config |
Method | PATCH |
Authorization | Bearer {{token}} |
Accept | application/json |
Content-Type | application/json |
Body |
{ "projectState": { "documentSelfLink": "/provisioning/resources/projects/{projectID} |
Ejemplo en CURL
curl --location --request GET 'https://vra.datacenter.local/provisioning/mgmt/project-config' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJS...' \ --data-raw '{ "projectState": { "documentSelfLink": "/provisioning/resources/projects/pp7ed91e-537d-4923-aakk-024ba0949073" }, "cloudZones": [ { "project": null, "name": "MiCloudAccount / MiCloudZone", "priority": 0, "maxNumberInstances": 0, "memoryLimit": 8589934592, "cpuLimit": 2, "gpuLimit": 0, "storageLimit": 61440, "placementZoneLink": "/provisioning/resources/placement-zones/088bd0a1-4bc4-4b74-b8fa-6510801b84f4" } ] }'
Asignar usuarios y groups al Projecto
Volvemos a las APIs documentadas para esta última operación. En este ejemplo se agrega un grupo como Administrador y un usuario como Member.
URL | https://{{vraHost}}/project-service/api/projects/{{projectId}}/principals |
Method | PATCH |
Authorization | Bearer {{token}} |
Accept | application/json |
Content-Type | application/json |
Body |
{ "modify": [ { "email": "group@dominio", "type": "group", "role": "administrator" }, { "email": "user@dominio", "type": "user", "role": "member" } ], "remove": [ ] } |
Ejemplo en CURL
curl --location --request PATCH 'https://vra.datacenter.local/project-service/api/projects/ff7ed91e-537d-4923-aatt-024ba0949028/principals' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciO...' \ --data-raw '{ "modify": [ { "email": "migrupo@datacenter.local", "type": "group", "role": "administrator" }, { "email": "miusuario@datacenter.local", "type": "group", "role": "member" } ], "remove": [ ] }'
Con esto ya hemos creado un Proyecto, configurado en qué Cloud Zone debe desplegar, cuales son los límites de recursos y cuales son sus usuarios.
Comentarios
Publicar un comentario