Per connettere due applicazioni diverse, è possibile utilizzare i webhook. Utilizzando i webhook, è possibile configurare le notifiche degli eventi.
Un webhook è un callback HTTP. Quando si verifica un evento, un'applicazione Web che implementa i webhook trasmette i dati relativi a tale evento e li invia a un URL del webhook dall'applicazione di cui si desidera ricevere informazioni. Per ulteriori informazioni, vedere Cloud Developer Platform.
Nel contesto di VMware Cloud Director, è possibile configurare i webhook utilizzando i comportamenti dei webhook. I comportamenti dei webhook inviano una richiesta POST a un server webhook remoto. Il corpo della richiesta contiene informazioni sulla chiamata del comportamento e sull'entità in cui è stato richiamato il comportamento. È inoltre possibile personalizzare il corpo utilizzando un modello. La risposta del server webhook determina il risultato del task di chiamata del comportamento. Esistono tre diversi tipi di risposte che il server può restituire.
Il server webhook remoto può essere qualsiasi server raggiungibile da VMware Cloud Director. Tuttavia, prima di creare un comportamento webhook, è necessario verificare che l'endpoint del webhook sia sicuro.
- Verificare che l'endpoint del webhook sia un endpoint HTTPS.
- Verificare che l'organizzazione dell'utente che richiama il comportamento consideri attendibile il certificato del server webhook. Ciò significa che anche se il certificato è presente in un archivio di attendibilità di VMware Cloud Director, se l'organizzazione dell'utente che richiama il comportamento non considera attendibile il certificato, il comportamento del webhook non verrà eseguito.
- È possibile aggiungere un certificato all'archivio di attendibilità utilizzando l'interfaccia utente o l'API di VMware Cloud Director. Vedere Gestione dei certificati tramite VMware Cloud Director.
Creazione di comportamenti dei webhook
"POST https"://host/cloudapi/1.0.0/interfaces/<interface_id>/behaviors{ "name":"webhookBehavior", "execution":{ "type":"WebHook", "id":"testWebHook", "href":"https://hooks.slack.com:443/services/T07UZFN0N/B01EW5NC42D/rfjhHCGIwzuzQFrpPZiuLkIX", "key":"secretKey", "execution_properties":{ "template":{ "content":"<template_content_string>" }, "_secure_token":"secureToken", "invocation_timeout":7 } } }
Campo | Descrizione |
---|---|
type |
Campo obbligatorio. Deve essere WebHook . |
id |
Campo stringa facoltativo. |
href |
Campo obbligatorio per l'URL che deve ricevere le richieste da VMware Cloud Director. |
_internal_key |
Campo obbligatorio per il segreto condiviso utilizzato per firmare le richieste inviate all'endpoint del webhook. |
invocation_timeout |
Campo facoltativo che specifica il timeout in secondi per la risposta dal server webhook |
template.content |
Campo facoltativo per la personalizzazione del payload inviato al server webhook. È possibile fornire un modello come stringa. È possibile aggiungere altri campi a execution_properties , accessibili per il modello. |
_secure_ |
I campi con prefisso _secure_ sono facoltativi. I campi sono di sola scrittura e non possono essere ottenuti tramite una richiesta GET sul comportamento. Il valore del campo viene crittografato prima di essere salvato nel database di VMware Cloud Director. I campi sono accessibili per il modello. |
Payload da VMware Cloud Director al server webhook
Esiste un formato predefinito del payload inviato al server webhook. È inoltre possibile personalizzare il payload utilizzando un modello.
{ "entityId":"urn:vcloud:entity:vmware:test_entity_type:b95d96ec-c294-4a64-b5c4-9009abe6ab06", "typeId":"urn:vcloud:type:vmware:test_entity_type:1.0.0", "arguments":{ "x":7 }, "_metadata":{ "executionId":"testWebHook", "execution":{ "href":"https://webhook.site/3ca4588f-c9f1-4c0f-911f-734ab598b2dc" }, "invocation":{ }, "apiVersion":"36.0", "behaviorId":"urn:vcloud:behavior-interface:webhookBehavior:vmware:test_interface_3:1.0.0", "requestId":"8312df21-712c-4b85-86d4-c9b00669662f", "executionType":"WebHook", "invocationId":"115c5b99-09e8-44f7-8189-4b9d96e067b1", "taskId":"a9e0556b-7699-4ded-b56b-c51fee659008" }, "entity":{ "cluster":{ "name":"testCluster0" }, "clusterState":{ "host":"testHost", "status":"valid" } } }
Per i payload personalizzati con un modello, è possibile specificare un modello per il payload inviato al server webhook. Se non si specifica un modello, VMware Cloud Director invia il payload della richiesta predefinito al server webhook. Il motore del modello Apache FreeMarker esegue il rendering del payload dal modello fornito e dal modello di dati.
+ - entityId | + - typeId | + - arguments | + - arguments_string | + - _execution_properties | + - _metadata | | | + - executionId | + - behaviorId | + - executionType | + - taskId | + - execution | | | | | + - href | + - invocation | + - invocationId | + - requestId | + - apiVersion | + - entity | + - entity_string
Argomento | Descrizione |
---|---|
entityId |
ID dell'entità definita richiamata. |
typeId |
ID del tipo di entità dell'entità definita richiamata. |
arguments |
Argomenti passati nella chiamata del comportamento. |
arguments_string |
Stringa di argomenti in formato JSON. È possibile utilizzarla se si desidera aggiungere tutti gli argomenti al payload. |
_execution_properties |
È possibile selezionare tutti i valori dall'argomento della chiamata execution_properties in base al nome della chiave. |
execution |
È possibile selezionare tutti i valori dall'argomento della chiamata execution in base al nome della chiave. |
invocation |
È possibile selezionare tutti i valori dall'argomento invocation in base al nome della chiave. |
entity |
Mappa del contenuto dell'entità. È possibile selezionare tutti i valori nell'entità in base al nome della chiave. |
entity_string |
Stringa di entità in formato JSON. |
Per ulteriori informazioni sul linguaggio dell'espressione di Apache FreeMarker per il modello del payload, vedere https://freemarker.apache.org/docs/dgui_quickstart_template.html.
<#assign header_Content\-Type= "application/json" /> { "text": "Behavior with id ${_metadata.behaviorId} was executed on entity with id ${entityId}" }
header_
. Ad esempio, è possibile specificare il valore per l'intestazione
Authorization
aggiungendo la riga seguente al modello:
<#assign header_Authorization = "${_execution_properties._secure_token}" />
Payload dal server webhook a VMware Cloud Director
- Risposta predefinita
Il payload predefinito dal server webhook a VMware Cloud Director deve contenere quanto segue.
- La risposta può non avere alcuna intestazione
Content-Type
oppure avere un'intestazioneContent-Type
con valoretext/plain
. - Il corpo della risposta deve essere una stringa.
- Il corpo della risposta viene utilizzato come risultato della chiamata del comportamento. Lo stato del task di chiamata del comportamento è
success
. Il risultato del task viene impostato sul corpo della risposta.
- La risposta può non avere alcuna intestazione
- Risposta di aggiornamento singolo del task
Oltre al risultato del comportamento, la risposta di aggiornamento del task può impostare alcune altre proprietà del task di chiamata del comportamento come
status
,details
,operation
,error
,progress
eresult
. Poiché si tratta di un aggiornamento del task unico, la risposta deve completare il task. Se la risposta non imposta lo stato del task susuccess
,error
oaborted
, il task non riesce e viene visualizzato un errore. Il messaggio di errore indica che lo stato non è accettabile.- La risposta deve avere un'intestazione
Content-Type
con valoreapplication/vnd.vmware.vcloud.task+json
. - Il corpo della risposta deve contenere una rappresentazione JSON della classe
TaskType
contenente le proprietà del task che si desidera modificare. - Corpo della risposta di esempio con stato
success
:{ "status":"success", "details":"example details", "operation":"example operation", "progress":100, "result":{ "resultContent":"example result" } }
- Corpo della risposta di esempio con stato
error
:{ "status":"error", "details":"example details", "operation":"example operation", "progress":50, "error":{ "majorErrorCode":404, "minorErrorCode":"ERROR", "message":"example error message" } }
- La risposta deve avere un'intestazione
- Risposta di aggiornamento continuo del task
Il server webhook può inviare più aggiornamenti del task utilizzando una risposta HTTP in più parti. Ogni aggiornamento è una parte separata del corpo della risposta. L'ultima parte del corpo della risposta del server webhook deve completare il task. Se il corpo della risposta non completa il task, il task non riesce e viene visualizzato un errore.
- La risposta deve avere un'intestazione
Content-Type
con valoremultipart/form-data; boundary=...
. -
Il corpo della risposta deve iniziare e terminare con una stringa di delimitazione
--<boundary_string>
. Ogni parte del corpo della risposta deve terminare con una stringa di delimitazione. È necessario specificare il limite nell'intestazioneContent-Type
della risposta HTTP dal server webhook.Headers: ... Content-Type: multipart/form-data; boundary=<boundary_string> Body: --<boundary_string> Content-Type: application/vnd.vmware.vcloud.task+json { "details": "example details", "operation": "example operation", "progress": 50 } --<boundary_string> Content-Type: application/vnd.vmware.vcloud.task+json { "status": "success", "progress": 100, "result": { "resultContent": "example result" } } --<boundary_string>
Le parti del corpo nel corpo della risposta devono avere il formato di un aggiornamento del task o il formato di un aggiornamento finale.
Esempio di aggiornamento del task:Content-Type: application/vnd.vmware.vcloud.task+json { "details": "example details", "operation": "example operation", "progress": 50 }
Esempio di aggiornamento finale:Content-Type: text/plain <string>
- La risposta deve avere un'intestazione
Autenticazione delle richieste di comportamento del webhook
L'autenticazione del codice di autenticazione del messaggio basato su hash (HMAC) protegge le richieste di comportamento del webhook. HMAC è un meccanismo che garantisce l'autenticità e l'integrità delle richieste HTTP. Per garantire l'autenticità e l'integrità, HMAC include due intestazioni personalizzate per ogni richiesta HTTP. Le intestazioni personalizzate sono un'intestazione della firma e un digest. Per VMware Cloud Director, l'intestazione della firma è x-vcloud-signature
e il digest è x-vcloud-digest
.
x-vcloud-signature
è un'intestazione personalizzata inviata con ogni richiesta di webhook. L'intestazione della firma è costituita da un algoritmo HMACSHA512, intestazioni e una firma generata da
VMware Cloud Director. Le intestazioni mostrano il contenuto della stringa di base che è stata firmata per creare la firma.
Campo | Descrizione |
---|---|
host |
Host del server webhook |
date |
Data della richiesta |
(request-target) |
Metodo HTTP in minuscolo collegato, spazio ASCII e intestazioni del percorso della richiesta. Ad esempio, post /webhook . |
digest |
Digest SHA-512 del corpo della richiesta |
Per generare l'intestazione della firma, è necessario un segreto condiviso. Il segreto condiviso è una stringa nota solo a VMware Cloud Director e al server webhook.
L'intestazione del digest x-vcloud-digest
è un digest SHA-512 con codifica Base64 del corpo della richiesta.
Ogni richiesta di webhook da VMware Cloud Director può essere verificata generando la firma tramite il segreto condiviso e confrontandola con la firma nell'intestazione della firma di VMware Cloud Director.
Richiamo dei comportamenti dei webhook
{ "arguments": { "argument1": "data1", "argument2": "data2", ... } }