Come detto, nel progetto di CloMAs si è deciso di lasciare la massima libertà all’utente, per cui sul modello dei dati è possibile eseguire qualsiasi query SQL valida, sfruttando se necessario anche costrutti avanzati. In questo modo è possibile implementare algoritmi particolari, differenti da quello presentato in sezione 4.5, ottenendo in pratica un disac- coppiamento tra il motore di esecuzione e l’input che gli viene fornito, che è il nucleo principale del nostro sistema.
Di seguito, presentiamo come esempi alcune query che sono state ideate e utilizzate nel corso dei test e che rappresentano delle realizzazioni degli algoritmi di matching discussi in dettaglio nel capitolo precedente.
5.5.1
Immagini con complessità
Come primo esempio di possibile output presentiamo una lista che associ, a ogni immagine in input che sia compatibile con il cloud target, il suo best match, sulla base di un criterio che cerca di minimizzare il numero di CPU.
Il primo passo consiste nella creazione di una vista, a cui assegniamo il nome output e definita come segue. Le informazioni che verranno fornite dalla vista possono ovviamen- te essere scelte a piacere, ma nel nostro caso si è scelto di fornire il nome dell’immagine originale, quello dell’offerta cloud corrispondente, il numero di CPU dell’immagine origi- naria, se essa era fisica o già virtualizzata; ci sono poi i sistemi operativi di origine e de- stinazione, con lo sforzo di migrazione ad esso associato. Infine c’è il numero di software presenti sull’immagine di origine.
CREATE VIEW output ("origName", "offerName", "numCPU", "physical/virtual", " osNameOrig", "osNameTarget", "osMigrationEffort", "#softwares")
AS (
SELECT DISTINCT "InputImage"."imageName", "Offer"."imageName", "Offer"."numCPU ", "InputImage"."physical", "InputImage"."osName", "Offer"."osName", "OSUpgrades" ."effort",
(SELECT COUNT(*) AS softwareNumber FROM "InputSoftware" WHERE "InputImage"."
id" = "InputSoftware"."idImage")
WHERE "InputImage"."osBits" = "Offer"."osBits" AND ("InputImage"."osName" = " OSUpgrades"."originalOSName"AND "OSUpgrades"."destinationOS" = "Offer"." osName")AND "InputImage"."numCPU" <= "Offer"."numCPU");
Tale vista associa a ogni immagine di partenza una o più immagini tra quelle offerte in cloud prese in considerazione; per questo motivo, è necessario applicare un’ulteriore interrogazione che, tra le immagini di destinazione compatibili, selezioni quella con il numero minimo di CPU.
SELECT "t".* FROM output AS "t"
INNER JOIN ( SELECT "origName", MIN("numCPU") AS minCPU FROM "OUTPUT" GROUP BY "origName" ) "smaller"
ON "t"."numCPU" = "smaller".minCPU AND "t"."origName" = "smaller"."origName"
5.5.2
Immagini che non richiedono l’aggiornamento del sistema ope-
rativo
Sulla stessa falsariga della query precedente, è possibile interrogare la base di dati in modo da ottenere solo le immagini per cui non è necessario effettuare l’aggiornamento a una versione più recente del sistema operativo; prendiamo, inoltre, come parametro per la se- lezione del best match il prezzo minimo, che richiede solo piccole modifiche rispetto al caso precedente, dove consideravamo invece il numero di CPU. La scelta di questo spe- cifico parametro dipenderà dalla completezza dei dati raccolti, poiché, ad esempio, i costi potrebbero non essere disponibili.
CREATE VIEW output ("origName", "offerName", "cost", "physical/virtual", "osNameOrig ", "osNameTarget", "osMigrationEffort", "#softwares")
AS (
SELECT DISTINCT "InputImage"."imageName", "Offer"."imageName", "Offer"."cost", " InputImage"."physical", "InputImage"."osName", "Offer"."osName", "OSUpgrades"." effort",
(SELECT COUNT(*) AS softwareNumber FROM "InputSoftware" WHERE "InputImage"."
id" = "InputSoftware"."idImage")
FROM "Offer", "InputImage", "OSUpgrades"
WHERE "InputImage"."osBits" = "Offer"."osBits" AND ("InputImage"."osName" = " OSUpgrades"."originalOSName"AND "OSUpgrades"."destinationOS" = "Offer"."
osName")AND "InputImage"."numCPU" <= "Offer"."numCPU" AND "InputImage"." RAM" <= "Offer"."RAM");
La query di selezione diventa la seguente.
SELECT "t".* FROM "OUTPUT"
AS "t" INNER JOIN ( SELECT "origName", MIN("cost") AS minCost FROM "OUTPUT" GROUP BY "origName" ) "smaller" ON "t"."cost" = "smaller".minCost AND "t"." origName" = "smaller"."origName"WHERE "osMigrationEffort" = 0
5.5.3
Immagini appartenenti a workload completamente migrabili
Come descritto in dettaglio in sezione 4.4.2.2, è possibile avere una visione dei workload combinata oppure indipendente. Nel primo caso, se anche una sola delle immagini di un workload non può essere migrata, anche tutte le altre appartenenti allo stesso workload dovranno essere escluse, con conseguenze a catena sugli altri workload collegati; ciò è stato definito in maniera teorica nell’algoritmo 3, del quale presentiamo l’implementazione pratica.
Creiamo inizialmente una lista complementare a quella delle immagini migrabili e da essa estraiamo gli id univoci dei workload cui tali immagini appartengono.
CREATE VIEW "WorkloadNotOK" AS (
SELECT DISTINCT "ImageWorkload"."idWorkload" FROM "InputImage", "
ImageWorkload"WHERE NOT EXISTS (SELECT "t".* FROM "OUTPUT" AS "t" WHERE "InputImage"."imageName" = "t"."origName") AND "InputImage"."id" = " ImageWorkload"."idImage" ))
A questo punto, selezioniamo, come nel caso precedente, le immagini in base al costo, escludendo però quelle per le quali il workload non può essere migrato.
CREATE VIEW "OUTPUTNOWORKLOAD" ("origName","offerName","numCPU", " physical/virtual", "osNameOrig", "osNameTarget", "osMigrationEffort", "#softwares", " workload")
AS ( SELECT DISTINCT "InputImage"."imageName", "Offer"."imageName", "Offer"." numCPU", "InputImage"."physical", "InputImage"."osName", "Offer"."osName", "
OSUpgrades"."effort", (SELECT COUNT(*) AS softwareNumber FROM "
"ImageWorkload"."idWorkload"
FROM "InputImage" JOIN "ImageWorkload" ON "InputImage"."id" = "ImageWorkload"." idImage", "Offer", "OSUpgrades"WHERE "InputImage"."osBits" = "Offer"."osBits" AND ("InputImage"."osName" = "OSUpgrades"."originalOSName" AND "
OSUpgrades"."destinationOS" = "Offer"."osName")AND "InputImage"."numCPU" <= "Offer"."numCPU"AND "ImageWorkload"."idWorkload" NOT IN (SELECT "
idWorkload"FROM "WorkloadNotOK")
La query di selezione, infine, sarà analoga a quelle viste poco sopra.
SELECT "t".* FROM "OUTPUTNOWORKLOAD"
AS "t" INNER JOIN ( SELECT "origName", MIN("cost") AS minCost FROM " OUTPUTNOWORKLOAD"GROUP BY "origName" ) "smaller" ON "t"."cost" = " smaller".minCostAND "t"."origName" = "smaller"."origName"