Vés al contingut (premeu Retorn)

Com fer una crida a la API de Cloudstack

En aquest document t'expliquem com pots arribar a fer crides a la API de Cloudstack via Shell Scripting

Per fer una crida a la API de cloudstack necessitem un script. Aquest script pot estar implementat en qualsevol llenguatge, donat que el que ha de fer és construir una URL per fer la crida a la API REST del servei. Si busques a Internet trobaràs molts exemples en bash, python, php, etc, de manera que et facilitarà la integració amb els teus serveis, però al final d'aquest document trobarás un d'exemple un que funciona prou bé.

Necessitaràs les credencial d'un usuari. Per això, cal anar al teu usuari al Cloud https://cloud.upc.edu/client, Domains -> View accounts -> Gestor -> View users -> i al teu usuari has de prémer el botó amb una clau que l'ajut posa "Generate keys". Configura el script indicant les credencials API_KEY i SECRET_KEY.

 

Per comprovar que funciona correctament:

 ./cloudstack.sh command=listVirtualMachines listall=true

 

Totes les crides que pots executar a la API de cloudstack les trobaràs a la pròpia documentació del producte:

http://cloudstack.apache.org/api.html

Entra en la versió corresponent (probablement la darrera estable), i allà tens disponibles totes les crides que es poden fer contra la API del servei del Cloud UPC.

 

cloudstack.sh

Guardeu aquest document amb els permissos necessaris (755) per poder executar-ho.

#!/usr/bin/env bash

ADDRESS="https://cloud.upc.edu"
API_KEY=""
SECRET_KEY=""
USE_XMLLINT=1 # true => 1, false => 0

if [ x$ADDRESS == x ] || [ x$API_KEY == x ] || [ x$SECRET_KEY == x ] || [ x$USE_XMLLINT == x ]; then
  echo 'ERROR: Set all required valiables.'
  exit 1
fi

api_path="/client/api?"
if [ $# -lt 1 ]; then
echo "usage: $0 command=... paramter=... parameter=..."; exit;
elif [[ $1 != "command="* ]]; then
echo "usage: $0 command=... paramter=... parameter=..."; exit;
elif [ $1 == "command=" ]; then
echo "usage: $0 command=... paramter=... parameter=..."; exit;
fi
data_array=("$@" "apikey=${API_KEY}")
temp1=$(echo -n ${data_array[@]} | \
tr " " "\n" | \
sort -fd -t'=' | \
perl -pe's/([^-_.~A-Za-z0-9=\s])/sprintf("%%%02X", ord($1))/seg'| \
tr "A-Z" "a-z" | \
tr "\n" "&" )
signature=$(echo -n ${temp1[@]})
signature=${signature%&}
signature=$(echo -n $signature | \
openssl sha1 -binary -hmac $SECRET_KEY | \
openssl base64 )
signature=$(echo -n $signature | \
perl -pe's/([^-_.~A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg')
url=${ADDRESS}${api_path}$(echo -n $@ | tr " " "&")"&"apikey=$API_KEY"&"signature=$signature

if [ $USE_XMLLINT -eq 1 ] && [ `type xmllint > /dev/null; echo $?` -eq 0 ]; then
  curl -k ${url} | xmllint --format -
else
  curl -k ${url}
fi

exit $?