From f9e98ff0eba526d6cc69e76ba9cf60c5613a0c10 Mon Sep 17 00:00:00 2001 From: luckysideburn Date: Sun, 29 Dec 2024 17:55:18 +0000 Subject: [PATCH] added images and code for kubevirt support --- html/images/sprite_invader_vm_failed.png | Bin 0 -> 426 bytes html/images/sprite_invader_vm_paused.png | Bin 0 -> 426 bytes html/images/sprite_invader_vm_starting.png | Bin 0 -> 426 bytes html/images/sprite_invader_vm_stopped.png | Bin 0 -> 426 bytes html/index.html | 2 +- html/js/kubeinvaders.js | 30 +++++++++---- scripts/vm_reboot.lua | 47 +++++++++++++++++++++ 7 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 html/images/sprite_invader_vm_failed.png create mode 100644 html/images/sprite_invader_vm_paused.png create mode 100644 html/images/sprite_invader_vm_starting.png create mode 100644 html/images/sprite_invader_vm_stopped.png create mode 100644 scripts/vm_reboot.lua diff --git a/html/images/sprite_invader_vm_failed.png b/html/images/sprite_invader_vm_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..f1af99c26e6d2fc17457c79cf8dd6446a20078e5 GIT binary patch literal 426 zcmV;b0agBqP)Y3Y+0 zTG5Haak!zt?RveHUoY#rYqz*+N+4auw{(-MW(X72U22nBuNYTN$>A2z641y@x5zze zj^un{-i`1GK$n{>V?ub#T)oFSU2*2B9-k_~@|+W-Gna+%r={W&kLFR9m^8y7Of50T z#bF?5TAFO%<^#QPTT*Ae)v7dCug$v-j})S3$yJl)3gJS{IP98X+Ja;sICE7Fk0b|A zg~LP2nGWGNe0URj3#O&XRxVYVrR@nW$zhV%+lVY1!4<-3Y4E>MX4v$S{M+P`7keZI z{nApF16w;hijW~OAxu;vG2FX;B>k_6;OgFo`*5BSbdizqAXi3;t9qNF9wd)50$deJ z#T|!LY3Y+0 zTG5Haak!zt?RveHUoY#rYqz*+N+4auw{(-MW(X72U22nBuNYTN$>A2z641y@x5zze zj^un{-i`1GK$n{>V?ub#T)oFSU2*2B9-k_~@|+W-Gna+%r={W&kLFR9m^8y7Of50T z#bF?5TAFO%<^#QPTT*Ae)v7dCug$v-j})S3$yJl)3gJS{IP98X+Ja;sICE7Fk0b|A zg~LP2nGWGNe0URj3#O&XRxVYVrR@nW$zhV%+lVY1!4<-3Y4E>MX4v$S{M+P`7keZI z{nApF16w;hijW~OAxu;vG2FX;B>k_6;OgFo`*5BSbdizqAXi3;t9qNF9wd)50$deJ z#T|!LY3Y+0 zTG5Haak!zt?RveHUoY#rYqz*+N+4auw{(-MW(X72U22nBuNYTN$>A2z641y@x5zze zj^un{-i`1GK$n{>V?ub#T)oFSU2*2B9-k_~@|+W-Gna+%r={W&kLFR9m^8y7Of50T z#bF?5TAFO%<^#QPTT*Ae)v7dCug$v-j})S3$yJl)3gJS{IP98X+Ja;sICE7Fk0b|A zg~LP2nGWGNe0URj3#O&XRxVYVrR@nW$zhV%+lVY1!4<-3Y4E>MX4v$S{M+P`7keZI z{nApF16w;hijW~OAxu;vG2FX;B>k_6;OgFo`*5BSbdizqAXi3;t9qNF9wd)50$deJ z#T|!LY3Y+0 zTG5Haak!zt?RveHUoY#rYqz*+N+4auw{(-MW(X72U22nBuNYTN$>A2z641y@x5zze zj^un{-i`1GK$n{>V?ub#T)oFSU2*2B9-k_~@|+W-Gna+%r={W&kLFR9m^8y7Of50T z#bF?5TAFO%<^#QPTT*Ae)v7dCug$v-j})S3$yJl)3gJS{IP98X+Ja;sICE7Fk0b|A zg~LP2nGWGNe0URj3#O&XRxVYVrR@nW$zhV%+lVY1!4<-3Y4E>MX4v$S{M+P`7keZI z{nApF16w;hijW~OAxu;vG2FX;B>k_6;OgFo`*5BSbdizqAXi3;t9qNF9wd)50$deJ z#T|!L
-

version: 2024-12-25 10:23:42

+

version: 2024-12-29 17:50:52

diff --git a/html/js/kubeinvaders.js b/html/js/kubeinvaders.js index 759123e..612e067 100644 --- a/html/js/kubeinvaders.js +++ b/html/js/kubeinvaders.js @@ -336,6 +336,16 @@ function startChaosNode(node_name) { oReq.send(); } +function rebootVirtualMachine(vm_name) { + var oReq = new XMLHttpRequest(); + oReq.onload = function () { + $('#alert_placeholder').replaceWith(alert_div + 'Latest action: Prepareing reboot virtual machine ' + vm_name + ''); + };; + $('#alert_placeholder').replaceWith(alert_div + 'Latest action: Reboot virtual machine ' + vm_name + ''); + oReq.open("GET", k8s_url + "/kube/chaos/vm_reboot?vm_name=" + vm_name + "&namespace=" + namespace); + oReq.send(); +} + function deletePods(pod_name) { var oReq = new XMLHttpRequest(); oReq.onload = function () { @@ -356,8 +366,6 @@ function addNodeAndVMstoPods() { return pods; } - - function getPods() { if (chaos_pods) { var oReq = new XMLHttpRequest(); @@ -405,7 +413,7 @@ function getVMs() { virtualMachines = []; Array.from(jsonData.items).forEach(vm => { const name = vm.metadata.name; // Nome della VM - const status = vm.status.printableStatus; // Stato della VM + const status = vm.status.printableStatus.toLowerCase(); // Stato della VM virtualMachines.push({ name: name, status: status }); }); };; @@ -537,9 +545,9 @@ function drawAlien(alienX, alienY, name, status) { ctx.fillText(name.substring(0, 10) + '..', alienX, alienY + 50); } else if (virtualMachines.some((vm) => vm.name == name)) { - image.src = './images/k8s_node.png'; + image.src = `./images/sprite_invader_vm_${status}.png`; ctx.font = '10px pixel'; - ctx.drawImage(image, alienX, alienY, 30, 40); + ctx.drawImage(image, alienX, alienY, 40, 40); ctx.fillText(name.substring(0, 10) + '..', alienX, alienY + 50); } else { @@ -578,6 +586,10 @@ function checkRocketAlienCollision() { aliens[i]["active"] = false; startChaosNode(aliens[i]["name"]); } + else if (virtualMachines.some((vm) => vm.name == aliens[i]["name"])) { + aliens[i]["active"] = false; + rebootVirtualMachine(aliens[i]["name"]); + } else { deletePods(aliens[i]["name"]); } @@ -851,10 +863,10 @@ window.setInterval(function setAliens() { }, 1000) window.setInterval(function backgroundTasks() { - console.log("Nodes:", nodes); - console.log("Virtual Machines:", virtualMachines); - console.log("chaos_vms flag:", chaos_vms); - console.log("Pods:", pods); + // console.log("Nodes:", nodes); + // console.log("Virtual Machines:", virtualMachines); + // console.log("chaos_vms flag:", chaos_vms); + // console.log("Pods:", pods); if (!codename_configured) { chaosProgram = $('#chaosProgramTextArea').val(); diff --git a/scripts/vm_reboot.lua b/scripts/vm_reboot.lua new file mode 100644 index 0000000..0044cd4 --- /dev/null +++ b/scripts/vm_reboot.lua @@ -0,0 +1,47 @@ +local https = require "ssl.https" +local ltn12 = require "ltn12" +local json = require 'lunajson' +local redis = require "resty.redis" +local http = require("resty.http") + +local k8s_url = "" + +if os.getenv("KUBERNETES_SERVICE_HOST") then + k8s_url = "https://" .. os.getenv("KUBERNETES_SERVICE_HOST") .. ":" .. os.getenv("KUBERNETES_SERVICE_PORT_HTTPS") +else + k8s_url = os.getenv("ENDPOINT") +end + +local token = os.getenv("TOKEN") +local arg = ngx.req.get_uri_args() +local namespace = arg["namespace"] +local vm_name = arg["vm_name"] +local url = k8s_url .. "/apis/kubevirt.io/v1/namespaces/" .. namespace .. "/virtualmachines/" .. vm_name .. "/restart" +local decoded = nil + +ngx.header['Access-Control-Allow-Origin'] = '*' +ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' +ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' +ngx.header['Access-Control-Expose-Headers'] = 'Content-Length,Content-Range'; + +ngx.log(ngx.INFO, "Requesting nodes using this url: " .. url) + +local httpc = http.new() + +-- Esegui la richiesta +local res, err = httpc:request_uri(url, { + method = "GET", + ssl_verify = false, -- TODO: use a valid certificate + headers = { + ["Accept"] = "application/json", + ["Content-Type"] = "application/json", + ["Authorization"] = "Bearer " .. token + } +}) + +if not res then + ngx.log(ngx.ERR, "Errore durante la richiesta HTTP: ", err) + return +end + +ngx.say(res.body) \ No newline at end of file