Premier Training & Business Partner Red Hat

Introduzione alle Python API per RHEV ed oVirt

Giulio Casella
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

RHEV - 1

In questo articolo verrà affrontata una breve introduzione alle API python per interfacciarsi alle API REST di RHEV ed oVirt.

RHEV fornisce un’interfaccia completa per la gestione tramite l’administrator portal, tuttavia può essere utile avere una modalità alternativa di gestione, ad esempio per automatizzare task ripetitivi (tramite script python) o estendere le funzionalità del portal stesso.

Per poter usufruire delle API python occorre avere installato il pacchetto ovirt-engine-sdk-python.

Il primo passo consiste nella connessione alle API REST di rhev:

1
2
3
4
5
6
7
8
9
10
11
12
13
from ovirtsdk.api import API
from ovirtsdk.xml import params
 
rhevaddress = "172.16.1.100"
username="admin@internal"
password="rhevpassword"
 
try:
        api = API ( url="http://%s" % rhevaddress,
                username=username,
                password=password)
except Exception as e:
        sys.exit("Connessione fallita: %s" % e)

Qualora abbiate predisposto il manager RHEV per rispondere su connessione cifrata, occorrerà aggiungere alcune opzioni alla chiamata API. Per semplicità in questo articolo ci limiteremo ad utilizzare il parametro insecure=True, che fa sì che la chiamata ometta i controlli su tutta la chain del certificato ottenuto dal server (utile qualora non si possieda un vero certificato). Un altro parametro degno di nota è persistent_auth (True|False), che permette di evitare l’autenticazione per ogni singola chiamata che l’SDK python farà alle API REST.

Una volta connessi occorre ottenere l’entità (virtual machine, host, template, pool, cluster, ecc.) sulla quale dobbiamo lavorare. Alcuni esempi:

1
2
3
myvm = api.vms.get(name="nomevm")
mytemplate = api.templates.get(name="nometemplate")
mypool = api.vmpools.get(name="nomepool")

Esistono inoltre alcuni metodi per enumerare oggetti:

  • Elenco di tutte le VM appartenenti ad un particolare pool
1
vms = api.vms.list("pool=nomepool")
  • Elenco di tutti i templates
1
vms = api.templates.list()

Sulle Virtual machines si possono svolgere una serie di operazioni. Ad esempio:

1
2
myvm = api.vms.get(name="nomevm")
myvm.start()

accende la VM. Questo codice è minimale e privo di controlli, qualora si debba implementare qualcosa di più serio il codice assomiglierebbe a qualcosa del tipo:

1
2
3
myvm = api.vms.get(name="nomevm")
if myvm.status.state == "down":
	myvm.start()

in quanto una chiamata al metodo start() genererebbe un’eccezione su un VM non spenta.

1
2
3
myvm = api.vms.get(name="nomevm")
if myvm.status.state != "down":
	myvm.stop()

spegne (brutalmente) la VM.
Analogamente esistono i metodi reboot() e shutdown(), che, rispettivamente, riavviano e fanno lo shutdown (pulito) di una VM. Si noti che per l’utilizzo di questi due metodi è necessario che sulla VM siano installati i guest agent, che permettono all’hypervisor su cui gira la VM di inviare comandi al sistema operativo guest.
È anche possibile alterare alcuni parametri di una VM:

1
2
3
myvm = api.vms.get(name="nomevm")
myvm.memory = 4294967296
myvm.update()

imposta la memoria della VM.
Si noti che la memoria assegnata ad una VM è individuata da due parametri, uno (quello impostato nel precedente esempio) è quello che la VM “vede”, l’altro è quello che quantifica la memoria “garantita” dall’infrastruttura RHEV. L’impostazione di questo parametro è leggermente più complessa:

1
2
3
4
5
myvm = api.vms.get(name="nomevm")
mempol = params.MemoryPolicy()
mempol.guaranteed = 1073741824 # 1GB
myvm.set_memory_policy(mempol)
myvm.update()

Un altro esempio è la gestione delle schede di rete di una VM:

1
2
3
4
myvm = api.vms.get(name="nomevm")
nics = myvm.nics.list()
for nic in nics:
        print nic.name, nic.interface, nic.mac.address

stampa nome, tipo di interfaccia e MAC address di ogni scheda di rete della VM. Naturalmente è anche possibile cambiare alcuni valori, quale il mac address o la rete (VLAN) a cui la scheda di rete è assegnata:

1
2
3
4
5
6
7
myvm = api.vms.get(name="nomevm")
nics = myvm.nics.list()
for nic in nics:
        if nic.name == "nic1":
                nic_network = api.networks.get(name="nomerete") # "nomerete" è una delle reti definite in RHEV
                nic.network = nic_network
                nic.update()

Un’operazione leggermente più complessa è il cambio di un CD nella VM:

1
2
3
4
5
6
7
8
9
10
11
12
13
myvm = api.vms.get(name="nomevm")
# Ottengo lo storage domain:
sd = api.storagedomains.get(name="isostoragedomain")
cd_iso = sd.files.get(name="CentOS-7.iso")
 
# le operazioni da compiere sono diverse a seconda che la macchina sia accesa o spenta
if myvm.status.state == 'down':
        cd_params = params.CdRom(file=cd_iso)
        myvm.cdroms.add(cd_params)
else:
        cdrom=myvm.cdroms.get(id="00000000-0000-0000-0000-000000000000")
        cdrom.set_file(cd_iso)
        cdrom.update(current=True)

mentre la rimozione di un CD è abbastanza semplice (assunto che la VM abbia un solo CD drive):

1
2
myvm = api.vms.get(name="nomevm")
myvm.cdroms.get(id="00000000-0000-0000-0000-000000000000").delete()

Nel prossimo articolo della serie vedremo come affrontare task più complessi, come la gestione dei pool e dei template.

TO BE CONTINUED…

Info about author

Giulio Casella