Skip to content

Commit

Permalink
Add error handling and logging for VM management functions
Browse files Browse the repository at this point in the history
  • Loading branch information
nishogi committed Jun 2, 2024
1 parent 75d6295 commit ec4712a
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 55 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
# EDEN
Projet EDEN - 2024

```mermaid
graph TD
A[Start] --> B[createVM]
B --> C[getNextAvailableVMID]
C --> D{ID Available?}
D -- Yes --> E[getVMId]
D -- No --> F[Error: No Available ID]
E --> G{Clone ID Found?}
G -- Yes --> H[modifyVariablesFile]
G -- No --> I[Error: No Clone ID]
H --> J[executeTofuCommands]
J --> K[VM Created]
F --> L[End]
I --> L
K --> L
```
122 changes: 67 additions & 55 deletions website/students/students_functions.php
Original file line number Diff line number Diff line change
@@ -1,53 +1,43 @@
<?php

// Fonction pour récupérer les noms de VM correspondant au motif donné en argument de la fonction
// Function to retrieve VM names matching the given pattern
function getVMNames($pattern) {
// URL de l'API et paramètres
$url = 'https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu';
$headers = array(
'Authorization: PVEAPIToken=web@pve!web_token=d0ea3d01-dbd5-4cf0-a534-19b508cd81f7',
);
$cert_file = "/etc/certs/activ/eden.imtbs-tsp.eu/fullchain.pem";

// Configuration de la requête Curl
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // Ignorer la vérification SSL pour l'instant, trouver comment faire
//curl_setopt($curl, CURLOPT_CAINFO, $cert_file); // Spécifier le chemin vers le certificat SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$vmListResult = curl_exec($curl);

// Vérification des erreurs Curl
if ($vmListResult === false) {
echo 'Erreur Curl : ' . curl_error($curl);
error_log("CURL error: " . curl_error($curl));
curl_close($curl);
return array();
}

// Fermeture de la session Curl
curl_close($curl);

//echo "$vmListResult\n";

// Décodage des données brutes afin d'en extraite le nom des VM
$vmListData = json_decode($vmListResult, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("JSON decode error: " . json_last_error_msg());
return array();
}

$userVMs = array();

// Permet de sauvegarde le nom des VM correspondant au pattern
// On enlève au début 8 caractère pour l'id du cours ex : CSC3101_
foreach ($vmListData['data'] as $vm) {
if (strcmp(substr($vm['name'], 8),$pattern)==0) {
// Si même nom, ajouter le nom de la VM au tableau
if (strpos($vm['name'], $pattern) !== false) {
$userVMs[] = $vm['name'];
}
}

return $userVMs;
}

// Fonction pour obtenir l'Id de la VM en ayant son nom en paramètre
// Function to get the VM ID given its name
function getVMId($name) {
// On obtient l'ensemble des données au format JSON
$url = 'https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu';
$headers = array(
'Authorization: PVEAPIToken=web@pve!web_token=d0ea3d01-dbd5-4cf0-a534-19b508cd81f7',
Expand All @@ -59,34 +49,39 @@ function getVMId($name) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$vmListResult = curl_exec($curl);
if ($vmListResult === false) {
error_log("CURL error: " . curl_error($curl));
curl_close($curl);
return false;
}
curl_close($curl);
//echo "$vmListResult\n";

// Décodage des données brutes afin d'en extraite le nom des VM
$vmListData = json_decode($vmListResult, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("JSON decode error: " . json_last_error_msg());
return false;
}


// Permet de sauvegarde le nom des VM correspondant au pattern
// On enlève au début 8 caractère pour l'id du cours ex : CSC3101_
foreach ($vmListData['data'] as $vm) {
if (strcmp($vm['name'],$name)==0) {
// Si même nom, obtenir l'id de la VM
$VMId = $vm['vmid'];
break;
if (isset($vm['name']) && strcmp($vm['name'], $name) == 0) {
return $vm['vmid'];
}
}

return $VMId;
return false; // Return false if no matching VM is found
}

// Permet d'allumer la VM via son nom
// Function to start the VM by its name
function startVM($name) {
$VMId = getVMId($name);
if ($VMId === false) {
error_log("Failed to get VM ID for VM: $name");
return;
}

$path = "https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu/$VMId/status/start";

# Envoi de la demande d'allumage avec curl en utilisant le path mentionné au dessus et l'id de la VM
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $path,
CURLOPT_RETURNTRANSFER => false,
Expand All @@ -98,22 +93,23 @@ function startVM($name) {
));

curl_exec($curl);

curl_close($curl);

header("Location: {$_SERVER['PHP_SELF']}");
exit;
}

// Permet d'arrêter la VM via son nom
// Function to stop the VM by its name
function stopVM($name) {
$VMId = getVMId($name);
if ($VMId === false) {
error_log("Failed to get VM ID for VM: $name");
return;
}

$path = "https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu/$VMId/status/stop";

# Envoi de la demande d'arrêt avec curl en utilisant le path mentionné au dessus et l'id de la VM
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $path,
CURLOPT_RETURNTRANSFER => false,
Expand All @@ -125,13 +121,11 @@ function stopVM($name) {
));

curl_exec($curl);

curl_close($curl);
}

// Fonction pour vérifier l'état de la machine virtuelle
// Function to check the status of the VM
function checkVMStatus($VMId) {
// On obtient l'ensemble des données au format JSON
$url = "https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu/$VMId/status/current";
$headers = array(
'Authorization: PVEAPIToken=web@pve!web_token=d0ea3d01-dbd5-4cf0-a534-19b508cd81f7',
Expand All @@ -143,33 +137,39 @@ function checkVMStatus($VMId) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$vmStatusResult = curl_exec($curl);
if ($vmStatusResult === false) {
error_log("CURL error: " . curl_error($curl));
curl_close($curl);
return false;
}
curl_close($curl);

$statusData = json_decode($vmStatusResult, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("JSON decode error: " . json_last_error_msg());
return false;
}

// Accéder à la valeur de la clé "status"
$status = $statusData['data']['status'];

return $status;
return $statusData['data']['status'];
}

// Permet de supprimer la VM via son nom
// Function to delete the VM by its name
function deleteVM($name) {
$VMId = getVMId($name);
if ($VMId === false) {
error_log("Failed to get VM ID for VM: $name");
return;
}

stopVM($name);

// Attendre que la machine virtuelle soit arrêtée
while (checkVMStatus($VMId) != 'stopped') {
// Attendre 2 secondes avant de vérifier à nouveau
sleep(1);
}

$path = "https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu/$VMId";

# Envoi de la demande de suppression avec curl en utilisant le path mentionné au dessus et l'id de la VM
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $path,
CURLOPT_RETURNTRANSFER => false,
Expand All @@ -181,9 +181,9 @@ function deleteVM($name) {
));

curl_exec($curl);

curl_close($curl);
}

// Function to check if the VM already exists
function existingVM($VMname) {
$url = "https://atlantis.int-evry.fr:8006/api2/json/nodes/atlantis/qemu";
Expand Down Expand Up @@ -250,8 +250,13 @@ function getNextAvailableVMID() {
$existingVMIDs[] = (int)$vm['vmid'];
}

$nextAvailableID = 100;
while (in_array($nextAvailableID, $existingVMIDs)) {
sort($existingVMIDs);

$nextAvailableID = 100; // Starting ID
foreach ($existingVMIDs as $existingID) {
if ($nextAvailableID < $existingID) {
break;
}
$nextAvailableID++;
}

Expand Down Expand Up @@ -283,12 +288,18 @@ function createVM($VMname, $sshPublicKey) {
throw new Exception("Failed to get next available VM ID");
}

// Check if the VM configuration file already exists
$configFilePath = "/etc/pve/nodes/atlantis/qemu-server/$vmID.conf";
if (file_exists($configFilePath)) {
throw new Exception("VM configuration file already exists: $configFilePath");
}

$VMname_clone = substr($VMname, 0, 7);
$cloneID = getVMId($VMname_clone);
if ($cloneID === false) {
throw new Exception("Failed to get VM ID for cloning");
}

echo ($filePath, $cloneID, $sshPublicKey, $userName, $vmID, $VMname);
modifyVariablesFile($filePath, $cloneID, $sshPublicKey, $userName, $vmID, $VMname);
executeTofuCommands($filePath, $folderPath);

Expand Down Expand Up @@ -354,4 +365,5 @@ function executeTofuCommands($filePath, $folderPath) {
echo "VM created successfully. Result: <pre>$planOutput</pre>";
echo "---------------------------------------------------------------------------------------------------------------------------------";
echo "VM created successfully. Result: <pre>$applyOutput</pre>";
}
}
?>

0 comments on commit ec4712a

Please sign in to comment.