D3.7 Sviluppo di unità di test e report relativi ai moduli di interfacciamento tra il Portale di visualizzazione remota 3D e il MiddleWare. Use Case Test API Middleware in modalità emulazione Stato del cluster Assegnazione risorse Rilascio risorse Test API Middleware cluster reale Stato del cluster Caso di errore Assegnazione risorse Caso di errore Rilascio risorse Caso di errore Hostname non valido URL errato Errore interno Test CloudAgent in modalità emulazione Assegnazione risorse Rilascio risorse Caso di errore Richiesta errata URL errato Test CloudAgent in cluster reale Stato del cluster Assegnazione risorse Rilascio risorse Caso di errore Richiesta errata URL errato Test CloudAgent in sessione interattiva Assegnazione risorse Rilascio risorse Caso di errore Use Case Nell’immagine seguente viene riportato lo schema relativo alla serie di azioni che vengono compiute in un use case Windows. Figura 1. Use Case completo Riportiamo un Use Case completo: 1. L’utente, selezionerà tramite portale il servizio relativo all’applicativo 3D Windows da avviare. 2. EnginFrame comunicherà con lo scheduler, delegandogli il compito di eseguire una sessione grafica interattiva, nella quale possa essere eseguito l’applicativo 3D selezionato. Le utenze lato EnginFrame e lato Scheduler verranno gestite tramite LDAP 3. Lo Scheduler eseguirà una serie di script atti a creare una sessione grafica interattiva. 4. L’agent dello scheduler comunicherà al middleware i dati relativi alla macchina prenotata per la sessione interattiva, notificando in questo modo l’avvenuta occupazione della macchina. 5. Il middleware si occuperà di gestire il firewall in modo tale che l’utente possa connettersi ad essa tramite una sessione grafica 3D, aprendo quindi le porte necessarie al funzionamento del visualizzatore remoto. 6. Verrà fornito all’utente un metodo di accesso alla macchina (file di connessione) e l’utente potrà loggarsi ed utilizzare l’applicativo selezionato. Test API Middleware in modalità emulazione Per i test delle API del middleware è stato utilizzato il client ​
curl​
. In una prima fase di integrazione è stata elaborata dal CRS4 una modalità di test per i Web services, grazie alla quale è possibile effettuare delle chiamate web services di test e ricevere delle risposte, ma dietro al quale non vi è un’effettiva valutazione dello stato del cluster. Questa modalità di emulazione del comportamento reale è identificata dal parametro “​
fake_driver”​
, da concatenare alla fine dell’url in un’operazione di GET o dal parametro Emulate=”true” ​
da passare nelle operazioni di tipo PUT. Questa emulazione è stata necessaria, in una prima fase, per poter lavorare sull’integrazione e l’interfacciamento tra portale EnginFrame e Middleware in maniera parallela allo sviluppo del middleware stesso. Si è potuto così lavorare sull’elaborazione dell’output delle chiamate web services, anche prima che tutta la parte del middleware e dell’orchestrator fosse effettivamente completata. Stato del cluster Per verificare lo stato del cluster, in modalità emulazione, è necessario contattare l’url http://156.148.14.126:5070/api/v1/nodes/fake_driver ​
con operazione GET. Il risultato ottenuto è una lista di nodi, con id, nome, IP privati e pubblici, UUID, altre informazioni utili e lo stato totale del cluster. [root@pia­fe ~]# curl ­s ­X GET ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/nodes/fake_driver { "nodes": [ { "cloud_type": "Dummy Node Provider", "extra": { "foo": "bar" }, "id": "1", "name": "dummy­1", "private_ips": [], "provider": "dummy", "public_ips": [ "127.0.0.1" ], "state": 0, "uuid": "2c183c20f71eb5732512d6cfe1f75ebc9d9bb4dd" }, { "cloud_type": "Dummy Node Provider", "extra": { "foo": "bar" }, "id": "2", "name": "dummy­2", "private_ips": [], "provider": "dummy", "public_ips": [ "127.0.0.1" ], "state": 0, "uuid": "46ff62f5eafc7837de6ec1450b8e0e608db06d7a" }, { "cloud_type": "Dummy Node Provider", "extra": { "foo": "bar" }, "id": "3", "name": "dummy­3", "private_ips": [], "provider": "dummy", "public_ips": [ "127.0.0.3" ], "state": 0, "uuid": "aef321fde331680846014b121ff377dcb8477731" }, { "cloud_type": "Dummy Node Provider", "extra": { "foo": "bar" }, "id": "4", "name": "dummy­4", "private_ips": [], "provider": "dummy", "public_ips": [ "127.0.0.4" ], "state": 0, "uuid": "f0f0f81f0a63ccd2c5e0c5244beebeafd0f2429c" } ], "status": "ok" Assegnazione risorse Per assegnare una risorsa, in modalità emulazione, è necessario contattare l’url http://156.148.14.126:5070/api/v1/vm/action/assign/fake_driver ​
con operazione PUT, passando come dati l’hostname della macchina da assegnare, l’utente assegnatario e il tipo della VM. La risposta ottenuta è un oggetto JSON contentente l’id della VM e il risultato dell’operazione. [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/vm/action/assign/fake_driver ­d '{"hostname":"dummy­3" ,"user":"fake_user", "vm_type":"nice", "emulate": "True"}' { "id": 42, "id_vm": "­fake_id­", "result": "Node ­fake_id­ assigned", "status": "ok" } Rilascio risorse Per rilasciare una risorsa, in modalità emulazione, è necessario contattare l’url http://156.148.14.126:5070/api/v1/vm/action/release/fake_driver ​
con operazione PUT, passando come dato l’hostname della macchina da rilasciare. La risposta ottenuta è un oggetto JSON contentente l’id della VM e il risultato dell’operazione. [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' ­d '{ "hostname": "dummy­3", "emulate":"True"}' http://localhost:5070/api/v1/vm/action/release/fake_driver { "id": 42, "id_vm": "­fake_id­", "result": "Node ­fake_id­ released", "status": "ok" } Test API Middleware cluster reale In una fase successiva dell’integrazione è stato testato il Middleware, non più con l’utilizzo della modalità emulazione, ma andando a chiedere lo stato effettivo del cluster sottostante e andando ad assegnare e rilasciare risorse nel cluster reale. Il ​
fake_driver ​
e il parametro ​
Emulate=”true” ​
sono stati eliminati dalle richieste, in modo tale che la risposta data dall’web service fosse relativa allo stato reale della cloud sottostante. Stato del cluster Per verificare lo stato del cluster reale è necessario contattare l’url http://156.148.14.126:5070/api/v1/nodes ​
con operazione GET. Il risultato ottenuto è una lista di nodi, con id, nome, IP privati e pubblici, UUID, altre informazioni utili, quali il flavor, data di creazione, imageId, hostId, e lo stato totale del cluster reale. [root@pia­fe ~]# curl ­s ­X GET ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/nodes { "nodes": [ { "cloud_type": "OpenStack", "extra": { "created": "2014­10­22T11:20:53Z", "flavorId": "2", "hostId": "e88a5cea406a9594871df4dd3f965d17ae0598ef0e097810dd8e9a53", "imageId": "42841348­5947­4f4a­9ed9­dd8479ff67f2", "key_name": "", "metadata": {}, "password": null, "tenantId": "6f19e0f9517440b083bf214c914c9d94", "updated": "2014­10­22T11:21:01Z", "uri": "http://156.148.16.64:8774/v2/6f19e0f9517440b083bf214c914c9d94/servers/30e94cc5­7fed­4fd6­a
197­6a64a6910404" }, "id": "30e94cc5­7fed­4fd6­a197­6a64a6910404", "name": "tbme55qgvxxqp3i", "private_ips": [ "156.148.14.71" ], "provider": "openstack", "public_ips": [], "state": 0, "uuid": "b589ee35f570f7d732c2b0e34d1629d4e33dd9cc" }, { "cloud_type": "OpenStack", "extra": { "created": "2014­10­20T10:20:51Z", "flavorId": "2", "hostId": "e88a5cea406a9594871df4dd3f965d17ae0598ef0e097810dd8e9a53", "imageId": "42841348­5947­4f4a­9ed9­dd8479ff67f2", "key_name": "", "metadata": {}, "password": null, "tenantId": "6f19e0f9517440b083bf214c914c9d94", "updated": "2014­10­20T10:20:59Z", "uri": "http://156.148.16.64:8774/v2/6f19e0f9517440b083bf214c914c9d94/servers/272bd128­c142­47d9­8
049­358fd132e394" }, "id": "272bd128­c142­47d9­8049­358fd132e394", "name": "v0pmszarj4g7aov", "private_ips": [ "156.148.14.73" ], "provider": "openstack", "public_ips": [], "state": 0, "uuid": "255e096d14f903491c10762f7e27af8a36eefb7f" } ], "status": "ok" Oltre allo stato generale del cluster, come è possibile notare dall’esempio, della macchina con hostname ​
v0pmszarj4g7aov ​
è possibile quindi conoscere l’ip, e altre informazioni utili. Caso di errore In caso di errore l’Web service risponde in maniera tale da comprendere che qualcosa non si è svolto nella maniera voluta. I valori restituiti sono: ● 200: Ok ● 500: Cloud not valid [root@pia­fe ~]# curl ­s ­X GET ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/nodes/wrong <html> <head> <title>Internal Server Error</title> </head> <body> <h1>Internal Server Error</h1> </body> </html> Assegnazione risorse Per assegnare una risorsa è necessario contattare l’url http://156.148.14.126:5070/api/v1/vm/action/assign ​
con operazione PUT, passando come dati l’hostname della macchina da assegnare, l’utente assegnatario e il tipo della VM. La risposta ottenuta è un oggetto JSON contentente l’id della VM e il risultato dell’operazione. [root@pia­fe ~]#curl ­s ­X PUT ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/vm/action/assign ­d '{"hostname":"tbme55qgvxxqp3i" ,"user":"user01", "vm_type":"nice"}' { "id": 301, "id_vm": "30e94cc5­7fed­4fd6­a197­6a64a6910404", "result": "Node tbme55qgvxxqp3i assigned", "status": "ok" } Caso di errore In caso di errore, ad esempio hostname non valido, l’Web services fornirà un oggetto JSON contentente lo stato di errore e la causa. I valori restituiti sono: ● 200: Ok ● 400: Param not valid ● 500: Cloud not valid [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' http://156.48.14.126:5070/api/v1/vm/action/assign ­d '{"hostname":"wrong" ,"user":"user01", "vm_type":"nice"}' { "message": "No valid hostname found", "status": "error", "status_code": 400, "status_long_message": "Bad request syntax or unsupported method", "status_short_message": "Bad Request" } Rilascio risorse Per rilasciare una risorsa è necessario contattare l’url operazione PUT, passando come dato l’hostname della macchina da rilasciare. La risposta ottenuta è un oggetto JSON contentente l’id della VM e il risultato dell’operazione. http://156.148.14.126:5070/api/v1/vm/action/release ​
con [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' ­d '{ "hostname": "tbme55qgvxxqp3i"}' http://localhost:5070/api/v1/vm/action/release { "id": 301, "id_vm": "30e94cc5­7fed­4fd6­a197­6a64a6910404", "result": "Node tbme55qgvxxqp3i released", "status": "ok" } Caso di errore In caso di errore, ad esempio parametri non validi, l’Web services fornirà un oggetto JSON contentente lo stato di errore e la causa. I valori restituiti sono: ● 200: Ok ● 400: Param not valid ● 500: Cloud not valid Hostname non valido [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' ­d '{ "hostame": "tbme55qgvxxqp3i"}' http://156.148.14.126:5070/api/v1/vm/action/release { "message": "No valid hostname found", "status": "error", "status_code": 400, "status_long_message": "Bad request syntax or unsupported method", "status_short_message": "Bad Request" } URL errato [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' ­d '{ "hostame": "tbme55qgvxxqp3i"}' http://156.148.14.126:5070/api/v1/vm/action/release/ { "message": "Page not found", "status": "error" } Errore interno [root@pia­fe ~]# curl ­s ­X PUT ­H 'Content­Type: application/json' http://156.148.14.126:5070/api/v1/vm/action/release/fake_driver ­d '{"hostname":"tbme55qgvxxqp3i"}' <html> <head> <title>Internal Server Error</title> </head> <body> <h1>Internal Server Error</h1> </body> </html> Test CloudAgent in modalità emulazione In una terza fase, dopo aver realizzato il CloudAgent, illustrato nel dettaglio nel Deliverable D3.6, sono stati effettuati dei testi di comunicazione con il Web Services, utilizzando come client il CloudAgent.exe al posto del client curl utilizzato per i test precedenti. E’ stata abilitata anche nel CloudAgent la modalità emulazione, identificata dal parametro ­e o ​
­­emulate e dal parametro ​
­c fake_driver ​
o ​
­­cloud fake_driver​
. Nell’output verrà visualizzato un warning tale da identificare il fatto che il CloudAgent è stato eseguito in modalità emulazione. Warning: CloudAgent is working on Emulation mode. Assegnazione risorse Per l’operazione di assegnazione di una risorsa, in modalità emulazione, i parametri necessari sono, l’action da eseguire (assign), il flavour da utilizzare (nice) e l’id dell’istanza da assegnare, più i parametri relativi alla cloud ​
fake_driver ​
e il parametro ­e.. Nell’output verranno visualizzate una serie di info utili e il JSON di risposta dell’Web Service. C:\>cloudagent.exe ­a assign ­f nice ­c fake_driver ­i fake_id ­e Warning: CloudAgent is working on Emulation mode. Contacting http://156.148.14.126:5070/api/v1/vm/action/assign/fake_driver Sent data: {"node":"fake_id","user":"user01","vm_type":"nice", "emulate":"True"} Info: Your request has been successfully submitted. Answer: { "id": 42, "id_vm": "­fake_id­", "result": "Node ­fake_id­ assigned", "status": "ok" } Rilascio risorse Per l’operazione di rilascio di una risorsa, in modalità emulazione, i parametri necessari sono, l’action da eseguire (release), il flavour da utilizzare (nice) e l’id dell’istanza da rilasciare, più i parametri relativi alla cloud ​
fake_driver​
e il parametro ­e. Nell’output verranno visualizzate una serie di info utili e il JSON di risposta dell’Web Service. C:\>cloudagent.exe ­a release ­f nice ­c fake_driver ­i fake_id ­e Warning: CloudAgent is working on Emulation mode. Contacting http://156.148.14.126:5070/api/v1/vm/action/release/fake_driver Sent data: {"node":"fake_id","user":"user01","vm_type":"nice", "emulate":"True"} Info: Your request has been successfully submitted. Answer: { "id": 42, "id_vm": "­fake_id­", "result": "Node ­fake_id­ released", "status": "ok" } Caso di errore Gli errori vengono gestiti in maniera differente, il caso di parametro mancante ad esempio viene gestito internamente al CloudAgent stesso, rifiutando l’esecuzione, mentre in caso di parametri errati la richiesta viene inviata al Web Service e viene riportato il risultato dell’esecuzione in output al CloudAgent. Richiesta errata C:\>cloudagent.exe ­a assign ­f nice ­c fake_driver ­i fake_id Contacting http://156.148.14.126:5070/api/v1/vm/action/assign/fake_driver Sent data: {"node":"fake_id","user":"user01","vm_type":"nice"} Web service call failed: The remote server returned an error: (400) Bad Request. URL errato C:\>cloudagent.exe ­a assign ­f nice ­c fake_driver ­i fake_id ­e ­ws wrong_url Warning: CloudAgent is working on Emulation mode. Unhandled Exception: System.UriFormatException: Invalid URI: The format of the URI could not be determined. Test CloudAgent in cluster reale Una volta verificato il funzionamento del CloudAgent in modalità emulazione sono stati effettuati dei test di funzionamento andando a contattare la cloud reale. Stato del cluster C:\>cloudagent.exe ­a=test Contacting http://156.148.14.126:5070/api/v1/sizes Info: Your request has been successfully submitted. Answer: { "flavors": [ { "cloud_type": "OpenStack", "cpu": 0, "disk": 0, "id": "1", "name": "m1.tiny", "provider": "openstack", "ram": 512 }, { "cloud_type": "OpenStack", "cpu": 0, "disk": 20, "id": "2", "name": "m1.small", "provider": "openstack", "ram": 2048 }, { "cloud_type": "OpenStack", "cpu": 0, "disk": 40, "id": "3", "name": "m1.medium", "provider": "openstack", "ram": 4096 }, { "cloud_type": "OpenStack", "cpu": 0, "disk": 80, "id": "4", "name": "m1.large", "provider": "openstack", "ram": 8192 }, { "cloud_type": "OpenStack", "cpu": 0, "disk": 160, "id": "5", "name": "m1.xlarge", "provider": "openstack", "ram": 16384 } ], "status": "ok" } Assegnazione risorse Per l’operazione di assegnazione di una risorsa i parametri necessari sono, l’action da eseguire (assign), il flavour da utilizzare (nice) e l’id dell’istanza da assegnare. Nell’output verranno visualizzate una serie di info utili e il JSON di risposta dell’Web Service. C:\>cloudagent.exe ­a assign ­f nice ­i v0pmszarj4g7aov Contacting http://156.148.14.126:5070/api/v1/vm/action/assign Sent data: {"node":"v0pmszarj4g7aov","user":"user01","vm_type":"nice"} Info: Your request has been successfully submitted. Answer: { "id": 305, "id_vm": "45a68nh7­9bbl­9ol8­t342­9p09q12345687", "result": "Node v0pmszarj4g7aov assigned", "status": "ok" } Rilascio risorse Per l’operazione di rilascio di una risorsa i parametri necessari sono, l’action da eseguire (release), il flavour da utilizzare (nice) e l’id dell’istanza da rilasciare. Nell’output verranno visualizzate una serie di info utili e il JSON di risposta dell’Web Service. C:\>cloudagent.exe ­a release ­f nice ­i v0pmszarj4g7aov Contacting http://156.148.14.126:5070/api/v1/vm/action/release Sent data: {"node":"v0pmszarj4g7aov ","user":"user01","vm_type":"nice"} Info: Your request has been successfully submitted. Answer: { "id": 305, "id_vm": "45a68nh7­9bbl­9ol8­t342­9p09q12345687", "result": "Node v0pmszarj4g7aov released", "status": "ok" } Caso di errore La richiesta viene inviata al Web Service e viene riportato il risultato dell’esecuzione in output al CloudAgent. Richiesta errata C:\>cloudagent.exe ­a assign ­f nice ­i wrong_id Contacting http://156.148.14.126:5070/api/v1/vm/action/assign Sent data: {"node":"wrong_id","user":"user01","vm_type":"nice"} Web service call failed: The remote server returned an error: (400) Bad Request. URL errato C:\>cloudagent.exe ­a assign ­f nice ­i v0pmszarj4g7aov ­ws wrong_url Unhandled Exception: System.UriFormatException: Invalid URI: The format of the URI could not be determined. Test CloudAgent in sessione interattiva Per effettuare questi test il team HPCN del CRS4 è rimasto in “ascolto” sui log del middleware. Assegnazione risorse E’ stata avviata una sessione interattiva windows, andando a verificare che all’avvio il middleware venisse contattato correttamente, che l’hostname della macchina fosse corretto e che l’assegnazione avvenisse correttamente. Riportiamo uno stralcio dei log lato Middleware identificante l’avvenuta richiesta: "156.148.14.69 ­ ­ [21/Ago/2014:16:47:29] "PUT /api/v1/vm/action/assign HTTP/1.1" 200 129 "­" "­" Il log dell’avvenuta assegnazione: 2015­04­20 16:47:34,195 INFO checking : 735ce651­7f82­40b2­9365­0a4486084eaa 2015­04­20 16:47:34,197 DEBUG <Status ASSIGNED> Il log relativo alla fase di avvio di una nuova istanza, in modo tale da mantenere costante il buffer di risorse: 2015­04­20 16:47:34,197 INFO checking : 8bd3b77f­d594­4f73­b1c5­25106875559e 2015­04­20 16:47:34,199 DEBUG <Status SPAWN> [...] 2015­04­20 16:47:44,503 INFO Status change: 265 SPAWN => FREE Rilascio risorse E’ stata chiusa una sessione interattiva windows, andando a verificare che alla chiusura il middleware venisse contattato, che l’hostname della macchina fosse corretto e che il rilascio avvenisse correttamente. E’ stato effettuato lo stesso test anche effettuando il logout dal sistema operativo. Riportiamo uno stralcio di log lato Middleware relativo al rilascio di una istanza. 2015­04­20 16:51:54,753 INFO checking : 735ce651­7f82­40b2­9365­0a4486084eaa 2015­04­20 16:51:54,757 INFO Status change: 264 RELEASED => DELETED Caso di errore Inserendo dei parametri errati nel CloudAgent abbiamo verificato che la chiamata web services non producesse nessun effetto sul cluster. 
Scarica

D3.7 Sviluppo di unità di test e report relativi ai moduli di