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}"
  },
  "cloudZones": [
    {
      "project": null,
      "name": "{placementZoneName}",
      "priority": 0,
      "maxNumberInstances": 0,
      "memoryLimit": 8589934592,
      "cpuLimit": 2,
      "gpuLimit": 0,
      "storageLimit": 61440,
      "placementZoneLink": "/provisioning/resources/placement-zones/{placementZoneId}"
    }
  ]
}

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

Entradas populares de este blog

vRA8 - Definir redes disponibles por Projecto

Aria Automation - crear lista ordenada de key-value en custom forms con Orchestrator

Demo simple de GSLB con AVI